最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Struts2的配置 struts.xml Action詳解

 更新時(shí)間:2017年10月12日 15:15:08   作者:這昵稱不錯(cuò)  
這篇文章主要介紹了Struts2的配置 struts.xml Action詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在學(xué)習(xí)struts的時(shí)候,我們一定要掌握struts2的工作原理。只有當(dāng)我們明確了在struts2框架的內(nèi)部架構(gòu)的實(shí)現(xiàn)過(guò)程,在配置整個(gè)struts 的框架時(shí),可以很好的進(jìn)行邏輯上的配置。接下來(lái)我就先簡(jiǎn)單的講解下struts2的框架工作原理:

一、struts2的工作原理

1、客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求;
2、這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
3、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action;
4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy;
5、ActionProxy通過(guò)ConfigurationManager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類;
6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7、ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper。

二、部署一個(gè)struts2項(xiàng)目的一般步驟

1)在Myeclipse中創(chuàng)建一個(gè)web項(xiàng)目,并將struts2需要的jar包導(dǎo)入進(jìn)項(xiàng)目中,如下圖

2)在項(xiàng)目中的web.xml中進(jìn)行配置struts2的框架,在web.xml中需要包含在<filter></filter>,在該節(jié)點(diǎn)下可以包含<filter-name>和<filter-mapin

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
  <display-name></display-name> 
  <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
  </welcome-file-list> 
 
  <filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
  </filter> 
  <filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>*.action</url-pattern> 
  </filter-mapping> 
  <filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
  </filter-mapping> 
   
</web-app> 

3)編寫(xiě)Action類
4)創(chuàng)建好了Action類中要對(duì)action進(jìn)行配置struts.xml,注意該配置文件的位置要在src的根目錄下
5)創(chuàng)建jsp的文件,進(jìn)行測(cè)試

三、struts.xml的配置初探

先來(lái)看看struts的基本配置的大概情況

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
  "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 
  "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 
   
<struts> 
  <package name="user" namespace="/" extends="struts-default"> 
    <action name="*user" class="com.zzjmay.action.VaildateAction" method="{1}"> 
      <result name="success">/success.jsp</result> 
      <result name="input">/{1}.jsp</result> 
    </action> 
  </package> 
</struts> 

從上面的代碼中可以看出,xml中包含的再根節(jié)點(diǎn)下<struts></struts>下。在實(shí)際項(xiàng)目中的編寫(xiě)時(shí),頭部信息需要更改,那么我們給以在導(dǎo)入的jar中的jar包中進(jìn)行獲取

在struts-core-2.2.1.1.jar包下的struts2.0.dtd中進(jìn)行獲取。

四、struts.xml中的package的配置

看著前面的代碼可以很清晰的看到package的屬性

屬性有:

1.     name:邏輯上的包名
2.     namespace:命名空間,用來(lái)區(qū)分同意struts下的相同action(注意是一種邏輯上的的路徑)
3.     extends: 繼承某個(gè)配置文件
4.     abstract

具體使用過(guò)程中要注意,有與命名空間的命名,我們要在相應(yīng)的過(guò)程中加上對(duì)應(yīng)的命名空間的路徑,例如:

<s:form action="db/login.action" method="post">

此代碼說(shuō)明的就是將會(huì)去調(diào)用db命名空間下的login對(duì)應(yīng)的action

還需要注意的是:

<result>標(biāo)簽的下的是物理路徑(絕對(duì)路徑),即指在項(xiàng)目中的實(shí)際位置,代碼如下

<result name="success">/login/error.jsp</result>

六、struts.xml中的result的配置

對(duì)于action的配置我這里面只是簡(jiǎn)單的概括,具體很多細(xì)節(jié)性的東西我將專門(mén)寫(xiě)一篇博客,主要講解的動(dòng)態(tài)的對(duì)action進(jìn)行配置

屬性有:

1.     name:Action類的映射名稱
2.     class:Action類的完整路徑
3.     method:默認(rèn)使用的execute()方法,如果要自定義觸發(fā)方法,需要使用method自定義

七、struts.xml配置過(guò)程中的注意信息

在實(shí)際開(kāi)發(fā)的項(xiàng)目中,我們可能需要配置很多的action,有時(shí)候?yàn)榱吮阌谖覀兊姆诸?,我們一般需要?jiǎng)?chuàng)建不同包下的struts-user.xml文件,不過(guò)最終我們的這些配置都是要導(dǎo)入進(jìn)我們的struts.xml文件中。使用的標(biāo)簽和jsp編程中<include>

struts.xml

[<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
  "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 
  "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 
 
<struts> 
  <include file="struts-user.xml"></include> 
</struts> 

struts-user.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
  "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 
  "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 
 
<struts> 
  <constant name="struts.ui.theme" value="simple"></constant> 
  <package name="user" namespace="/ss" extends="struts-default"> 
    <action name="login" class="com.zzjmay.action.UserAction" 
      method="execude2"> 
  <!--result下的路徑是物理路徑 --> 
      <result name="success">/login/success.jsp</result> 
      <result name="error">/login/error.jsp</result> 
    </action> 
  </package> 
  <!-- 包名不能相同 --> 
  <package name="user123" namespace="/db" extends="struts-default"> 
    <action name="login" class="com.zzjmay.action.UserAction" 
      method="execude2"> 
  <!--result下的路徑是物理路徑 --> 
      <result name="success">/login/error.jsp</result> 
      <result name="error">/login/success.jsp</result> 
    </action> 
  </package> 
</struts> 

一、Action的創(chuàng)建方法

1)實(shí)現(xiàn)Action接口
2)繼承ActionSupport類,覆寫(xiě)其中的方法
3)不繼承任何類都可以實(shí)現(xiàn),關(guān)鍵是在struts.xml中進(jìn)行配置

二、Action動(dòng)態(tài)方法的調(diào)用

在實(shí)際的項(xiàng)目中,一個(gè)action類的中,可能存在多個(gè)方法,而不同的方法執(zhí)行的效果是不一樣的,如果按照了一般性的配置,將無(wú)形的增加了程序員的負(fù)擔(dān)

第一種方法:在struts.xml中的action屬性標(biāo)簽中用method屬性指定方法名(不怎么推薦使用)

第二種方法: jsp頁(yè)面中指定你要調(diào)用的那個(gè)方法

<form action=”login!myfun.action”,method=”post”>

在客戶端請(qǐng)求中進(jìn)行動(dòng)態(tài)的配置:映射名!方法名.action

這樣可以動(dòng)態(tài)的調(diào)用action中的myfun方法,就不要在action標(biāo)簽中進(jìn)行method的配置

第三種方法:使用通配符進(jìn)行配置(推薦使用:適用情況當(dāng)一個(gè)類中存在較多的響應(yīng)方法)

在配置<action> 時(shí),可以在 name,class,method 中使用通配符,這是 另外一種形式的動(dòng)態(tài)方法調(diào)用

<action name="*user" class="com.zzjmay.action.UserAction" method="{1}"> 
//這種通配是針對(duì)的是同一個(gè)action中,響應(yīng)不同的方法 
 
在jsp頁(yè)面中調(diào)用的時(shí)候 
<form action="loginuser.action" method="post"> 
  <!-- 需要注意的是要保證表單中的name的命名要和Action中屬性的命名保持一致 --> 
    用戶名:<input type="text" name="username" id="username"><br> 
    密   碼:<input type="password" name="password" id="password"> 
    <br> 
    <input type="submit" value="提交"> 
     
  </form> 

注意:通過(guò)使用通配符的時(shí)候相當(dāng)于占位操作,其中的{1}表示第一個(gè)通配符,就上面的例子來(lái)講,當(dāng)jsp頁(yè)面中是loginuser.action進(jìn)行調(diào)用的時(shí)候,實(shí)際上出發(fā)的Action類中的login()方法

通過(guò)通配符實(shí)現(xiàn),不同的類響應(yīng)不同的類中的方法:

<action name=“*_*" class="action.{1}Action" method="{2}">
  <result >/{2}.jsp</result>
</action>

三、 Action的動(dòng)態(tài)結(jié)果的配置

含義:在實(shí)際運(yùn)行當(dāng)中,Action類的處理業(yè)務(wù)的過(guò)程中,可能由于業(yè)務(wù)條件的復(fù)雜,會(huì)跳轉(zhuǎn)到不同頁(yè)面,那么為了節(jié)省result的配置,我們一般會(huì)采用動(dòng)態(tài)結(jié)果的配置。其實(shí)很像我們?cè)趕ervlet中進(jìn)行全局的forward的配置。

UserAction.Java

public class UserAction extends ActionSupport {
  private String nextResult;
  ...
}

Struts2.xml

<action name="user" class="action.UserAction">
  <result>/{nextResult}</result>
</action>

四、接收用戶數(shù)據(jù)(推薦使用的實(shí)現(xiàn)ModelDriven的接口)

在這篇博客中我只是介紹常用的,并且在實(shí)際項(xiàng)目中效率較高的方法。我之所以推薦ModelDriven接口的方法,原因就是可以很好的分離顯示界面和業(yè)務(wù)邏輯的分離(解耦性)。

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

步驟:
u    實(shí)現(xiàn)用戶登錄功能
u    創(chuàng)建User.java類
Ø          聲明用戶登錄信息
Ø          創(chuàng)建無(wú)參構(gòu)造
u   創(chuàng)建Action類
Ø          實(shí)現(xiàn)com.opensymphony.xwork2.ModelDriven接口
Ø          聲明User類對(duì)象并實(shí)例化
Ø         實(shí)現(xiàn)getModel ()方法,返回User類對(duì)象
u    創(chuàng)建JSP頁(yè)面
Ø         表單元素使用”屬性”設(shè)置name屬性

注意:
1)  首先,action要實(shí)現(xiàn)ModelDriven的接口,默認(rèn)實(shí)現(xiàn)getModel()方法
2)  要在action中自己來(lái)實(shí)例化user的對(duì)象,而不像前面一種方法是有struts2的框架實(shí)現(xiàn)的
3)  比較突出的就是在jsp頁(yè)面中,表單元素的name屬性,直接用名字就可以來(lái)

UserAction.java

public class UserAction implements ModelDriven<User> { 
  //要實(shí)例化 
  private User user=new User(); 
   
  public User getUser() { 
    return user; 
  } 
 
  public void setUser(User user) { 
    this.user = user; 
  } 
  public String myfun() throws Exception { 
    System.out.println("username="+user.getUsername()); 
    System.out.println("password="+user.getPassword()); 
    System.out.println("myfun....."); 
    //用來(lái)進(jìn)行處理 
    if(user.getUsername().equals(user.getPassword())){ 
      return "success"; 
    }else{ 
      return "error"; 
    } 
     
     
  } 
 
  public User getModel() { 
    // TODO Auto-generated method stub 
    return user; 
  } 
 
} 

login.jsp

<form action="loginuser.action" method="post"> 
  <!-- 需要注意的是要保證表單中的name的命名要和Action中屬性的命名保持一致 --> 
    用戶名:<input type="text" name="username" id="username"><br> 
    密   碼:<input type="password" name="password" id="password"> 
    <br> 
    <input type="submit" value="提交"> 
     
  </form> 

五、在Action中訪問(wèn)Servlet API

訪問(wèn)Servlet API的實(shí)際項(xiàng)目中有兩種的方法訪問(wèn)Servlet API

1)解耦的方法(實(shí)現(xiàn)三大接口程序RequestAware,ApplicationAware,SessionAware)

public class UserAction2 implements ModelDriven<User> ,RequestAware,SessionAware,ApplicationAware{ 
 
  private User user = new User(); 
   
  private Map<String, Object> requestMap; 
  private Map<String, Object> sessionMap; 
  private Map<String, Object> applicationMap; 
   
   
  public void setApplication(Map<String, Object> applicationMap) { 
    this.applicationMap=applicationMap; 
     
  } 
 
  public void setSession(Map<String, Object> sessionMap) { 
    this.sessionMap=sessionMap; 
  } 
 
  public void setRequest(Map<String, Object> requestMap) { 
      this.requestMap=requestMap; 
     
  } 
 
 
  public User getUser() { 
    return user; 
  } 
 
  public void setUser(User user) { 
    this.user = user; 
  } 
 
  public String myfun() throws Exception { 
    System.out.println("username=" + user.getUsername()); 
    System.out.println("password=" + user.getPassword()); 
    System.out.println("myfun2....."); 
    // 用來(lái)進(jìn)行處理 
    if (user.getUsername().equals(user.getPassword())) { 
 
      sessionMap.put("Succ", "成功的哇2!?。?); 
      Bookbiz bookbiz=new Bookbiz(); 
       
      applicationMap.put("books",bookbiz.getBooks()); 
       
      return "success"; 
    } else { 
 
      requestMap.put("errorMsg", "登陸失敗了2"); 
      return "error"; 
    } 
 
  } 
 
 
  public User getModel() { 
    // TODO Auto-generated method stub 
    return user; 
  } 



注意:在非解耦的方式中,struts2框架已經(jīng)將對(duì)應(yīng)的四大應(yīng)用作用域給封裝到了Map集合中,所以這里一開(kāi)始定義的三個(gè)Map集合中可以相當(dāng)于操作四大作用域?qū)ο?/p>

2)非解耦的方法(實(shí)現(xiàn)兩大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是說(shuō)直接操作的Servlet API對(duì)象

public class UserAction4 implements ModelDriven<User>,ServletRequestAware,ServletContextAware{ 
 
  private User user = new User(); 
   
  private HttpServletRequest request; 
  private HttpSession session; 
  private ServletContext application; 
 
  public void setServletContext(ServletContext application) { 
    this.application = application; 
 
  } 
 
  public void setServletRequest(HttpServletRequest request) { 
    this.request = request; 
 
  } 
 
  public User getUser() { 
    return user; 
  } 
 
  public void setUser(User user) { 
    this.user = user; 
  } 
……………… 

注意:在實(shí)現(xiàn)接口中只實(shí)現(xiàn)了request和application的獲取

在實(shí)際項(xiàng)目開(kāi)發(fā)當(dāng)中,需要的獲取session的方法是通過(guò)Httpsession session= request.getsession();

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 散列算法與散列碼(實(shí)例講解)

    散列算法與散列碼(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇散列算法與散列碼(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Java幾種分布式全局唯一ID生成方案

    Java幾種分布式全局唯一ID生成方案

    本文主要介紹了聊聊幾種分布式全局唯一ID生成方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Mybatis-Plus使用p6spy對(duì)SQL性能進(jìn)行監(jiān)控的方法

    Mybatis-Plus使用p6spy對(duì)SQL性能進(jìn)行監(jiān)控的方法

    這篇文章主要介紹了Mybatis-Plus使用p6spy對(duì)SQL性能進(jìn)行監(jiān)控的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Springboot @Value注入boolean設(shè)置默認(rèn)值方式

    Springboot @Value注入boolean設(shè)置默認(rèn)值方式

    這篇文章主要介紹了Springboot @Value注入boolean設(shè)置默認(rèn)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 如何將Object類轉(zhuǎn)換為實(shí)體類

    如何將Object類轉(zhuǎn)換為實(shí)體類

    這篇文章主要介紹了如何將Object類轉(zhuǎn)換為實(shí)體類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例

    Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例

    這篇文章主要介紹了Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例,普通的線程執(zhí)行是無(wú)法獲取到執(zhí)行結(jié)果的,FutureTask?間接實(shí)現(xiàn)了?Runnable?和?Future?接口,可以得到子線程耗時(shí)操作的執(zhí)行結(jié)果,AsyncTask?異步任務(wù)就是使用了該機(jī)制,需要的朋友可以參考下
    2024-01-01
  • 詳解Java設(shè)計(jì)模式——迭代器模式

    詳解Java設(shè)計(jì)模式——迭代器模式

    這篇文章主要介紹了Java設(shè)計(jì)模式——迭代器模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java?String類和StringBuffer類的區(qū)別介紹

    Java?String類和StringBuffer類的區(qū)別介紹

    這篇文章主要介紹了Java?String類和StringBuffer類的區(qū)別,?關(guān)于java的字符串處理我們一般使用String類和StringBuffer類有什么不同呢,下面我們一起來(lái)看看詳細(xì)介紹吧
    2022-03-03
  • Java中Stream流的常用方法代碼示例

    Java中Stream流的常用方法代碼示例

    這篇文章主要介紹了Java中Stream流的常用方法代碼示例,Stream類中每一個(gè)方法都對(duì)應(yīng)集合上的一種操作,將真正的函數(shù)式編程引入到Java中,能 讓代碼更加簡(jiǎn)潔,極大地簡(jiǎn)化了集合的處理操作,提高了開(kāi)發(fā)的效率和生產(chǎn)力,需要的朋友可以參考下
    2023-10-10
  • Java中保證線程順序執(zhí)行的操作代碼

    Java中保證線程順序執(zhí)行的操作代碼

    本文給大家分享一篇教程關(guān)于java線程順序執(zhí)行問(wèn)題,如何保證線程的順序執(zhí)行呢?今天通過(guò)實(shí)例代碼給大家詳細(xì)講解下,感興趣的朋友跟隨小編一起看看吧
    2021-05-05

最新評(píng)論

静宁县| 静安区| 巴楚县| 关岭| 静安区| 青河县| 高台县| 靖西县| 建宁县| 富平县| 乐亭县| 雷山县| 青岛市| 惠东县| 武邑县| 荆州市| 吴堡县| 平凉市| 南宁市| 华池县| 长宁县| 咸宁市| 米易县| 桂阳县| 蓬安县| 灵山县| 延津县| 五华县| 北碚区| 阜新市| 饶阳县| 台山市| 竹溪县| 独山县| 额敏县| 佛冈县| 镇赉县| 文登市| 安溪县| 凤山县| 浦北县|