速动画教程第三十集
搭建SSH2的集成开发环境
下载地址: www.oksonic.cn www.oksonic.com.cn
一.开发环境:
1. Windows2003 sp1
2. Eclipse 3.2.2
3. MyEclipse 5.1.1
4. Struts 2.0.6
5. Spring 2.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); }
} |
联系方法:
http://www.oksonic.cn
Email: [email protected]
QQ: 71279650