`

spring整合struts的三种方式

阅读更多
本文是在http://hnzhoujunmei.iteye.com/admin/blogs/1004838的项目基础上添加spring功能的。
spring整合struts有3中方法:
(1)使用spring的ActionSupport类整合struts。
(2)使用spring的DelegatingRequestProcessor覆盖struts的RequestProcessor。
(3)将struts Action委托给spring框架
无论使用哪种方式,需要将spring框架的ContextLoaderPlugin作为插件注册到struts应用中。struts-config.xml文件中通过<plug-in>标签进行。
第一种方式:使用spring的ActionSupport类整合struts。
在struts登录系统的基础上添加spring功能,选择spring 的core包和web包。
并将spring的配置文件放在在WEB-INF目录下
打开struts配置文件struts-config.xml,添加如下内容:
  <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation" value = "/WEB-INF/applicationContext.xml" />
  </plug-in>

并在spring配置文件中添加struts的业务逻辑处理类,
<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<!-- struts 里的业务逻辑类 -->
<bean id = "login" class = "com.qdu.struts.BO.LoginBO"></bean>

</beans>

修改登录的Action类
package com.qdu.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;

import com.qdu.struts.BO.LoginBO;
import com.qdu.struts.form.LoginForm;
public class LoginAction extends ActionSupport {
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method
												// stub

		ApplicationContext ctx = getWebApplicationContext(); //获取spring的上下文
		LoginBO login = (LoginBO) ctx.getBean("login"); //spring的
		if (login.validate(loginForm.getUsername(), loginForm.getPassword())) {
			request.setAttribute("username", loginForm.getUsername());
			return mapping.findForward("success");
		} else
			return mapping.findForward("failed");
	}
}

第一种方法比较简单,但struts中的action何spring框架耦合在一起,不如以下两种方式合适。
第二种方式:使用spring的DelegatingRequestProcessor覆盖struts的RequestProcessor。
在struts配置文件中添加:
<!-- 添加新的控制器 -->
  <controller processorClass = 

"org.springframework.web.struts.DelegatingRequestProcessor"></controller>
   <!-- 添加的支持spring -->
  <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation" value = "/WEB-INF/applicationContext.xml" />
  </plug-in>

在spring配置文件中添加:
<!-- struts 里的业务逻辑类 -->
<bean id = "login" class = "com.qdu.struts.BO.LoginBO" />

<bean name = "/login" class ="com.qdu.struts.action.LoginAction">
<property name = "loginBean">
<ref bean = "login"/>
</property>
</bean>

修改action类
package com.qdu.struts.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.qdu.struts.BO.LoginBO;
import com.qdu.struts.form.LoginForm;

/** 
 * MyEclipse Struts
 * Creation date: 04-14-2011
 * 
 * XDoclet definition:
 * @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true"
 * @struts.action-forward name="failed" path="/fail.jsp"
 * @struts.action-forward name="success" path="/success.jsp"
 */
public class LoginAction extends Action {
	
	private LoginBO loginBean;
	
	/*
	 * Generated Methods
	 */

	public LoginBO getLoginBean() {
		return loginBean;
	}

	public void setLoginBean(LoginBO loginBean) {
		this.loginBean = loginBean;
	}

	/** 
	 * Method execute
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return ActionForward
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
//      调用业务处理类,整合spring的第二种方式
		LoginBO login = this.getLoginBean();
		if(login.validate(loginForm.getUsername(),loginForm.getPassword())){
			request.setAttribute("username", loginForm.getUsername());
			return mapping.findForward("success");
		}
		else return mapping.findForward("failed");
	}	
}	

第三种方式:将struts Action委托给spring框架
一个更好的解决方法是将struts框架中的对action的管理委托给spring框架。开发者可通过在struts配置文件中的action映射来注册一个代理来实现。该代理负责在spring环境中查找struts的action对象。该方法相对于第二种方法,改变的就是struts配置文件的不同
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />
  <form-beans >
    <form-bean name="loginForm" type="com.qdu.sun.struts.form.LoginForm" />

  </form-beans>

  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action
      attribute="loginForm"
      input="/login.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      type="org.springframework.web.struts.DelegatingActionProxy">
      <forward name="failed" path="/fail.jsp" />
      <forward name="success" path="/success.jsp" />
    </action>

  </action-mappings>

  <message-resources parameter="com.qdu.sun.struts.ApplicationResources" />
  <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
 </plug-in>
  
</struts-config>


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics