<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

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


    網站導航:
     
    主站蜘蛛池模板: 日本免费网址大全在线观看| 好大好硬好爽免费视频| 麻豆精品不卡国产免费看| 18未年禁止免费观看| 国产精品成人四虎免费视频| 中国亚洲女人69内射少妇| 亚洲精品国产福利在线观看| 亚洲AV无码资源在线观看| 免费成人在线视频观看| 久热综合在线亚洲精品| 亚洲精品9999久久久久无码| 男女午夜24式免费视频| 国产美女无遮挡免费网站| 相泽南亚洲一区二区在线播放| 99爱免费观看视频在线| 亚洲色图综合在线| 亚洲国产成人精品激情| 久久久久免费视频| 免费无码黄动漫在线观看| 少妇中文字幕乱码亚洲影视| 午夜在线免费视频 | 亚洲精品成人无限看| 亚洲AV无码男人的天堂| 亚洲AⅤ永久无码精品AA | 亚洲精品在线播放视频| 最新中文字幕免费视频| 久久水蜜桃亚洲av无码精品麻豆| 日本免费人成在线网站| 亚洲影院在线观看| 国内自产拍自a免费毛片| 尤物视频在线免费观看| 亚洲国产一区二区a毛片| baoyu777永久免费视频| 一区二区三区亚洲视频| 丁香花在线视频观看免费| 亚洲色偷拍区另类无码专区| 91免费福利精品国产| 亚洲日本视频在线观看| 久久久精品2019免费观看| 亚洲av无码一区二区三区天堂| 亚洲精品无码mv在线观看网站|