下面爲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