我们知道struts1与spring整合是靠org.springframework.web.struts.DelegatingActionProxy来实现的,以下通过具体一个用户登录实现来说明struts2整合spring的相关内容.
一、
准备工作 1.实例分析我们在这不与数据库打交道,所有就是当用登录的时候判断用户名是否为指定值,密码是否为指定值,以及相关的异常处理、
2.为什么我们要说struts2整合spring呢?相信在家都知道,我也不用多说了....
4.在 下载struts2的jar包,源码,API文档.
5.在 下载不同版本的spring的jar包,源码,API文档.
6.配置
开发环境:MyEclipse6.0+Eclipse3.3+JDK6.0+Tomcat6.0+Struts 2.0.11+spring2.0
。 7.新建web项目,导入相应的jar包,如以下所示: a.由于现在IDE开发工具还没有对struts2.0有很好的支持,所有我们需要手功配置,首先将我们刚下下来的struts2.0的lib里面的commons-logging-1.0.4.jar、ognl-2.6.11.jar、xwork-2.0.4.jar、freemarker-2.3.8.jar、struts2-core-2.0.11.1.jar以及struts2.0里面所需要的插件包struts2-spring-plugin-2.0.11.1.jar添加的WEB-INF/lib下面 b.通过通过IDE开发工具项目对spring2.0的支持 7.在src下建立struts.xml文件(具体的写法在后面呈现) 8.配置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" > <!-- 加载struts2核心 --> < 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 > <!-- 指明spring配置文件在何处 --> < context-param > < param-name >contextConfigLocation
</ param-name > < param-value >classpath*:applicationContext.xml
</ param-value > </ context-param > <!-- 加载spring配置文件applicationContext.xml --> < listener > < listener-class > org.springframework.web.context.ContextLoaderListener
</ listener-class > </ listener > </ web-app >
二、
建立前台页面 1.用户登录肯定有一个用户登录页面login.jsp,如下:
<%@ page language=
" java " pageEncoding=
" GB2312 " %>
<%@ taglib prefix=
" s " uri=
" /struts-tags " %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//CN" > < html > < head > < title >login2
</ title > </ head > < body > < s:form name ="login" action ="login" method ="post" > < s:textfield name ="username" label ="帐号" ></ s:textfield > < s:password name ="password" label ="密码" ></ s:password > < s:submit ></ s:submit > </ s:form > </ body > </html>
2.若登录成功的index.jsp文件,如下:
<%@ page language=
" java " pageEncoding=
" GB2312 " %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//CN" > < html > < head > < title >login2
</ title > </ head > < body > < div > < h4 >欢迎你!
</ h4 >< font color ="red" >${username}
</ font > < br /> < h4 >你登录的密码是
< h4 >< font color ="red" >${password}
</ font >;
</ div > </ body > </html>
3、用户名非法提示页面.usernameInvalid.jsp(通过el表达示得到异常信息)
<%@ page language="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 > < meta http-equiv ="Content-Type" content ="text/html; charset=GB18030" > < title >Insert title here
</ title > </ head > < body > 用户名非法:
< font color ="red" >${exception.message}
</ font > </ body > </ html > 4、密码非法提示页面.passwordInvalid.jsp(struts2标签得到异常信息);
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding=
" GB18030 " %>
<%@ taglib prefix=
" s " uri=
" /struts-tags " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > < html > < head > < meta http-equiv ="Content-Type" content ="text/html; charset=GB18030" > < title >Insert title here
</ title > </ head > < body > 密码非法:
< FONT color ="red" >< s:property value ="exception.message" /></ FONT > </ body > </ html >
三、建立对应的action
1.提供用户请求服务的LoginService类
package org.topCSA.s2s.service;
import org.topCSA.s2s.exception.PasswordException;
import org.topCSA.s2s.exception.UsernameException;
public class LoginService
{
/* * 我们这只是一个小的例子,不与数据库打交到 * 若有数据库操作,那么在这个LoginService就是操作具体Dao类实现登录的相关操作 */ public boolean validate(String username,String password)
throws Exception
{
boolean v =
false;
if(!"xcp".equals(username))
// 如果用户名不等于xcp,就抛出一个异常 {
throw new UsernameException("用户名不正确");
}
else if(!"123".equals(password))))
// 如果密码不等于123,就抛出一个异常 {
throw new PasswordException("密码不正确");
}
else {
v =
true;
}
return v;
}
}
2.接收用户请求的LoginAction类
package org.topCSA.s2s.action;
import org.topCSA.s2s.service.LoginService;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction
extends ActionSupport
{
/** * */ private static final long serialVersionUID = 1L;
private String username;
private String password;
/* * 我们通过Spring的IOC容器注入LoginService,从而减少类之间的依赖关系 */ private LoginService loginService;
public LoginService getLoginService()
{
return loginService;
}
public void setLoginService(LoginService loginService)
{
this.loginService = loginService;
}
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;
}
@Override
public void validate()
{
/* * 我们可以在这个方法类加一些输入验证 但是为了体现后面我们写的业务逻辑方法这就不验证 */ }
@Override
public String execute()
throws Exception
{
boolean result = loginService.validate(username, password);
if(result ==
true)
{
return SUCCESS;
}
else {
return INPUT;
}
}
}
四、配置struts.xml与applicationContext.xml
1.配置struts.properties,为了解决中文问题,具体用法参照struts2的用法如下:里面加上
struts.i18n.encoding = gb2312,当然也可以直接加到struts.xml里面写法为<constant name="struts.i18n.encoding" value="gbk"></constant> 2.配置struts.xml
<?xml version="1.0" encoding="GB2312" ?>
<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > < struts > < package name ="struts2" extends ="struts-default" > < action name ="login" class ="LoginAction" > < exception-mapping result ="usernameInvalid" exception ="org.topCSA.s2s.exception.UsernameException" /> < exception-mapping result ="passwordInvalid" exception ="org.topCSA.s2s.exception.PasswordException" /> < result name ="success" >/index.jsp
</ result > < result name ="input" >/login.jsp
</ result > < result name ="usernameInvalid" >/usernameInvalid.jsp
</ result > < result name ="passwordInvalid" >/passwordInvalid.jsp
</ result > </ action > </ package > </ struts >
3.配置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" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" > < bean name ="loginService" class ="org.topCSA.s2s.service.LoginService" /> < bean name ="LoginAction" class ="org.topCSA.s2s.action.LoginAction" > < property name ="loginService" > < ref bean ="loginService" /> </ property > </ bean > </ beans >