Struts2學習——請求引數獲取
阿新 • • 發佈:2018-12-09
Struts2框架是web層的優秀框架,他的核心是採用Filter技術,並且使用Action類代替Servlet技術,當然如果特別想使用servlet技術,也可以通過一些方法獲取Servlet中的所有物件(如:request、response、session、ServletContext……)
獲取了這些物件後,你就可以做一些想做的事,比如……想幹啥就幹啥
一、從Action中獲取ServletAPI
- 具體如何獲取ServletAPI,有三種方式(底層都是相同的方法)
- 1. 通過ActionContext
例如:
//request域=> map (struts2並不推薦使用原生request域) Map<String, Object> requestScope = (Map<String, Object>)ActionContext.getContext().get("request"); //推薦,直接使用put方法將鍵值對存到Action物件中 ActionContext.getContext().put("name", "requestTom"); //session域 => map Map<String, Object> sessionScope = ActionContext.getContext().getSession(); sessionScope.put("name", "sessionTom"); //application域=>map Map<String, Object> applicationScope = ActionContext.getContext().getApplication(); applicationScope.put("name", "applicationTom");
- 2. 通過ServletActionContext
//原生request HttpServletRequest request = ServletActionContext.getRequest(); //原生session HttpSession session = request.getSession(); //原生response HttpServletResponse response = ServletActionContext.getResponse(); //原生servletContext ServletContext servletContext = ServletActionContext.getServletContext();
- 3. 通過實現介面方式
public class Demo7Action extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; public String execute() throws Exception { System.out.println("原生request:"+request); return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }
二、獲取引數
-
既然Struts2不推薦使用Servlet中的Api,那麼如何從請求中獲取引數,Action有自己的方式:
- 以表單提交的資料獲取方式為例:(分為三種方式)
1. 屬性注入方式:
- 方式1 表單:
<form action="${pageContext.request.contextPath}/xxxAction" method="post"> 使用者名稱:<input type="text" name="name" /><br> 年齡:<input type="text" name="age" /><br> 生日:<input type="text" name="birthday" /><br> <input type="submit" value="提交" /> </form>
- 方式1 Action屬性
//準備與引數鍵名稱相同的屬性 private String name; //自動型別轉換 只能轉換8大基本資料型別以及對應包裝類 private Integer age; //支援特定型別字串轉換為Date ,例如 yyyy-MM-dd private Date birthday;
- 當表單提交到該Action時,封裝資料屬性名會對應input的name值自動
- (注意,有set/get方法的私有成員變數才能稱之為屬性,這裡未寫出set/get方法,但是實際開發種一定有)
2. 物件驅動方式:
- 方式2 表單:
<form action="${pageContext.request.contextPath}/Demo9Action"> 使用者名稱:<input type="text" name="user.name" /><br> 年齡:<input type="text" name="user.age" /><br> 生日:<input type="text" name="user.birthday" /><br> <input type="submit" value="提交" /> </form>
//準備user物件 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }
- 物件的屬性與表單的name值對應進行自動封裝
- 這裡將物件作為屬性,同樣生成set/get方法
3. 模型驅動方式:
- 表單與方式1 的表單相同
- 程式碼:
public class Demo10Action extends ActionSupport implements ModelDriven<User> { //準備user 成員變數 private User user =new User(); public String execute() throws Exception { System.out.println(user); return SUCCESS; } @Override public User getModel() { return user; } }
- 此種方式需要實現介面ModelDriven,泛型為想要封裝的物件類。然後實現方法getModel()。
- 優點:前臺頁面無須任何改動(與方式1相同);
- 缺點:只能封裝一個物件
拓展:當然其實還有第四種方式,作為拓展知識,集合形式:
- 頁面:
<form action="${pageContext.request.contextPath}/Demo11Action" method="post" > list:<input type="text" name="list" /><br> list:<input type="text" name="list[3]" /><br> map:<input type="text" name="map['haha']" /><br> <input type="submit" value="提交" /> </form>
- 程式碼:
//list private List<String> list; //Map private Map<String,String> map;
- 注意:這裡同樣為集合型別的屬性,需要有set/get方法
- List集合name值為屬性名,角標為集合索引,
- Map集合,角標為key值