<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大鳥的學習樂園
    路漫漫其修遠兮,吾將上下而求索
    posts - 26,comments - 27,trackbacks - 0
    利用JBOSS+MyEclipse完成一個簡單的EJB示例

    目標:
    1、編寫一個簡單的無狀態會話Bean,傳入一個字符串參數,返回字符串Hello +
    字符串參數。
    2、通過JSP頁面上輸入一個字符串,提交到Servlet,并調用EJB,最后在一個頁面上輸出處
    理后的字符串。
    工具:
    JBOSS 4.2GA + Eclipse 3.2.2 +MyEclipse 5.5GA + JDK 1.6

    首先需要搭建好各種環境,這一步比較簡單,就不再贅述。唯一需要注意的是在啟動JBOSS
    服務器時可能會出現一些問題。如端口號被占用而導致服務器無法啟動。如果出現這個問題
    可以在%JBOSS%/server/default/deploy/jboss-web.deployer/目錄下找到server.xml文件
    ,修改<Connector port="8080" address="${jboss.bind.address}"
             maxThreads="250" maxHttpHeaderSize="8192"
             emptySessionPath="true" protocol="HTTP/1.1"
             enableLookups="false" redirectPort="8443" acceptCount="100"
             connectionTimeout="20000" disableUploadTimeout="true" />
    中的port屬性,然后再重新啟動服務器。默認端口是8080。

    JBOSS自帶了TOMCAT
    5.X,當然也可以使用另外的Web服務器,不過后面的程序會稍微有些改動。
    環境搭建完成后就需要編寫EJB代碼。一個EJB至少需要3個類,即Home接口、遠程接口、實
    現類。新建一個EJB Project,項目名為:MyFirstEJB.
    -----------------------------------------------------------------------------------------
    1、創建Home接口---HelloHome.java
    package com;

    public interface HelloHome extends javax.ejb.EJBHome {
        public Hello create() throws javax.ejb.CreateException,
                java.rmi.RemoteException;
    }
    -----------------------------------------------------------------------------------------
    2、創建遠程接口---Hello.java
    package com;

    public interface Hello extends javax.ejb.EJBObject {
           public String sayHello(String message) throws java.rmi.RemoteException;

    }
    -----------------------------------------------------------------------------------------
    3、創建實現類---HelloBean.java
    package com;

    import java.rmi.RemoteException;

    import javax.ejb.CreateException;
    import javax.ejb.EJBException;
    import javax.ejb.SessionBean;
    import javax.ejb.SessionContext;

    public class HelloBean implements SessionBean {

        private SessionContext context;

        public HelloBean() {

        }

        public String sayHello(String message) {
            if (message == null)
                message = "";
            message = "i am xiongxiong.Hello " + message + "!";
            return message;
        }

        public void ejbActivate() throws EJBException, RemoteException {
       

        }

        public void ejbPassivate() throws EJBException, RemoteException {

        }

        public void ejbRemove() throws EJBException, RemoteException {

        }

        public void setSessionContext(SessionContext newContext)
                throws EJBException {
            context = newContext;
        }

        public void ejbCreate() throws CreateException {

        }

        public void replaceWithRealBusinessMethod() throws EJBException {

        }

    }

    -----------------------------------------------------------------------------------------
    其中方法sayHello就是我們需要實現的業務。
    類建好之后,接下來就需要配置相關的xml文件。在該項目下的META-INF里新建兩個xml文件
    ejb-jar.xml和jboss.xml。具體配置如下:
    -----------------------------------------------------------------------------------------
    ejb-jar.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
    <ejb-jar>
           <description>
                  <![CDATA[No Description.]]>
           </description>
           <display-name>Generated by XDoclet</display-name>
           <enterprise-beans>
                  <session>
                         <description>
                                <![CDATA[Description for Hello]]>
                         </description>
                         <display-name>Name for Hello</display-name>
                         <ejb-name>Hello</ejb-name>
                         <home>com.HelloHome</home>
                         <remote>com.Hello</remote>
                         <ejb-class>com.HelloBean</ejb-class>
                         <session-type>Stateless</session-type>
                         <transaction-type>Container</transaction-type>
                  </session>
           </enterprise-beans>
           <assembly-descriptor>
           </assembly-descriptor>
    </ejb-jar>

    -----------------------------------------------------------------------------------------
    jboss.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 2.4//EN" "http://www.jboss.org/j2ee/dtd/jboss_2_4.dtd">
    <jboss>
       <enterprise-beans>
          <session>
             <ejb-name>Hello</ejb-name>
             <jndi-name>ejb/Hello</jndi-name>
          </session>
       </enterprise-beans>
       <resource-managers>
       </resource-managers>
    </jboss>
    -----------------------------------------------------------------------------------------
    使用XDoclet來自動生成這些文件還是很方便的,只是同時會生成一些多余的類和代碼,需
    要手動去刪除他們。

    到這里一個簡單的無狀態會話Bean就完成了,下面就是將他們部署到Jboss下面。可以將項
    目打包成jar文件,然后放在
    %JBOSS%/server/default/deploy/目錄下,這樣就算部署完成。還可以使用MyEclipse來幫
    你進行部署。如果控制臺上出現:
    01:59:48,640 INFO [EjbModule] Deploying Hello
    01:59:48,703 INFO [ProxyFactory] Bound EJB Home 'Hello' to jndi 'ejb/Hello'
    01:59:48,703 INFO [EJBDeployer] Deployed:
    file:/%jboss%/server/default/deploy/MyFirstEJB.jar/
    就表示部署成功。下面我們就可以編寫客戶端程序來調用該EJB。

    新建一個Web項目,項目名為testEJB,里面包含兩個jsp文件和一個servlet。
    -----------------------------------------------------------------------------------------
    EJBServlet.java

    package com;

    import java.io.IOException;

    import javax.ejb.CreateException;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class EJBServlet extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doPost(request, response);
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("gb2312");
            String info = request.getParameter("info");
            InitialContext context = null;
            Hello hello = null;
            try {
                context = new InitialContext();
                HelloHome home = (HelloHome) context.lookup("ejb/Hello");
                hello = home.create();
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (CreateException e) {
                e.printStackTrace();
            }
            info = hello.sayHello(info);
            request.setAttribute("info", info);
            request.getRequestDispatcher("message.jsp").forward(request, response);
        }

    }
    -----------------------------------------------------------------------------------------
    從jsp頁面上獲得表單中的字符串,然后將這個字符串傳遞到EJB的會話Bean中進行處理。最
    后將返回的字符串顯示在另外一個JSP頁面上。
    -----------------------------------------------------------------------------------------
    index.jsp

    <%@ page language="java" isELIgnored="false" pageEncoding="gb2312"%>
    <html>
    <head>
        <title>EJB</title>
    </head>
    <body>
         <form action="servlet" method="post">
                <input type="text" name="info" />
                <input type="submit" value="提交">
         </form>
    </body>
    </html>
    -----------------------------------------------------------------------------------------
    message.jsp

    <%@ page language="java" isELIgnored="false" pageEncoding="utf-8"%>
    <html>
    <head>
        <title>message</title>
    </head>
    <body>
        <h1>${info }</h1>
    </body>
    </html>
    -----------------------------------------------------------------------------------------
    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4"
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>EJBServlet</servlet-name>
        <servlet-class>com.EJBServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>EJBServlet</servlet-name>
        <url-pattern>/servlet</url-pattern>
    </servlet-mapping>

    </web-app>
    -----------------------------------------------------------------------------------------


    如果Web項目和EJB項目在同一服務器中,那么象上面的程序運行是沒什么問題的。


    如果Web項目和EJB項目不在同一臺服務器中,或者同一臺服務器中使用的不是JBOSS自帶的T
    omcat,那么創建
    ClientTestEJB.java
    -----------------------------------------------------------------------------------------

    package com;

    import java.rmi.RemoteException;
    import java.util.Hashtable;

    import javax.ejb.CreateException;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.http.HttpServlet;

    public class ClientTestEJB extends HttpServlet {

        public static void main(String[] args) {

            String info = "";
            InitialContext context = null;
            Hello hello = null;
            /** *******************添加的代碼**************************** */
            Hashtable environment = new Hashtable();

            environment.put(Context.INITIAL_CONTEXT_FACTORY,
                    "org.jnp.interfaces.NamingContextFactory");
            environment.put(Context.URL_PKG_PREFIXES,
                    "org.jboss.naming:org.jnp.interfaces");
            environment.put(Context.PROVIDER_URL, "jnp://localhost:1099");
            /** ******************************************************** */

            try {
                context = new InitialContext(environment);
                HelloHome home = (HelloHome) context.lookup("ejb/Hello");
                hello = home.create();

                info = hello.sayHello(info);
            } catch (RemoteException e) {
               
                e.printStackTrace();
            } catch (NamingException e) {
           
                e.printStackTrace();
            } catch (CreateException e) {
           
                e.printStackTrace();
            }
            System.out.println(info);

        }

    }
    -----------------------------------------------------------------------------------------
    還需要將%jboss%/client/jbossall-client.jar
    和EJB項目的jar包拷貝到web 項目中WEB-INF\lib目錄或者CLASSPATH下。

    如果不是jsp或servlet調用EJB不會出現下面錯誤
    補充:在jsp或servlet中調用EJB時出現下面錯誤時:
    04:03:33,714 INFO [STDOUT] java.rmi.ServerException: EJBException:; nested
    exception is:
    javax.ejb.EJBException: Invalid invocation, check your deployment packaging,
    method=public abstract test.ejb.TestEJBInterface test.ejb.TestEJBHome.create()
    throws javax.ejb.CreateException,java.rmi.RemoteException
    解決辦法有三種:
    1、編輯%jboss%/server/default/conf/jboss-service.xml

    <mbean code="org.jboss.naming.NamingService"
          name="jboss:service=Naming"
          xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
          <!-- The call by value mode. true if all lookups are unmarshalled using
             the caller's TCL, false if in VM lookups return the value by reference.
          -->
          <attribute name="CallByValue">false</attribute>
           ...
    </mbean>
    將屬性CallByValue的值改為true

    2、編輯%jboss%/server/default/deploy/ear-deployer.xml

    <mbean code="org.jboss.deployment.EARDeployer"
          name="jboss.j2ee:service=EARDeployer">
               <attribute name="Isolated">false</attribute>
             <attribute name="CallByValue">false</attribute>
               <attribute name="EnablelibDirectoryByDefault">true</attribute>
       </mbean>
    將屬性Isolated和CallByValue的值改為true

    3、編輯%jboss%/server/default/deploy/jboss-web.deployer/META-INF/jboss-service.x
    ml

    <attribute name="Java2ClassLoadingCompliance">false</attribute>
           <attribute name="UseJBossWebLoader">false</attribute>
    將屬性Java2ClassLoadingCompliance和UseJBossWebLoader的值改為false,這里默認值一
    般都是false

    一般情況下,使用第二種方式就可以解決該問題。
    posted on 2009-09-14 19:41 大鳥 閱讀(424) 評論(0)  編輯  收藏 所屬分類: WEB

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲最大福利视频网站| 亚洲精品蜜桃久久久久久| 亚洲图片校园春色| 日韩在线不卡免费视频一区| 亚洲gv白嫩小受在线观看| 你懂的网址免费国产| 最新亚洲成av人免费看| 中文字幕在线视频免费观看 | 免费大片av手机看片高清| 日韩中文字幕在线免费观看| 极品色天使在线婷婷天堂亚洲| 国产男女猛烈无遮档免费视频网站 | 四虎影永久在线高清免费| 男女污污污超污视频免费在线看| 亚洲av高清在线观看一区二区| jizz免费在线观看| 亚洲AV无码专区亚洲AV伊甸园| 亚洲一区在线免费观看| 国产91在线|亚洲| 国产一级高清免费观看| 国产精品青草视频免费播放| 亚洲小视频在线观看| 成人午夜免费福利| 国产福利免费视频 | 91在线老王精品免费播放| 亚洲色图激情文学| 亚洲成A人片在线观看中文| 永久免费不卡在线观看黄网站| 亚洲精品456在线播放| 免费看大美女大黄大色| 国产精品无码永久免费888| 久久久久亚洲精品日久生情 | 亚洲第一页中文字幕| 国产一级淫片免费播放电影| 国产成人精品一区二区三区免费| 91精品国产亚洲爽啪在线观看| 国产高清免费在线| 午夜无码A级毛片免费视频| 亚洲精品无播放器在线播放| 精品国产亚洲一区二区三区 | 黄色a级片免费看|