前三篇的Struts博文基本把Struts的配置信息講解完了…..本博文主要講解Struts對數據的處理java
通常地,咱們使用Servlet的時候都是分爲幾個步驟的:web
如今問題來了,咱們本身編寫的Action類是沒有request、response、Session、application之類的對象的….咱們是怎麼獲得web層的數據、再將數據存到域對象中的呢??markdown
前面已經說過了,Struts預先幫咱們完成了對數據封裝的功能,它是經過params攔截器來實現數據封裝的session
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
首先,咱們填寫表單頁面的數據,請求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設置與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
通常地,咱們註冊的時候,都是在Servlet上把基本信息封裝到對象上…那麼在Struts怎麼作呢?post
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; } }
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"; } }
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
咱們能夠經過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();
咱們還能夠經過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();
當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對應的對象,那麼該使用哪種呢???
分析:
若是咱們須要使用到對象的其餘方法,相似getContextPath()之類的,那麼只能使用第一種
若是咱們就按照日常的開發,咱們就使用第二種【獲取簡單,沒有耦合】
至於第三種,當咱們未來可能開發BaseAction的時候,就使用它!