1. 程式人生 > >struts2重要知識點總結(1):

struts2重要知識點總結(1):

struts2最近又看了一邊,每看一次都有一次的收穫,這裡總結struts2中的一些重要的知識點:
action介紹:
1:action類代表著一次請求或者呼叫,每個請求的動作都對應一個相應的action類,action是一個獨立的工作單元
2:struts2中action充當著MVC中模型的角色,但是實際中其實action處理的是邏輯部分,和dispatcher共同擔任了MVC中controler的角色,不同的是dispatcher擔任的是業務部分
3:在struts2中,action可以不實現任何特殊的介面或者繼承特殊的類,僅僅看成是一個pojo類,但是還有一個空參的execute方法
4:實現Action類,這個類中主要定義了一些常量

public abstract interface com.opensymphony.xwork2.Action {

  // Field descriptor #4 Ljava/lang/String;
  public static final java.lang.String SUCCESS = "success";

  // Field descriptor #4 Ljava/lang/String;
  public static final java.lang.String NONE = "none";

  // Field descriptor #4 Ljava/lang/String;
  public
static final java.lang.String ERROR = "error"; // Field descriptor #4 Ljava/lang/String; public static final java.lang.String INPUT = "input"; // Field descriptor #4 Ljava/lang/String; public static final java.lang.String LOGIN = "login"; // Method descriptor #16 ()Ljava/lang/String; public abstract
java.lang.String execute() throws java.lang.Exception; }

5:繼承ActionSupport類,由於ActionSupport本身實現了Action介面,所以繼承ActionSupport實際上就是相當於實現了Action介面,自定義的Action類繼承了ActionSupport類的時候,通常需要重寫execute()方法
6:ActionSupport類還實現了幾個其他的介面,提供了更多的功能
#: com.opensymphony.xwork2.Validateable:提供validate()方法來為Action增加驗證的功能
#: com.opensymphony.xwork2.Validateaware:提供方法來儲存和恢復action或field級的錯誤資訊
#: com.opensymphony.xwork2.TextProvider:提供獲取本地資訊文字的功能
#: com.opensymphony.xwork2.LocaleProvider:提供getLocale()方法來獲取本地訊息
7:execute方法的內部實現方式
execute方法在實際的開發中通常需要做下面的事情
7.1:收集使用者傳遞過來的資料
7.2:把使用者收集的資料組織成邏輯層需要的型別和格式
7.3:呼叫邏輯層介面,來執行業務邏輯處理
7.4:準備下一個頁面中所需要展示的資料,存放在相應的地方
7.5:轉向下一個頁面

        1.  public class HelloWorldAction extends ActionSupport {  
2.      private String account;  
3.      private String password;  
4.      private String submitFlag;  
5.        
6.      public String execute() throws Exception {  
7.          //收集引數 ,一般使用的是HttpServletRequest,一般只要頁面中元素的名稱和action中的屬性相對應,會通過param攔截器自動的注入的 
8.          //組織引數  一般是資料組織成邏輯層的型別或格式就可以了
9.          //呼叫邏輯層來進行邏輯處理,businessExecute方法中一般執行的是與資料庫操作相關的  
10.         this.businessExecute();  
11.         //準備下一個頁面所需要的資料  ,例如向跳轉的中,顯示XXX,你已登陸成功
12.         //轉向下一個頁面,通過返回的result來告知跳到那個jsp頁面或者action中的某個方法  
13.         return "toWelcome";  
14.     }  

8:action中的資料來源
在struts2中,頁面中的資料和action中的屬性,有兩種基本的對應方式,分別是,屬性驅動(filedDriven)和模型驅動(ModelDriven)
屬性驅動的兩種情況:
1:基本型別的屬性對應
2:javaBean風格的屬性對應**
基本型別的屬性驅動:
就是web頁面中要提交的html控制元件的name屬性,和action屬性或者屬性對應的getter/setter相對應,這種做法就是基本型別的屬性對應的屬性驅動(有點繞口,哈哈)
比如在登陸介面中這樣寫:

    <form action="XXX" method="post">
        <input type="text" name="userName"/><br/>
        <input type="text"  name="gender"/><br/>
        <input type="submit" value="提交"/>
    </form>

在action中是這樣寫的:

public class Demo extends ActionSupport{
    //和頁面上的input控制元件中的userName,以及gender相對應,並生成setter和gerter方法
    //Ctrl + Alt +s 快速的找到生成個getter 和 setter方法
    private String userName;
    private String gender;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

這裡的action中的userName 和 gender都是private 外界是不能訪問的,所以生成setter/getter方法來設定值,當然你如果覺得為每個屬性提供getter/setter方法比較累贅,那麼你只需把userName和gender方法設定成public就可以了,但是一般不建議屬性直接對外部開放

屬性驅動(filedDriven):
如果action中的屬性比較多,那麼setter/getter方法將會特別多,造成程式碼特別的凌亂,我們可以把有相關聯絡的單獨的提取出來做成一個javaBean類,例如剛才的userName和gender可以提成一個user物件中的屬性
User.java

package javaBean;
public class User {
    private String userName;
    private String gender;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

新的action中Demo.action

public class Demo extends ActionSupport{
    private User user= new User();
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

當然了jsp也沒中也要有相應的改動:

<form action="XXX" method="post">
        <input type="text" name="User.userName"/><br/>
        <input type="text"  name="User.gender"/><br/>
        <input type="submit" value="提交"/>
    </form>

模型驅動ModelDriven:
struts2中海油另外的一種資料對應的方式叫做模型驅動,基本實現是讓action實現一個ModelDriver的介面,這個介面需要我們實現一個genModel的方法,這個方法的返回值就是action所使用的資料模型物件
把剛才action中的程式碼修改成ModelDriven的實現方式,只是添加了ModelDriven的實現,另外去掉了Userde 的setter/getter方法,其他的基本不變

public class Demo extends ActionSupport implements ModelDriven{
    private User user= new User();
    public Object getModel(){
        return user;
    }
}

當然jsp頁面中也許做一點改動的:

<form action="XXX" method="post">
        <input type="text" name="userName"/><br/>
        <input type="text"  name="gender"/><br/>
        <input type="submit" value="提交"/>
    </form>
<!-- 去掉user這個字首 ,因為一個action對應一個model,如果加上字首,反而找不到屬性了-->

到底該用哪個對應方式呢:
屬性驅動(基本資料型別的屬性對應),比較凌亂,對於屬性比較少的只有一兩個可以使用
javaBean屬性對應,優先推薦這個
模型驅動:
這三種方式是可以混合使用的,甚至是三種方式可以一起使用,但是屬性驅動(基本資料型別的屬性)和模型驅動有可能發生衝突,因為都不帶字首,如果出現這種衝突的情況,那麼優先模型驅動的對應方式。

Action的生命週期
Struts2的Action的生命週期是:Struts2為每個請求都重新初始化一個Action的例項。可以稍微改造一下程式碼來驗證一下。
1:給HelloWorldAction加上一個public無參的構造方法,在裡面輸出一句話。
大家都知道,一個Java類如果沒有寫構造方法,那麼會有一個預設的public無參的構造方法,這裡只是把它明確的寫出來了,因此這麼做,並沒有改變Action的任何功能,只是想看一下到底什麼時候,Action會被初始化。示例程式碼如下:

1.  public LoginAction (){  
2.      System.out.println("LoginAction被初始化");  
3.  }

2:然後在execute方法上也加入一個列印Action自己這個物件例項的語句,示例程式碼如下:

1.  public String execute() throws Exception {  
2.      System.out.println(this);  
3.      this.businessExecute();  
4.      return "toWelcome";  
5.  }

在列印一個物件例項的時候,實際上是呼叫的這個類的toString方法,但是LoginAction類沒有實現toString方法,所以,會呼叫到Object的toString方法。Object的toString方法會打印出自己的全類名和Object的hashcode方法的返回值,這個hashcode方法返回一個數字,只要這個數字不同,則被列印的物件就絕不是同一個物件。
修改做完之後,重新啟動Tomcat,仔細察看後臺的輸出資訊,你會發現啟動的時候,並沒有打印出來那句“LoginAction被初始化”,這說明了Action的初始化並不是在Tomcat啟動的時候進行的。
我們提交表單並重新整理再次提交,大家觀察console上的輸出。
“LoginAction被初始化”這句話被列印了兩次,說明LoginAction物件的構造方法被呼叫了兩次。
而且兩次列印的toString分別是“[email protected]”和“[email protected]”,這說明了為兩次web請求服務的LoginAction物件不是同一個。
因此請記住,Struts2中的Action在每一次web請求的時候都要新建一個例項。

相關推薦

struts2重要知識點總結(1)

struts2最近又看了一邊,每看一次都有一次的收穫,這裡總結struts2中的一些重要的知識點: action介紹: 1:action類代表著一次請求或者呼叫,每個請求的動作都對應一個相應的action類,action是一個獨立的工

struts2重要知識點總結(2)

Action的配置 的配置 通過上面的示例可以看出,Action需要在struts.xml中配置才可以使用,而且Action應該配置成為元素的子元素,那麼元素的功能是什麼呢? 元素可以把邏輯上相關的一組Action、Result、Intercepter等元

angularjs初學者知識點總結1對於不同module間的依賴注入

1.第一個module裡定義一個factory angular.module('myApp1', []) .factory('Chats', function() { return{ all: function() { return '1

struts2知識點總結1

struts2知識點總結 什麼是Struts2 Struts2 是一個MVC框架,重點在控制器上 Struts1 + xword=Struts2 背景:在web開發中,不同的功能採用不同的Servlet,造成維護和管理的不便; struts2通過過濾器,將不同的操作引導

項目期復習總結1背景圖合並,hack,瀏覽器內核前綴,偽類after before

標準 after 不同 fixed cli 條件 人員 tle ble 文件夾: 1、背景圖合並和CSS Spirit 2、PS基本快捷鍵 3、hack技術基本書寫,為什麽不用? 4、內核前綴 5、偽類afterbefore 1、背景

JS重要知識點總結-不完善

子函數 必須 his 代碼規範 重要 line java 全局 lba ###1、閉包 ??閉包就是能夠讀取其他函數內部變量的函數。由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。所以,在本質上,

HBase學習總結(1)HBase的下載與安裝

oot 停止 微信公眾號 profile jdk1 variable jdk oop lib (HBase是一種數據庫:Hadoop數據庫,它是一種NoSQL存儲系統,專門設計用來高速隨機讀寫大規模數據。本文介紹HBase的下載與安裝的整個過程。) 一

PHP的知識點總結1

指令 cal 環境 w3c nan 命令 mysq web 速度 PHP 基礎知識總結 2015-06-03 分類: 編程技術 PHP 代表 PHP: Hypertext Preprocessor PHP 文件可包含文本、HTML、JavaScript代碼和 PHP

struts2框架學習筆記1搭建測試

method lang app org char 示例 重要 type img Servlet是線程不安全的,Struts1是基於Servlet的框架 而Struts2是基於Filter的框架,解決了線程安全問題 因此Struts1和Struts2基本沒有關系,只是創造者取

用django框架開發一個B2C購物網站的基本流程和用到的知識點總結1

value 後端開發 .site elf pan 直接 基本 inter mobile 開發流程 開發模式采用前後端分離模式,作為後端開發人員我們只關註後端業務邏輯開發: 省略項目框架搭建文件的配置部分。。。。 一:用戶部分 在項目開發中我們要用到用戶模型類User,Dj

C#知識點總結系列3、C#中Delegate和Event以及它們的區別

的區別 sent () exit 功能 final 通知 bsp t對象 1.Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,這就是Monitor最常用的兩個方法,當然在使用過程中為了避免獲取鎖之後因為異常,致鎖

Java詳解(1)--知識點總結1

大資料NP知識點總結1 ---------------------  作者:文動天下 來源:CSDN  連結:https://blog.csdn.net/li_yi_kun?t=1 版權宣告:本文為博主原創文章,轉載請附上博文連結! 目錄 上午

知識點整理1JVM記憶體結構

  JVM把記憶體分為如下幾個區域: 1.方法區(Method Area) 2.堆區(Heap) 3.虛擬機器棧(VM Stack) 4.本地方法棧(Native Method Stack) 5.程式計數器(Program Counter R

ES678重要知識點總結

ES6:也就使es2015,這一版更新了非常重要的知識點,也是目前前端面試內容佔比最多的一部分 1、let,const.     1.11塊級作用域:見到這種變數首先想到的就是es6新添了一種作用域,塊級作用域。而生效過程即使在有let和const存在就會有會計作用域,顧

計算機系統結構之重要知識點總結2

交換 受限 分析 存儲器結構 處理器 完全 如果 判斷 狀態 一.名詞解釋 1)虛擬機:指通過軟件模擬具有完整硬件系統功能的,運行在一個完全隔離環境中的完整計算機系統 2)系統加速比:同一個任務在系統改進前花費總時間和在系統改進後花費總時間的比率 3)Amdahl定律

敏捷開發學習總結(1)傳統序列式軟體開發方法的缺點,以及迭代開發方法的選擇

大部分公司仍使用傳統瀑布模型(或序列式開發方法)進行開發。我所工作過的公司,以及我身邊的朋友工作所在的公司,再加上招聘時從求職者那裡所瞭解到的其他一些公司的開發過程,基本上都是使用傳統的軟體開發模式 ,類擬或者就是瀑布開發模式,這種模式有如下特點:1)將專案的生命週期明確地劃分為幾個階段,完成一個階段才進入下

Appium基礎總結1獲取包名和Activity

主要通過cmd命令:aapt來獲取包名和Activity 1.安裝android build-tools SDK安裝目錄雙擊Manager.exe,勾選Build-tools 2.PATH配置環境變數 將SDK安裝目錄下的\Android\android-sdk\build-tools\24.0.0;新增到

opencv_deeplearning學習總結1幾種目標檢測方法的區別

一、總概 學習opencv和深度學習也有一段時間了,也做了不少筆記,亂七八糟的,很多已經忘了,趁有空,趕緊寫寫部落格,分享給更多的喜歡計算機視覺的同學入門。最主要的是自己回顧一下所學。以下的都是自己的一些理解筆記,未免會出錯,有不對的地方,望幫忙指正,一起學習

Java重要知識點總結

*編碼規範:常量名通常使用大寫字母,中間使用下劃線連線 *定義的final變數屬於全域性變數時,必須在定義時就設定它的初值,否則將會產生編譯錯誤。區域性變數可以不在定義的時候賦初值(但是在使用前必須賦初值)。 *普通的成員變數(全域性變數),可以為它設定初始值,也可以不設定

集合知識點總結1

集合就是一個已經封裝好的物件 集合三大介面 Collection 所有集合類的跟介面 Map 對映介面,存放鍵值對 Iterator 遍歷集合的迭代介面 Java的集合框架是由很多介面、抽象類、具體類組成的,都位於java.util包中。除Comparable位