Struts2 Action標籤
Struts Action 筆記
package.Namespace
package.namespace預設為“”,必須以“/”開頭,例如“/req”而不能是“req”。如果namespace為“”,那這個package就會成為全域性的,凡請求可以匹配到action,都會匹配到這個namespace,例如:
//package 的namespace不寫預設為
<package extends="struts-default" name="main">
<action name="req">
<result>/index.jsp</result >
</action>
</package>
請求無論為http://localhost:8080/Struts2/abcdefg/a/b/c/req
還是http://localhost:8080/Struts2/req
都是可以請求到index.jsp的
Action的方法呼叫(3種方式)
第一種方式是在struts.xml中明確指明該請求應該呼叫哪個方法:
<package extends="struts-default" name="main">
<action name="req" class="action.action" method="index" >
<result>/index.jsp</result>
</action>
</package>
第二種方式是在請求的時候用動態方法呼叫(DMI)來呼叫方法,struts.xml可以指明也可以不指明具體呼叫的方法名,而在請求連結的時候用!連線方法實現呼叫
<package extends="struts-default" name="main">
<action name="req" class="action.action">
<result>/index.jsp</result >
</action>
</package>
請求可以為:http://localhost:8080/Struts2/req!index
第三種方式:
<package extends="struts-default" name="main">
<action name="req_*" class="action.action" method="{1}">
<result>/{1}.jsp</result>
</action>
</package>
這種方式是通過萬用字元呼叫,主要有兩個主要地方:*萬用字元 和 {1}佔位符。
萬用字元可以模糊匹配客戶端的請求,而佔位符是為 準備呼叫哪個方法而佔位的。
上面的程式碼為例,如果如果請求為http://localhost:8080/Struts2/req_index
的話,則會呼叫action.action中的index()或者doIndex()。佔位符中數字說明這個為第幾個*而佔位。
第三種方法以犧牲可讀性縮短xml配置檔案內容,可以使xml非常精簡,例如:
<package extends="struts-default" name="main" namespace="/">
<action name="*_*" class="action.action" method="{1}{2}">
<result>/{1}{2}.jsp</result>
</action>
</package>
當請求http://localhost:8080/Struts2/req_index
的時候就會呼叫action.action
類下的index()
方法,如果方法返回了success的話,則會在web-Root下找到req_index.jsp頁面。這樣的話請求的自由度非常的高。凡是xxx_xxx的請求都是適用的。
接收請求引數(3種方式)
在action類中定義成員變數以及成員的setting、getting,在請求傳遞到Struts的時候,Struts會根據action中的class反射action類並且例項化,這個時候就會將引數通關過setting給變數賦值。
public class action extends ActionSupport{
private int id;
private String name;
public void setId(int id){
this.id = id;
}
public int getId(){
return this.id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
//...
}
請求為:http://localhost:8080/Struts2/req!index?id=10&name=abc
需要注意的是:Struts反射的是方法而不是成員變數,所以,請求的引數名要與方法名(getting、setting)對應。
第二種方式是在action類中使用物件進行接收引數
public class action extends ActionSupport{
private User user;
public void setUser(User user){
this.user = user;
}
public int getUser(){
return this.user;
}
//...
}
請求為:http://localhost:8080/Struts2/req!index?user.id=10&user.name=abc
第三種方式:
action類實現ModelDriven介面,並實現方法public T getModel()
。
public class action extends ActionSupport implements ModelDriven<User>{
private User user = new User();
@Override
public User getModel() {
return this.user;
}
@Override
public String execute() throws Exception {
System.out.println(this.user.getName());
return super.execute();
}
}
請求為:http://localhost:8080/StrutsDemo/req?user.name=abcdef
這種方式需要例項化好物件。
資料校驗
簡單的資料校驗,檢視錯誤資訊,debug標籤。
action類繼承了ActionSupport類之後,可以使用addFieldError()來為欄位新增錯誤,在頁面中用Strtus標籤庫來檢視這個錯誤。或者使用debug標籤檢視各個物件的資料資訊。
@Override
public String execute() throws Exception {
this.addFieldError("name","錯誤1");
return ERROR;
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<s:fielderror></s:fielderror>
<s:debug></s:debug>
</body>
action中訪問web元素(四種方式)
struts.xml配置
第一種:依賴容器
依賴Struts的ActionContext.getContext()
獲取web元素。
public class action extends ActionSupport {
private Map request;
private Map session;
private Map application;
@Override
public String execute(){
Map request = (Map)ActionContext.getContext().get("request");
request.put("r", "rrr");
Map session = (Map)ActionContext.getContext().getSession();
session.put("s", "ssss");
Map application = (Map)ActionContext.getContext().getApplication();
application.put("a", "aaaa");
return SUCCESS;
}
第二種:依賴注入/控制反轉
public class action extends ActionSupport implements SessionAware,RequestAware,ApplicationAware{
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
@Override
public String execute(){
Map request = (Map)ActionContext.getContext().get("request");
request.put("r", "rrr");
Map session = (Map)ActionContext.getContext().getSession();
session.put("s", "ssss");
Map application = (Map)ActionContext.getContext().getApplication();
application.put("a", "aaa");
return SUCCESS;
}
@Override
public void setApplication(Map<String, Object> arg0) {
this.application = arg0;
}
@Override
public void setRequest(Map<String, Object> arg0) {
this.request = arg0;
}
@Override
public void setSession(Map<String, Object> arg0) {
this.session = arg0;
}
}
第三種:依賴容器
public class action extends ActionSupport{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
@Override
public String execute(){
this.request = ServletActionContext.getRequest();
request.setAttribute("r", "rrr");
this.session = this.request.getSession();
this.session.setAttribute("s", "sss");
this.application = ServletActionContext.getServletContext();
this.application.setAttribute("a", "aaa");
return SUCCESS;
}
}
第四種:依賴注入/控制反轉
public class action extends ActionSupport implements ServletRequestAware,ServletContextAware{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
@Override
public String execute() throws Exception {
this.request.setAttribute("r", "rrr");
this.session = this.request.getSession();
this.session.setAttribute("s", "sss");
this.application.setAttribute("a", "aaa");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
}
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;
}
}
包含模組和預設Action
包含模組標籤<default-action-ref name="req">index.jsp</default-action-ref>
預設Action標籤<include file="struts2.xml"></include>