Struts2_day02

Struts2_day02

Struts2課程安排

第一天 struts2 入門(mén) 2017年10月27日

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

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

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

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

1.1全局結(jié)果頁(yè)面

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

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

    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)如果多個(gè)action脸秽,方法里面返回值相同的,到頁(yè)面也是相同的牲剃,這個(gè)時(shí)候可以使用全局結(jié)果頁(yè)面配置

    (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é)果頁(yè)面

<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>
  • 配置全局頁(yè)面话速,也配置了局部頁(yè)面,最終以局部配置為準(zhǔn)购公,比如上面配置萌京,執(zhí)行book.action會(huì)跳轉(zhuǎn)到world.jsp頁(yè)面

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

  • 默認(rèn)值dispatcher做轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)地址不變宏浩,內(nèi)容變
  • redirect做重定向枫夺,重定向地址和內(nèi)容都變
  • 上面兩個(gè)值dispatcher、redirect绘闷,這兩個(gè)值一般針對(duì)到頁(yè)面中配置
  • 配置到其他的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對(duì)象里面的方法獲取印蔗,getParameter,getParameterMap
  2. 提交表單到action丑勤,但是action沒(méi)有request對(duì)象华嘹,不能直接使用request對(duì)象

2.1使用ActionContext類獲取


(1)因?yàn)榉椒ú皇庆o態(tài)的方法,需要?jiǎng)?chuàng)建ActionContext類的對(duì)象
(2)這個(gè)ActionContext類對(duì)象不是new出來(lái)的法竞,


  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對(duì)象
        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使用接口注入方式獲惹看臁(了解)

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

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對(duì)象
        // 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í)體類對(duì)象,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屬性封裝(會(huì)用)

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

實(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ū)動(dòng)封裝(重點(diǎn))

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

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

public class FormAction extends ActionSupport implements ModelDriven<User>

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

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

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

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

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

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

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

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

(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屬性值里面寫(xiě)表達(dá)式形式

<form action="${pageContext.request.contextPath }/form4.action" method="post">
    <!-- 3.在表單輸入項(xiàng)的name屬性值里面寫(xiě)表達(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ū)動(dòng)封裝比較

  • 相同點(diǎn):

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

  • 不同點(diǎn):

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

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

    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ù)封裝到集合中(會(huì)用)

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)里面寫(xiě)表達(dá)式

<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫(xiě)表達(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)里面寫(xiě)表達(dá)式

<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫(xiě)表達(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胸私,隨后出現(xiàn)的幾起案子厌处,更是在濱河造成了極大的恐慌,老刑警劉巖岁疼,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阔涉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捷绒,警方通過(guò)查閱死者的電腦和手機(jī)瑰排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)暖侨,“玉大人椭住,你說(shuō)我怎么就攤上這事∽侄海” “怎么了京郑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)葫掉。 經(jīng)常有香客問(wèn)我些举,道長(zhǎng),這世上最難降的妖魔是什么俭厚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任户魏,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叼丑。我一直安慰自己关翎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布鸠信。 她就那樣靜靜地躺著纵寝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪症副。 梳的紋絲不亂的頭發(fā)上店雅,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音贞铣,去河邊找鬼闹啦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辕坝,可吹牛的內(nèi)容都是我干的窍奋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酱畅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琳袄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起纺酸,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窖逗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后餐蔬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碎紊,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年樊诺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仗考。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡词爬,死狀恐怖秃嗜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顿膨,我是刑警寧澤锅锨,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站恋沃,受9級(jí)特大地震影響必搞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芽唇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匆笤,春花似錦研侣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咆课,卻和暖如春末誓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背书蚪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工喇澡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殊校。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓晴玖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親为流。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呕屎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

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