Struts2与Spring整合

2016/12/09 10:06
阅读数 20

https://github.com/darknessitachi/struts2Spring

【先引入struts2、spring相关的jar】
首先需要在web.xml文件中做如下配置:

<context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/applicationContext*.xml,classpath*: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>


比较简单,作用就是引入struts2与spring

下面我们来写一个登陆用的Action,代码如下:

 

public class LoginAction {

	private ILoginService loginService;
	private String userName;
	private String password;

	public String execute(){
		
		if(loginService.login(userName, password))
			return Action.SUCCESS;
		
		return Action.INPUT;
	}

        // setter and getter methods...
}


Struts2中的action已经不像Struts1.x中那样必须要继承一个Action了,这样比较简单,更像一个POJO了,而且可以看到,原来Struts1.x 处理函数中servlet相关的api已经消失不见了,这样我们就可以脱离web容器来对其进行相关的单元测试了,看上去爽了不少吧...

上面的action中我们调用了ILoginService 的login方法,该接口的定义如下:

 

public interface ILoginService {

	boolean login(String userName, String password);

}



他的实现也比较简单,我们简单的来判断用户名与密码是否时我们所给定的字符串,如果是,返回true,否则,返回false。通过接口,我们完全可以屏蔽掉底层的实现,这样我们可以快速的搭建好项目的框架,以后我们如果需要将login方法中的逻辑进行真正业务上的处理,对前台调用的地方来说都是完全透明的,该方法简单实现如下:

 

public class LoginService implements ILoginService {

	/* (non-Javadoc)
	 * @see org.darkness.struts2.service.ILoginService#login(java.lang.String, java.lang.String)
	 */
	public boolean login(String userName, String password) {

		if ("darkness".equals(userName) && "sky".equals(password)) {
			return true;
		}

		return false;
	}
}



接下来我们需要在项目的src目录下面新建一个struts.xml,代码如下:

 

<struts>
	<package name="struts2" extends="struts-default">
		<action name="login" class="loginAction">
			<result name="input">/login.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
</struts>


他就是将我们刚才定义的一个action配置到了struts文件当中,这样,LoginAction的生命周期就交由struts来进行管理了。注意到这个配置文件中的 class="loginAction",这个action怎么不是一个class类了?别急,看到下面就可以知道,原来我们将这个loginAction的创建交由spring去管理了。下面来看看我们的spring文件中的配置:

 

<beans>
	<bean id="loginService"
		class="org.darkness.struts2.service.LoginService" />

	<bean id="loginAction"
		class="org.darkness.struts2.action.LoginAction" scope="prototype">
		<property name="loginService" ref="loginService" />
	</bean>
	
</beans>


该配置比较简单,我就不做详细说明了,需要大家注意的一点就是,loginAction Bean中的 scope="prototype",该配置用来告诉spring,每访问一次这个类,你就给我新创建一个实例,这样可以避免多用户登陆时的线程安全问题。

好了,大体上Struts2与spring的配置差不多就这个样子,下面我们来编写一个测试页面:

 

<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form action="login">
    <s:textfield key="userName" label="用户名"/>
    <s:password key="password" label="密 码"/>
    <s:submit/>
</s:form>


该表单提交给login action去处理,如果成功就跳转到welcome.jsp,否则还停留在本页面。
完成手工,部署该项目测试一下...咦,出错了?
到struts2的下载文件中找到struts2-spring-plugin-2.0.11.1.jar,把它扔进lib后再看看效果


 

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部