?? ejb3-1.txt
字號:
ejb3.0所用的技術:
rmi:遠程方法調用
客戶端可以直接調用服務端的相關方法
jndi:相當于dns,是類的一個別名可以更好的記憶。
連接池:
事先有n個連接,可以直接取,用完了還可以放回去。
JBOSS安裝:
java -jar jboss-4.0.4.GA-Patch1-installer.jar
在windows的環境加入一個環境變量JBOSS_HOME
JBOSS_HOME=C:\jboss404
如果在安裝時是
ejb3_clusered:集群
default
直接運行run.bat,就可以啟動jboss
如果是all
在dos下,run -c all
JBOSS的目錄
C:\jboss-404\bin:運行目錄
C:\jboss-404\client:客戶端需要的類包
C:\jboss-404\docs\examples\jca:連接池的模板文件
C:\jboss-404\server\default\DEPLOY:所有JAR ERA WAR包的部署目錄
C:\jboss-4.0.4.GA\server\default\lib:部署文件的包庫
C:\jboss-404\server\default\work:可以看到JSP頁面的源代碼
C:\jboss-404\docs\dtd:所有的JBOSS所有的DTD文件
C:\jboss-404\server\default:默認的運行目錄,在安裝時確定(ALL DEFAULT MINI)
配置數據源連接池的過程
將MSSQL中的三個類包拷到C:\jboss-404\server\default\lib目錄下
將C:\jboss-404\docs\examples\jca模板目錄中的MSSQL-DS.XML拷到C:\jboss-404\server\default\DEPLOY目錄下
修改C:\jboss-404\server\default\DEPLOY中的內容指定到對應的數據庫及用戶名和密碼
建立EJB3.0實體BEAN的過程
在SRC下建立一個META-INF目錄
在META-INF中加入一個persistence.xml文件,內容如下,文件名必須是persistence.xml
<persistence>
<persistence-unit name="foshanshop">
<jta-data-source>java:/MSSQLDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
將build.xml拷到工程的根目錄下。
ant的作用:
編譯
打包
jar:ejb class
ear:jar+war(ejb+struts)
war:web處理,jsp、action、actionForm
部署:
發部到服務器上
文件目錄的創建、刪除、復制
加載模板
window-->preferences-->java-->Editor-->Templates
導入
寫代碼
將eclipse的編譯環境變為jdb5.0,java compiler
持久化核心類
--持久化類
@Entity
@Table(name = "Customer")
public class myEntity
{
@id
public Integer getCustomerID()
{
}
}
--持久化代碼
EntityManager em
merge --修改
remove --刪除
find(Class,Object) --查找
Query query=em.createQuery("select c from Customer c where c.customerName=?1 and c.pwd=?2");
query.setParameter(1,customer.getCustomerName);
List list=query.getResultList();
業務層
一個接口,一個類
//接口
public interface IFacade
{
public void insert() throws Exception
}
//實現類
@Stateless //當前是一個無狀態的sessionBean
@Remote ({IFacade.class}) //其遠程接口是IFacade
public Class Facade implements IFacade
{
@PersistenceContext
protected EntityManager em;
public void insert() throws Exception
{
em.persist();
}
}
如何得到上下文環境(jndi.config)
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming
jndi:java naming directory interface(dsn)
rmi:遠程方法調用
客戶端可以直接訪問服務器的方法。
訪問過程:
上下文件環境
在properties中加入一個地址localhost:1099
在properties中加入一個工廠org.jnp.interfaces.NamingContextFactory
Properties p=new Properties();
p.load(Class.getReasouseAsStream(jndi.config));
Context context=new InitContext(p)
通過lookup得到遠程接口
IFacade facade=(IFacade)context.lookUp("Facade/remote");
ejb3.0:
SesssionBean:
stateless:無狀態(1..n客)
只要一個接口一個類
stateful:有狀態(1..1)
EntityBean:(cmp)
持久化
ejb3.0與ejb2.0之間的比較:
所有的配置沒有xml文件,使用注釋的原元素來說明,jdk1.5。
ejb2.0要有兩個接口一個類,與框架的耦合度太高,ejb3.0是pojo:
提高開發效率,調試
提高了測試,對于實體bean還是要發部到容器中進行處理。
ejb3.0在jboss中使用hibernate技術作為實體bean,去除ejb2.0所具有缺點。
ejb3.0的實體bean可以處在:自由、持久、游離,可以直接返回一個pojo
ejb2.0離不開容器,實體只能返回一個遠程或本地接口,要進行傳送要dto,dto是不符合面向對象的思想。
pojo:pure old java object
dto:data translate object(get set)
ejb3.0與spring的比較
ejb3.0:
pojo:部分的依賴于容器
減少了xml文件,使用注釋的元素來說明,jdk1.5
與容器緊密的整合有一起,所在執行效率上較高(事務、日志)
所有服務是容器提供的,如果想減去一些不用的服務,只能調整容器。
spring:
pojo:完全不依賴于容器,測試
一切都是xml文件,配置復雜
在容器之上,所在效率低一些
在容器之上,選擇不同的服務(安全、事務、分布式)。
cascade 的值只能是:
無:不需要級聯
one表可以不加many,但many要加one,主要來控制主外鍵
one表通過add對象加入的內容,在many不用設置。
CascadeType.PERSIST(級聯新建)
CascadeType.REMOVE(級聯刪除)
CascadeType.REFRESH(級聯刷新)
CascadeType.MERGE(級聯更新)
CascadeType.ALL(所有的都可以)
onetomany
mappedBy="customer":代表是雙向,如要關聯,將其作為另一個對象的屬性。
fetch:延時:默認是lazy
FetchType.EAGER:瞬時
FetchType.LAZY。
@OrderBy(value = "buyID ASC")注釋指明加載buy 時按buyID 的升序排序
manytoone:
@ManyToOne注釋有四個屬性:targetEntity、cascade、fetch 和optional
optional=true:buy所有,customer匹配
@JoinColumn(name = "customer_name")注釋指定buy映射表的customer_name列作為外鍵與Customer映射表的主鍵列
關聯。
onetoone:實際上是onetomany的一個變種,不同的是many的
@JoinColumn(unique="true"),可以變成的one-to-one
使用方法一onetomany一樣。
mappedBy="person":代表是雙向,如要關聯,將其作為另一個對象的屬性,其是one表。
one用onetoone
many用Manytoone @JoinColumn(unique="true")
manytomany:
兩個表之間的關系是many的時候,根據一個表主鍵可以直接取出另一個表的所有內容
實現基理:
有一個中間表即關系集,實現多與多的關系。
被控方:
@ManyToMany(mappedBy = "students")
主控方:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "teacherstudent",
joinColumns = {@JoinColumn(name = "teacher_ID", referencedColumnName = "teacherID")},
inverseJoinColumns = {@JoinColumn(name = "student_ID", referencedColumnName =
"studentID")})
復合主鍵:
作一個主鍵類,有一個默認的構造函數,要序列化,包括多個屬性,
這個類的實現equals及hashCode方法。
要有一個注釋:@Embeddable,可以聲明其列
主鍵類整體作為主表的一個屬性,進行相關的操作。
在關聯的時候的處理:
有復合主鍵的是one,有另一個many表的外鍵指向one表的主鍵,要如下:
@JoinColumns
({
@JoinColumn(name="first_name", referencedColumnName = "firstName", nullable=false),
@JoinColumn(name="last_name", referencedColumnName = "lastName", nullable=false)
})
消息驅動bean:異步。(Message Driver Bean)
jms:(java message server)
概念:
消息驅動Bean(MDB)是設計用來專門處理基于消息請求的組件。
一個MDB類必須實現MessageListener 接口。
當容器檢測到bean守候的隊列一條消息時,
就調用onMessage()方法,將消息作為參數傳入。
MDB在OnMessage()中決定如何處理該消息。
你可以用注釋來配置MDB 監聽哪一條隊列。
當MDB 部署時,容器將會用到其中的注釋信息。
使用的時間:
當一個業務執行的時間很長,
而執行結果無需實時向用戶反饋時,
很適合使用消息驅動Bean
種類:
注釋信息:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/foshanshop")
})
@ActivationConfigProperty注釋配置消息的各種屬性
destinationType屬性指定消息的類型,
topics:(javax.jms.Topic)
Topics 可以有多個客戶端。
用topic 發布允許一對多,或多對多通訊通道。
消息的產生者被叫做publisher,
消息接受者叫做subscriber。
Queue(javax.jms.Queue) 僅僅允許一個消息傳送給一個客戶。
一個發送者將消息放入消息隊列,
接受者從隊列中抽取并得到消息,
消息就會在隊列中消失。
destination屬性用作指定消息路徑,消息驅動Bean在發布時,
如果路徑不存在,容器會自動創建該路徑,當容
器關閉時該路徑會自動被刪除。
實現:
public myMessage implements MessageListener
{
public void onMessage(Message mess)
{
}
}
客戶端連接:
Properties p=new Properties();
p.load(Client.class.getResourceAsStream("link.properties"));
//得到上下文環境
Context context=new InitialContext(p);
//得到服務的消息驅動bean的引用
Queue que=(Queue)context.lookup("queue/foshanshop");
//得到消息連接工廠
QueueConnectionFactory factory=(QueueConnectionFactory)context.lookup("ConnectionFactory");
//產生一個連接
QueueConnection queueConnection=factory.createQueueConnection();
//產生一個session
QueueSession session=(QueueSession)queueConnection.createSession(false,QueueSession.AUTO_ACKNOWLEDGE);
//產生一個消息
TextMessage message=session.createTextMessage("hello 張三");
//產生一個發送者,以消息引用為參數
QueueSender sender=session.createSender(que);
//發送消息
sender.send(message);
session.close();
攔截器:在執行某一個類的方法前被攔截處理
實現過程:
實現一個攔截器
public class Inteceptor
{
@AroundInvoke
public Object XXXXX(InvocationContext ctx) throws Exception
{
long start=System.currentTimeMillis();
try
{
return ctx.proceed();
}
catch (Exception e)
{
e.printStackTrace();
throw e;
}
finally
{
}
}
}
在被攔截的類中進行說明
@Interceptors({Inteceptor.class})
pojo:
pure old java object
pure old java inteface
dto:data trans object
vo:value object
po:persistent object
bo:business object
生命周期:
ejb2.0是固定的方法,必須實現,即使方法內部是空的。
ejb3.0方法名可以隨心定義,只有的注釋說明就可以。
@Init:初始化
@PostConstruct:實例化被調用的構造方法
@PreDestroy:在刪除前被調用
@PrePassivate:鈍化前被調用
@PostActivate:激活前被調用
@Remove:移除前被調用,同時告訴服務器刪除對象
依賴注入:
通過注釋可以將一個bean注入到另一個bean中,注入有兩種方式。
1、根據jndi名
@EJB (mappedName="HelloWorldBean/remote")
2、根所類名,沒有包名。
@EJB (beanName="TestTime")
3、可以在set方法前或屬性方法前寫注釋注入
可以注入任意一個
@Resource (mappedName="java:/MSSQLDS")
web service:web服務
作用:
實現跨平臺、跨協議、跨系統、跨語言(java->c#)
粗粒度的處理
協議:
tcp/ip-->http-->soap(simple object access protocal)
傳輸的介質:
xml
角色:
服務提供商(業主)
代理商(中介)
客戶端(買方)
ejb:
rmi:遠程方法調用,java與java之間
rmi:粗粒度的處理
wsdl:web service description language
在jboss中實現web service過程
寫一引普通的類
加入一些說明注釋
@WebService(name = "HelloWorld",
targetNamespace = "http://com.foshanshop.ws", serviceName = "HelloWorldService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
1. name
Web 服務的名字,WSDL中wsdl:portType元素的name屬性和它保持一致,默認是Java 類或者接口的名字。
2. serviceName
Web 服務的服務名,WSDL 中wsdl:service元素的name屬性和它保持一致,默認是Java 類的名字+”Service” 。
3. targetNamespace
WSDL文件所使用的namespace,該Web 服務中所產生的其他XML文檔同樣采用這個作為namespace 。
@SOAPBinding()表示這個服務可以映射到一個SOAP消息中。Style用于指定SOAP消息請求和回應的編碼方式。
@WebMethod 這個注釋放在需要被發布成Web 服務的方法前面。
4、在web.xml將提供服務的類指定為servlet
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>aa.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
客戶端的調用過程:
需要用如下內容生成一個xml文件及客戶端類
加入一個xml文件
在ant中加入如下內容:
<target name="generate-sources" description="生成客戶端代碼及映射文件">
<taskdef name="wstools" classname="org.jboss.ws.tools.ant.wstools">
<classpath refid="build.classpath" />
</taskdef>
<wstools dest="${app.dir}/src" config="${src.dir}/wstools-config.xml" />
</target>
通過客戶端與服務器交互。
URL hellourl=new URL("http://lab5:8080/webservice/hello?wsdl");
String namespace="http://com.foshanshop.ws";
URL mappingUrl=Client.class.getClassLoader().getResource("jaxrpc-mapping.xml");
//service工廠
ServiceFactoryImpl sfi=new ServiceFactoryImpl();
//得到服務名,前綴加真正的名稱
QName qname=new QName(namespace,"HelloWorldService");
//得到具體的服務
Service service=sfi.createService(hellourl,qname,mappingUrl);
//得到一個遠程接口
HelloWorld hw=(HelloWorld)service.getPort(HelloWorld.class);
hw.hello("zhang sai");
開發過程:
可行性報告
之前:
整理ant
整理cvs目錄
定下來寫那些文檔,誰什么時候提交
需求
use-case圖
需求說明書
界面原型
類圖(ooa):業務相關的對象模型
概要設計
e-r圖:對象的模型的進一步持久。
類圖的細化:進一步的細化,加入各種模式及框架
詳細設計
時序圖
細化類圖
要的編碼規范
實現
測試
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -