EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean...
該jboss集成到eclipse
關掉Jboss控制臺新聞Ctrl+c,在MyEclipse→Servers→Jboss可配置JBoss。
通過ANT提高EJB應用的開發效率
在HelloWorld 增加ANT,右擊項目新建xml:build.xml,右擊打開方式選擇Ant ..
相應用進行編譯、打包、公布、解公布
?
<?xml version="1.0" encoding="UTF-8"?
> <!--basedirz項目所在路徑,.代表在build.xml的所在路徑--> <project name="HelloWorld" basedir="."> <property name="src.dir" value="${basedir}\src"></property> <!--指的是系統變量--> <property environment="env"></property> <property name="jboss.home" value="${env.JBOSS_HOME}"></property> <!--用于指定眼下JBoss使用的配置項--> <property name="jboss.server.config" value="default"></property> <!--用于編譯源文件class類存放的文件夾--> <property name="build.dir" value="${basedir}\build"></property> <!--ejb依賴的jar文件--> <path id="build.classpath"> <fileset dir="${jboss.home}\client"> <include name="*.jar"/> </fileset> <pathelement location="${build.dir}"/> </path> <target name="prepare"> <delete dir="${build.dir}"></delete> <mkdir dir="${build.dir}"></mkdir> </target> <target name="compile" depends="prepare" description="編譯"> <!--對源文件進行編譯。destdir編譯后class存放文件夾--> <javac srcdir="${src.dir}" destdir="${build.dir}"> <!--編譯依賴的jar文件--> <classpath refid="build.classpath"></classpath> </javac> </target> <target name="EJBjar" depends="compile" description="創建EJB公布包"> <!--${ant.project.name}就是上面的name HelloWorld--> <jar jarfile="${basedir}\${ant.project.name}.jar"> <fileset dir="${build.dir}" > <include name="**/*.class"/> </fileset> </jar> </target> <target name="deploy" depends="EJBjar" description="公布EJB"> <copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"></copy> </target> <target name="undeploy" description="卸載ejb"> <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"></delete> </target> </project>
?公布:在servers視圖啟動Jboss。然后在build.xml的大綱視圖右擊deploy→run as → Ant ..
(發現編碼問題我項目是GBK,把項目改成UTF-8就可以);
?
卸載EJB,要先停止Jboss在運行undeploy就可以;
開發具有本地接口的無狀態bean
???????? 之前我們介紹過遠程接口。通過一個遠程接口調用EJB的過程。首先client須要與EJB建立socket通信。在通信管道上它們須要來回發送IIOP協議信息,由于數據要在網絡進行傳輸,存放數據的Java對象必須要進行序列化。在這個過程。有網絡通信的開銷、協議解析的開銷、對象序列化的開銷等。由于EJB是分布式技術。它同意client與EJB應用在不同機器上。所以這些性能開銷也是必定的。
???????? 可是在實際開發中,client與EJB應用執行在同一個JBoss中。
這時候client訪問EJB是否有必要走上面的網絡通信呢?據我們所知,這時候client與EJB是在同一個JVM內,他們之間全然能夠通過內存進行交互,這樣就能夠避免網絡通信的性能開銷。既然我們都想到了這一點,EJB專家組也想到了這一點,所以引入了本地接口。通過本地接口調用EJB,直接在內存中交互。這樣就能避免因網絡通信所造成的各種性能開銷。可是有一點。大家必須注意,僅僅有client與EJB應用在同一個JVM內執行的時候,我們才干調用本地接口,否則僅僅能調用遠程接口。
僅僅要client與EJB公布在同一個JBoss內。我們就覺得他們是在同一個JVM。
????????
?
client和EJB部署到同機器上面
將HelloWorldBean指定為本地接口(@Remote改動為@Local):
@Stateless
@Local(HelloWorld.class)
public classHelloWorldBean implementsHelloWorld {
?
本地接口的無狀態bean已經被開發出來了。
通過Ant的deploy部署到EJB中。
?
新建一個web Project 做為EJB的client。而且部署到Jboss中,這樣client和EJB就在同一個jvm中了。
新建Web Projcet:EJBClient,部署到Jboss。
在用jsp調用EJB。新建test.jsp,將編碼格式換成utf-8,這樣就能夠通過本地接口訪問EJB了(把HelloWorld項目引用進來:右擊項目Build Path→Conf…→Projects→add):
?
<%@ pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@ pageimport="javax.naming.*,cn.hqu.ejb3.*"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
?
<!DOCTYPEHTMLPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
? <head>
??? <basehref="<%=basePath%>">
???
??? <title>My JSP'test.jsp' starting page</title>
???
??? <metahttp-equiv="pragma"content="no-cache">
??? <metahttp-equiv="cache-control"content="no-cache">
??? <metahttp-equiv="expires"content="0">???
??? <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
??? <metahttp-equiv="description"content="This is my page">
??? <!--
??? <linkrel="stylesheet" type="text/css"href="styles.css">
??? -->
?
? </head>
?
? <body>
????? <%
?????? try {
?????????? InitialContextctx = new InitialContext();
?????????? HelloWorldhelloworld = (HelloWorld) ctx
????????????????? .lookup("HelloWorldBean/local");
?????????? out.println(helloworld.sayHello("本地的蘇志達"));
?????? }catch (NamingException e) {
?????????? e.printStackTrace();
?????? }
??? %>
? </body>
</html>
?
client應用開發完了。導出war文件,將war文件復制到Jboss的公布文件夾下,看控制臺發現應用公布成功了(能夠通過MyEclipse部署項目到Jboss,啟動Jboss就可以公布)
http://localhost:8080/EJBClient/test.jsp
?
通過本地接口調用EJB成功了。web應用和EJB部署到同一個Jboss中的。在同一個jvm中。能夠進行訪問。
?
client和EJB部署到不同機器上面。
新建一個本地接口,在HelloWorld項目新建HelloWorldLocal接口。繼承遠程接口HelloWorld。
HelloWorldBean實現HelloWorldLocal和HelloWorld接口。
?
@Stateless
@Remote(HelloWorld.class)
@Local(HelloWorldLocal.class)
public class HelloWorldBean implements HelloWorld,HelloWorldLocal {
??? @Override
??? public StringsayHello(String name) {
??????? return name+"說:你好!
";
??? }
}
?
部署同一個機器上的時候優先調用本地,不同機器上我們僅僅能通過遠程接口訪問。
本地調用:部署啟動JBoss執行http://localhost:8080/EJBClient/test.jsp
遠程調用:
將HelloWorld的EJBClient類改為遠程接口:
HelloWorldhelloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
部署公布:執行Ant deploy,啟動Jboss執行main方法。
在client通過遠程接口調用EJB,如今他們是在不同JVM內的,僅僅能通過遠程接口訪問,執行EJBCLient的mian方法。成功訪問到。
?
在實際應用中我們最好把本地接口和遠程借口都實現出來。主要是能夠解決能夠公布在同一個Jboss或者不同Jboss都能夠使用。
開發有狀態bean
僅僅須要改動@Stateless為@Stateful就能夠標注為有狀態bean
@Stateful
@Remote(HelloWorld.class)
@Local(HelloWorldLocal.class)
public class HelloWorldBean implementsHelloWorld,HelloWorldLocal {
??? @Override
??? public StringsayHello(String name) {
??????? return name+"說:你好。";
??? }
}
?
Ant deploy部署
?
有狀態和無狀態在代碼上需然區別不大。可是採用對bean的管理的技術的不一樣的.
Bean實例的兩種管理技術
1.無狀態bean使用實例池技術管理bean
2.有狀態bean使用激活(activation)管理bean
???????? 每一個用戶都有自己的Bean實例,相當于有多少個用戶就有多少個Bean實例為之服務。假設不採取不論什么機制,這樣必定會導致server資源嚴重消耗,最后落個down機罷工。
為了解決問題。EJB引入了激活機系統。該機構的原理來實現,這是,在EJBserver如果有必要,節約資源。從內存中恢復bean示例。將舉行它的會話狀態序列化到磁盤,他們占用內存釋放。如果此時client正確EJB再次發起請求,EJB再次實例化一個容器Bean示例,并從硬盤的狀態恢復在先前。
碼:http://pan.baidu.com/s/1gdGIi8V
轉載于:https://www.cnblogs.com/yxwkf/p/5042703.html
總結
以上是生活随笔為你收集整理的EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络邻居无法共享解决办法
- 下一篇: 使用Exchange 的SMTP连接器路