Struts2_day02

Struts2_day02

Struts2課程安排

第一天 struts2 入門 2017年10月27日

第二天 struts2 數(shù)據(jù) 2017年10月28日

第三天 struts2 值棧 2017年10月29日

第四天 struts2攔截器 2017年10月30日

1.結(jié)果頁面配置

1.1全局結(jié)果頁面

  1. result標(biāo)簽配置action方法的返回值到不同的路徑里面

  2. 創(chuàng)建兩個action,執(zhí)行默認(rèn)的方法execute方法,讓兩個action的方法都返回success,返回success之后,配置到同一個頁面里面

    public class BookAction extends ActionSupport {
     public String execute() throws Exception {
         return "success";
     }
    }
    public class OrdersAction extends ActionSupport {
     public String execute() throws Exception {
         return "success";
     }
    }
    

    (1)如果多個action,方法里面返回值相同的,到頁面也是相同的,這個時候可以使用全局結(jié)果頁面配置

    (2)在package標(biāo)簽里面配置

    <package name="action1" extends="struts-default" namespace="/">
     <action name="book" class="com.ghw.action.BookAction">
         <result name="success" type="redirect">/hello.jsp</result>
     </action>
     <action name="order" class="com.ghw.action.OrdersAction">
         <result name="success">/hello.jsp</result>
     </action>
    </package>
    

1.2局部結(jié)果頁面

<package name="action1" extends="struts-default" namespace="/">
    <global-results>
        <result name="success">/hello.jsp</result>
    </global-results>
    <action name="book" class="com.ghw.action.BookAction">
        <result name="success">/world.jsp</result>
    </action>
    <action name="order" class="com.ghw.action.OrdersAction"></action>
</package>
  • 配置全局頁面,也配置了局部頁面,最終以局部配置為準(zhǔn),比如上面配置,執(zhí)行book.action會跳轉(zhuǎn)到world.jsp頁面

1.3result標(biāo)簽type屬性

  • 默認(rèn)值dispatcher做轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)地址不變,內(nèi)容變
  • redirect做重定向,重定向地址和內(nèi)容都變
  • 上面兩個值dispatcher、redirect,這兩個值一般針對到頁面中配置
  • 配置到其他的action里面
  • chain:轉(zhuǎn)發(fā)到action
  • redirectAction:重定向到action
<action name="book" class="com.ghw.action.BookAction">
    <result name="success" type="redirectAction">order</result>
</action>

<action name="book" class="com.ghw.action.BookAction">
    <result name="success" type="chain">order</result>
</action>

2.在action獲取表單提交數(shù)據(jù)

  1. 之前web階段,提交表單到servlet里面,在servlet里面使用request對象里面的方法獲取,getParameter,getParameterMap
  2. 提交表單到action,但是action沒有request對象,不能直接使用request對象

2.1使用ActionContext類獲取


(1)因?yàn)榉椒ú皇庆o態(tài)的方法,需要創(chuàng)建ActionContext類的對象
(2)這個ActionContext類對象不是new出來的,


  1. 具體演示
    (1)創(chuàng)建表單,提交表單到action里面
<form action="${pageContext.request.contextPath }/form4.action" 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="submit"/>
</form>

(2)在action使用ActionContext獲取數(shù)據(jù)

public class FormAction extends ActionSupport {
  public String execute() throws Exception {
      ActionContext context = ActionContext.getContext();
      Map<String, Object> map = context.getParameters();
      Set<String> keys = map.keySet();
      for (String key : keys) {
          Object[] obj = (Object[]) map.get(key);
          System.out.println(Arrays.toString(obj));
      }
      return "success";
  }
}

2.2使用ServletActionContext類獲取

public class FormAction extends ActionSupport {
    public String execute() throws Exception {
        // 1.使用Servlet類獲取request對象
        HttpServletRequest httpServletRequest = ServletActionContext.getRequest();
        // 2.使用request里面的方法得到結(jié)果
        String username = httpServletRequest.getParameter("username");
        String password = httpServletRequest.getParameter("password");
        String address = httpServletRequest.getParameter("address");
        System.out.println("username:" + username + " password:" + password + " address" + address);
        return "success";
    }
}

2.3使用接口注入方式獲?。私猓?/h3>

讓action實(shí)現(xiàn)ServletRequestAware接口,得到request對象

package com.ghw.action;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;

public class FormAction extends ActionSupport implements ServletRequestAware {

    private HttpServletRequest request;

    public HttpServletRequest getRequest() {
        return request;
    }

    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }

    public String execute() throws Exception {
        // 1.使用Servlet類獲取request對象
        // 2.使用request里面的方法得到結(jié)果
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String address = request.getParameter("address");
        System.out.println("username:" + username + " password:" + password + " address" + address);
        return "success";
    }
}

2.4在action操作域?qū)ο?/h3>
  1. request、session、servletContext域?qū)ο?/li>
  2. 使用ServletActionContext類操作

3.獲取表單數(shù)據(jù)方式

3.1原始方式(了解)

原始方式獲取表單封裝到實(shí)體類對象,2.1-2.3方法中只是把表單內(nèi)容獲取

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(
            "username:" + user.getUsername() + " password:" + user.getPassword() + " address:" + user.getAddress());
    return "success";
}

3.2屬性封裝(會用)

直接把表單內(nèi)容封裝到action的屬性里面,只能封裝到類屬性里面,不能封裝到對象里面

實(shí)現(xiàn)步驟:

  1. 在action中定義成員變量,變量名稱和表單輸入項(xiàng)name屬性值一樣
  2. 生成變量的get和set方法
package com.ghw.action;

import com.opensymphony.xwork2.ActionSupport;

public class FormAction extends ActionSupport {
    // 1.定義與表單name相同的變量名
    private String username;
    private String password;
    private String address;
    
    // 2.生成setter和getter方法
    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;
    }


    public String getAddress() {
        return address;
    }


    public void setAddress(String address) {
        this.address = address;
    }

    public String execute() throws Exception {
        System.out.println("username:" + username + " password:" + password + " address" + address);
        return "success";
    }
}

3.3模型驅(qū)動封裝(重點(diǎn))

  1. 使用模型驅(qū)動方式,可以直接把表單數(shù)據(jù)封裝到實(shí)體類對象里面
  2. 要求:實(shí)體類里面的成員屬性名和表單name名一樣
  3. 實(shí)現(xiàn)步驟:

(1)action實(shí)現(xiàn)接口ModelDriven

public class FormAction extends ActionSupport implements ModelDriven<User>

泛型要寫封裝數(shù)據(jù)的類的類型

(2)實(shí)現(xiàn)接口里面的方法 getModel方法把創(chuàng)建對象返回

// 返回創(chuàng)建的user對象
public User getModel() {
  return user;
}

(3)在action里面創(chuàng)建實(shí)體類對象

// 創(chuàng)建對象
private User user = new User();
  1. 使用模型驅(qū)動和屬性封裝注意問題:
  • 在一個action中,獲取表單數(shù)據(jù)可以屬性封裝,也可以使用模型驅(qū)動封裝,但不能同時使用屬性封裝和模型驅(qū)動封裝獲取同一個表單數(shù)據(jù),如果同時使用,只會執(zhí)行模型驅(qū)動

3.4表達(dá)式封裝(會用)

  1. 實(shí)現(xiàn)過程

(1)使用表達(dá)式封裝可以把表單數(shù)據(jù)封裝到實(shí)體類對象里面

(2)把表達(dá)式封裝歸類到屬性封裝里面

第一步 在action里面聲明實(shí)體類

// 1.聲明實(shí)體類
private User user;

第二步 生成實(shí)體類變量的set和get方法

// 2.生成實(shí)體類的setter和getter方法
public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

第三步 在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式

<form action="${pageContext.request.contextPath }/form4.action" method="post">
    <!-- 3.在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式 -->
    username:<input type="text" name="user.username"/>
    <br/>
    password:<input type="text" name="user.password"/>
    <br/>
    address:<input type="text" name="user.address"/>
    <br/>
    <input type="submit" value="submit"/>
</form>

3.5表達(dá)式封裝和模型驅(qū)動封裝比較

  • 相同點(diǎn):

    可以把數(shù)據(jù)封裝到實(shí)體類對象里面

  • 不同點(diǎn):

    表達(dá)式封裝可以封裝到不同的實(shí)體類里面

    使用模型驅(qū)動只能把數(shù)據(jù)封裝到一個實(shí)體類對象里面

    private User user;
    private Book book;
    public User getUser() {
      return user;
    }
    public Book getBook() {
      return book;
    }
    public void setBook(Book book) {
      this.book = book;
    }
    public void setUser(User user) {
      this.user = user;
    }
    
    username:<input type="text" name="user.username"/>
    <br/>
    password:<input type="text" name="book.password"/>
    <br/>
    address:<input type="text" name="user.address"/>
    <br/>
    

4.數(shù)據(jù)封裝到集合中(會用)

4.1封裝到list集合

第一步 在action聲明List

第二步 生成list變量的set和get方法

// 1.聲明list變量
private List<User> list;

// 2.生成list的set,get方法
public List<User> getList() {
    return list;
}

public void setList(List<User> list) {
    this.list = list;
}

第三步 在表單輸入項(xiàng)里面寫表達(dá)式

<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式 -->
username:<input type="text" name="list[0].username"/>
<br/>
password:<input type="text" name="list[0].password"/>
<br/>
address:<input type="text" name="list[0].address"/>
<br/>

username:<input type="text" name="list[1].username"/>
<br/>
password:<input type="text" name="list[1].password"/>
<br/>
address:<input type="text" name="list[1].address"/>
<br/>

4.2封裝到map集合

第一步 在action聲明Map

// 1.聲明map變量
private Map<String, User> map;

第二步 生成map變量的set和get方法

// 2.生成map的set,get方法
public Map<String, User> getMap() {
    return map;
}

public void setMap(Map<String, User> map) {
    this.map = map;
}

第三步 在表單輸入項(xiàng)里面寫表達(dá)式

<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式 -->
username:<input type="text" name="map['one'].username"/>
<br/>
password:<input type="text" name="map['one'].password"/>
<br/>
address:<input type="text" name="map['one'].address"/>
<br/>

username:<input type="text" name="map['two'].username"/>
<br/>
password:<input type="text" name="map['two'].password"/>
<br/>
address:<input type="text" name="map['two'].address"/>
<br/>
<input type="submit" value="submit"/>

5.案例-添加客戶功能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 非本人總結(jié)的筆記,抄點(diǎn)筆記復(fù)習(xí)復(fù)習(xí)。感謝傳智博客和黑馬程序猿記筆記啊記筆記 結(jié)果頁面的設(shè)置 在action標(biāo)簽里面...
    鍵盤瞎閱讀 591評論 2 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評論 18 399
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產(chǎn)品,是在 struts1和WebWork的...
    inke閱讀 2,340評論 0 50
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評論 0 11
  • 今天在仔細(xì)研究比特幣的51%攻擊 1. 當(dāng)全網(wǎng)算力巨大的情況下,發(fā)起51%的攻擊制造一個區(qū)塊所消耗的算力巨大,成本...
    那你_d234閱讀 271評論 0 1

友情鏈接更多精彩內(nèi)容