1. Struts2的定義
Apache Struts 2 is an open-source web application framework for developing Java EE web applications. It uses and extends the Java Servlet API to encourage developers to adopt a model–view–controller (MVC) architecture. ——from Wikipedia
Apache Struts 2是一個開放源代碼,支持開發java EE應用的的Web應用框架。它使用和擴展java Servlet API,鼓勵開發者採取模型–視圖控制器(MVC)架構。——來自維基百科
2. 關於Struts2
- Struts2主要是基於webwork核心的
- Struts2已經逐步被SpringMVC替代,原因有SpringMVC的優點,自然也有Struts2的不足:參見
http://blog.csdn.net/chenleixing/article/details/44570681
3. Struts2起步
3.1 登錄Struts官網下載(建下載Full Distribution完整版,技術支持可以下載Documentation相關文檔)。
3.2 解壓目錄結構
apps->包含了基於Struts2的示例
docs->包含有Struts2技術支持的相關文檔
lib->(重要)包含Struts2的核心類庫,相關第三方插件類庫
src->源碼
3.3 主要jar包介紹
- Struts2-core-**.jar : Struts框架的核心類庫
- Xwork-core-**.jar : command模式框架,webwork和struts2都基於xwork
- ornl-**,jar : 對象圖導航語言(Object Graph Navigation Language),struts2框架通過其讀寫對象的屬性
- reemarker-2.3.18.jar:Struts 2的UI標籤的模板使用FreeMarker編寫
- commons-logging-1.1.x.jar:ASF出品的日誌包,Struts 2框架使用這個日誌包來支持Log4J和JDK 1.4+的日誌記錄。
- commons-fileupload-1.2.2.jar: 文件上傳組件,2.1.6版本後需要加入此文件
- commons-io-2.0.1.jar:傳文件依賴的jar包
- commons-lang-2.5.jar:對java.lang包的增強- javassist-3.11.0.GA.jar:動態代理的開發包。日本的(Jboss)。Hibernate也會用到
. 新建一個web項目,從apps中struts2-blank中lib下的jar包拷到項目lib下
4. 在web.xml中配置Struts2的核心Filter
```
<filter>
<filter-name>struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
```
在src下新建一個Struts.xml,配置該配置文件。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"/> <package name="default" namespace="/" extends="struts-default"> <!--to login page--> <action name="toLogin" > <result>/login.jsp</result> </action> </package> </struts>
- 寫一個動作類
public class OrderAction extends ActionSupport {
//bean
private OrderService orderService;
//bussiness
public String orderDetail(){
order = orderService.findOneById(id);
return SUCCESS;
}
//getter&setter
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
}
Struts2的相關配置文件
Struts2的配置文件體系
- default.properties:在struts2-core-**.jar的org.apache.struts包中
關於Struts2一些常量配置(框架內部) - struts-default.xml:在struts2-core-**.jar中。(框架內部)
定義了一些bean;
定義了一個抽象的包:struts-default
- 定義了一些結果視圖類型
- 定義了一些攔截器和攔截器小組
- struts-plugin.xml :在struts2的第三方插件中(插件內部)
- struts.xml:用戶自己編寫的(重點)
- struts.properties:用戶自己編寫的(類路徑中。不需要)
- web.xml:struts2的一些配置可以寫在這(Web應用中。不需要)
default.prorerties
- 在struts2-core-**.jar的org.apache.struts包中
- 配置了一些關於Struts2一些常量配置(框架內部)
- 配置常量的方式(依次加載覆蓋):
- 通過struts.xml(常用)
- 通過struts.properties
- 通過web.xml
常用屬性:
請求相關
- 設置訪問action的後綴
struts.action.extension=action,,
- 設置web默認字符編碼集,對處理中文請求參數很有用
struts.i18n.encoding=UTF-8
文件上傳相關
- 設置處理multipart、form-data的MIME類型
jakarta:使用common-fileupload文件上傳框架(默認值)
struts.multipart.parser=jakarta
- 設置上傳文件臨時保存路徑
struts.multipart.saveDir=
- 設置文件上傳允許的最大字節數
struts.multipart.maxSize=2097152
開發時相關
- 設置是否使用開發者模式,在開發時設置true會提示更多,更友好的錯誤
struts.devMode = false
- 設置瀏覽器是否緩存靜態類容(在開發時,如果希望每次都獲得服務器最新響應,可可設置其爲false)
struts.serve.static.browserCache=true
- 設置Struts是否支持動態方法調用
struts.enable.DynamicMethodInvocation = false
國際化
指定國際化資源文件,多個用,隔開
struts.custom.i18n.resources=testmessages,testmessages2
sturts-default.xml
在struts2-core-**.jar中。(框架內部)
- 定義了一些bean;
- 定義了一個抽象的包:struts-default
- struts-default下定義了一些結果視圖
- 常用的結果視圖:
- chain:轉發到Action
- dispatcher:視圖轉發(默認)
- redirect:視圖重定向
- redirectAction:重定向到Action
- stream:使用InputStream,常用於文件下載
- struts-default下定義了一些攔截器和攔截器小組(默認攔截器組defaultStack)
- struts-default設置了默認Action爲com.opensymphony.xwork2.ActionSupport
struts.xml重點
struts.xml的骨架結構
注意點
配置action的method配置
1. 必須是public修飾的
2. 不可以帶參數
3. 返回值必須是String
配置結果視圖重定向到其它名稱空間
```
<result type=”redirectAction” >
<param name=”namespace”>/house</param>
<param name=”actionName”>/addhouse</param>
</result>
```
param注入調用的是setter方法,故在注入類必須定義setter方法
自定義結果集
實現com.opensymphony.xwork2.Result接口,或者繼承自該接口的實現類org.apache.struts2.dispatcher.StrutsResultSupport
public class MyResultType implements Result { //由param注入 private int width ; private int height ; //必須要有setter public int getWidth() {return width;} public void setWidth(int width) {this.width = width;} public int getHeight() {return height;} public void setHeight(int height) {this.height = height;} //重寫execute @Override public void execute(ActionInvocation invocation) throws Exception { //生成驗證碼 ValidateCode validateCode = new ValidateCode(width,height,4,10); String code = validateCode.getCode(); System.out.println("驗證碼:"+code); //怎麼把驗證碼顯示到頁面 //怎麼在struts2中使用servlet的api HttpServletResponse response = ServletActionContext.getResponse(); //把驗證碼展示到頁面 validateCode.write(response.getOutputStream()); } }
- 配置struts.xml
<!-- 配置自定義結果視圖 -->
<result-types>
<result-type name="yanzhengma" class="com.itqf.resulttype.MyResultType">
</result-type>
</result-types>
<!--將結果視圖配置給action-->
<action name="showImg" >
<result type="yanzhengma">
<!-- 給自定義結果類型注入值 -->
<param name="width">500</param>
<param name="height">100</param>
</result>
</action>
訪問Servlet API
方式一:通過ServletActonContext工具類:
//獲得一個HttpServletRequest對象
HttpServletRequest request = ServletActionContext.getRequest();
//獲得一個HttpServletResponse對象
HttpServletResponse response = ServletActionContext.getResponse();
//獲得一個ServletContext對象
ServletContext servletContext = ServletActionContext.getServletContext();
//獲得一個Session對象
HttpSession session = request.getSession();
方式二:通過ActionContext對象
//得到ActionContext對象
ActionContext actionContext = ActionContext.getContext();
//2通過ActionContext得到session域對象(一個map集合)
Map<String, Object> sessionMap = actionContext.getSession();
//獲得application域對象
Map<String, Object> applicationMap = actionContext.getApplication();
//request對象
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
方式三:通過實現接口
- ServletContextAware:通過該接口可以直接訪問ServletContext
- ServletRequestAware:訪問HttpServletRequest
- ServletResponseAware:訪問HttpServletResponese
//實現接口
public class MyAction3 implements ServletRequestAware {
//定義變量
private HttpServletRequest request;
//重寫setter
public void setRequest(HttpServletRequset request){
this.request = request;
}
}
Page和Action間數據的交互
Action 接收Page的值
字段方式
page:
<form action="login1.action">
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="登錄">
</form>
action:
//1,把頁面需要向動作類傳值的字段聲明出來
private String username;
private String password;
//2,設置get set方法(必須,因爲是用注入的方式寫入的)
通過Bean
page:
//注意name是對象名.字段名 OGNL表達式格式
<form action="login1.action">
用戶名:<input type="text" name="user.username"><br>
密碼:<input type="password" name="user.password"><br>
<input type="submit" value="登錄">
</form>
action:
//1.聲明user類
private User user;
//2.設置getter&setter方法
...
通過Map
page:
//注意name是對象名.字段名 OGNL表達式格式
<form action="login1.action">
用戶名:<input type="text" name="users['u1'].username"><br>
密碼:<input type="password" name="users['u1'].password"><br>
<input type="submit" value="登錄">
</form>
action:
//1.聲明user類
private Map(String,Object) users;
//2.設置getter&setter方法
...
//3.取值
User user = (User)users.get("u1") ;
通過模型驅動
page和上面一樣
action:
// 實現ModelDriven接口
public class LoginAction3 implements ModelDriven<User>{
//新建一個user對象
private User user = new User();
//重寫getModel()方法
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
自定義轉換器
- 繼承org.apache.struts2.util.StrutsTypeConverter(最簡單和方便)
- 覆蓋convertFromString,convertToString方法
public class DataConvertor extends StrutsTypeConverter{
private DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd");
//字符串轉Date
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
if(aClass == Date.class){
String date = strings[0];
try {
return dateFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
//日期轉字符串
@Override
public String convertToString(Map map, Object o) {
if(o instanceof Date){
Date date = (Date)o;
return dateFormat.format(date);
}
return null;
}
}
- 編寫配置文件
- 全局配置:
- 在src根目錄下創建一個文件,名爲xwork-conversion.properties:
- 配置com.util.Date=com.util.StudentConverter;
- 局部配置:
- 在需要使用該轉換器的Action的目錄下創建:
- date=com.util.StudentConverter(date爲Action中的字段名)
- 全局配置:
Page訪問Action數據
Struts ValueStack
Stack Context
OGNL表達式
OGNL是Object Graphic Navigation Language(對象圖導航語言)的縮寫,它是一個單獨的開源項目。 Struts2框架使用OGNL作爲默認的表達式語言,OGNL使用必須依賴struts標籤支持。