Struts2+EJB+JBoss的集成Demo
因为Struts2仅仅是一个MVC框架,在JavaEE企业级开发中不像JavaEE标准那么吃香,很多东西得自己来做。这就是为什么很多EJB项目的Web前端都是JSF或者直接就是JSP+Servlet,而不是Struts2了。
新建一个Struts2的项目,之后先看Action代码
package action;
import javax.naming.InitialContext; import javax.naming.NamingException; import com.opensymphony.xwork2.ActionSupport; import ejb.messageDrivenBean.dto.UserDTO; import ejb.sessionBean.UserService;
public class EJBAction extends ActionSupport {
/** * */ private static final long serialVersionUID = 1L;
private UserDTO userDTO;
public UserDTO getUserDTO() { return userDTO; }
public void setUserDTO(UserDTO userDTO) { this.userDTO = userDTO; }
/** * @return */ public String execute() {
UserService userService;
if (userDTO != null) { InitialContext ctx; try { ctx = new InitialContext(); userService = (UserService) ctx .lookup("myear/UserServiceEAOImpl/local"); userService.insertUser(userDTO); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} return SUCCESS; } } |
这里需要指出的就是红色代码部分,通过全局的JNDI名称来获取SessionBean的实例,之后执行业务。在这个JNDI参数中myear是打包后的ear名称。此处必须指明全局的JNDI名称才行。页面代码和servlet页面代码差不多,只是在form中有一些属性变量不一致罢了在此就不再赘述了,Struts2配置文件如下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts>
<package name="ejb" extends="struts-default"> <action name="EJBAction" class="action.EJBAction"> <result name="success">insertUserFormList.jsp</result> </action> </package> </struts> |
打成war包后放入ear包中,修改application.xml文件后重新部署此ear。运行效果与servlet差不多。在此就不再赘述。其实关键就是Action中的EJB组件是通过应用上下文通过全局的JNDI名称获取的服务对象。不用全局名称,会发生找不到绑定名的Exception。