引入
1 之前web階段,提交表單到servlet里面,在servlet里面使用request對象里面的方法獲取,getParameter,getParameterMap
2 提交表單到action,但是action沒有request對象,不能直接使用request對象
一 在action獲取表單提交數(shù)據(jù)
1 使用ActionContext類獲取
Map<String,Object> getParameters()
返回一個(gè)包含所有HttpServletRequest參數(shù)
(1)因?yàn)榉椒ú皇庆o態(tài)的方法,需要創(chuàng)建ActionContext類對象
(2)這個(gè)ActionContext類對象不是new出來的
static ActionContext getContext()
獲取當(dāng)前線程的ActionContext對象
(3)演示
- 創(chuàng)建表單,提交表單到action里面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/form1" method="post">
username:<input type="text" name="username"><br>
password:<input type="text" name="password"><br>
address: <input type="text" name="address"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
- 寫action方法
package Form;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
public class Form1DemoAction extends ActionSupport {
@Override
public String execute() throws Exception {
//第一種方式
//1 使用ActionContext類對象
ActionContext context = ActionContext.getContext();
//2 調(diào)用方法得到表單數(shù)據(jù)
// key 是表單輸入項(xiàng)name屬性值,value是輸入的值
Map<String,Object> map= context.getParameters();
Set<String> keys = map.keySet();
for (String key : keys){
//根據(jù)key得到value
//數(shù)組形式:因?yàn)檩斎腠?xiàng)里面可能有復(fù)選框
Object[
] objects= (Object[]) map.get(key);
System.out.println(Arrays.toString(objects));
}
return NONE;
}
}
- 配置核心文件
<?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>
<package name="dmeo2" extends="struts-default" namespace="/">
<action name="form1" class="Form.Form1DemoAction">
</action>
</package>
</struts>
2 使用ServletActionContext類獲取
(1)static HttpServletRequest getRequest()
獲取Web應(yīng)用的HttpServletRequest對象
(2)static HttpServletResponse getResponse()
獲取Web應(yīng)用的HttpServletResponse對象
(3)static ServletContext getServletContext()
獲取Web應(yīng)用的ServletContext對象
(4)static PageContext getPageContext()
獲取Web應(yīng)用的PageContext對象
(5)演示
- 創(chuàng)建表單,提交表單到action里面
<%--
Created by IntelliJ IDEA.
User: pc
Date: 2017/10/9
Time: 21:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/form2" method="post">
username:<input type="text" name="username"><br>
password:<input type="text" name="password"><br>
address: <input type="text" name="address"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
- 寫action方法
package Form;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
public class Form2DemoAction extends ActionSupport {
@Override
public String execute() throws Exception {
//第二種方式 使用ServletAction類獲取
//1 使用ServletActionContext獲取request對象
HttpServletRequest request= ServletActionContext.getRequest();
//2 調(diào)用request里面的方法得到結(jié)果
String username = request.getParameter("username");
String password = request.getParameter("password");
String address= request.getParameter("address");
System.out.println(username+" "+password+" "+address);
return NONE;
}
}
- 配置核心文件
<?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.i18n.encoding" value="utf-8"></constant>
<package name="dmeo2" extends="struts-default" namespace="/">
<action name="form1" class="Form.Form1DemoAction"></action>
<action name="form2" class="Form.Form2DemoAction"></action>
</package>
</struts>
3 使用接口注入方式獲取(了解)
package Form;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import javax.servlet.http.HttpServletRequest;
public class Form3DemoAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request =null;
public void setServletRequest(HttpServletRequest httpServletRequest) {
this.request = request;
}
@Override
public String execute() throws Exception {
String username= request.getParameter("username");
System.out.println(username);
return NONE;
}
}
4 操作action域?qū)ο?br> (1)request
//1 request域
HttpServletRequest request1 = ServletActionContext.getRequest();
request1.setAttribute("req","reqValue");
(2)session
//2 session域
HttpSession session= request1.getSession();
session.setAttribute("sess","sessValue");
(3)ServletContext
//3 ServletContext域
ServletContext context = ServletActionContext.getServletContext();
context.setAttribute("contextname","contextValue");
二 Struts2提供獲取表單數(shù)據(jù)方式
1 原始方式獲取表單封裝到實(shí)體類對象
package Form;
import com.opensymphony.xwork2.ActionSupport;
import entity.User;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
public class Form4DemoAction extends ActionSupport {
@Override
public String execute() throws Exception {
//1 獲取表單數(shù)據(jù)
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
//2 封裝到實(shí)體類
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setAddress(address);
System.out.println(user);
return NONE;
}
}
2 屬性封裝
- 特點(diǎn):直接把表單提交屬性封裝到action的屬性里面
- 實(shí)現(xiàn)步驟
(1)在action成員變量位置定義變量
- 變量名稱和表單輸入項(xiàng)的name屬性值一樣
(2)生成變量的set方法(set和get方法都寫出來)
- 不足:使用屬性封裝獲取表單數(shù)據(jù)到屬性里面,不能把數(shù)據(jù)直接封裝到實(shí)體類對象類里面
3 模型驅(qū)動封裝(重點(diǎn))
- 使用模型驅(qū)動方式,可以直接把表單數(shù)據(jù)封裝到實(shí)體類對象里面
- 實(shí)現(xiàn)步驟
(1)action實(shí)現(xiàn)接口 ModelDriver
(2)實(shí)現(xiàn)接口里面的方法 getModel方法 - 把創(chuàng)建對象返回
(3)在action里面創(chuàng)建實(shí)體類對象
package Date;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import entity.User;
//使用模型驅(qū)動獲取表單數(shù)據(jù)
public class DateDemo2Action extends ActionSupport implements ModelDriven<User>{
//創(chuàng)建對象
//前提要求:表單輸入項(xiàng)name屬性值和實(shí)體類屬性名稱一樣
private User user = new User();
public User getModel() {
//返回創(chuàng)建user對象
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user.toString());
return NONE;
}
}
- 前提要求:表單輸入項(xiàng)name屬性值和實(shí)體類屬性名稱一樣
4 使用模型驅(qū)動和屬性封裝注意問題
- 在一個(gè)action中,獲取表單數(shù)據(jù)可以使用屬性封裝,或者模型驅(qū)動封裝,但是不能同時(shí)使用屬性封裝和模型驅(qū)動封裝同時(shí)獲取一個(gè)表單。如果同時(shí)使用,只會執(zhí)行模型驅(qū)動。
5 表達(dá)式封裝(會用)
- 使用表達(dá)式封裝可以把表單數(shù)據(jù)封裝到實(shí)體類對象里面
- 實(shí)現(xiàn)過程
(1)在action里面聲明實(shí)體類
(2)生成實(shí)體類變量的set和get方法
(3)在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式
三 比較表達(dá)式封裝和模型驅(qū)動封裝
1 使用表達(dá)式封裝和模型驅(qū)動封裝都可以把數(shù)據(jù)封裝到實(shí)體類對象里面
2 不同點(diǎn)
(1)使用模型驅(qū)動只能把數(shù)據(jù)封裝到一個(gè)實(shí)體類對象里面
- 在一個(gè)action里面不能使用模型驅(qū)動把數(shù)據(jù)封裝到不同的實(shí)體類對象里面
(2)使用表達(dá)式封裝可以把數(shù)據(jù)封裝到不同的實(shí)體類對象里面
package Date;
import com.opensymphony.xwork2.ActionSupport;
import entity.Book;
import entity.User;
//使用表達(dá)式形式獲取表單數(shù)據(jù)
public class DateDemo3Action extends ActionSupport{
//1 聲明實(shí)體類
private User user;
private Book book;
//2 生成實(shí)體類變量的set和get方法
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user.toString());
System.out.println(book.getBname());
return NONE;
}
}
四 Struts2獲取數(shù)據(jù)封裝到集合中(會用)
1 封裝到list集合
第一步 在action聲明List
第二步 生成list變量的set和get方法
第三步 在表單輸入項(xiàng)里面寫表達(dá)式
2 封裝到map集合
第一步 聲明map集合
第二步 生成get和set方法
第三步 在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式