速动画教程第三十集
搭建SSH2的集成开发环境
下载地址:www.oksonic.cn www.oksonic.com.cn
一.开发环境:
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);
}
}
|
联系方法:
http://www.oksonic.cn
Email: oksonic@tom.com
QQ: 71279650