下面为Strut2Demo应用增加一个简单的登录处理流程:
loginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@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=UTF-8">
<title><s:text name="loginPage"/></title>
</head>
<body>
<s:form action="login">
<s:textfield name="username" key="user"/>
<s:textfield name="password" key="pass"/>
<s:submit key="login"/>
</s:form>
</body>
</html>
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 指定全局国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="mess"/>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="true" />
<!-- 所有的Action定义都应该放在package下 -->
<package name="crazyit" namespace="/" extends="struts-default">
<action name="login" class="com.yd.action.LoginAction">
<!-- 定义三个逻辑视图和物理资源之间的映射 -->
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="success">/WEB-INF/content/welcome.jsp</result>
</action>
**<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>**
</package>
</struts>
注意:
/WEB-INF/content/{1}.jsp
上面的配置文件指定国际化文件的base名为mess,所以要为该应用提供一个mess_zh_CN.properties
mess_zh_CN.properties
loginPage=\u767B\u5F55\u9875\u9762
errorPage=\u9519\u8BEF\u9875\u9762
succPage=\u6210\u529F\u9875\u9762
failTip=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u4E0D\u80FD\u767B\u5F55\uFF01
succTip=\u6B22\u8FCE\uFF0C{0},\u60A8\u5DF2\u7ECF\u767B\u5F55\uFF01
user=\u7528\u6237\u540D
pass=\u5BC6 \u7801
login=\u767B\u5F55
接下来让我们看看在action如何这登录验证
LoginAction
package com.yd.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
// 定义封装请求参数的username和password成员变量
private String username;
private String password;
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;
}
// 定义处理用户请求的execute方法
public String execute() throws Exception {
// 当username为admin password为pass时即登录成功,模拟从数据库得到数据
if (getUsername().equals("admin") && getPassword().equals("pass")) {
ActionContext.getContext().getSession().put("user", getUsername());
return SUCCESS;
}
return ERROR;
}
}
另外两个简单提示页面
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@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>
<title><s:text name="succPage"/></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<s:text name="succTip">
<s:param>${sessionScope.user}</s:param>
</s:text><br/>
</body>
</html>
error.jsp
<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@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>
<title><s:text name="errorPage"/></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<s:text name="failTip"/>
</body>
</html>
既然本应用采用的MVC是Struts,那么我对此应用的开发过程进行总结:
Struts 2应用的开发步骤:
1. 在web.xml文件定义核心Filter来拦截用户请求,故在开发Struts 2应用第一步在配置web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 让Struts 2的核心Filter拦截所有请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.如果需要post方式提交请求,则定义包含表单数据的JSP页面。只是get方法请求,则忽略。
3.定义处理用户请求的Action类
这部分为MVC框架中的C部分(控制器),负责调用Model里的方法来处理请求。控制器实际上由两个部分组成的,即拦截所有用户的请求,处理请求的通用代码有核心控制器完成,而实际的业务控制则由Action来处理。
4.配置Action。
现在Struts 2的Convention 插件借鉴Rails框架的优点,开始支持“约定优于配置”的思想,就是采用约定方式来规定用户请求地址和Action之间的对应关系。
<action name="login" class="com.yd.action.LoginAction"
...
</action>
5.配置处理结果
当Action处理用户请求结束,通常会返回一个处理结果
<!-- 定义多个逻辑视图和物理资源之间的映射 -->
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="success">/WEB-INF/content/welcome.jsp</result>
6.编写视图资源。如果Action要把一些数据传给视图资源,则借助于OGNL表达式
经过上面6个步骤,即可基本上完成一个Struts 2处理流程的开发,也就是执行一次完整的请求/响应过程
概括:这是一个简单Struts2简单的对登录验证的处理,其中国际化资源,也使用了Struts2标签库,本应用的提升有一定的升华,比如English国际化,后台提示输入格式错误等等。
May-The-Good-Luck-Be-With-You