Struts2教學
Struts2快速入門
Struts2 MVC架構
Struts2 是什麼?
Struts2 環境配置
Struts2 體系結構
Struts2 Hello World 實例
Struts2 配置文件
Struts2 Action/動作
Struts2 攔截器
Struts2 結果和結果類型
Struts2 值棧/OGNL
Struts2 文件上傳
Struts2 MySQL數據庫訪問
Struts2 發送郵件Email
Struts2 驗證框架
Struts2 基於XML校驗
Struts2 本地化/國際化(i18n)
Struts2 類型轉換
Struts2 主題和模板
Struts2 異常處理
Struts2 註釋
Struts2 註釋類型
Struts2 控件標籤
Struts2 iterator標籤
Struts2 if/else標籤
Struts2 merge標籤
Struts2 append標籤
Struts2 generator標籤
Struts2 數據標籤
Struts2 action標籤
Struts2 include標籤
Struts2 bean 標籤
Struts2 date 標籤
Struts2 param 標籤
Struts2 property 標籤
Struts2 set 標籤
Struts2 text 標籤
Struts2 url標籤
Struts2 表單標籤
Struts2 Ajax 標籤
Struts2和Spring集成
Struts2和Tiles集成
Struts2和Hibernate集成
Struts 2 hello world (XML版本)
Struts2註解示例
Struts2 @ResultPath註釋示例
Struts2 include(包含)多個配置文件
Struts2命名空間配置和解釋
Struts2開發者模式
如何刪除Struts2動作的後綴擴展名
使用Struts2動作
Struts2的ActionError&ActionMessage示例
Struts2模型驅動實例
Struts2映射攔截動作
Struts2重寫攔截器參數
Struts2攔截器棧的例子
Struts2 execAndWait攔截器例子
Struts2 <s:textfield>文本示例
Struts2 <s:password>密碼示例
Struts2 <s:hidden>隱藏值例子
Struts2 <s:textarea>文本域實例
Struts2 <s:radio>單選按鈕例子
Struts2單選預選按鈕值
Struts2 <s:checkbox>複選框例子
Struts2設置多個複選框缺省值
Struts2 <s:checkboxlist>多個複選框例子
Struts2 <s:select>下拉框例子
Struts2自動選擇下拉框的值
Struts2 <s:combobox>組合框的例子
Struts2 <s:head>示例
Struts2文件上傳例子
Struts2上傳多個文件例子
Struts2 <s:doubleselect>示例
Struts2 <s:updownselect>示例
Struts2 <s:optiontransferselect>示例
Struts2 <sx:datetimepicker>示例
Struts2 <sx:autocompleter>自動提示例子
Struts2 autocompleter+JSON例子
Struts2 <s:iterator>迭代器標籤示例
Struts2 if,elseif,else標籤示例
struts2 <s:append>標籤示例
Struts2 <s:generator>標籤示例
Struts2 <s:merge>標籤示例
Struts2 <s:sort>標籤示例
Struts2 <s:subset>標籤示例
Struts2 <s:a>標籤示例
Struts2 <s:action>標籤示例
Struts2 <s:bean>標籤示例
Struts2 <s:date>標籤示例
Struts2 <s:debug>標籤示例
Struts2 <s:include>標籤示例
Struts2 <s:i18n>標籤示例
Struts2 <s:param>標籤示例
Struts2 <s:property>標籤實例
Struts2 <s:push>標籤示例
Struts2 <s:set>標籤示例
Struts2 <s:texttag>標籤示例
Struts2 <s:url>標籤示例
Struts2資源包使用示例
Struts2本地化和國際化
Struts2 key鍵屬性示例
Struts2中文本地化問題
如何配置Struts2全局資源包
Struts2+Spring集成實例
Struts2+Quartz2調度集成實例
Struts2+Hibernate使用Full Hibernate Plugin集成
Struts2+Hibernate集成實例
Struts2+Spring+Hibernate集成實例
Struts2+Log4j集成
Struts2的FilterDispatcher和StrutsPrepareAndExecuteFilter有什麼不同?
Struts2獲取HttpServletRequest實例
Struts2獲取HttpServletResponse實例
如何獲取ServletContext對象
Struts2配置Action類的靜態參數
Struts2下載文件實例
Struts2和JSON實例

Struts2註解示例

在這個教程,我們重複使用以前 STRUST2  Hello World(XML版本)的例子,並將其轉換成註解版本。

Struts2 註解概念

Struts2註解是由Struts 2的約定插件的支持,所以,必須要了解其背後的「掃描方法」和「命名轉換」機制的魔力。

1. 掃描方法

許多Struts 2的文章或書籍說,可以配置過濾器的「init-param」或「struts.convention.action.packages」告訴Struts2,其中掃描註解的類。 例如,

web.xml

struts2 org.apache.struts2.dispatcher.FilterDispatcher actionPackages com.yiibai.common

從測試(Struts22.1.6和2.1.8版本),這是不正確的,不管你把在「param-value」還是 「struts.convention.action.packages「, 在Struts 2會忽略它,並只掃描指定的文件夾命名:struts, struts2, action 或 actions 。

下面是掃描工作

  1. 掃描其位於包的命名註解的類 「struts, struts2, action 或 actions「.

  2. 接着,掃描相匹配下列任一條件的文件:

    • 實例了 com.opensymphony.xwork2.Action 接口。
    • 擴展了 com.opensymphony.xwork2.ActionSupport 類
    • 文件名用動作(例如:UserAction,LoginAction)結束

詳細請查看這裏Struts 2 約定插件文件

2. 命名轉換器

Struts 2的約定插件將所有的註解操作文件名轉換爲指定的格式。

例如 : LoginAction.java

  1. 首先,去掉「Action」字符在文件名的末尾,如果存在的話。

  2. 其次,轉換文件名的第一個字母爲小寫。

因此,去除結束並轉換第一個字母爲小寫後,LoginAction.action 將變爲 login.action。

Struts2約定插件的「掃描方法」和「命名轉換」特性真正帶來了很多的便利和好處,只有當你的Struts2項目正確下面的命名約定纔會帶來好處; 否則,這將是一場災難。

Struts 2 註解例子

現在是時候開始轉換過程了,我們使用MyEclipse 10 創建一個工程爲:struts2example。

最終的項目結構

Struts2註解示例


2. LoginAction

擴展ActionSupport並創建了LoginAction,什麼也不做,ActionSupport 默認返回 「success」 字符串,這將匹配 @Result 並重定位到 「pages/login.jsp「.

註解版本

package com.yiibai.user.action;

import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/User")
@ResultPath(value="/")
@Result(name="success",location="/login.jsp")
public class LoginAction extends ActionSupport{

}

XML 實現版本



/login.jsp

3. WelcomeUserAction

重寫execute()方法並指定 @Action 和 @Result 註解。

註解版本

package com.yiibai.user.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/User")
@ResultPath(value="/")
public class WelcomeUserAction extends ActionSupport{

private String username;

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

@Action(value="Welcome", results={
    @Result(name="success",location="welcome\_user.jsp")
})
public String execute() {

    return SUCCESS;

}

}

XML 實現版本

/welcome\_user.jsp

Struts 2 註解 – @Action, @Result 和 @Namespace 不言自明,可以將它與XML比較。@ResultPath 可能需要一點點的解釋,請參閱本 @ResultPath示例

4. JSP視圖頁面

普通JSP視圖頁面來接受用戶名和密碼後點擊提交按鈕,並重定向到一個歡迎頁面。

login.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

Struts 2 註解示例

<s:form action="Welcome">
    <s:textfield name="username" label="用戶名" />
    <s:password name="password" label="密碼" />
    <s:submit value="提交"/>
</s:form>

welcome_user.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

Struts 2 註解示例

您好,

5. struts.xml

所有類註解無需創建 struts.xml 文件。

6. web.xml

只要創建一個典型的web.xml文件,並聲明FilterDispatcher過濾器標準。

Struts 2 Web Application struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /\*

7. 運行測試

LoginAction.action 改爲 login.action,請參閱上面的「命名轉換器」。

http://localhost:8080/struts2example/User/login.action

Struts2註解示例

提交到 http://localhost:8080/Struts2Example/User/Welcome.action 後顯示:

Struts2註解示例

參考

  1. Struts 2 約定插件文檔
  2. Strust 2 Hello World (XML 版本)