Action的三種實現方式,struts.xml配置的詳細解釋及其簡單執行過程(二)
阿新 • • 發佈:2020-06-09
> 勿以惡小而為之,勿以善小而不為--------------------------劉備
>
> 勸諸君,多行善事積福報,莫作惡
上一章簡單介紹了Struts2的'兩個蝴蝶飛,你好' (一),如果沒有看過,[請觀看上一章](https://www.cnblogs.com/yjltx/p/13071327.html)
# 一 Action的三種實現方式
上一章開發的HelloAction和HelloAction2,並沒有繼承任何類或者實現任何介面,但是必須有一個execute() 方法,方法返回值是String型別。
這樣的程式碼不容易理解,更並不能使人看得出這個類是幹什麼的,甚至不能區分這個控制器類與普通的Java類有什麼區別,通常開發中不這樣做。
我們開發者在開發Struts2框架的時候,希望自己寫的這個Action類能夠具有易理解性,且已經支援某些功能,如引數接收,檔案上傳等。
## 一.一 第一種實現方式(普通Java類,裡面只包含execute()方法)
~~~
package com.yjl.web.action;
import org.apache.log4j.Logger;
/**
* @author 兩個蝴蝶飛
* @version 建立時間:2018年8月23日 上午9:41:32
* @description 第一種實現方式,普通java類,
* 有一個execute()方法,也可以多寫幾個方法,用action中的標籤method來控制,可以正常訪問。
*/
public class Hello1Action {
private static Logger logger=Logger.getLogger(Hello1Action.class);
public String execute() {
logger.info("兩個蝴蝶飛,web層你好");
return "success";
}
}
~~~
不具有開發時要求的規範性,且不支援某些struts2自身提供的功能。
方法名稱只有一個 execute()
## 一.二 第二種實現方式(實現Action介面)
~~~
package com.yjl.web.action;
import com.opensymphony.xwork2.Action;
/**
* @author 兩個蝴蝶飛
* @version 建立時間:2018年8月23日 上午10:54:03
* @description 第二種實現方式,實現Action介面,重寫裡面的execute()方法
* 有一個execute()方法和五個String型別的常量
*/
public class Hello2Action implements Action{
@Override
public String execute() throws Exception {
return Action.SUCCESS;
//return Action.ERROR;
//return Action.LOGIN;
//return Action.NONE;
//return Action.INPUT;
}
}
~~~
注意,Action介面是xwork2包下的介面。
實現了Action介面,使開發者能夠看出來這是一個Action,具有了一定程度上的開發規範,
但是實現了Action介面,所以必須要重寫execute()方法。
一般自己寫Action,構思好之後上來就直接add(), edit(), delete(). select() 這些業務方法,
每次都要重寫execute()方法,不太方便。 而且這種方式不具有struts2中某些功能,如驗證框架和國際化。
Action中介面中有五個常用的結果字串(好多方法都返回success,error,login,input,none,故將其封裝了一下) .
這些字串雖然是大寫,然而真實的值是全部小寫.
~~~
package com.opensymphony.xwork2;
public abstract interface Action
{
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public abstract String execute()
throws Exception;
}
~~~
## 一.三 繼承ActionSupport類(官方推薦)
~~~
package com.yjl.web.action;
import com.opensymphony.xwork2.ActionSupport;
/**
* @author 兩個蝴蝶飛
* @version 建立時間:2018年8月23日 上午11:04:20
* @description 第三種方式,繼承ActionSupport類。
* ActionSupport類實現了Action介面,也有Action中的五個常量.
*/
public class Hello3Action extends ActionSupport{
public String list() {
return "list";
}
}
~~~
繼承了ActionSupport類,不需要重新寫execute()方法,直接寫業務方法即可。
ActionSupport類,已經實現了 Action介面。 其具備Action中的五個常量,並且該類還實現了其他介面,
原始碼:
~~~
public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable{
...
public String execute() throws Exception
{
//預設返回的是 success 字串
return "success";
}
...
}
~~~
如驗證框架(Validateable,ValidationAware),國際化(LocaleProvider)。
以後開發中,使用 繼承 ActionSupport 類的形式。
# 二 配置檔案 struts.xml中節點的詳細解釋
在src下有一個struts.xml的配置檔案,它配置了開發者自己編寫實現的Action,是struts2框架的核心,不能改變檔名稱。(注意,是struts.xml,並不是struts2.xml,並沒有那個2)。
在struts.xml中,最上面是一個約束,是一個根節點。
## 二.一 修改常量節點
在struts-core.jar核心包下,有一個包org.apache.struts2包下,有一個default.properties屬性檔案,裡面記錄了很多常用的常量,
其中常見的有:
~~~
struts.i18n.encoding=UTF-8
struts.multipart.maxSize=2097152
struts.action.extension=action,,
struts.enable.DynamicMethodInvocation = false
struts.devMode = false
struts.ui.theme=xhtml
struts.ognl.allowStaticMethodAccess=false
~~~
建議修改後的值為:
~~~
###國際化操作,編碼格式為UTF-8
struts.i18n.encoding=UTF-8
###上傳檔案時最大的上傳大小,預設為2M. 根據專案情況具體填寫值,建議後面加兩個00
struts.multipart.maxSize=209715200
###struts的訪問字尾名, struts1框架預設的是 .do
struts.action.extension=action,,
###struts是否可以訪問靜態方法
struts.enable.DynamicMethodInvocation =true
###struts是否是開發者模式
struts.devMode =true
###struts中ui標籤的主題,建議為simple
struts.ui.theme=simple
###ognl中是否可以訪問靜態方法,為true
struts.ognl.allowStaticMethodAccess=true
~~~
可以在struts.xml中進行相應的修改,如
~~~
~~~
按照name,value值的形式進行填寫。
也可以在src下新建一個struts.properties,然後將這些值放置進去,struts也會自動struts.propeties中的常量值的。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200609111329725.png)
也可以在web.xml中,在中,以區域性引數的形式傳遞進去。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200609111413293.png)
建議使用第一種方式,在struts.xml中用,畢竟這個檔案常常開啟,出錯了也容易發現。
## 二.二 分模