Struts 2 配置Action詳解
實(shí)現(xiàn)了Action處理類之后,就可以在struts.xml中配置該Action,從而讓Struts 2框架知道哪個(gè)Action處理哪個(gè)請(qǐng)求,即建立用戶請(qǐng)求和Action類之間的對(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屬性。
- name屬性:指定Action的名字,即指明該Action所處理的請(qǐng)求的URL,例如,若name屬性值為login,則請(qǐng)求該Action的URL是login.action
- class屬性:指定Action的實(shí)現(xiàn)類,該屬性不是必須的,如果沒(méi)有指定class屬性的值,則默認(rèn)使用ActionSupport類。
Action基本配置代碼如下:
<package name="default" namespace="/" extends="struts-default"> <action name="example" class="com.example.struts.action.expAction"> </package>
Action只是一個(gè)邏輯控制器,不直接對(duì)用戶請(qǐng)求生成任何相應(yīng)。因此,Action處理完用戶請(qǐng)求后需要將指定的視圖資源呈現(xiàn)給用戶,即配置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)用戶通過(guò)不同的提交按鈕進(jìn)行提交時(shí),系統(tǒng)需要使用Action的不同方法進(jìn)行處理用戶請(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
- ActionName是Action的名字,即struts.xml中配置的Action的name屬性值;
- methodName是Action實(shí)現(xiàn)類中處理邏輯的方法名。
動(dòng)態(tài)方法調(diào)用示例
//訪問(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>商品名稱</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)用戶單擊不同的鏈接時(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)類為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處理類定義成多個(gè)邏輯Action。此時(shí),在配置<action>元素時(shí),需要指定name、class和method屬性。這樣就可以讓Action調(diào)用指定方法,而不是execute()方法來(lái)處理用戶請(qǐng)求。
例如可以將ProductAction類定義成兩個(gè)邏輯Action,即將該類中的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)的處理類都是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,只要用戶請(qǐng)求的URL符合“ * product.action”的模式,都可以通過(guò)ProductAction處理。此外,必須要指定method屬性,method屬性用于指定用戶請(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á)式,例如:
<action name = " *_* " class = "com.qst.chapter03,action.{1}Action" method = " {2} ">
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個(gè)web項(xiàng)目(圖文教程)
這篇文章主要介紹了新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個(gè)web項(xiàng)目的圖文教程,需要的朋友可以參考下2018-01-01Spring?Boot?實(shí)現(xiàn)Redis分布式鎖原理
這篇文章主要介紹了Spring?Boot實(shí)現(xiàn)Redis分布式鎖原理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08基于java servlet過(guò)濾器和監(jiān)聽(tīng)器(詳解)
下面小編就為大家?guī)?lái)一篇基于java servlet過(guò)濾器和監(jiān)聽(tīng)器(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10JAVA中常用的設(shè)計(jì)模式:?jiǎn)卫J?,工廠模式,觀察者模式
設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_(kāi)發(fā)人員所采用。設(shè)計(jì)模式是軟件開(kāi)發(fā)人員在軟件開(kāi)發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。這些解決方案是眾多軟件開(kāi)發(fā)人員經(jīng)過(guò)相當(dāng)長(zhǎng)的一段時(shí)間的試驗(yàn)和錯(cuò)誤總結(jié)出來(lái)的。2020-04-04關(guān)于java String中intern的深入講解
這篇文章主要給大家介紹了關(guān)于java String中intern的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04SSH框架網(wǎng)上商城項(xiàng)目第28戰(zhàn)之使用Ajax技術(shù)局部更新商品數(shù)量和總價(jià)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第28戰(zhàn)之使用Ajax技術(shù)局部更新商品數(shù)量和總價(jià),感興趣的小伙伴們可以參考一下2016-06-06JSP request.setAttribute()詳解及實(shí)例
這篇文章主要介紹了 javascript request.setAttribute()詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02Spring?Data?JPA?在?@Query?中使用投影的方法示例詳解
這篇文章主要介紹了Spring?Data?JPA?在?@Query?中使用投影的方法,大家需要注意如果要在 @Query 中使用投影,必須要主動(dòng)聲明要查詢的字段,并且主動(dòng)寫(xiě)明字段的別名才行,本文通過(guò)sql代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-07-07