具體爲一下幾個步驟:
1、引入Struts 2工程所需運行庫文件。
2、創建並配置web.xml文件
3、創建一個Action類
4、創建並配置struts.xml文件。
引入工程所需運行庫文件
目前我用到的Struts版本爲2.1.8.1 GA。
把以下幾個運行庫文件複製到工程的WEB-INF下的lib文件夾中。
在web.xml中配置FilterDispatcher
配置WEB-INF下的web.xml文件
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
09 | < filter-name >struts2</ filter-name > |
10 | < filter-class >org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</ filter-class > |
14 | < filter-name >struts2</ filter-name > |
15 | < url-pattern >/*</ url-pattern > |
- Struts2的核心控制器FilterDispatcher被設計成了過濾器,通過<filter></filter>標籤引入。
- <url-pattern>/*</url-pattern>說明所有客戶端請求都經由FilterDispatcher處理,並把過濾後的請求交給Struts2進行處理。
編寫Action
- Struts2直接使用Action來封裝HTTP請求參數,因此Action類應該包含與請求相對應的屬性,併爲該屬性提供對應的setter和getter方法。
- 爲Action類裏增加一個execute方法,因爲Struts2框架默認會執行這個方法。這個方法本身並不做業務邏輯處理,而是調用其他業務邏輯組件完成這部分工作。
- Action類返回一個標準的字符串,該字符串是一個邏輯視圖名,該視圖名對應實際的物理視圖。
我們現在要實現的是一個用戶登錄驗證,因此Action中提供用戶名和密碼兩個屬性。如果正確返回success否則返回error
01 | package wwfy.action.user; |
03 | public class UserAction { |
05 | private String username; |
06 | private String password; |
08 | public String getUsername() { |
12 | public void setUsername(String username) { |
13 | this .username = username; |
16 | public String getPassword() { |
20 | public void setPassword(String password) { |
21 | this .password = password; |
24 | public String execute() throws Exception { |
26 | if (username.equals( "wwfy" ) && password.equals( "123456" )) { |
Action有一下特點:
- Struts2框架中Action是一個POJO,沒有被代碼污染。
- Struts2中的Action的execute方法不依賴於servlet API,改善了Struts1中耦合過於緊密,極大方便了單元測試。
- Struts2的Action無須用ActionForm封裝請求參數。
- 相對Struts1框架而言,Struts2的邏輯視圖不再是ActionForward對象,而是一個普通的字符串,利於分離和複用。
配置struts.xml
Struts2框架的核心配置文件就是struts.xml,該文件主要負責Struts2應用中各Action的具體實現邏輯。struts.xml會根據不同請求找到具體的Action,然後根據Action返回的邏輯視圖名找到具體的物理視圖。
在WEB-INF/classes文件夾下創建struts.xml
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
02 | <!DOCTYPE struts PUBLIC |
03 | "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" |
07 | < package name = "wwfy" extends = "struts-default" > |
08 | < action name = "loginUser" class = "wwfy.action.user.UserAction" > |
09 | < result name = "success" >/jsp/error.jsp</ result > |
10 | < result name = "error" >/jsp/error.jsp</ result > |
- 該文件發佈的時候必須放置在WEB-INF/classes路徑下,當程序運行的時候會自動在該目錄下搜索struts.xml。
- 在action標籤中定義了name和class。name屬性對應的是用戶URL請求中的action名,比如在本應用中,用戶請求爲http://localhost:8080/Struts2/loginUser.action,那麼name屬性就應該爲loginUser。class屬性是處理請求的實現類(注意:要包含完整路徑),本應用的實現類是wwfy.action.user.UserAction。
- result標籤定義邏輯視圖和物理視圖之間的映射,在我們的Action中,如果返回的字符串是"success”則由對應的success.jsp頁面進行處理;如果返回的字符串是"error”則由error.jsp頁面進行處理。
編寫視圖資源
1、登陸頁面login.jsp
01 | <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%> |
02 | <%@ taglib prefix="s" uri="/struts-tags" %> |
03 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
11 | < s:form action = "loginUser" > |
12 | < s:textfield name = "username" label = "用戶名" ></ s:textfield > |
13 | < s:password name = "password" label = "密碼" ></ s:password > |
14 | < s:submit value = "確定" /> |
2、登陸成功頁面success.jsp
01 | <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%> |
02 | <%@ taglib prefix="s" uri="/struts-tags" %> |
03 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
10 | < p align = "center" >登陸成功!!!您的用戶名是< s:property value = "username" ></ s:property ></ p > |
3、登陸失敗頁面error.jsp
01 | <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%> |
03 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
10 | < p align = "center" >登陸失敗!!!</ p > |
頁面中很多以s:開頭的標籤,這些是Struts2框架獨有的標籤庫.
整個應用的目錄結構是