Struts2框架自學之路——Action獲取表單資料的方式以及表單資料的封裝
目錄
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
相關文章
- Struts2筆記06 封裝獲取表單資料方式筆記封裝
- 原生js實現獲取form表單資料JSORM
- 如何建立最簡單的 ABAP 資料庫表,以及編碼從資料庫表中讀取資料 (上)資料庫
- Struts2的資料封裝封裝
- 關鍵字: 讀取表單中最簡單的資料
- mysql,sqlserver資料庫單表資料過大的處理方式MySqlServer資料庫
- 解決PHP Post獲取不到非表單資料的問題PHP
- 一個表單中的資料新增到不同的資料表中
- js獲取表單元素所在的form表單物件JSORM物件
- 簡單的資料表統計
- POST表單資料大小的限制
- Ajax 提交表單資料
- 表單資料驗證
- 表單資料相關
- 038 收集表單資料
- 為何我用spring mvc獲取不到表單提交資料?SpringMVC
- 過濾器中獲取form表單或url請求資料過濾器ORM
- jdbcTemplate 獲取資料表結構JDBC
- 利用js解析php的表單資料JSPHP
- modbustcp封裝使用獲取裝置資料示例TCP封裝
- js獲取form表單下所有表單元素JSORM
- SqlSugar 多資料來源的簡單封裝SqlSugar封裝
- Laravel 表單輸入資料Laravel
- 資料庫 表單運用資料庫
- 用強資料型別保護你的表單資料-基於antd表單的型別約束資料型別
- PHP獲取表單方法PHP
- 封裝react antd的form表單元件封裝ReactORM元件
- 封裝Vue Element的form表單元件封裝VueORM元件
- C++ 使用 hiredis 封裝redis 的資料獲取介面C++Redis封裝
- jQuery獲取表單值及幾個表單事件jQuery事件
- 獲取表單物件的三種方法物件
- Vue資料驅動表單渲染,輕鬆搞定form表單VueORM
- Struts2 action前的資料預處理
- javascript獲取form表單中表單元素的數目JavaScriptORM
- 資料庫中單表查詢資料庫
- 資料庫-單表結構-建表語句資料庫
- 在MySQL中,如何獲取資料庫下所有表的資料行數?MySql資料庫
- 字典表資料在表單中顯示的方法請教!