spring+struts

在spring和struts整合之前,需要导入spring和struts的jar包

 

原理:

1、用spring来管理struts的action:
     在spring的配置文件中配置action和action所依赖的业务逻辑对象。

2、因为Action要调用业务逻辑对象,将业务逻辑对象注入到Action中,从而避免在Action类中直接进行代码查找:

     因此Action中要有业务逻辑对象的声明和此对象的set方法

     在spring的配置文件中配置他们之间的依赖关系

3、在struts的配置文件里把action的type改成spring的一个代理类:
     org.springframework.web.struts.DelegatingActionProxy
     此代理类功能:创建BeanFactory、到IoC容器里查找用户请求的Action。
     根据<action>中的path属性值到IoC容器中取得本次请求对应的Action。
4、在spring的配置文件中定义struts的action.注意:必须使用name属性
     将Action的 scope设置为prototype多粒模式
     必须注入业务逻辑对象

 

部署描述符 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
    <!-- 定义spring的配置文件,此文件会被spring的监听器获得 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <!-- ContextLoaderListener默认监听spring的applicationContext.xml配置文件 -->
    <!-- 当spring的配置文件改名了,就需要有上面的<context-param>配置 -->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
	<!-- 配置Struts ActionServlet -->
	<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 ActionServlet 的请求路径-->
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
	<!-- 欢迎页面 -->
	<welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 

spring的配置文件 applicationContext.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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <bean id="uManage" class="com.cos.manager.UserManager"/>
    <!-- 把userManage注入进来、一定要用name不要用id、多粒模式 -->
    <bean name="/login" class="com.cos.action.LoginAction" scope="prototype">
        <property name="userManager" ref="uManage"/>
    </bean>
</beans>

struts的配置文件 struts-config.xml:

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE struts-config SYSTEM "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
	<form-beans>
		<form-bean name="userForm" type="com.cos.form.UserForm"></form-bean>
	</form-beans>
	<action-mappings>
		<!-- 当一个.do请求过来,先进入struts的配置文件,将此action代理给spring的action管理 -->
		<!-- DelegatingActionProxy类使用映射名称path查找Spring环境中的动作名称name -->
		<!-- path的值要和spring action中的name值相同 -->
		<!-- type的值是spring的代理action: DelegatingActionProxy -->
		<!-- 此代理类完成了BeanFactory的创建、根据path值到IoC容器里的查找本次请求对应的Action -->
		<action path="/login"
			type="org.springframework.web.struts.DelegatingActionProxy"
			scope="request" 
			name="userForm">
			<forward name="success" path="/success.jsp" />
		</action>
	</action-mappings>
</struts-config>

此处一定要把type值配置成DelegatingActionProxy:

把用户的请求提交给spring的action,spring的action创建BeanFactory,再由spring的action调用struts的action。

 

登录页面 login.jsp:

<%@ page language="java" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    <form action="login.do" method="post">
	    <table>
	        <tr>
	            <td>用户名:</td><td><input type="text" name="username"></td>
	        </tr>
	        <tr>
	          <td>密&nbsp;&nbsp;码:</td><td><input type="password" name="password"></td>
	        </tr>
	        <tr>
                <td><input type="submit" value="提交"></td>
                <td><input type="reset" value="重置"></td>
            </tr>
	    </table>
    </form>
  </body>
</html>

 LoginAction.java:

package com.cos.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.cos.form.UserForm;
import com.cos.manager.UserManager;

public class LoginAction extends Action {

    //把此对象注入进来,用set()方法
    private UserManager userManager;
    
    public ActionForward execute(ActionMapping mapping, ActionForm actionfrom,
            HttpServletRequest request, HttpServletResponse response) {
        UserForm loginForm = (UserForm)actionfrom;
        userManager.createUser(loginForm.getUsername(), loginForm.getPassword());
        return mapping.findForward("success");
    }
    //set()方法
    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }
}

struts的FormBean: UserForm.java

package com.cos.form;

import org.apache.struts.action.ActionForm;

public class UserForm extends ActionForm {

    private static final long serialVersionUID = 1L;
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

业务处理类 UserManager.java:

package com.cos.manager;

//业务逻辑处理
public class UserManager {

    public void createUser(String username, String password) {
        System.out.println("业务逻辑处理:用户名:" + username + ",密码:" + password);
    }
}

成功页面 success.jsp:

<%@ page language="java" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
	            登录成功。<a href="login.jsp">返回</a>    
  </body>
</html>

 

运行结果:跳转到成功页面success.jsp、控制台打印出 "业务逻辑处理:用户名:xxx,密码:xxx"

 

优点:

在LoginAction中没有和业务逻辑对象UserManager耦合,即:没有 new UserManager();

 

注:

如果spring没有使用默认的配置文件名称:applicationContext.xml,那么一定要在web.xml文件中配置:

    <!-- 定义spring的配置文件,此文件会被spring的监听器获得 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- <param-value>classpath:applicationContext-*.xml</param-value> -->
        <param-value>/WEB-INF/applicationContext-*.xml</param-value>
    </context-param>

 如果使用了默认名称,则可以不添加<context-param>这段代码。

 

 

 

 

你可能感兴趣的:(spring,AOP,struts,servlet,配置管理)