例子使用的工具:MyEclipse6.6,Jboss5.1, Tomcat6.18.
实现功能描述:通过Struts2调用EJB3.0的远程方法,完成简单的登陆功能,只是简单的字符串比对,未使用持久层。
首先创键EJB project,我的项目名称为:S2Login。然后定义Session Bean LoginServiceBean实现远程接口LoginServiceBeanRemote,代码如下:
远程接口:
1 package com.elric.s2login.ejb.sessionbeans;
2
3 import javax.ejb.Remote;
4
5 @Remote
6 public interface LoginServiceBeanRemote
7 {
8 public boolean login(String name,String pwd);
9 }
10
实现接口类:
1 package com.elric.s2login.ejb.sessionbeans;
2
3 import javax.ejb.Remote;
4 import javax.ejb.Stateless;
5
6 @Stateless
7 @Remote
8 public class LoginServiceBean implements LoginServiceBeanRemote
9 {
10
11 public boolean login(String name, String pwd)
12 {
13 if (name.equalsIgnoreCase("zhangsan") && pwd.equalsIgnoreCase("123"))
14 return true;
15 else
16 return false;
17 }
18
19 }
20
然后部署到JBoss服务器上,启动服务器,登入查看JNDI信息,记录下来:
接下来,编写客户端部分了。我们使用Struts2来完成登录页面和业务调用,Web.xml、struts.xml、index.jsp、LoginAction的开发配置如下:
web.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
6 <welcome-file-list>
7 <welcome-file>index.jsp</welcome-file>
8 </welcome-file-list>
9 <!-- 定义Struts 2的FilterDispatcher的Filter -->
10
11 <filter>
12 <!-- 定义核心Filter的名字 -->
13 <filter-name>struts2</filter-name>
14 <!-- 定义核心Filter的实现类 -->
15 <filter-class>
16 org.apache.struts2.dispatcher.FilterDispatcher
17 </filter-class>
18 </filter>
19
20 <!-- FilterDispatcher用来初始化Struts 2并且处理所有的Web请求 -->
21 <filter-mapping>
22 <filter-name>struts2</filter-name>
23 <url-pattern>/*</url-pattern>
24 </filter-mapping>
25
26 </web-app>
27
struts.xml
1 <?xml version="1.0" encoding="GBK"?>
2
3 <!-- 指定Struts 2配置文件的DTD信息 -->
4
5 <!DOCTYPE struts PUBLIC
6
7 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
8
9 "http://struts.apache.org/dtds/struts-2.0.dtd">
10
11 <!-- struts是Struts 2配置文件的根元素 -->
12
13 <struts>
14
15 <!-- Struts 2的Action必须放在指定的包空间下定义 -->
16
17 <package name="struts2" extends="struts-default">
18
19 <!-- 定义login的Action,该Action的实现类为lee.Action类 -->
20
21 <action name="Login" class="com.elric.s2login.actions.LoginAction">
22
23 <!-- 定义处理结果和资源之间映射关系。 -->
24
25 <result name="error">/error.jsp</result>
26
27 <result name="success">/welcome.jsp</result>
28
29 </action>
30
31 </package>
32
33 </struts>
34
35
36
index.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2 <%@ taglib uri="/struts-tags" prefix="s"%>
3 <%
4 String path = request.getContextPath();
5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
6 %>
7
8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
9 <html>
10 <head>
11 <base href="<%=basePath%>">
12
13 <title>My JSP 'index.jsp' starting page</title>
14 <meta http-equiv="pragma" content="no-cache">
15 <meta http-equiv="cache-control" content="no-cache">
16 <meta http-equiv="expires" content="0">
17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18 <meta http-equiv="description" content="This is my page">
19 <!--
20 <link rel="stylesheet" type="text/css" href="styles.css">
21 -->
22 </head>
23
24 <body>
25 Struts2结合EJB3.0完成登录操作:
26 <s:form action="Login" method="post">
27 <s:textfield name="username" label="用户名"></s:textfield>
28 <s:password name="password" label="密 码"></s:password>
29 <s:submit value="提交"></s:submit>
30 </s:form>
31 </body>
32 </html>
33
LoginAction
1 package com.elric.s2login.actions;
2
3 import com.elric.s2login.biz.BizLogin;
4 import com.opensymphony.xwork2.ActionSupport;
5
6 public class LoginAction extends ActionSupport
7 {
8 /**
9 *
10 */
11 private static final long serialVersionUID = 1L;
12 private String username;
13 private String password;
14
15
16 public String getUsername()
17 {
18 return username;
19 }
20
21 public void setUsername(String username)
22 {
23 this.username = username;
24 }
25
26 public String getPassword()
27 {
28 return password;
29 }
30
31 public void setPassword(String password)
32 {
33 this.password = password;
34 }
35
36 // 具体业务实现方法
37 public String execute()
38 {
39
40 String name = this.getUsername();
41 String pwd = this.getPassword();
42
43
44 Boolean b;
45 try
46 {
47 b = new BizLogin().isLogin(name, pwd);
48
49 } catch (Exception e)
50 {
51 e.printStackTrace();
52 return ERROR;
53 }
54
55 if (b)
56 return SUCCESS;
57 else
58 return ERROR;
59 }
60
61
62 }
63
这里,我定义了一个BizLogin来完成EJB的远程调用。
Ps:这里发现一个问题,使用Properties文件来配置JNDI会报一个命名空间异常,无法远程调用Jboss上的登陆方法。所以,我在这里只有老老实实的写段Properties代码。
1 package com.elric.s2login.biz;
2
3 import java.util.Properties;
4
5 import javax.naming.InitialContext;
6
7 import com.elric.s2login.ejb.sessionbeans.LoginServiceBeanRemote;
8
9 public class BizLogin
10 {
11 public boolean isLogin(String name, String pwd)
12 throws Exception
13 {
14 Properties props = new Properties();
15 props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
16 props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
17 props.setProperty("java.naming.provider.url", "localhost:1099");
18
19 InitialContext ctx = new InitialContext(props);
20 LoginServiceBeanRemote s = (LoginServiceBeanRemote) ctx
21 .lookup("LoginServiceBean/remote");
22 System.out.println("是否成功调用远程方法: "+s.login(name, pwd));
23 return s.login(name, pwd);
24 }
25 }
26
Lookup方法中使用我们在JBoss中记录下来的命名空间。
这里注意一点,ctx.Lookup(“LoginServiceBean/remote”)方法返回的类型我们强转为LoginServiceBean的接口,也就是其代理类。否则会报个代理错误的异常!
最后,也是最重要的一点,我们还要将Jboss里面client文件夹下的所有jar包都复制进lib下面!这里试过很多办法想去掉些jar,但项目总不能运行,所以全部使用。(光引入Jbossall-client是无效的,它只是个引用其他30多个Jar的只记录了地址信息的Jar包,也试过把它上面引用的Jar统统拷进lib中,但项目依然报错!)
Ok,开发就此完成,部署后成功运行!
posted on 2009-08-04 08:50
Rique 阅读(1959)
评论(2) 编辑 收藏 所属分类:
MVC领域 、
Webservices和EJB