spring整合struts简单测试

奶奶的,弄了半天,网上资料杂乱无章的,而且大夏天的,本来就烦躁,在加上心情不好,看见那一大堆的配置文件就烦,还好,下午在狠狠的吹了一会儿风扇之后终于搞定了,下面先贴出我的包结构

spring_struts

spring_struts

先简单说说spring整合MVC框架的一些思考
对于一个JAVA EE应用来说,用户请求总是向MVC框架的控制器请求,而当控制器拦截到用户的请求时,必须调用业务逻辑来处理用户请求,那么,控制器应该如何获得业务逻辑?答案就是工厂模式,在轻量级的JAVA EE应用中业务逻辑不是EJB而是一个POJO,业务逻辑的组件通常由工厂负责,而工厂可以保证该组件的实例只有一个就够了,可以避免重复实例化而造成的系统开销.
下图就是采用工厂模式的顺序图

factory

factory

采用工厂模式,可以将控制器和业务逻辑实现分离,在采用工厂模式的访问策略中,所有的业务逻辑组件的创建由工厂负责,业务逻辑组件的运行也由工厂负责,而控制器只需定位工厂实例就可以.
如果采用Spring框架,则spring成为最大的工厂,spring负责业务逻辑组件的创建和生成,并负责业务逻辑的生命周期.
那么,控制器是如何访问到Spring容器中的业务组件呢?为了让Action访问到Spring的业务逻辑组件,有两种策略,
1.Spring容器负责管理控制器Action.并利用依赖注入为控制器注入业务逻辑组件.
2.利用Spring的自动装配,action自动从Spring容器中获得所需的业务逻辑组件.
下面先说说第一种.Spring容器负责管理控制器Action
让Spring容器管理应用中的控制器,可以充分的利用Sprin的IOC特性.Struts提供一个插件struts2-spring-plugin-2.2.1.jar.这个插件提供了一种伪Action,当我们在Struts.xml中配置action时,通常要制定该action的实现类.但spring插件让我们不用指向action的实现类,而是指向Spring的BeanID,这样,Struts就不用在创建action实例,而是通过Spring来获得Action对象.
这种策略的关键就是Struts2的请求转发给指定的Action时,Struts2中的该Action只是一个傀儡,他只是一个代号,并没有指定实际的实现类,而隐藏在该Action下的是Spring容器中的Action实例,这才是真正处理用户请求的控制器
协作图如下所示

spring_actionpng

spring_actionpng

如图所示,struts2只是配置了一个伪控制器,这个控制器的功能其实是由Spring容器中的控制器来完成的.
下面是我的测试代码
首先是登录页面login.jsp

<%@ page language="java" pageEncoding="GB2312"%>
<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//CN">
<html>
<head>
<title>login2</title>
</head>

<body>
	<!-- 注意这个Action -->
	<s:form name="login" action="loginPro" method="post">
		<s:textfield name="username" label="帐号"></s:textfield>
		<s:password name="password" label="密码"></s:password>
		<s:submit></s:submit>
	</s:form>
</body>
</html>

处理用户请求的Action代码

import com.opensymphony.xwork2.Action;

public class LoginAction implements Action {
	private String username;
	private String password;
	private String tip;
	private MyService ms;

	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;
	}

	public String getTip() {
		return tip;
	}

	public void setTip(String tip) {
		this.tip = tip;
	}

	public void setMs(MyService ms) {
		this.ms = ms;
	}

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		if (ms.valid(getUsername(), getPassword())) {
			setTip("整合成功!");
			return SUCCESS;
		} else
			return ERROR;
	}

}

struts.xml

<?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="test" extends="struts-default">
		<action name="loginPro" class="loginAction">
			<result name="success">/welcome.jsp</result>
			<result name="error">/error.jsp</result>
		</action>

	</package>
</struts>    

业务逻辑组件接口和实现类MyService.java和MyServiceImpl.java

public interface MyService {
	boolean valid(String username,String password);
}
public class MyServiceImpl implements MyService {

	@Override
	public boolean valid(String username, String password) {
		// TODO Auto-generated method stub
		if (username.equals("test") && password.equals("test"))
			return true;
		else
			return false;
	}

}

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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
	<bean id = "myService" class = "MyServiceImpl"></bean>
	<bean id = "loginAction" class = "LoginAction" scope="prototype">
	<property name="ms" ref = "myService"></property>
	</bean>

</beans>

welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>

My JSP 'welcome.jsp' starting page

<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3" />
<meta http-equiv="description" content="This is my page" />
	<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
	-->

    This is my JSP page.

    ${requestScope.tip}

发表评论

电子邮件地址不会被公开。 必填项已用*标注