日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tarena学习EJB笔记

發布時間:2023/12/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tarena学习EJB笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

EJB day1 Wednesday 2007.3.28
Enterprise JavaBeans
寫EJB項目步驟:
1.建立EJB項目的路徑。
2.設置CLASSPATH(類路徑):
?EJB目錄/lib/javaee.jar?//編譯時
?EJB目錄/lib/appserv-rt.jar?//運行時
?如:liunx下配置
?export CLASSPATH=.:opt/EJB/lib/javaee.jar:opt/EJB/lib/appserv-rt.jar:$CLASSPATH
3.寫bean類,需要暴露的接口:Remote,Local
?必須要有接口與實現類;遠程通過接口中暴露的方法,向服務器發起調用,用服務器調用具體的實現類
?public interface BeanRemote{
??String m1(String v);
??}
??//只在服務器端有
??//無狀態模式
?@Stateless
?@Remote(BeanRemote.class)
?public Bean implements BeanRemote{
??String m1(String v){
???//方法實現的代碼
??};
?}
4.編譯bean類。
5.打成jar包
6.部署到服務器上
7.(可選)寫一個測試類測試
?public class BeanTest {???
??? public BeanTest() {}
??? public static void main(String[] args) throws NamingException {
??? ??//設置遠程訪問的IP地址
??????? System.setProperty("org.omg.CORBA.ORBInitialHost","192.168.12.41");
??????? InitialContext context=new InitialContext();
???//在上下文中查詢
??????? BeanRemote beanRemote=(BeanRemote) context.lookup(BeanRemote.class.getName());
??????? //調用BeanRemote的方法
????String s=beanRemote.m1("abc");
??? }???
}
==============================================================================================


EJB day2 Thursday 2007.3.29

1.Stateless Session Bean
?特點:存入Bean pool,無成員屬性保存數據
?Stateful Session Bean
?特點:存入cache中,成員屬性保存數據,只供各自客戶端使用

2.Lifecycle of Session Bean(生命周期)
?------------------------------------------------
?Stateless and Stateful 注釋
?@Stateless?:聲明該Session Bean是無狀態的
?@Stateful?:聲明該Session Bean是有狀態的
?
?*寫這些注釋的方法的標準:public void method()??//只有method可自己命名
?@PostConstruct :在Session Bean創建后,調用該方法
?@PreDestroy?:在Session Bean銷毀前,調用該方法
?@Remove?:(Stateless 中無用)接口中暴露該方法,由客戶端主動調用該方法,調用后會銷毀Session Bean,銷毀前會調用@PreDestroy(有則調用)
?
?Stateful 注釋
?@PrePassivate?:內存cache中Session Bean被用完時,回根據配置的策略選一個Session Bean存到磁盤中(叫遁化)前調用該方法
?@PostActivate?:從磁盤中取回數據到內存cache中后,調用該方法
?
?三中策略:
?LRU:最近最少使用策略
?FIFO:先進先出策略
?NRU:(Not Recently Used)這種近似LRU算法,已經退化成一種"最近不用"的算法
?
3.NetBeans 5.5使用
?一般端口設置:
??Admin port:4848
??Domain Http port:8080
??ORB Listener Port:3700
??HTTPS port 8181
?
?用NetBeans寫EJB
?選擇新建項目:企業(Enterprise)->企業應用(EnterpriseApplication)[選擇創建EJB模塊,客戶段模塊]
?在EJB模塊->源包(Source)中建一個會話bean(Session bean)
?1).//遠程借口類session class
??@Remote
??public interface CountRemote{
???int count();
???@Remove
???void remove();
??}
?2).//接口實現類session class
??@Stateful
??//如果使用攔截器,需要在這里配置,攔截器的類
??@Interceptors({CountInterceptor.class})
??public class CountBean implements CountRemote{
???private int val;
???public int count(){//實現代碼};
???
???@Remove
???public void remove(){//實現代碼};
???
???/*
???//如果攔截器中有了該方法就不用寫在該類中了
???@Postconstruct
???public void construct(){//實現代碼};
???*/
??}
?3).//攔截器(可選)java class
??public class CountInterceptor{
???@PostConstruct
???public void construct(){//實現代碼};
???@preDestroy
???public void destroy(){//實現代碼};
???@PrePassivate
???public void passivate(){//實現代碼};
???@PostActivate
???public void activate(){//實現代碼};
??}
??
?4).//測試類(可選) java main
??創建Enterprise Applicaton Client(不通用,只有sun公司提供),提供了EJB運行環境容器
?public class CountTest {
??//創建EJB Session bean
??//注入的方式創建bean,提供了運行環境容器
??? @EJB
??? private static CountRemote countRemote;???
??? public CountTest() {
??? }
??? public static void main(String[] args) {
??? //可以直接使用,不關心如何獲得
????? int i=countRemote.count();
????? countRemote.remove();
????? }???
??}
?5.//配置EJB配置文件下的sun-ejb-jar.xml
??Bean pool:(Stateless)
??穩定池大小:
??調整數量:
??最大池數量:
??池空閑超時秒數:
??Bean cache:(Stateful)??
??最大緩存大小:
??調整數量:
??是否允許緩存溢出:(有些不支持)
??緩存空閑超時秒數:
??刪除超時秒數:>100
??犧牲者選擇策略:LRU
==============================================================================================
EJB day3 Friday 2007.3.30
WebService:主要目標是跨平臺的可互操作性。為了達到這一目標,WebService完全基于XML(可擴展標記語言)、XSD(XMLSchema)等獨立于平臺、獨立于軟件供應商的標準,是創建可互操作的、分布式應用程序的新平臺。
?1.用EJB生成WebService
???1)寫Session Bean(聲明為WebService);
???@Stateless
???//聲明生成WebService發布,服務名(serviceName):AdderService,(portName):AdderSerevicePort
???@WebService(serviceName="AdderService",portName="AdderServicePort")
???public class AdderBean implements AdderLocal {
??????
?????? /** Creates a new instance of AdderBean */
?????? public AdderBean() {
?????? }
????//聲明該方法在WebService中發布,如果所有的方法都不加,默認都發布
?????? @WebMethod
?????? public int add(int a, int b) {
?????????? //TODO implement add
?????????? return a+b;
?????? }??
???}
???2).部署(Deploy)到服務器上.在瀏覽器上獲取他的地址(http://localhost:8080/AdderService/AdderBean?WSDL)
????生成的是xml文檔
???3).在客戶端創建Web Service Client->WSDL URL:http://localhost:8080/AdderService/AdderBean?WSDL
????創建成功會訪問服務器把應用下載到本地,生成相關的java.class和*.java等文件.包括:
????AdderService.java:連接WebService的靜態類,獲取AdderBean的實體
????AdderBean.java:只是接口(暴露所提供的方法),以便我們調用
???4).(可選)寫一個測試類,創建一個java main class
????package test;
????import java.net.MalformedURLException;
????import java.net.URL;
????import javax.xml.namespace.QName;
????import javax.xml.ws.Service;
????public class AdderTest {
??????? public AdderTest() {}
??????? public static void main(String[] args) throws MalformedURLException {
??????????? //靜態
?????/獲取服務對象
??????????? AdderService service=new AdderService();
?????//獲得Session Bean
??????????? AdderBean adderBean=(AdderBean)service.getAdderServicePort();
?????//調用他暴露的方法
??????????? System.out.println(adderBean.add(12,23));
??????????? //動態
??????????? URL wsdlURL=new URL("http://localhost:8080/AdderService/AdderBean?WSDL");
??????????? QName serviceName=new QName("http://day03/", "AdderService");
??????????? Service service2=Service.create(wsdlURL,serviceName);
??????????? adderBean=(AdderBean)service.getAdderServicePort();
??????? ?? System.out.println(adderBean.add(12,23));
??????? }???
????}
??
2.Message Service(JMS)
?創建queue message服務(點對點),發送者,接收者
?發送者->queue message->一個接收者
?1).在sun java System Application Server上創建消息轉發:
??Application Server->Resources->JMS Resources->Connection Factories->new[JNDI Name=jms/cfA?Type=javax.jms.ConnectionFactory{自動區別queue或topic}]
??Application Server->Resources->JMS Resources->Destination Resources->new[JNDI Name=jms/queueA?Type=javax.jms.Queue?name={必須有,隨便輸}]?
?2).客戶端必須創建Enterprise Applicaton Client下創建發送者,和接收者
???import javax.jms.Connection;
???import javax.jms.ConnectionFactory;
???import javax.jms.MessageProducer;
???import javax.jms.Queue;
???import javax.jms.Session;
???import javax.jms.TextMessage;
???import javax.naming.Context;
???import javax.naming.InitialContext;
???import javax.naming.NamingException;
???public class Sender {
?????? public Sender() {}
?????? public static void main(String[] args) throws Exception {
????System.setProperty("jndi.factory","com.sun.jndi.cosnaming.CNCtxFactory");
????System.setProperty("jndi.provider.url","corbaloc::localhost:3700/NameService");
?????????? Context context=new InitialContext();
?????????? ConnectionFactory cf=(ConnectionFactory) context.lookup("jms/cfA");???????
?????????? /*
?????????? //等價上面2行
?????????? context context2=context.lookup("jms");
?????????? ConnectionFactory cf2=context2.lookup("cfA");
?????????? */
?????????? Queue queueA=(Queue) context.lookup("jms/queueA");
?????????? Connection con=cf.createConnection();
?????????? //false不支持事務(自動通知接收者),手動通知
?????????? Session session=con.createSession(false,Session.AUTO_ACKNOWLEDGE);
?????????? MessageProducer producor=session.createProducer(queueA);
?????????? TextMessage msg=session.createTextMessage();
?????????? msg.setText("***********");
?????????? producor.send(msg);
?????????? System.out.println("send completed!!!");
?????//關閉連接
?????????? con.close();
?????? }
???}
??? 3.接收者
???public class Receiver {
?????? public Receiver() {}
?????? public static void main(String[] args) throws Exception {
????System.setProperty("jndi.factory","com.sun.jndi.cosnaming.CNCtxFactory");
????System.setProperty("jndi.provider.url","corbaloc::localhost:3700/NameService");
?????????? Context context=new InitialContext();
?????????? ConnectionFactory cf=(ConnectionFactory) context.lookup("jms/cfA");
?????????? Queue queueA=(Queue) context.lookup("jms/queueA");
?????????? Connection con=cf.createConnection();
?????????? //false不支持事務(自動通知接收者),手動通知
?????????? Session session=con.createSession(false,Session.AUTO_ACKNOWLEDGE);
?????????? MessageConsumer consumer=session.createConsumer(queueA);
?????????? //必需告訴消息服務器,準備好了
?????????? con.start();
?????????? //沒有接收到消息則阻塞,每次只接收一條消息
?????????? TextMessage msg=(TextMessage) consumer.receive();
?????????? System.out.println(msg.getText());
??????????? con.close();
?????? }???
???}
?==============================================================================================
EJB day4 Friday 2007.4.2
1.Message Service(JMS)監聽器(監聽者、接收者)
?1).Message-Driven Bean(MDB):需要實現兩個接口:
??javax.jms.MessageListener
??javax.ejb.MessageDrivenBean(可選)
??它一般是無狀態bean.生命周期有:@PostConstruct、@PreDestroy?
??用NetBeans寫MDB
???選擇新建文件:[EJB 模塊]->Enterprise->Message-Driven Bean(MDB)->[類名、包名、消息類別]
??//mappedName:表示服務器上的DNJI名。
??@MessageDriven(mappedName = "jms/queueA", activationConfig =? {
???//
????? @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
????? //消息的類型;Queue:隊列、Topic:主題
????? @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue",
????? //(可選)消息選擇器,JMSType='1':該監聽器只接收類型為‘1’的消息,需要在發送者發送消息時著名類型:
????? @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "JMSType='1'"
????? )
??})
??public class Inserter implements MessageListener {
?????
????? @Resource(name = "jdbc/sample")
????? private DataSource jdbcSample;
?????
????? /** Creates a new instance of Inserter */
????? public Inserter() {
????? }
?????
????? public void onMessage(Message message) {
????????? if(message instanceof TextMessage){
????????? ??//文本消息
????????????? TextMessage msg=(TextMessage) message;
????????????? //對象消息
//???????ObjectMessage msg=(ObjectMessage)message4;
????????????? request = msg.getText();????????????
????????????? }
????????? }
????? }?????
??}
2. Return Results Back to Message Producers(發送者發送消息,并接收返回消息)

3.The Entity Class(實體)
??1).用NetBeans寫MDB
???選擇新建文件:[EnterpriseApplication-app-client]->Persistence(持久性)->Entity class->[類名、包名、創建持久性單元(選擇數據庫)]
??2).為實體類寫一個stateless Session Bean
@Stateless
public class AccountSLBean implements AccountSLRemote {
??//注入持久性管理器
??? @PersistenceContext
??? private EntityManager em;
???
??? /** Creates a new instance of AccountSLBean */
??? public AccountSLBean() {
??? }

??? public void doSomething(){
??????? Account a1=new Account();
??????? a1.setBalance(1000);
??????? a1.setOwerName("yoogo");
??????? //持久化到數據庫
??????? em.persist(a1);?????????????
??? }
???
??? public Account findByPrimaryKey(Long id){
??????? return em.find(Account.class,id);
??? }
???
??? public List findAll(){
??????? String s="select a from Account a";
??????? return em.createQuery(s).getResultList();
??? }
}??

==============================================================================================
EJB day5 Tuesday 2007.04.03
1.EntityManager(實體管理器)中的方法

?1). EntityManager.createQuery(String s);//等效于JDBC中的PreparedStatement()
???? Query query=entityManager.createQuery("select a from Acount a where name= :name");
???? query.setParamenter("name","hiloo");
?
?2). EntityManager.createNameQuery("select * from acount");//直接使用SQL語句
?3). EntityManager.createNamedQuery();//
???? 類前面聲明namedQuery
???? @NamedQuery(name="findAll",query="select a from Account a")
???? class AccountBean{
???? //....中間代碼
???? Query query=entityManager.createNamedQuery("findAll");
???
2.實體管理器注釋
?@PersistenceContext(type=PersistenceContextType.EXTENDED)?? //用于stateful session bean
?@PersistenceContext(type=PersistenceContextType.TRANSACTION)?? //用于stateless session bean
?
?@Stateful
?public class AccountSFBean implements AccountSFRemote {
???? unitName="EntityBean1-
???? @PersistenceContext(type=PersistenceContextType.EXTENDED)
???? private EntityManager em;??
???? Account a;
???? public AccountSFBean() {}
???? public Account open(Long id,String name){
???????? a=em.find(Account.class,id);
???????? if(a==null){
???????????? a=new Account();
???????????? a.setOwerName(name);
???????????? em.persist(a);
???????? }
???????? return a;
???? }
???? public void deposit(double amount){
???????? a.setBalance(a.getBalance()+amount);
???? }??
???? public void withdraw(double amount){
???????? a.setBalance(a.getBalance()-amount);
???? }??
?}

3.Entity Life cycle(實體的聲明周期)
?@PrePersist?? //持久化前調用該方法
?@PostPersist?? //持久化后調用該方法
?@PreUpdate?? //更新前調用該方法
?@PostLoad?? //加載后調用該方法
?舉例:
???? 1).寫一個EntityListener(實體監聽器)
?public class AccountListener{
???? @PrePersist
???? public void prePersist(Account a){//代碼塊}
???? @Postpersist
???? //....? 同PrePersist
?}
???? 2).在Entity中注冊EntityListener
?@Entity
?@EntityListeners(AccountListener.class)
?public class Account implements Serializable{
???? @Id
???? @GeneratedValue(strategy=GenerationType.AUTO)
???? private Long accountno;
???? @Cloumn
???? private String name;
???? //...
?}

?


實體的狀態
?
new新建,也就是新建的實體實例,其信息還沒有持久到數據庫中。
managed受管狀態,也就是實體已經持久化到數據庫中,并且已經和持久化上下文進行了關聯。
detached分離狀態,也就是與持久化上下文解除關聯的實體的狀態
removed刪除,此時實體和持久化上下文進行了關聯,但是要從數據庫中刪除這個實體。
?
?
? new????? persist()??? 中止PersistenceContext >
? ——>新建————>受管========================分離
???????????????????? ||/?? <? merge()
??????????? remove()/|| persist()
??????????????????? 刪除
?
?
@PersistenceContext,持久化上下文是內存中的實例和數據庫間的連接樞紐,就像是一快緩沖區,但這個緩沖區是由容器來進行管理的,在這個緩沖區中的實體是處在受管理狀態。
?
@PersistenceContext(type=PersistenceContextType.EXTENDED,unitName="PetPU")
type屬性使用來標識持久化上下文的類型的,持久化上下文有兩種類型事務范圍和擴展的。這兩種類型的持久化上下文的生命周期不同。unitName屬性是指定持久化單元的名字,其值是在持久化單元定義文件中persistence-unit標簽中的name屬性的值。
?
事務范圍的持久化上下文應用到無狀態SessionBean,一旦事務終結,就銷毀,其中的實體也會變成分離狀態。
擴展的持久化上下文應用在有狀態的SessionBean,只有在有狀態的SessionBean被容器銷毀是才會銷毀持久化上下文,也就使實體一直是被管理的。
?
持久化單元的定義文件,這個文件是描述數據庫連接和事務管理的文件
?
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
??? <!--"JTA"用于容器狀態;"RESOURCE_LOCAL":非容器-->
? <persistence-unit name="PetPU" transaction-type="JTA">
??? <!--transaction-type是事務管理的類型-->
??? <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
??? <!--SPI,持久化API的實現類的提供者-->
??? <jta-data-source>my.jdbc</jta-data-source>
???? <!--數據源的配置-->
??? <properties>
????? <property name="toplink.ddl-generation" value="create-tables"/>
??? </properties>
? </persistence-unit>
</persistence>
?
EntityManager實體管理器,它是用來管理實體的,如果使用容器管理實體,容器就會注入EntityManager,EntityManager可以提供實體類生命周期管理,實現數據的同步,和實體的數據的查詢。
?
實體生命周期回調方法
?
實體的生命周期回調方法不是通用的。
在實體類中定義時,只在方法前加標注,并且方法的返回值為void,方法為public
也就是:
?
@PrePersist
public void save(){}
在另外的類中寫生命周期回調方法時,就需要以這個實體類為參數了
class AcountListenter{
@PrePersist
public void save(Acount a){}
}
?
@Entity
@EntityListenters(AcountListenter.class)
class Acount...
?
PostPersist
PreRemove
PostRemove
PreUpdate
PostUpdate
PostLoad

總結

以上是生活随笔為你收集整理的tarena学习EJB笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。