spring结合struts的代码详解
Struts调用流程如下图所示。
看到这幅图一下子就能了解了struts的原理。Spring的核心就是IOC容器和AOP,所以我们用spring主要是管理业务对象和事务的管理,所以主要是Model层来让spring管理,这是我们的一种方案。
第一种集成方案在Action中取得beanFactory
还记的在上篇文章中,测试的时候是在单元测试中拿到的BeanFactory,与struts结合就是在Action中取得beanFactory。步骤如下。
1、 建立一个web项目。
2、 建立相关页面,代码如下所示。
Login.jsp代码入下所示。
<%@ pagelanguage="Java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=GB18030">
<title>Insert titlehere</title>
</head>
<body>
<formaction="login.do" method="post">
用户:<input type="text"name="username"><br>
密码:<input type="password"name="password"><br>
<inputtype="submit" value="登录">
</form>
</body>
</html>
Login_success.jsp
<%@ pagelanguage="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=GB18030">
<title>Insert titlehere</title>
</head>
<body>
xx,用户登录成功!
</body>
</html>
3、 配置struts环境,关于struts的配置,拷贝struts和jstl的依赖包;在web.xml中配置ActionServlet,提供struts-config.xml文件。前篇文中有说明,在此就不赘述了。
struts-config.xml代码如下所示。
<struts-config>
<form-beans>
<form-beanname="loginForm"type="com.bjpowernode.usermgr.web.forms.LoginActionForm"></form-bean>
</form-beans>
<action-mappings>
<actionpath="/login"
type="com.bjpowernode.usermgr.web.actions.LoginAction"
name="loginForm"
scope="request"
>
<forwardname="success" path="/login_success.jsp"/>
</action>
</action-mappings>
<message-resourcesparameter="resources.MessageResources" />
</struts-config>
4、 配置spring环境,拷贝spring相关jar包,建立spring配置文件applicationContext-beans.xml。
applicationContext-beans.xml代码如下所示。
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<beanid="userManager"class="com.bjpowernode.usermgr.manager.UserManagerImpl"/>
</beans>
5、 建立相关的Action和ActionForm。代码如下所示。
LoginAction.java代码如下所示。
public class LoginAction extendsAction {
@Override
publicActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequestrequest, HttpServletResponse response)
throwsException {
LoginActionFormlaf = (LoginActionForm)form;
Stringusername = laf.getUsername();
Stringpassword = laf.getPassword();
//但是我们每次都要去调用,去创建太麻烦了.
//我们在这里只需要去配置Listener就可以了,spring给实现好了.
BeanFactoryfactory = newClassPathXmlApplicationContext("applicationContext.xml");
UserManageruserManager = (UserManager)factory.getBean("userManager");
userManager.login(username,password);
}
}
LoginActionForm.java代码如下所示。
public class LoginActionFormextends ActionForm {
//表单上有什么提供什么属性.
//名字一定要与表单中的一样.
privateString username;
publicString getUsername() {
returnusername;
}
publicvoid setUsername(String username) {
this.username= username;
}
privateString password;
publicString getPassword() {
returnpassword;
}
publicvoid setPassword(String password) {
this.password= password;
}
}
6、 建立业务逻辑层,代码如下所示。
UserManager代码如下所示。
public interface UserManager {
publicvoid login(String username, String password);
}
UserManagerImpl.java代码如下所示。
public class UserManagerImplimplements UserManager {
publicvoid login(String username, String password) {
System.out.println("UserManagerImpl"+"username="+ username);
}
}
7、 web.xml配置文件代码如下所示。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
就这样我们在LoginAction中,使用beanFactory读取spring配置文件,找到UserManagerImpl实例。如果每次在Action中读取application-beans.xml文件,我们是否可以在服务器启动的时候就就创建BeanFactory呢?在这里我们可以使用spirng的工具WebApplicationContextUtils.getRequiredWebApplicationContext()从 ServletContext中 取得BeanFactory,然后再web.xml中配置Spring的Listener。
修改后,LoginAction代码如下所示。
public class LoginAction extendsAction {
@Override
publicActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequestrequest, HttpServletResponse response)
throwsException {
LoginActionFormlaf = (LoginActionForm)form;
Stringusername = laf.getUsername();
Stringpassword = laf.getPassword();
//用工具包直接拿出来就可以了。
BeanFactoryfactory =WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
UserManageruserManager = (UserManager)factory.getBean("userManager");
userManager.login(username,password);
returnmapping.findForward("success");
}
}
加入相关配置,web.xml代码如下所示。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这种方案缺点:
我们在在Action中仍然看到Spring相关东西,看到Spring相关类,要是程序只看到的是接口,那要怎么做呢?
第二种方案,将struts的Aciton交给Spring来创建,让代理Action负责拿到beanFactory,根据Path名称到IOC中把对应的Action取出来。
我们是在Model层应用spring,在Action中取得BeanFactory,然后通过SpringIOC来找到Model层的bean。但是这这样存在一些问题,我们在Action中使用的是Spring相关的静态类,这就说明我们依赖的是Spring的静态类,我们希望所依赖的是接口而不是类,符合设计原则,面向接口编程,这样也容易扩展和维护。于是在此基础上进行改进。
第二种方案是将Struts的Action交给Spring创建,这样业务逻辑对象将被注入,这样就避免了依赖查找,而Spring中会有一个代理Action,通过代理ActionProxy取得banFactory。方案一和方案二的对比图如下图所示。
这样就不用Spring的Listener了,所以我们的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">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
同时再struts的配置文件,struts-config.xml中,在<action-mappings>标签中配置Action,也不再配置我们自己建立的Action,而是配置Spring自己的代理Action。代码如下所示。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.bjpowernode.usermgr.web.forms.LoginActionForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/login"
type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"/>
</action>
</action-mappings>
<message-resources parameter="resources.MessageResources" />
</struts-config>
Spring对Aciton的配置文件如下所示。applicationContext-actions.xml.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean name="/login" class="com.bjpowernode.usermgr.web.actions.LoginAction" scope="prototype">
<property name="userManager" ref="userManager"/>
</bean>
</beans>
在这里配置对应的本系统实际的Action,注意名字一定要和struts中代理Action一致!并且设置每次创建一个新的Action,而不是共用一个Action,scope="prototype"。
这样在LoginAction中,我们不用再看到创建Model和工厂的细节,使用SpringIOC,创建Model,UserManager,并且配置文件中注入LoginAction,这样LoginAction代码如下所示。
public class LoginAction extends Action {
private UserManager userManager;
// 让spring注入,LoginAction让Spring管理, 不是让strus创建而是由spring创建.
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf = (LoginActionForm) form;
String username = laf.getUsername();
String password = laf.getPassword();
userManager.login(username, password);
return mapping.findForward("success");
}
}
小结:
Spring框架就相当于我们的工具,我们把工具挖掘和使用的淋漓尽致才好,这可能就是人和工具的区别,人利用创造和利用工具,工具被创造和被利用。这中间的过程就是磨合了。
以上是 spring结合struts的代码详解 的全部内容, 来源链接: utcz.com/p/214658.html