Struts2第四篇【請求數據自動封裝、Action獲得域對象】

前言

前三篇的Struts博文基本把Struts的配置信息講解完了…..本博文主要講解Struts對數據的處理java

通常地,咱們使用Servlet的時候都是分爲幾個步驟的:web

  1. 獲得web層的數據、封裝數據
  2. 調用service層的邏輯業務代碼
  3. 將數據保存在域對象中,跳轉到對應的JSP頁面

如今問題來了,咱們本身編寫的Action類是沒有request、response、Session、application之類的對象的….咱們是怎麼獲得web層的數據、再將數據存到域對象中的呢??markdown

請求數據封裝

前面已經說過了,Struts預先幫咱們完成了對數據封裝的功能,它是經過params攔截器來實現數據封裝的session

<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

register.jsp

首先,咱們填寫表單頁面的數據,請求Action處理數據app

<form action="${pageContext.request.contextPath}/date01" method="post">
    用戶名:<input type="text" name="username"><br>
    密碼:<input type="text" name="psd"><br>
    年齡:<input type="text" name="age"><br>
    生日:<input type="text" name="birthday"><br>
    <input type="submit" value="註冊"><br>
</form>

Action封裝基本信息

在Action設置與JSP頁面相同的屬性,併爲它們編寫setter方法jsp

private String username;
    private String psd;
    private int  age;
    private Date birthday;

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPsd(String psd) {
        this.psd = psd;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

咱們直接在業務方法中訪問這些變量,看是否能獲得表單的值。ide

這裏寫圖片描述


Action封裝對象

通常地,咱們註冊的時候,都是在Servlet上把基本信息封裝到對象上…那麼在Struts怎麼作呢?post

  • 建立一個User類,基本的信息和JSP頁面是相同的。
package qwer;

import java.util.Date;

/** * Created by ozc on 2017/4/27. */
public class User {

    private String username;
    private String psd;
    private int  age;
    private Date birthday;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPsd() {
        return psd;
    }

    public void setPsd(String psd) {
        this.psd = psd;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
  • 在Action中定義User對象出來,並給出setter和getter方法….值得注意的是:基本信息只要setter就夠了,封裝到對象的話,須要setter和getter
public class ccAction extends ActionSupport {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String register() {

        System.out.println(user.getUsername());
        System.out.println(user.getPsd());
        System.out.println(user.getAge());
        System.out.println(user.getBirthday());

        return "success";
    }


}
  • 在JSP頁面,提交的name要寫成user.username之類的
<form action="${pageContext.request.contextPath}/register" method="post">
    用戶名:<input type="text" name="user.username"><br>
    密碼:<input type="text" name="user.psd"><br>
    年齡:<input type="text" name="user.age"><br>
    生日:<input type="text" name="user.birthday"><br>
    <input type="submit" value="註冊"><br>
</form>

這裏寫圖片描述

獲得域對象

Struts怎麼把數據保存在域對象中呢???Struts提供了三種方式this

1、獲得Servlet API

咱們能夠經過ServletActionContext獲得Servlet APIspa

因爲每一個用戶擁有一個Action對象,那麼底層爲了維護用戶拿到的是當前線程的request等對象,使用ThreadLocal來維護當前線程下的request、response等對象…

 //經過ServletActionContext獲得Servlet API javax.servlet.ServletContext context = ServletActionContext.getServletContext(); HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); HttpServletResponse response = ServletActionContext.getResponse();

2、ActionContext類

咱們還能夠經過ActionContext類來獲得request、response、session、application被Struts封裝的Map集合

//獲得ActionContext 對象
        ActionContext context = ActionContext.getContext();
        Map<String, Object> session = context.getSession();
        Map<String, Object> application = context.getApplication();

        //這是request的Map
        Map<String, Object> request = context.getContextMap();

3、實現接口

當web容器發現該Action實現了Aware接口,會把相對應的資源經過Aware接口注射進去,實際上就是一種IOC。

Aware實際就是一種攔截器,攔截代碼在執行Action以前執行、將資源注射到Action中

實現SessionAware, RequestAware, ApplicationAware接口,它就要在程序中實現三個方法:

 private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; @Override public void setApplication(Map<String, Object> map) { this.application = map; } @Override public void setRequest(Map<String, Object> map) { this.request = map; } @Override public void setSession(Map<String, Object> map) { this.session = map; } 

經過這些方法,咱們就能夠獲得對應的Map對象…..

小總結

那麼,咱們有三種方法能夠獲得Servlet對應的對象,那麼該使用哪種呢???

分析:

  • 第一種方法:須要導入Servlet的包,與Struts耦合了
  • 第二種方法:只能在業務方法中使用ActionContext類獲得對應的Map對象,若是有多個方法,那麼每一個方法都須要寫相似的代碼
  • 第三種方法:能夠在類上定義成員變量,以致於整個類都能使用。可是須要實現類、實現對應的方法

若是咱們須要使用到對象的其餘方法,相似getContextPath()之類的,那麼只能使用第一種

若是咱們就按照日常的開發,咱們就使用第二種【獲取簡單,沒有耦合】

至於第三種,當咱們未來可能開發BaseAction的時候,就使用它!

相關文章
相關標籤/搜索