Struts2框架自學之路——Action獲取表單資料的方式以及表單資料的封裝

加瓦一枚發表於2018-10-24

目錄

 

Action獲取表單資料的方式

通過ActionContext類獲取

使用ServletActionContext類獲取

通過特定介面訪問

在Action中操作域物件

Action中原始方式封裝表單資料

Struts2中表單資料的封裝

屬性封裝

模型驅動封裝(重點)

表示式封裝

比較表示式封裝和模型驅動封裝

Struts2封裝資料到集合中

封裝資料到List集合

封裝資料到Map集合


Action獲取表單資料的方式


  在使用servlet處理請求的過程中,可以通過request物件獲得表單提交過來的資料。採用struts2後將採用Action處理請求,而Action類中並沒有request物件,所以不能直接使用request物件獲取表單提交的資料。以下將講解如何在Action中獲取表單提交的資料。 
  Action獲取表單提交的資料主要有三種方式: 
(1)使用ActionContext類 
(2)使用ServletActionContext類 
(3)使用介面注入方式

通過ActionContext類獲取


  在Struts2中,提供了ActionContext類來訪問Servlet API,ActionContext是Action執行的上下文物件,在ActionContext中儲存了Action執行所需要的所有物件,包括parameters、request、session、application等。在主要講解ActionContext中的一個方法:getParameters(),它用來返回一個包含所有HttpServletRequest引數資訊的Map集合。 
案例: 
  form1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>ActionContext接收表單資料</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/form1.action" method="post">
    使用者名稱:<input type="text" name="username"/><br/>
    密 碼:<input type="password" name="password"/><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

Form1Action.java

package com.wm103.form;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import java.util.Set;

public class Form1Action extends ActionSupport {
    @Override
    public String execute() throws Exception {
        // 1. 獲取ActionContext物件
        ActionContext context = ActionContext.getContext();
        // 2. 獲取表單資料,其中Map集合中的key是表單name的屬性值,value是對應表單輸入項的值
        Map<String, Object> parameters = context.getParameters();
        Set<String> keys = parameters.keySet();
        for (String key: keys) {
            // 這裡是陣列形式的原因是一個表單name屬性值可以對應多個value值,如核取方塊提交資料
            Object[] obj = (Object[]) parameters.get(key);
            System.out.println(key + ": " + Arrays.toString(obj));
        }
        return NONE;
    }
}

struts.xml中的配置:

<package name="demo2" extends="struts-default" namespace="/">
        <action name="form1" class="com.wm103.form.Form1Action"></action>
</package>

使用ServletActionContext類獲取


  為了直接訪問Servlet API,Struts2框架還提供了ServletActionContext類,該類包含了幾個常用的靜態方法,具體如下: 
static HttpServletRequest getRequest() 獲取Web應用的HttpServletRequest物件; 
static HttpServletResponse getResponse() 獲取Web應用的HttpServletResponse物件; 
static ServletContext getServletContext() 獲取Web應用的ServletContext物件; 
static PageContext getPageContext() 獲取Web應用的PageContext物件。 
  這裡為獲取表單資料,呼叫ServletActionContext中的靜態方法getRequest獲取request物件。如: 
  Form2Action.java

package com.wm103.form;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;

public class Form2Action extends ActionSupport {
    @Override
    public String execute() throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username + ": " + password);
        return NONE;
    }
}

通過特定介面訪問


  (這種方式一般不使用。) 
  為了在Action中直接訪問Servlet API,Stuts2還提供了一系列介面,具體如下:ServletRequestAware:實現該介面的Action可以直接訪問Web應用的HttpServletRequest例項;
ServletResponseAware:實現該介面的Action可以直接訪問Web應用的HttpServletResponse例項;
SessionAware:實現該介面的Action可以直接訪問Web應用的HttpSession例項;
ServletContextAware:實現該介面的Action可以直接訪問Web應用的ServletContext例項。 
  這裡為獲取表單資料,需要Action實現ServletRequestAction介面,如: 
  Form3Action.java

package com.wm103.form;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import javax.servlet.http.HttpServletRequest;

public class Form3Action extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;

    @Override
    public void setServletRequest(HttpServletRequest httpServletRequest) {
        this.request = httpServletRequest;
    }

    @Override
    public String execute() throws Exception {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username + ": " + password);
        return NONE;
    }
}

在Action中操作域物件


  在Servlet中有3個域物件,分別為 request、session和servletContext。(pageContext域物件[page域]是在JSP中的)。 
  使用ServletActionContext操作域物件,如: 
  DomainAction.java

package com.wm103.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class DomainAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        // 1. 獲取request域物件
        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("request", "requestValue");

        // 2. 獲取session域物件
        HttpSession session = request.getSession();
        session.setAttribute("session", "sessionValue");

        // 3. 獲取servletContext域物件
        ServletContext servletContext = ServletActionContext.getServletContext();
        servletContext.setAttribute("servletContext", "servletContextValue");

        return NONE;
    }
}

Action中原始方式封裝表單資料


   通過ServletActionContext物件獲取request物件,進而使用request物件獲取表單資料,將資料到的資料封裝到實體物件去。如: 
   實體類 User.java

package com.wm103.entity;

/**
 * Created by DreamBoy on 2017/5/26.
 */
public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

  Form4Action.java

package com.wm103.form;

import com.opensymphony.xwork2.ActionSupport;
import com.wm103.entity.User;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;

/**
 * Created by DreamBoy on 2017/5/26.
 */
public class Form4Action extends ActionSupport {
    @Override
    public String execute() throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        System.out.println(user);
        return NONE;
    }
}

Struts2中表單資料的封裝


  在實際開發中,我們需要在Action獲取到表單資料,並對錶單資料進行封裝,封裝到一個JavaBean中,然後將JavaBean傳遞給業務層。這些封裝的操作Struts2框架提供了實現方式。如下。

屬性封裝


  在Struts2中可以直接在Action中定義各種Java基本資料型別的欄位,使這些欄位與表單資料相對應,並利用這些欄位進行資料傳遞。 
  實現步驟如下: 
(1)在Action成員變數中定義變數,且變數名稱與表單輸入項的name屬性值一致; 
(2)在Action中生成與這些變數對應的set方法。 
  案例如下: 
  Data1Action.java

package com.wm103.data;

import com.opensymphony.xwork2.ActionSupport;

public class Data1Action extends ActionSupport {
    // 1. 定義變數,且變數的名稱與表單輸入項中的name屬性值一致
    private String username;
    private String password;

    // 2. 生成變數對應的set方法(這裡把getter和setter方法都生成了)
    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(this.username + ": " + this.password);
        return NONE;
    }
}

模型驅動封裝(重點)


  使用模型驅動封裝的方式,我們可以直接把表單資料封裝到實體類物件。 
  模型驅動:通過實現ModelDriven介面來接收請求引數,Action類必須實現ModelDriven介面,並且要重寫getModel()方法,這個方法返回的就是Action所使用的資料模型物件。 
  實現步驟: 
(1)讓Action類實現介面ModelDriven; 
(2)在Action類中建立實體類物件成員; 
(3)實現介面中getModel方法,並返回上述提及的實體類物件。 
  案例如下: 
  Data2Action.java

package com.wm103.data;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.wm103.entity.User;

public class Data2Action extends ActionSupport implements ModelDriven<User> {
    // 建立實體類物件
    // 注意:要求表單輸入項的name屬性值與實體類屬性名稱一致,否則表單資料無法封裝到實體物件的屬性中去。
    private User user = new User();
    @Override
    public User getModel() {
        return user;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(this.user.getUsername() + ": " + this.user.getPassword());
        return NONE;
    }
}

使用模型驅動和屬性封裝時需要注意的問題: 
  在一個Action中,獲取表單資料可以使用屬性封裝,也可以使用模型驅動封裝,但是不能同時使用這兩種方式獲取同一個表單資料。如果同時使用,那麼將執行模型驅動封裝資料。

表示式封裝


  使用表示式封裝也可以把表單資料封裝到實體類物件中去。表示式封裝也可以歸類於屬性封裝。 
  實現步驟: 
(1)在Action中宣告實體類物件; 
(2)在Action中為該實體類物件生成實體類變數的set和get方法; 
(3)在表單中提交項的name屬性值中寫表示式形式,表示式的內容為 實體類物件的名稱.實體類物件的屬性名。 
  案例如下: 
  Data3Action.java

package com.wm103.data;

import com.opensymphony.xwork2.ActionSupport;
import com.wm103.entity.User;

public class Data3Action extends ActionSupport {
    // 1. 宣告實體類物件
    private User user;
    // 2. 生成實體類變數的set和get方法
    public User getUser() {
        return user;
    }

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

    @Override
    public String execute() throws Exception {
        System.out.println(this.user);
        return NONE;
    }
}

  在struts.xml中Action的配置:

<package name="demo2" extends="struts-default" namespace="/">
    <action name="data3" class="com.wm103.data.Data3Action"></action>
</package>

  測試頁面 data3.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表示式封裝</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/data3.action" method="post">
    使用者名稱:<input type="text" name="user.username"/><br/>
    密 碼:<input type="password" name="user.password"/><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

比較表示式封裝和模型驅動封裝


相同點:使用表示式封裝和模型驅動封裝都可以把資料封裝到實體類物件中。
不同點: 
使用模型驅動只能把資料封裝到一個實體類物件中。在一個Action中不能使用模型驅動把資料封裝到不同的實體類物件裡面。
使用表示式封裝可以把資料封裝到不同的實體類物件中。


Struts2封裝資料到集合中


封裝資料到List集合


  將表單提交的資料儲存到List集合中,實現步驟如下(類似表示式封裝): 
(1)在Action中宣告List集合物件; 
(2)在該Action中生成List物件的get和set方法; 
(3)在表單的提交項name屬性中填寫表示式,表示式的格式為 List集合物件的名稱[下標].List集合中儲存的物件的屬性名稱。 
  案例如下: 
  ListAction.java

package com.wm103.data;

import com.opensymphony.xwork2.ActionSupport;
import com.wm103.entity.User;
import java.util.List;

public class ListAction extends ActionSupport {
    private List<User> list;

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(list);
        return NONE;
    }
}

  在struts.xml中Action的配置:

<package name="demo2" extends="struts-default" namespace="/">
    <action name="list" class="com.wm103.data.ListAction"></action>
</package>

  list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>封裝資料到List集合</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/list.action" method="post">
    使用者名稱1:<input type="text" name="list[0].username"/><br/>
    密 碼1:<input type="password" name="list[0].password"/><br/>
    <br/><br/>
    使用者名稱2:<input type="text" name="list[1].username"/><br/>
    密 碼2:<input type="password" name="list[1].password"/><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

封裝資料到Map集合


  將表單提交的資料儲存到Map集合中,實現步驟如下(類似表示式封裝): 
(1)在Action中宣告Map集合物件; 
(2)在該Action中生成Map物件的get和set方法; 
(3)在表單的提交項name屬性中填寫表示式,表示式的格式為 Map集合物件的名稱['自定義鍵值對的key值'].Map集合中儲存的物件的屬性名稱。 
  案例如下: 
  MapAction.java

package com.wm103.data;

import com.opensymphony.xwork2.ActionSupport;
import com.wm103.entity.User;

import java.util.Map;

public class MapAction extends ActionSupport {
    private Map<String, User> map;

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(map);
        return NONE;
    }
}

  在struts.xml中Action的配置:

<package name="demo2" extends="struts-default" namespace="/">
    <action name="map" class="com.wm103.data.MapAction"></action>
</package>

  map.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>封裝資料到Map集合</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/map.action" method="post">
    使用者名稱1:<input type="text" name="map['key01'].username"/><br/>
    密 碼1:<input type="password" name="map['key01'].password"/><br/>
    <br/><br/>
    使用者名稱2:<input type="text" name="map['key02'].username"/><br/>
    密 碼2:<input type="password" name="map['key02'].password"/><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

 

-----------------------------

原文:https://blog.csdn.net/qq_15096707/article/details/72764820

相關文章