Struts 2 配置Action詳解
實現(xiàn)了Action處理類之后,就可以在struts.xml中配置該Action,從而讓Struts 2框架知道哪個Action處理哪個請求,即建立用戶請求和Action類之間的對應(yīng)關(guān)系。
Action基本配置
Struts 2使用package包來組織Action,在struts.xml中通過使用package下的action元素來配置Action。在配置Action時,需要指定action元素的name和class屬性。
- name屬性:指定Action的名字,即指明該Action所處理的請求的URL,例如,若name屬性值為login,則請求該Action的URL是login.action
- class屬性:指定Action的實現(xiàn)類,該屬性不是必須的,如果沒有指定class屬性的值,則默認使用ActionSupport類。
Action基本配置代碼如下:
<package name="default" namespace="/" extends="struts-default"> <action name="example" class="com.example.struts.action.expAction"> </package>
Action只是一個邏輯控制器,不直接對用戶請求生成任何相應(yīng)。因此,Action處理完用戶請求后需要將指定的視圖資源呈現(xiàn)給用戶,即配置Action時,應(yīng)該配置邏輯視圖和物理視圖資源之間的映射。
配置邏輯視圖和物理視圖之間的映射關(guān)系是通過<result>元素來定義的,每個<result>元素定義邏輯視圖和物理視圖之間的一個映射:
<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>
動態(tài)方法調(diào)用
有時一個Action內(nèi)需要包含多個控制處理邏輯。例如,對于同一個表單,當(dāng)用戶通過不同的提交按鈕進行提交時,系統(tǒng)需要使用Action的不同方法進行處理用戶請求,此時就需要讓Action中包含多個控制處理邏輯。
Struts 2框架允許一個Action中包含多個處理邏輯。在Struts 2中請求一個Action中的不同處理邏輯方法的方式成為DMI(Dynamic Method Invocation,動態(tài)方法調(diào)用),其請求格式如下:
(ActionName)!(methodName).action
- ActionName是Action的名字,即struts.xml中配置的Action的name屬性值;
- methodName是Action實現(xiàn)類中處理邏輯的方法名。
動態(tài)方法調(diào)用示例
//訪問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>小米手機</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>佳能相機</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>```
上述代碼中,商品列表中的每個商品使用超鏈接進行編輯、刪除操作。超鏈接中href屬性值采用動態(tài)方法調(diào)用的方式進行鏈接請求,并將產(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)建了兩個業(yè)務(wù)方法edit()和del()方法。當(dāng)用戶單擊不同的鏈接時,系統(tǒng)將交給對應(yīng)的方法處理。
接下來編寫edit.jsp和del.jsp頁面:
<%@ 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處于開發(fā)階段,可以進行調(diào)試 -->
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- Struts2的Action都必須配置在package里,此處使用默認package -->
<package name="default" namespace="/" extends="struts-default">
<!-- 定義一個名為user的Action,實現(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才會開啟動態(tài)方法調(diào)用,否則默認不會開啟動態(tài)方法調(diào)用。
使用method屬性及通配符
除了動態(tài)方法調(diào)用之外,Struts 2還提供了另一種處理方法,即將Action處理類定義成多個邏輯Action。此時,在配置<action>元素時,需要指定name、class和method屬性。這樣就可以讓Action調(diào)用指定方法,而不是execute()方法來處理用戶請求。
例如可以將ProductAction類定義成兩個邏輯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兩個邏輯Action,這兩個Action對應(yīng)的處理類都是ProductAction,但處理邏輯不同。分別對應(yīng)的是edit()和del()方法。
上面的這種方式雖然能夠?qū)崿F(xiàn),但兩個定義絕大部分是相同的,帶來冗余問題。Struts 2還提供了通配符“ * ”來解決這個問題。利用通配符在定義Action的name屬性時使用模式字符串(即用“ * ”代表一個或多個任意字符串),接下來就可以在class、method屬性以及<result>子元素中使用{N}的形式代表前面第N個星號“ * ”所匹配的子串。
* 通配符
<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”,使用了通配符,此時定義的不是一個普通的Action,而是定義了一系列的邏輯Action,只要用戶請求的URL符合“ * product.action”的模式,都可以通過ProductAction處理。此外,必須要指定method屬性,method屬性用于指定用戶請求的方法。在method屬性中使用表達式{1},代表該表達式就是name屬性值中第一個“ * ”指代的值。通過上述配置規(guī)則可以達到與動態(tài)調(diào)用同樣的運行效果。
此外Struts 2允許在class屬性和method屬性中同時使用表達式,例如:
<action name = " *_* " class = "com.qst.chapter03,action.{1}Action" method = " {2} ">
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA配置Tomcat后,控制臺tomcat?catalina?log出現(xiàn)亂碼問題
本文介紹了如何通過設(shè)置Tomcat和IDEA的編碼格式來解決編碼問題,首先嘗試修改Tomcat的logging.properties文件中的編碼設(shè)置,如果未解決問題,則調(diào)整IDEA的編碼設(shè)置,通過修改vmoptions文件來全局設(shè)置IDEA的編碼格式,作者分享了個人成功解決問題的方法和步驟,供其他開發(fā)者參考2024-09-09
基于Java實現(xiàn)文件和base64字符串轉(zhuǎn)換
這篇文章主要介紹了基于Java實現(xiàn)文件和base64字符串轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
手寫簡版kedis分布式key及value服務(wù)的實現(xiàn)及配置
這篇文章主要為大家介紹了手寫簡版的kedis分布式key及value服務(wù)的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02
如何禁用IntelliJ IDEA的LightEdit模式(推薦)
這篇文章主要介紹了如何禁用IntelliJ IDEA的LightEdit模式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
深入分析Comparable與Comparator及Clonable三個Java接口
接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統(tǒng)一格式進行定義,這篇文章主要為大家詳細介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-05-05

