一.开发环境:
1. Windows2003 sp1
2. Eclipse3.2.2
3. MyEclipse5.1.1
4. Struts2.0.6
5. Spring2.0.4
二.教学内容
1. Struts2.0的应用之Login
2. 表单验证
3. 使用freemarker模板
4. 集成Spring2.0
5. Struts2.0的单元测试
三.准备工作
1. struts-2.0.6-all.zip
2. spring 2.0.2
四.开发步骤
1. Struts2.0的Login应用
a) 建立一个Struts2.0应用(ssh2)
b) 将struts-2.0.6-all.zip包lib目录以下文件拷贝到项目的lib目录中,刷新工程。
i. antlr-2.7.2.jar
ii. commons-beanutils-1.6.jar
iii. commons-chain-1.1.jar
iv. commons-logging-1.0.4.jar
v. commons-validator-1.3.0.jar
vi. freemarker-2.3.8.jar
vii. ognl-2.6.11.jar
viii. oro-2.0.8.jar
ix. struts2-core-2.0.6.jar
x. xwork-2.0.1.jar
c) 编辑web.xml文件,加入以下红色字体部份
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <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> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
d) 页面的设计
i. 进入登录界面login.jsp填写的用户名和密码
ii. 用户名和密码验证成功后跳转到首页index.jsp
iii. 用户名和密码验证失败后跳转到错误页error.jsp
e) 类图
f) 相关代码
页面部份
login.jsp
<%@ page language="java" pageEncoding="GBK"%> <html> <head> <title>登录</title> </head> <body> 登录 <FORM action="login.action" method="post"> <DIV align="center"> <TABLE width="300px" border="1" cellpadding="0" cellspacing="0"> <TR> <TD> 姓名: </TD> <TD> <INPUT type="text" size="10" name="user.username"> </TD> </TR> <TR> <TD> 密码: </TD> <TD> <INPUT type="text" size="10" name="user.password"> </TD> </TR> <TR> <TD colspan="2" align="center"> <INPUT type="submit" value="提交" name="submit"> </TD> </TR> </TABLE> </DIV> </FORM> </body> </html>
index.jsp
<%@ page language="java" pageEncoding="GBK"%> <%@ taglib uri = "/struts-tags" prefix = "s" %> <html> <head> <title>首页</title> </head> <body> <s:property value="user.username" /> 欢迎您到来! </body> </html>
error.jsp
<%@ page language="java" pageEncoding="GBK"%> <html> <head> <title>错误</title> </head> <body> <DIV align="center"> <h3>来到这里就是出错啦</h3> </DIV> </body> </html>
Java代码部份
User.java
package cn.oksonic.model.bo; public class User { // 用户名称 private String username; // 密码 private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
LoginAction.java
package cn.oksonic.web; import cn.oksonic.model.bo.User; import com.opensymphony.xwork2.Action; public class LoginAction extends ActionSupport { private User user = new User(); @SuppressWarnings("static-access") public String execute() throws Exception { // 可以在这里调用Service层来进行验证,这里只验证用户名 if (user.getUsername().equals("oksonic")) return this.SUCCESS; else return this.ERROR; } public User getUser() { return user; } }
配置文件部份
新建struts.xml(src目录)
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > <struts> <package name="user" namespace="/" extends="struts-default"> <!-- 配置一个action --> <action name="login" class="cn.oksonic.web.LoginAction"> <!-- 这里的意思是登录成功后跳转到 /index.jsp 页面 --> <result name="success" type="dispatcher"> <param name="location">/index.jsp</param> </result> <!-- 登录失败后跳转到 /error.jsp 页面 --> <result name="error" type="dispatcher"> <param name="location">/error.jsp</param> </result> </action> </package> </struts>
2. 表单验证
a) 配置验证器
在src目录新建validators.xml文件,文件内容如下:
<validators> <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/> <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/> <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/> <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/> <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> </validators>
这些验证器已经定义了一些常用的验证,如:必填验证、数字验证、日期验证、邮件验证等。
要启动表单验证,需要增加一个拦截器,对 struts.xml 文件进行修改,增加 <interceptor-ref name="validationWorkflowStack" />
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > <struts> <package name="user" namespace="/" extends="struts-default"> <!-- 配置一个action --> <action name="login" class="cn.oksonic.web.LoginAction"> <!-- 这里的意思是登录成功后跳转到 /index.jsp 页面 --> <result name="success" type="dispatcher"> <param name="location">/index.jsp</param> </result> <!-- 登录失败后跳转到 /error.jsp 页面 --> <result name="error" type="dispatcher"> <param name="location">/error.jsp</param> </result> <interceptor-ref name="validationWorkflowStack" /> </action> </package> </struts>
建立验证配置文件
对 LoginAction 进行验证规则的配置,需要新建一个配置文件,文件名以 “Action 的名称” + “-validation.xml”来命名,并保存到 LoginAction.java 文件所在的目录中
如:
LoginAction-validation.xml
文件内容如下:
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"> <validators> <field name="user.username"> <field-validator type="requiredstring"> <message>用户名必须填写</message> </field-validator> </field> <field name="user.password"> <field-validator type="requiredstring"> <message>用户密码必须填写</message> </field-validator> </field> </validators>
修改 login.jsp,代码如下:
<%@ page language="java" pageEncoding="GBK"%> <%@ taglib uri = "/struts-tags" prefix = "s" %> <html> <head> <title>登录</title> </head> <body> 登 录 <s:form name="loginForm" action="login.action"> <DIV align="center"> <TABLE width="300px" border="1" cellpadding="0" cellspacing="0"> <TR> <TD> 姓名: </TD> <TD> <s:textfield name="user.username" required="true"/> </TD> </TR> <TR> <TD> 密码: </TD> <TD> <s:password name="user.password" required="user.password"/> </TD> </TR> <TR> <TD colspan="2" align="center"> <s:submit value="登录" /> </TD> </TR> </TABLE> </DIV> </s:form> </body> </html> </html>
这里的红字部份为struts的标签
修改配置文件,加入input属性,设置了此属性表单提交后如果出错后将返回到指定的页面
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > <struts> <package name="user" namespace="/" extends="struts-default"> <!-- 配置一个action --> <action name="login" class="cn.oksonic.web.LoginAction"> <!-- 这里的意思是登录成功后跳转到 /index.jsp 页面 --> <result name="success" type="dispatcher"> <param name="location">/index.jsp</param> </result> <!-- 登录失败后跳转到 /error.jsp 页面 --> <result name="error" type="dispatcher"> <param name="location">/error.jsp</param> </result> <!-- 如果验证失败,则返回登录页 --> <result name="input" type="dispatcher"> <param name="location">/login.jsp</param> </result> <interceptor-ref name="validationWorkflowStack" /> </action> </package> </struts>
3. 使用freemarker模板
使用freemarker模板语言来显示页面内容在Struts2中实现起来很简单,现在欢迎页面改为使用freemarker来显示。
新建welcome.ftl文件,后缀名为ftl的文件即为freemarker模板文件夹,文件内容如下:
${user.username} 欢迎您的到来!这是FreeMarke页面
有一点需要注意,welcome.ftl文件默认编码为GBK,需要将其转为UTF-8,否则中文不能正常显示。
修改Action执行成功后的转向,转到welcome.ftl
原:
<result name="success" type="dispatcher"> <param name="location">/index.jsp</param> </result>
改:
<result name="success" type="freemarker"> <param name="location">/welcome.ftl</param> </result>
红字部份为类型,这里需要指定为freemarker
4. 集成Spring2.0
1) 加入spring2包内dist目录下的spring.jar文件,加入struts2包内lib目录下的struts2-spring-plugin-2.0.6.jar
2) 修改 web.xml,为 Web 应用增加相应的 Spring ContextLoaderListener
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
3) 在 src 目录下新建 struts.properties 文件,内容如下:
struts.objectFactory = spring
4) 新增 Service 层的对像 IUserService、UserService
IUserService
package cn.oksonic.service; import cn.oksonic.model.bo.User; public interface IUserService { /** * 验证是否为合法用户 * @param user * @return */ public boolean isValidUser(User user); }
UserService
package cn.oksonic.service; import cn.oksonic.model.bo.User; public class UserService implements IUserService { public boolean isValidUser(User user) { if (user.getUsername().equals("oksonic") && user.getPassword().equals("oksonic")) return true; else return false; } }
5) 修改 LoginAction.java代码
package cn.oksonic.web; import com.opensymphony.xwork2.ActionSupport; import cn.oksonic.model.bo.User; import cn.oksonic.service.IUserService; @SuppressWarnings("serial") public class LoginAction extends ActionSupport { private User user = new User(); private IUserService userService; @SuppressWarnings("static-access") public String execute() throws Exception { // 可以在这里调用Service层来进行验证,这里只验证用户名 if (userService.isValidUser(user)) return this.SUCCESS; else return this.ERROR; } public User getUser() { return user; } public void setUserService(IUserService userService) { this.userService = userService; } }
6) 修改 struts.xml
原: <action name="login" class="cn.oksonic.web.LoginAction"> 改: <action name="login" class="loginAction">
这里红字部份为引用spring中的bean
7) 加入spring框架,并配置loginAction Bean
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 id="userService" class="cn.oksonic.service.UserService" /> <bean id="loginAction" class="cn.oksonic.web.LoginAction"> <property name="userService"> <ref bean="userService" /> </property> </bean> </beans>
红字的login就是struts.xml文件中所引用的Bean
5. Struts2.0的单元测试
使用spring-mork进行单元测试
a) 加入spring-mork.jar文件
b) 编写BaseTest.java文件,以后所有的单元测试用例都将继承于它,它的作用是读取spring的配置文件。
package cn.oksonic; import org.springframework.test.AbstractSingleSpringContextTests; public class BaseTest extends AbstractSingleSpringContextTests { protected String[] getConfigLocations() { return new String[]{"file:D:/oksonic/workspace/ssh2/WebRoot/WEB-INF/applicationContext.xml"}; } public static final void testTmp() { assertTrue( true ); } protected void logDebug( Object arg0 ) { logger.error(arg0); } protected void logError( Object arg0 ) { logger.error(arg0); } protected void logWarn( Object arg0 ) { logger.warn(arg0); } }
c) 创建测试用例LoginActionTest.java
package cn.oksonic.web; import org.junit.Test; import cn.oksonic.BaseTest; import cn.oksonic.model.bo.User; public class LoginActionTest extends BaseTest { private LoginAction action; @Override protected void onSetUp() throws Exception { super.onSetUp(); action = (LoginAction) this.applicationContext.getBean("loginAction"); } @Override protected void onTearDown() throws Exception { super.onTearDown(); action = null; } @Test public void testExecute() throws Exception { User user = new User(); user.setPassword("oksonic"); user.setUsername("oksonic"); action.setUser(user); assertEquals(action.execute(), action.SUCCESS); } }