Struts2認知

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

  1. Struts2主要是基於webwork核心的
  2. 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>
```
  1. 在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>
  2. 寫一個動作類
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的配置文件體系

  1. default.properties:在struts2-core-**.jar的org.apache.struts包中
    關於Struts2一些常量配置(框架內部)
  2. struts-default.xml:在struts2-core-**.jar中。(框架內部)
    定義了一些bean;
    定義了一個抽象的包:struts-default
    • 定義了一些結果視圖類型
    • 定義了一些攔截器和攔截器小組
  3. struts-plugin.xml :在struts2的第三方插件中(插件內部)
  4. struts.xml:用戶自己編寫的(重點)
  5. struts.properties:用戶自己編寫的(類路徑中。不需要)
  6. 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方法

自定義結果集

  1. 實現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()); 
        }
    }
  2. 配置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");

方式三:通過實現接口

  1. ServletContextAware:通過該接口可以直接訪問ServletContext
  2. ServletRequestAware:訪問HttpServletRequest
  3. 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;
    }

自定義轉換器

  1. 繼承org.apache.struts2.util.StrutsTypeConverter(最簡單和方便)
  2. 覆蓋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;
        }
    }
  1. 編寫配置文件
    • 全局配置:
      • 在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標籤支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章