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

Struts 2 配置Action詳解

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

實(shí)現(xiàn)了Action處理類(lèi)之后,就可以在struts.xml中配置該Action,從而讓Struts 2框架知道哪個(gè)Action處理哪個(gè)請(qǐng)求,即建立用戶(hù)請(qǐng)求和Action類(lèi)之間的對(duì)應(yīng)關(guān)系。

Action基本配置

Struts 2使用package包來(lái)組織Action,在struts.xml中通過(guò)使用package下的action元素來(lái)配置Action。在配置Action時(shí),需要指定action元素的name和class屬性。

  1. name屬性:指定Action的名字,即指明該Action所處理的請(qǐng)求的URL,例如,若name屬性值為login,則請(qǐng)求該Action的URL是login.action
  2. class屬性:指定Action的實(shí)現(xiàn)類(lèi),該屬性不是必須的,如果沒(méi)有指定class屬性的值,則默認(rèn)使用ActionSupport類(lèi)。

Action基本配置代碼如下:

<package name="default" namespace="/" extends="struts-default">
  <action name="example" class="com.example.struts.action.expAction">
</package>

Action只是一個(gè)邏輯控制器,不直接對(duì)用戶(hù)請(qǐng)求生成任何相應(yīng)。因此,Action處理完用戶(hù)請(qǐng)求后需要將指定的視圖資源呈現(xiàn)給用戶(hù),即配置Action時(shí),應(yīng)該配置邏輯視圖和物理視圖資源之間的映射。

配置邏輯視圖和物理視圖之間的映射關(guān)系是通過(guò)<result>元素來(lái)定義的,每個(gè)<result>元素定義邏輯視圖和物理視圖之間的一個(gè)映射:

<package name="default" namespace="/" extends="struts-default">
  <action name="example" class="com.example.struts.action.expAction">
  <result name = "success">/success.jsp</result>
  <result name = "error">/error</result>
</package>

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

有時(shí)一個(gè)Action內(nèi)需要包含多個(gè)控制處理邏輯。例如,對(duì)于同一個(gè)表單,當(dāng)用戶(hù)通過(guò)不同的提交按鈕進(jìn)行提交時(shí),系統(tǒng)需要使用Action的不同方法進(jìn)行處理用戶(hù)請(qǐng)求,此時(shí)就需要讓Action中包含多個(gè)控制處理邏輯。

Struts 2框架允許一個(gè)Action中包含多個(gè)處理邏輯。在Struts 2中請(qǐng)求一個(gè)Action中的不同處理邏輯方法的方式成為DMI(Dynamic Method Invocation,動(dòng)態(tài)方法調(diào)用),其請(qǐng)求格式如下:

(ActionName)!(methodName).action
  1. ActionName是Action的名字,即struts.xml中配置的Action的name屬性值;
  2. methodName是Action實(shí)現(xiàn)類(lèi)中處理邏輯的方法名。

動(dòng)態(tài)方法調(diào)用示例

//訪(fǎng)問(wèn)product中的edit()方法
product!edit.action

productList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>商品列表</title>
</head>
<body>
  <table border="1">
    <tr>
      <th>商品ID</th>
      <th>商品名稱(chēng)</th>
      <th>數(shù)量</th>
      <th colspan="2">操作</th>
    </tr>
    <tr>
      <td>1001</td>
      <td>小米手機(jī)</td>
      <td>128</td>
      <td><a href="product!edit.action?productId=1001" rel="external nofollow" >編輯</a></td>
      <td><a href="product!del.action?productId=1001" rel="external nofollow" >刪除</a></td>
    </tr>
    <tr>
      <td>1002</td>
      <td>佳能相機(jī)</td>
      <td>100</td>
      <td><a href="product!edit.action?productId=1002" rel="external nofollow" >編輯</a></td>
      <td><a href="product!del.action?productId=1002" rel="external nofollow" >刪除</a></td>
    </tr>
  </table>
</body>
</html>```

上述代碼中,商品列表中的每個(gè)商品使用超鏈接進(jìn)行編輯、刪除操作。超鏈接中href屬性值采用動(dòng)態(tài)方法調(diào)用的方式進(jìn)行鏈接請(qǐng)求,并將產(chǎn)品ID作為參數(shù)傳遞給Action。

ProductAction.java代碼如下:

package com.qst.chapter03.action;

import com.opensymphony.xwork2.ActionSupport;

public class ProductAction extends ActionSupport {
  private int productId;

  public int getProductId() {
    return productId;
  }

  public void setProductId(int productId) {
    this.productId = productId;
  }

  // 編輯商品
  public String edit() {
    System.out.println("編輯商品" + productId);
    // ...省略一些編輯商品的業(yè)務(wù)
    return "edit";
  }

  // 刪除商品
  public String del() {
    System.out.println("刪除商品" + productId);
    // ...省略一些刪除商品的業(yè)務(wù)
    return "del";
  }
}

上述代碼創(chuàng)建了兩個(gè)業(yè)務(wù)方法edit()和del()方法。當(dāng)用戶(hù)單擊不同的鏈接時(shí),系統(tǒng)將交給對(duì)應(yīng)的方法處理。

接下來(lái)編寫(xiě)edit.jsp和del.jsp頁(yè)面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<title>編輯商品</title>
</head>
<body>
  ${param.productId}商品編輯
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<title>刪除商品</title>
</head>
<body>
  ${param.productId}商品刪除成功!
</body>
</html>

在struts.xml中配置ProductAction代碼如下所示:

<?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>
  <!-- 指定Struts2處于開(kāi)發(fā)階段,可以進(jìn)行調(diào)試 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />

  <!-- Struts2的Action都必須配置在package里,此處使用默認(rèn)package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定義一個(gè)名為user的Action,實(shí)現(xiàn)類(lèi)為com.qst.chapter03.action.LoginAction -->
    <action name="product" class="com.qst.chapter03.action.ProductAction">
      <result name="edit">/edit.jsp</result>
      <result name="del">/del.jsp</result>
    </action>
  </package>

</struts>

上述配置文件配置了常量struts.enable.DynamicMethodInvocation的值為true,這樣Struts 2才會(huì)開(kāi)啟動(dòng)態(tài)方法調(diào)用,否則默認(rèn)不會(huì)開(kāi)啟動(dòng)態(tài)方法調(diào)用。

使用method屬性及通配符

除了動(dòng)態(tài)方法調(diào)用之外,Struts 2還提供了另一種處理方法,即將Action處理類(lèi)定義成多個(gè)邏輯Action。此時(shí),在配置<action>元素時(shí),需要指定name、class和method屬性。這樣就可以讓Action調(diào)用指定方法,而不是execute()方法來(lái)處理用戶(hù)請(qǐng)求。

例如可以將ProductAction類(lèi)定義成兩個(gè)邏輯Action,即將該類(lèi)中的edit()和del()方法映射成不同的Action,示例代碼如下:

<action name="editproduct" class="com.qst.chapter03.action.ProductAction" method = "edit">
  <result name="edit">/edit.jsp</result>
</action>
<action name="delproduct" class="com.qst.chapter03.action.ProductAction" method = "del">
  <result name="del">/del.jsp</result>
</action>

上述代碼定義了editproduct和delproduct兩個(gè)邏輯Action,這兩個(gè)Action對(duì)應(yīng)的處理類(lèi)都是ProductAction,但處理邏輯不同。分別對(duì)應(yīng)的是edit()和del()方法。

上面的這種方式雖然能夠?qū)崿F(xiàn),但兩個(gè)定義絕大部分是相同的,帶來(lái)冗余問(wèn)題。Struts 2還提供了通配符“ * ”來(lái)解決這個(gè)問(wèn)題。利用通配符在定義Action的name屬性時(shí)使用模式字符串(即用“ * ”代表一個(gè)或多個(gè)任意字符串),接下來(lái)就可以在class、method屬性以及<result>子元素中使用{N}的形式代表前面第N個(gè)星號(hào)“ * ”所匹配的子串。

* 通配符

<struts>
  <!-- 演示通配符的使用方法 -->
  <package name="product" extends="struts-default">
    <action name=" * product" class="com.qst.chapter03.action.ProductAction" method = "{1}">
      <result name="edit">/edit.jsp</result>
      <result name="del">/del.jsp</result>
    </action>
  </package>

</struts>

上述代碼Action的name屬性值為“ * product”,使用了通配符,此時(shí)定義的不是一個(gè)普通的Action,而是定義了一系列的邏輯Action,只要用戶(hù)請(qǐng)求的URL符合“ * product.action”的模式,都可以通過(guò)ProductAction處理。此外,必須要指定method屬性,method屬性用于指定用戶(hù)請(qǐng)求的方法。在method屬性中使用表達(dá)式{1},代表該表達(dá)式就是name屬性值中第一個(gè)“ * ”指代的值。通過(guò)上述配置規(guī)則可以達(dá)到與動(dòng)態(tài)調(diào)用同樣的運(yùn)行效果。

此外Struts 2允許在class屬性和method屬性中同時(shí)使用表達(dá)式,例如:

復(fù)制代碼 代碼如下:

<action name = " *_* " class = "com.qst.chapter03,action.{1}Action" method = " {2} ">

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

相關(guān)文章

  • java dom4j解析xml用到的幾個(gè)方法

    java dom4j解析xml用到的幾個(gè)方法

    這篇文章主要介紹了java dom4j解析xml用到的幾個(gè)方法,有需要的朋友可以參考一下
    2013-12-12
  • IDEA配置Tomcat后,控制臺(tái)tomcat?catalina?log出現(xiàn)亂碼問(wèn)題

    IDEA配置Tomcat后,控制臺(tái)tomcat?catalina?log出現(xiàn)亂碼問(wèn)題

    本文介紹了如何通過(guò)設(shè)置Tomcat和IDEA的編碼格式來(lái)解決編碼問(wèn)題,首先嘗試修改Tomcat的logging.properties文件中的編碼設(shè)置,如果未解決問(wèn)題,則調(diào)整IDEA的編碼設(shè)置,通過(guò)修改vmoptions文件來(lái)全局設(shè)置IDEA的編碼格式,作者分享了個(gè)人成功解決問(wèn)題的方法和步驟,供其他開(kāi)發(fā)者參考
    2024-09-09
  • 基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換

    基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換

    這篇文章主要介紹了基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java實(shí)現(xiàn)黃金分割法的示例代碼

    Java實(shí)現(xiàn)黃金分割法的示例代碼

    黃金分割法是一種區(qū)間收縮方法。所謂區(qū)間收縮方法,指的是將含有最優(yōu)解的區(qū)間逐步縮小,直至區(qū)間長(zhǎng)度為零的方法。本文將用Java實(shí)現(xiàn)這一算法,需要的可以參考一下
    2022-03-03
  • 通過(guò)openpyxl讀取excel文件過(guò)程解析

    通過(guò)openpyxl讀取excel文件過(guò)程解析

    這篇文章主要介紹了通過(guò)openpyxl讀取excel文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring依賴(lài)注入的三種方式詳解

    Spring依賴(lài)注入的三種方式詳解

    這篇文章主要給大家介紹了三種Spring依賴(lài)注入的方式,?settter方法注入,構(gòu)造器注入以及變量(filed)?注入這三種方式,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 手寫(xiě)簡(jiǎn)版kedis分布式key及value服務(wù)的實(shí)現(xiàn)及配置

    手寫(xiě)簡(jiǎn)版kedis分布式key及value服務(wù)的實(shí)現(xiàn)及配置

    這篇文章主要為大家介紹了手寫(xiě)簡(jiǎn)版的kedis分布式key及value服務(wù)的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 如何禁用IntelliJ IDEA的LightEdit模式(推薦)

    如何禁用IntelliJ IDEA的LightEdit模式(推薦)

    這篇文章主要介紹了如何禁用IntelliJ IDEA的LightEdit模式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 深入分析Comparable與Comparator及Clonable三個(gè)Java接口

    深入分析Comparable與Comparator及Clonable三個(gè)Java接口

    接口不是類(lèi),而是對(duì)類(lèi)的一組需求描述,這些類(lèi)要遵從接口描述的統(tǒng)一格式進(jìn)行定義,這篇文章主要為大家詳細(xì)介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-05-05
  • java四種訪(fǎng)問(wèn)權(quán)限實(shí)例分析

    java四種訪(fǎng)問(wèn)權(quán)限實(shí)例分析

    這篇文章主要介紹了java四種訪(fǎng)問(wèn)權(quán)限實(shí)例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

郧西县| 唐河县| 万载县| 井研县| 庆城县| 安西县| 南岸区| 龙泉市| 巴马| 阿坝县| 广昌县| 上犹县| 永定县| 乌恰县| 宁津县| 尼勒克县| 灌阳县| 随州市| 炉霍县| 房产| 左云县| 胶州市| 沐川县| 乐亭县| 卓资县| 北票市| 桐庐县| 江永县| 玛纳斯县| 仁怀市| 呈贡县| 灵宝市| 电白县| 同江市| 浦城县| 绍兴县| 平潭县| 张北县| 雷波县| 洛隆县| 老河口市|