Java的Struts框架中Action的編寫與攔截器的使用方法
Struts2 Action/動作
動作是Struts2框架的核心,因為他們的任何MVC(模型 - 視圖 - 控制器)框架。每個URL將被映射到一個特定的動作,它提供了來自用戶的請求提供服務所需的處理邏輯。
但動作也提供其他兩個重要的能力。首先,操作從請求數(shù)據(jù)的傳輸中起著重要的作用,通過向視圖,無論是一個JSP或其它類型的結(jié)果。二,動作必須協(xié)助的框架,在確定結(jié)果應該渲染視圖,在響應該請求將被退回。
創(chuàng)建動作:
在Struts2的動作,唯一的要求是必須有一個無參數(shù)的方法返回String或結(jié)果的對象,必須是一個POJO。如果不帶參數(shù)的方法是不指定,則默認動作是使用execute()方法。
也可以選擇擴展ActionSupport類實現(xiàn)了6個接口,包括動作界面。動作界面如下:
public interface Action { public static final String SUCCESS = "success"; public static final String NONE = "none"; public static final String ERROR = "error"; public static final String INPUT = "input"; public static final String LOGIN = "login"; public String execute() throws Exception; }
讓我們來看看Hello World示例的操作方法:
package com.yiibai.struts2; public class HelloWorldAction{ private String name; public String execute() throws Exception { return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
為了說明這一點,操作方法控制視圖,讓我們做出以下更改執(zhí)行方法和擴展類ActionSupport 如下:
package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport{ private String name; public String execute() throws Exception { if ("SECRET".equals(name)) { return SUCCESS; }else{ return ERROR; } } public String getName() { return name; } public void setName(String name) { this.name = name; } }
在這個例子中,我們有一些在execute方法的邏輯來看待的name屬性。如果屬性等于字符串“SECRET”,我們返回SUCCESS 的結(jié)果,否則我們返回ERROR 的結(jié)果。因為我們已經(jīng)擴展ActionSupport,所以我們可以使用字符串常量的成功和錯誤?,F(xiàn)在,讓我們修改我們的struts.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="com.yiibai.struts2.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> <result name="error">/AccessDenied.jsp</result> </action> </package> </struts>
創(chuàng)建視圖
讓我們創(chuàng)建以下JSP文件 helloWorld.jsp 的WebContent文件夾在eclipse項目。要做到這一點,右鍵單擊WebContent文件夾在項目資源管理器,選擇New >JSP File。該文件將要求返回的結(jié)果是SUCCESS,這是一個字符串常量“success”的定義在動作界面:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World</title> </head> <body> Hello World, <s:property value="name"/> </body> </html>
以下是由框架的動作的結(jié)果將被調(diào)用的文件,該文件是等于字符串常量“錯誤”的ERROR 。以下是AccessDenied.jsp 的內(nèi)容
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Access Denied</title> </head> <body> You are not authorized to view this page. </body> </html>
我們還需要在WebContent文件夾中創(chuàng)建index.jsp。該文件將作為初始動作URL,用戶可以直接點擊告訴Struts 2框架調(diào)用HelloWorldAction類的 execute方法,并呈現(xiàn) helloWorld.jsp視圖。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Hello World</title> </head> <body> <h1>Hello World From Struts2</h1> <form action="hello"> <label for="name">Please enter your name</label><br/> <input type="text" name="name"/> <input type="submit" value="Say Hello"/> </form> </body> </html>
就是這樣,不需要改變的web.xml文件,所以讓我們用同一個web.xml,是之前我們已經(jīng)創(chuàng)建了范例章?,F(xiàn)在,我們已經(jīng)準備好運行使用Struts 2框架的 Hello World應用程序。
執(zhí)行應用程序
右鍵點擊項目名稱,并單擊 Export > WAR File 創(chuàng)建一個WAR文件。然后在Tomcat 的webapps目錄下部署這個WAR。最后,啟動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:
讓我們?yōu)椤癝ECRET”,并輸入一個字,應該看到以下頁面:
現(xiàn)在輸入任何單詞而非“SECRET”,應該看到以下頁面:
建立多個動作:
經(jīng)常會定義一個以上的動作,以處理不同的請求,并提供不同的用戶的URL,因此可以定義不同的類定義如下:
package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; class MyAction extends ActionSupport{ public static String GOOD = SUCCESS; public static String BAD = ERROR; } public class HelloWorld extends ActionSupport{ ... public String execute() { if ("SECRET".equals(name)) return MyAction.GOOD; return MyAction.BAD; } ... } public class SomeOtherClass extends ActionSupport{ ... public String execute() { return MyAction.GOOD; } ... }
在struts.xml文件中配置這些操作如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="com.yiibai.struts2.HelloWorld" method="execute"> <result name="success">/HelloWorld.jsp</result> <result name="error">/AccessDenied.jsp</result> </action> <action name="something" class="com.yiibai.struts2.SomeOtherClass" method="execute"> <result name="success">/Something.jsp</result> <result name="error">/AccessDenied.jsp</result> </action> </package> </struts>
正如看到在上述假設的例子,動作的結(jié)果是重復的SUCCESS和ERROR。要解決這個問題,建議創(chuàng)建一個類包含結(jié)果的結(jié)果。
Struts2 攔截器
攔截器的概念是Servlet過濾器或JDK代理類一樣的。攔截器允許橫切功能分開實現(xiàn)的動作,以及框架。使用攔截器,可以實現(xiàn)如下:
- 提供預處理行動之前被稱為邏輯。
- 提供后處理邏輯動作后被調(diào)用
- 捕獲異常,這樣可以進行替代處理。
Struts2框架提供的許多功能都使用攔截實現(xiàn)的例子包括異常處理,文件上傳,生命周期回調(diào)和驗證等事實上作為Struts2的基礎,其功能攔截,這可能有7或8攔截器分配給每個動作。
Struts2框架的攔截器:
Struts 2框架提供了良好的箱攔截列表來預先設定的,并準備使用。下面列出了幾個重要的攔截:
請看Struts 2文檔的完整細節(jié)上面提到的攔截。會告訴如何使用Struts應用程序在一個攔截器。
如何使用攔截器?
讓我們來看看如何使用已有的攔截,我們的“Hello World”程序。我們將使用計時器來測量過了多長時間執(zhí)行操作方法,其目的是攔截。同時使用params攔截器,其目的是發(fā)送請求參數(shù)的動作。您可以嘗試不使用這個攔截您的示例中會發(fā)現(xiàn),沒有被設置name屬性,因為參數(shù)是無法達到動作。
我們將繼續(xù)HelloWorldAction.java,web.xml 的helloWorld.jsp 和 index.jsp 文件,因為他們已經(jīng)建立了范例章節(jié),但讓我們?nèi)缦滦薷膕truts.xml文件,添加一個攔截器
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="com.yiibai.struts2.HelloWorldAction" method="execute"> <interceptor-ref name="params"/> <interceptor-ref name="timer" /> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
右鍵點擊項目名稱,并單擊 Export > WAR File 創(chuàng)建一個WAR文件。然后部署在Tomcat 的webapps目錄下這個WAR。最后,啟動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:
現(xiàn)在,在給定的文本框中輸入單詞,并單擊“Say Hello按鈕執(zhí)行已定義的動作。現(xiàn)在,如果將檢查生成的日志,會發(fā)現(xiàn)下面的文字:
INFO: Server startup in 3539 ms 27/08/2011 8:40:53 PM com.opensymphony.xwork2.util.logging.commons.CommonsLogger info INFO: Executed action [//hello!execute] took 109 ms.
這里底行,正在生成因為這告訴動作發(fā)生要執(zhí)行的總共為 109ms定時器的攔截器。
創(chuàng)建自定義的攔截器
在應用程序中使用自定義的攔截器是一種優(yōu)雅的方式提供橫切的應用功能。創(chuàng)建一個自定義攔截器是很容易的,需要擴展的接口,下面的Interceptor接口:
public interface Interceptor extends Serializable{ void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; }
正如其名稱所表明的,init()方法提供了一種方法來初始化攔截器,并destroy() 方法提供了一種工具攔截清理。不同的行動,攔截被重用跨請求和需要是線程安全的,尤其是intercept() 方法。
ActionInvocation對象可以訪問運行時環(huán)境。它允許訪問的動作本身和方法調(diào)用的動作,并確定動作是否已被調(diào)用。
如果不需要初始化或清除代碼,可以擴展AbstractInterceptor類。這提供了一個默認的無操作實現(xiàn)的init()和 destroy()方法。
創(chuàng)建攔截器類:
讓我們創(chuàng)建Java資源 MyInterceptor.java> src 文件夾:
package com.yiibai.struts2; import java.util.*; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation)throws Exception{ /* let us do some pre-processing */ String output = "Pre-Processing"; System.out.println(output); /* let us call action or next interceptor */ String result = invocation.invoke(); /* let us do some post-processing */ output = "Post-Processing"; System.out.println(output); return result; } }
就像看到的,實際行動將使用攔截器執(zhí)行invocation.invoke()調(diào)用。所以,可以做一些前處理和一些處理后,根據(jù)需要。
該框架本身啟動的過程中,在第一次調(diào)用ActionInvocation對象的invoke()。每次 invoke()被調(diào)用,ActionInvocation的咨詢的狀態(tài)和執(zhí)行為準攔截接下來。通過請求流以下數(shù)據(jù)圖顯示了相同的概念:
創(chuàng)建動作類:
讓我們創(chuàng)建一個Java文件HelloWorldAction.java的Java下Java Resources > src下面給出的內(nèi)容包名為 com.yiibai.struts2。
package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport{ private String name; public String execute() throws Exception { System.out.println("Inside action...."); return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
在前面的例子中,我們已經(jīng)看到,這是一個相同的類。我們有標準的“名稱”屬性的getter和setter方法,并返回字符串“success”的執(zhí)行方法。
創(chuàng)建視圖
讓我們創(chuàng)建以下JSP文件helloWorld.jsp,在eclipse項目在WebContent文件夾。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World</title> </head> <body> Hello World, <s:property value="name"/> </body> </html>
創(chuàng)建頁面:
我們還需要在WebContent文件夾中創(chuàng)建 index.jsp。該文件將作為初始動作URL,用戶可以在其中點擊告訴Struts 2框架調(diào)用 HelloWorldAction類定義的方法呈現(xiàn) helloWorld.jsp視圖。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Hello World</title> </head> <body> <h1>Hello World From Struts2</h1> <form action="hello"> <label for="name">Please enter your name</label><br/> <input type="text" name="name"/> <input type="submit" value="Say Hello"/> </form> </body> </html>
Hello 動作定義在上面的視圖文件將被映射到HelloWorldAction類和其執(zhí)行方法使用struts.xml文件。
配置文件
現(xiàn)在,我們需要注冊我們的攔截器,然后調(diào)用它默認的攔截器在前面的例子中調(diào)用。要注冊一個新定義的攔截,直接放在的<interceptors>...</interceptors>標簽下<package>的標簽插件struts.xml文件。您可以跳過這一步為默認的攔截器,就像我們在我們前面的例子。但在這里,讓我們注冊和使用它,如下所示:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <interceptors> <interceptor name="myinterceptor" class="com.yiibai.struts2.MyInterceptor" /> </interceptors> <action name="hello" class="com.yiibai.struts2.HelloWorldAction" method="execute"> <interceptor-ref name="params"/> <interceptor-ref name="myinterceptor" /> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
應該指出的是,可以注冊多個攔截器<package>標簽內(nèi),同一時間,可以調(diào)用多個攔截里面的<action>標簽。可以調(diào)用相同的攔截器與不同的動作。
web.xml文件需要在 WEB-INF文件夾下創(chuàng)建 WebContent 如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts 2</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.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
右鍵點擊項目名稱,并單擊 Export > WAR File 文件創(chuàng)建一個WAR文件。然后部署在Tomcat 的webapps目錄下這個WAR。最后,啟動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:
現(xiàn)在,在給定的文本框中輸入任何單詞,并單擊“Say Hello“ 按鈕執(zhí)行已定義的動作?,F(xiàn)在,如果檢查生成的日志,會發(fā)現(xiàn)下面的文本下方:
Pre-Processing Inside action.... Post-Processing
堆疊多個攔截器:
可以想像,配置多個攔截器每個動作很快就會變得非常難以控制。出于這個原因,攔截器與攔截器棧管理。下面是一個例子,直接從在struts-default.xml文件:
<interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servlet-config"/> <interceptor-ref name="prepare"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> </interceptor-stack>
上面的棧被調(diào)用basicStack,可用于在配置中,如下所示。此配置節(jié)點放置在<package.../>節(jié)點下。每個<interceptor-ref.../>標記引用一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保該名稱是唯一的所有攔截器和攔截器棧配置配置初始的攔截器和攔截器棧時。
我們已經(jīng)看到了如何應用攔截的動作,將攔截器棧是沒有什么不同。事實上,我們完全使用相同的標簽:
<action name="hello" class="com.yiibai.struts2.MyAction"> <interceptor-ref name="basicStack"/> <result>view.jsp</result> </action
上述注冊的“basicStack”所有6個攔截器完成注冊的棧 Hello 動作。應該指出的是,攔截器執(zhí)行的順序在配置中。例如,在上述情況下,異常將被執(zhí)行,servlet 配置等。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之線段樹的原理與實現(xiàn)
線段樹是一種二叉搜索樹,是用來維護區(qū)間信息的數(shù)據(jù)結(jié)構(gòu)。本文將利用示例詳細講講Java數(shù)據(jù)結(jié)構(gòu)中線段樹的原理與實現(xiàn),需要的可以參考一下2022-06-06Spring注解驅(qū)動之BeanDefinitionRegistryPostProcessor原理解析
這篇文章主要介紹了Spring注解驅(qū)動之BeanDefinitionRegistryPostProcessor原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09Gradle jvm插件系列教程之Java?Library插件權(quán)威詳解
這篇文章主要介紹了Java?Library插件權(quán)威詳解,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01關(guān)于Javaweb的轉(zhuǎn)發(fā)和重定向詳解
這篇文章主要介紹了關(guān)于Javaweb的轉(zhuǎn)發(fā)和重定向詳解,請求的轉(zhuǎn)發(fā),是指服務器收到請求后,從一個服務器端資源跳轉(zhuǎn)到同一個服務器端另外一個資源的操作,需要的朋友可以參考下2023-05-05SpringSecurity詳解整合JWT實現(xiàn)全過程
JWT作為一個開放的標準(?RFC?7519?),定義了一種簡潔的,自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。接下來通過本文給大家介紹springSecurity+jwt實現(xiàn)互踢功能,需要的朋友可以參考下2022-07-07解決java.lang.Error: Unresolved compilation pro
這篇文章主要介紹了解決java.lang.Error: Unresolved compilation problems:問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03