1. 程式人生 > >Struts2第二天:Struts2的資料的封裝、結果頁面配置

Struts2第二天:Struts2的資料的封裝、結果頁面配置

目錄

   

1.Struts2的Servlet的API的訪問

1.1完全解耦合的方式

1.2使用Servlet的API的原生方式(*****)

1.3介面注入的方式

2.Struts2的結果頁面的配置

2.1結果頁面的配置

2.1.1全域性結果頁面

2.1.2區域性結果頁面

2.2result標籤的配置

3.Struts2的資料的封裝

3.1Struts2的資料封裝

3.1.1屬性驅動:提供屬性set方法的方式(不常用)

3.1.2屬性驅動:頁面中提供表示式方式

3.1.3模型驅動:採用模型驅動方式(最常用)

3.2INPUT的邏輯檢視的配置

4.Struts2的複雜型別的資料封裝

4.1封裝資料到List集合中

4.2封裝資料到Map集合中


   

1.Struts2的Servlet的API的訪問

在使用Struts2的框架的過程中,發現Struts2和Servlet的API是解耦合的。在實際開發中,經常使用到Servlet的API,比如進行登入,將使用者的資訊儲存到Session中,有的時候需要向頁面輸出一些內容,用到response物件。涉及到Servlet的API的訪問。

1.1完全解耦合的方式

  1. 編寫JSP
<body>

    <h1>完全解耦合</h1>

    <form action="${pageContext.request.contextPath }/requestDemo1.action" method="post">

          姓名:<input type="text" name="name" ><br/>

         

          密碼:<input type="text" name="password"><br/>

          <input type="submit" value="提交"><br/>

    </form>
  1. 編寫Action
package top.yangxianyang.web.action;



import java.util.Arrays;

import java.util.Map;



import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;



/**

 * 訪問Servlet的API方式一:完全解耦合的方式

 * @author yxy

 *

 */

public class RequestDemo1 extends ActionSupport{

    

     @Override

     public String execute() throws Exception {

         // 一、接收引數:

         // 利用Struts2中的物件ActionContext物件.

         ActionContext context = ActionContext.getContext();

         // 呼叫ActionContext中的方法。

         // 類似於Map<String,String[]> request.getParameterMap();

         Map<String,Object> map = context.getParameters();

         for (String key : map.keySet()) {

              String[] values = (String[]) map.get(key);

              System.out.println(key+"    "+Arrays.toString(values));

         }

        

         // 二、向域物件中存入資料

         context.put("reqName", "reqValue");// 相當於request.setAttribute();

         context.getSession().put("sessName", "sessValue"); // 相當於session.setAttribute();

         context.getApplication().put("appName", "appValue"); // 相當於application.setAttribute();

        

         return SUCCESS;

     }

}

  1. *****注意:這種方式只能獲得代表requestsessionapplication的資料的Map集合,不能操作這些物件的本身的方法。

1.2使用ServletAPI的原生方式(*****

  1. 編寫JSP

<h3>方式二:使用原生的方式訪問</h3>

<form action="${ pageContext.request.contextPath }/requestDemo2.action" method="post">

     姓名:<input type="text" name="name"/><br/>

     密碼:<input type="password" name="password"><br/>

     <input type="submit" value="提交">

</form>



  1. 編寫Action
package top.yangxianyang.web.action;



import java.util.Arrays;

import java.util.Map;



import javax.servlet.http.HttpServletRequest;



import org.apache.struts2.ServletActionContext;



import com.opensymphony.xwork2.ActionSupport;

/**

 * 訪問Servlet的API的方式二:原生的方式

 * @author yxy

 *

 */

public class RequestDemo2 extends ActionSupport {



     @Override

     public String execute() throws Exception {

         // 一、接收資料

         // 直接獲得request物件,通過ServletActionContext

         HttpServletRequest request = ServletActionContext.getRequest();

         Map<String, String[]> map = request.getParameterMap();

         for (String key : map.keySet()) {

              String[] values = map.get(key);

              System.out.println(key+"    "+Arrays.toString(values));

         }

        

         // 二、向域物件中儲存資料

         // 向request中儲存資料:

         request.setAttribute("reqName", "reqValue");

         // 向session中儲存資料

         request.getSession().setAttribute("sessName", "sessValue");

         // 向application中儲存資料

         ServletActionContext.getServletContext().setAttribute("appName", "appValue");

         return SUCCESS;

     }

}

  1. ***** 注意:這種方式可以操作域物件的資料,同時也可以獲得物件的方法。

1.3介面注入的方式

  1. 編寫JSP
<h3>方式三:介面注入的方式</h3>

<form action="${ pageContext.request.contextPath }/requestDemo3.action" method="post">

     姓名:<input type="text" name="name"/><br/>

     密碼:<input type="password" name="password"><br/>

     <input type="submit" value="提交">

</form>

  1. 編寫Action
package top.yangxianyang.web.action;



import java.util.Arrays;

import java.util.Map;



import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;



import org.apache.struts2.interceptor.ServletRequestAware;

import org.apache.struts2.util.ServletContextAware;



import com.opensymphony.xwork2.ActionSupport;

/**

 * 訪問Servlet的API的方式三:介面注入的方式

 * @author yxy

 *

 */

public class RequestDemo3 extends ActionSupport implements ServletRequestAware,ServletContextAware{



     private HttpServletRequest request;

     private ServletContext context;



     public RequestDemo3() {

         super();

         System.out.println("RequestDemo3被建立了...");

     }



     @Override

     public String execute() throws Exception {

         // 一、接收引數

         // 通過介面注入的方式獲得request物件。

         Map<String, String[]> map = request.getParameterMap();

         for (String key : map.keySet()) {

              String[] values = map.get(key);

              System.out.println(key+"    "+Arrays.toString(values));

         }

         // 二、向域物件中儲存資料

         // 向request域中儲存資料

         request.setAttribute("reqName", "reqValue");

         // 向session中儲存資料:

         request.getSession().setAttribute("sessName", "sessValue");

         // 向application中儲存資料:

         context.setAttribute("appName", "appValue");

        

         return super.execute();

     }



     public void setServletRequest(HttpServletRequest request) {

         this.request = request;

     }



     public void setServletContext(ServletContext context) {

         this.context = context;

     }

}

 

 

Servlet是單例的,多個程式訪問同一個Servlet只會建立一個Servlet的例項。Action是多例的,一次請求,建立一個Action的例項(不會出現執行緒安全的問題)。

 

 

2.Struts2的結果頁面的配置

2.1結果頁面的配置

2.1.1全域性結果頁面

  1. 全域性結果頁面:全域性結果頁面指的是,在包中配置一次,其他的在這個包中的所有的action只要返回了這個值,都可以跳轉到這個頁面。
    • 針對這個包下的所有的action的配置都有效。

 

<package name="demo1" extends="struts-default" namespace="/">

         <!-- 全域性結果頁面 -->

         <global-results>

              <result>/demo1/demo2.jsp</result>

         </global-results>

    

         <action name="requestDemo1" class="top.yangxianyang.web.action.RequestDemo1">

         </action>

        

         <action name="requestDemo2" class="top.yangxianyang.web.action.RequestDemo2">

         </action>

        

         <action name="requestDemo3" class="top.yangxianyang.web.action.RequestDemo3">

         </action>

     </package>

2.1.2區域性結果頁面

  1. 區域性結果頁面:區域性結果頁面指的是,只能在當前的action中的配置有效。
    1. 針對當前的action有效。

<?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="demo1" extends="struts-default" namespace="/">

         <!-- 全域性結果頁面 -->

         <global-results>

              <result>/demo1/demo2.jsp</result>

         </global-results>

    

         <action name="requestDemo1" class="top.yangxianyang.web.action.RequestDemo1">

              <!-- 區域性結果頁面 -->

              <result type="redirect">/demo1/demo2.jsp</result>

         </action>

        

         <action name="requestDemo2" class="top.yangxianyang.web.action.RequestDemo2">

              <result type="redirect">/demo1/demo2.jsp</result>

         </action>

        

         <action name="requestDemo3" class="top.yangxianyang.web.action.RequestDemo3">

              <result type="redirect">/demo1/demo2.jsp</result>

         </action>

     </package>

    

</struts>

2.2result標籤的配置

 

  1. result標籤用於配置頁面的跳轉。在result標籤上有兩個屬性:
    1. name屬性       :邏輯檢視的名稱。預設值:success
    2. type屬性         :頁面跳轉的型別。
      1. dispatcher       :預設值,請求轉發。(Action轉發JSP
      2. redirect             :重定向。(Action重定向JSP
      3. chain                  :轉發。(Action轉發Action)
      4. redirectAction :重定向。(Action重定向Action)
      5. stream              :Struts2中提供檔案下載的功能。

 

3.Struts2的資料的封裝

Struts2框架是一個web層框架,web層框架(框架:軟體的辦成品,完成一部分功能)。Struts2提供了資料封裝的功能。

3.1Struts2的資料封裝

3.1.1屬性驅動:提供屬性set方法的方式(不常用)

  1. 編寫頁面

<h1>Struts2的資料封裝</h1>

<h3>方式一:屬性驅動-提供set方法的方式</h3>

<s:fielderror/>

<form action="${ pageContext.request.contextPath }/userAction1.action" method="post">

     使用者名稱:<input type="text" name="username"/><br/>

     密碼:<input type="password" name="password"><br/>

     年齡:<input type="text" name="age"/><br/>

     生日:<input type="text" name="birthday"/><br/>

     工資:<input type="text" name="salary"/><br/>

     <input type="submit" value="提交">

</form>

  1. 編寫Action

package top.yangxianyang.demo2;



import java.util.Date;



import top.yangxianyang.entity.User;





import com.opensymphony.xwork2.ActionSupport;

/**

 * 資料封裝方式一:提供屬性的set方法的方式

 * @author yxy

 *

 */

public class UserAction1 extends ActionSupport {

     // 提供了對應的屬性

     private String username;

     private String password;

     private Integer age;

     private Date birthday;

     private Double salary;

     // 提供屬性對應的set方法

     public void setUsername(String username) {

         this.username = username;

     }



     public void setPassword(String password) {

         this.password = password;

     }



     public void setAge(Integer age) {

         this.age = age;

     }



     public void setBirthday(Date birthday) {

         this.birthday = birthday;

     }



     public void setSalary(Double salary) {

         this.salary = salary;

     }

    

    

     @Override

     public String execute() throws Exception {

         // 接收資料:

         System.out.println(username);

         System.out.println(password);

         System.out.println(age);

         System.out.println(birthday);

         System.out.println(salary);

         // 封裝資料:

         User user = new User();

         user.setUsername(username);

         user.setPassword(password);

         user.setAge(age);

         user.setBirthday(birthday);

         user.setSalary(salary);

         return NONE;

     }

}

 

3.1.2屬性驅動:頁面中提供表示式方式

  1. 編寫JSP

<h3>方式二:屬性驅動-在頁面中提供表示式方式</h3>

<form action="${ pageContext.request.contextPath }/userAction2.action" method="post">

     使用者名稱:<input type="text" name="user.username"/><br/>

     密碼:<input type="password" name="user.password"><br/>

     年齡:<input type="text" name="user.age"/><br/>

     生日:<input type="text" name="user.birthday"/><br/>

     工資:<input type="text" name="user.salary"/><br/>

     <input type="submit" value="提交">

</form>

  1. 編寫Action

package top.yangxianyang.demo2;





import top.yangxianyang.entity.User;



import com.opensymphony.xwork2.ActionSupport;

/**

 * 資料封裝的方式二:屬性驅動-在頁面中提供表示式的方式

 * @author yxy

 *

 */

public class UserAction2 extends ActionSupport {

    

     // 提供一個User物件:

     private User user;

     // 提供user的set和get方法:一定要提供get方法。

     // 因為攔截器完成資料封裝,需要建立User物件。通過get方法可以獲得同一個物件,將資料封裝到同一個物件中。

     public User getUser() {

         return user;

     }

     public void setUser(User user) {

         this.user = user;

     }

     @Override

     public String execute() throws Exception {

         System.out.println(user);

         return NONE;

     }



}

 

 

3.1.3模型驅動:採用模型驅動方式(最常用)

  1. 編寫JSP

<h3>方式三:模型驅動-模型驅動方式</h3>

<form action="${ pageContext.request.contextPath }/userAction3.action" method="post">

     使用者名稱:<input type="text" name="username"/><br/>

     密碼:<input type="password" name="password"><br/>

     年齡:<input type="text" name="age"/><br/>

     生日:<input type="text" name="birthday"/><br/>

     工資:<input type="text" name="salary"/><br/>

     <input type="submit" value="提交">

</form>

  1. 編寫Action

package top.yangxianyang.demo2;



import top.yangxianyang.entity.User;



import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

/**

 * 資料封裝的方式三:模型驅動-採用模型驅動的方式

 * @author yxy

 *

 */

public class UserAction3 extends ActionSupport implements ModelDriven<User>{

     // 模型驅動使用的物件:前提必須手動提供物件的例項

     private User user = new User(); // 手動例項化User.

    

     // 模型驅動需要使用的方法:

     public User getModel() {

         return user;

     }

     @Override

     public String execute() throws Exception {

         System.out.println(user);

         return NONE;

     }

}

  • 模型驅動方式最常用的方式:
    • 缺點:只能同時向一個物件中封裝資料。
  • 使用第二種可以向多個物件中同時封裝資料:

3.2INPUT的邏輯檢視的配置

  1. Action介面中提供了五個邏輯檢視的名稱:
    1. SUCCESS
    2. ERROR
    3. LOGIN
    4. INPUT                input在某些攔截器中會使用。
    5. NONE

 

4.Struts2的複雜型別的資料封裝

在實際開發中,有可能遇到批量向資料庫中插入記錄,需要在頁面中將資料封裝到集合中。

4.1封裝資料到List集合中

  1. 編寫JSP

<h3>封裝到List集合中:批量插入商品</h3>

<form action="${ pageContext.request.contextPath }/productAction1.action" method="post">

     商品名稱:<input type="text" name="products[0].name"><br/>

     商品價格:<input type="text" name="products[0].price"><br/>

     商品名稱:<input type="text" name="products[1].name"><br/>

     商品價格:<input type="text" name="products[1].price"><br/>

     商品名稱:<input type="text" name="products[2].name"><br/>

     商品價格:<input type="text" name="products[2].price"><br/>

     <input type="submit" value="提交">

</form>

 

  1. 編寫Action

package top.yangxianyang.demo3;



import java.util.List;



import top.yangxianyang.entity.Product;





import com.opensymphony.xwork2.ActionSupport;

/**

 * 複雜型別的資料封裝:封裝到List集合

 * @author yxy

 *

 */

public class ProductAction1 extends ActionSupport {

    

     private List<Product> products;

     // 提供集合的set方法:

     public void setProducts(List<Product> products) {

         this.products = products;

     }

     public List<Product> getProducts() {

         return products;

     }



     @Override

     public String execute() throws Exception {

         for (Product product : products) {

              System.out.println(product);

         }

         return NONE;

     }



    

}

4.2封裝資料到Map集合中

  1. 編寫JSP

<h3>封裝到Map集合中:批量插入商品</h3>

<form action="${ pageContext.request.contextPath }/productAction2.action" method="post">

     商品名稱:<input type="text" name="map['one'].name"><br/>

     商品價格:<input type="text" name="map['one'].price"><br/>

     商品名稱:<input type="text" name="map['two'].name"><br/>

     商品價格:<input type="text" name="map['two'].price"><br/>

     商品名稱:<input type="text" name="map['three'].name"><br/>

     商品價格:<input type="text" name="map['three'].price"><br/>

     <input type="submit" value="提交">

</form>

  1. 編寫Action

package top.yangxianyang.demo3;



import java.util.Map;



import top.yangxianyang.entity.Product;





import com.opensymphony.xwork2.ActionSupport;

/**

 * 複雜資料型別的封裝:封裝到Map集合

 * @author jt

 *

 */

public class ProductAction2 extends ActionSupport {



     private Map<String,Product> map;

    

     public Map<String, Product> getMap() {

         return map;

     }



     public void setMap(Map<String, Product> map) {

         this.map = map;

     }



     @Override

     public String execute() throws Exception {

         for (String key : map.keySet()) {

              Product product = map.get(key);

              System.out.println(key+"    "+product);

         }

         return NONE;

     }

}

原始碼:連結:https://pan.baidu.com/s/1FpyknygbfBxpHcWovVjylQ 提取碼:1gof