Struts2註解示例
在這個教程,我們重複使用以前 STRUST2 Hello World(XML版本)的例子,並將其轉換成註解版本。
Struts2 註解概念
Struts2註解是由Struts 2的約定插件的支持,所以,必須要了解其背後的「掃描方法」和「命名轉換」機制的魔力。
1. 掃描方法
許多Struts 2的文章或書籍說,可以配置過濾器的「init-param」或「struts.convention.action.packages」告訴Struts2,其中掃描註解的類。 例如,
web.xml
從測試(Struts22.1.6和2.1.8版本),這是不正確的,不管你把在「param-value」還是 「struts.convention.action.packages「, 在Struts 2會忽略它,並只掃描指定的文件夾命名:struts, struts2, action 或 actions 。
下面是掃描工作
掃描其位於包的命名註解的類 「struts, struts2, action 或 actions「.
接着,掃描相匹配下列任一條件的文件:
- 實例了 com.opensymphony.xwork2.Action 接口。
- 擴展了 com.opensymphony.xwork2.ActionSupport 類
- 文件名用動作(例如:UserAction,LoginAction)結束
詳細請查看這裏Struts 2 約定插件文件
2. 命名轉換器
Struts 2的約定插件將所有的註解操作文件名轉換爲指定的格式。
例如 : LoginAction.java
首先,去掉「Action」字符在文件名的末尾,如果存在的話。
其次,轉換文件名的第一個字母爲小寫。
因此,去除結束並轉換第一個字母爲小寫後,LoginAction.action 將變爲 login.action。
Struts2約定插件的「掃描方法」和「命名轉換」特性真正帶來了很多的便利和好處,只有當你的Struts2項目正確下面的命名約定纔會帶來好處; 否則,這將是一場災難。
Struts 2 註解例子
現在是時候開始轉換過程了,我們使用MyEclipse 10 創建一個工程爲:struts2example。
最終的項目結構
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 實現版本
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 實現版本
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過濾器標準。
7. 運行測試
LoginAction.action 改爲 login.action,請參閱上面的「命名轉換器」。
http://localhost:8080/struts2example/User/login.action
提交到 http://localhost:8080/Struts2Example/User/Welcome.action 後顯示:
參考
- Struts 2 約定插件文檔
- Strust 2 Hello World (XML 版本)