在经历了一段时间的PHP操练之后,我又重新拿起了JAVA。恰好今天看到如何整合spring+struts的时候,发现问题一大堆,把这些问题总结下来,有以下几点:
(1)在整合前的准备工作
struts的库文件(包括struts2-spring-plugin-2.2.3.jar),以及spring框架的JAR。如果没有备齐,会出现在启动服务器的时候出现很多的Exception,以及虽然能成功部署,但是不能访问整合后的ACTION。
(2)整合的方法(两种)
第一种,“伪Action”。
这种方法主要是在struts.xml配置一个Action,不直接指向ACTION的CLASS文件,只是作为spring中与一个bean同名的“伪Action”。具体做法如下:
struts.xml的代码
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.custom.i18n.resources" value="messageResource"></constant> <constant name="struts.i18n.encoding" value="GBK"></constant> <package name="normal" extends="struts-default"> <action name="login" class="loginAction"> <result name="success">/welcome.jsp</result> <result name="error">/error.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
applicationContext.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <bean id="myService" class="org.lee.managersys.service.MyServiceImpl" /> <bean id="loginAction" class="org.lee.managersys.struts.LoginAction" scope="prototype"> <property name="ms" ref="myService" /> </bean> </beans>
第二种,利用自动装配。
Spring能够自动管理Bean之间的依赖关系,无须显示地指定ref依赖bean;
struts.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.custom.i18n.resources" value="messageResource"></constant> <constant name="struts.i18n.encoding" value="GBK"></constant> <package name="normal" extends="struts-default"> <action name="login" class="org.lee.managersys.struts.LoginAction"> <result name="success">/welcome.jsp</result> <result name="error">/error.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
applicationContext.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <bean id="ms" class="org.lee.managersys.service.MyServiceImpl" /> </beans>
第二种方法比第一个简洁,但是可读性差。不用新建Action的bean。
下面是此次示例中的相关代码。
业务逻辑层接口MyService.java
package org.lee.managersys.service; public interface MyService { public boolean valid(String user,String password); }
业务逻辑层组件MyServiceImpl.java
package org.lee.managersys.service; public class MyServiceImpl implements MyService{ @Override public boolean valid(String user,String password){ if(user.equals("aa") && password.equals("aa")){ return true; } else{ return false; } } }
处理用户请求LoginAction.java
package org.lee.managersys.struts; import org.lee.managersys.service.MyService; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{ private String user; private String password; private String tip; private MyService ms; public void setMs(MyService ms){ this.ms=ms; } @Override public String execute()throws Exception{ if(ms.valid(getUser(),getPassword())){ setTip("哈哈,整合成功"); return SUCCESS; } else{ return ERROR; } } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } }
web.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
在下面的一节,我将把spring与hibernate整合遇到的问题作一个总结。