Struts2基礎-1- 簡單java類實現Action控制器

來源:互聯網
上載者:User

標籤:完成後   action   區別   ext   redirect   some   res   tomcat部署   star   

Strut2中,Action可以不繼承任何特殊的類或不實現任何特殊的介面,可以只編寫一個普通的Java類作為Action類,只要該類含有一個返回字串的無參的public方法即可!實際開發中,通常繼承ActionSupport類(該類繼承了Action介面)來編寫Action請求處理類。以下就以普通Java類作為Actoin類進行樣本:

項目結構

1。web.xml配置

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6     <welcome-file-list> 7         <welcome-file>index.jsp</welcome-file> 8     </welcome-file-list> 9 10     <filter>11         <filter-name>StrutsPrepareAndExecuteFilter</filter-name>12         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>13     </filter>14 15     <filter-mapping>16         <filter-name>StrutsPrepareAndExecuteFilter</filter-name>17         <url-pattern>/*</url-pattern>    //對所有請求進行攔截

<!--<url-pattern>*.action</url-pattern>--> //對以.action結尾的請求進行攔截

18     </filter-mapping>19 20 </web-app>

2. Action類

 1 package cn.test.action; 2  3 public class UserAction { 4      5     public String login(){ 6         return "success"; 7     } 8      9     public String register(){10         return "success";11     }12 13 }

3.struts.xml配置Action類

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4     "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6     <package name="user" namespace="/user" extends="struts-default"> 7         <action name="login" class="cn.test.action.UserAction" method="login"> 8             <result>/login.jsp</result><!-- result不寫name屬性,預設就是success --> 9         </action>10         <action name="register" class="cn.test.action.UserAction" method="register">11             <result>/register.jsp</result>12         </action>13     </package>14 15 </struts>

4. jsp頁面,沒有實質性代碼,僅僅作為展示Struts2請求處理展示

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9   <head>10     <base href="<%=basePath%>">11     <title>My JSP ‘login.jsp‘ starting page</title>12   </head>13   14   <body>15     This is my login JSP page. <br>16   </body>17 </html>
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9   <head>10     <base href="<%=basePath%>">11     <title>My JSP ‘register‘ starting page</title>12   </head>13   14   <body>15     This is my register  JSP page. <br>16   </body>17 </html>

5.部署並訪問:

http://localhost:8080/strutsstu0/user/login  結果如下:

 

訪問http://localhost:8080/strutsstu0/user/register 結果如下

如果web.xml中 url-pattern 配置成 <url-pattern>*.action</url-pattern> ,那麼訪問時就要 在後面加上.action了   :http://localhost:8080/strutsstu0/user/login.action,結果如下:

 

6. Struts2執行過程分析:

(1)web.xml

  Struts2架構基於MVC模式,基於MVC模式架構的核心就是控制器對所有請求進行統一處理。Struts2的控制器  StrutsPrepareAndExecuteFilter 由Servlet API中的Filter充當,

當Web容器接收到請求後,將請求交給Web.xml中配置的過濾器StrutsPrepareAndExecuteFilter  ,這個過濾器對架構進行初始化,以及處理所有的請求。(任何一個web應用程式都是基於請求/響應模式進行構建的,無論採用哪種MVC架構,都離不開Web.xml檔案的配置。只有在web應用中配置了web.xml檔案,MVC架構才能真正地與web應用融合起來。)

StrutsPrepareAndExecuteFilter 可以包含一些初始化參數,如果沒有配置初始化參數,Struts2架構預設載入Struts-default.xml、struts-plugin.xml  和 struts.xml 

(2) Action 

Struts2架構中國年,控制器由兩個部分組成:核心控制器Filter 用於攔截使用者請求,對請求進行處理;業務控制器,調用相應的Model類實現業務處理,返回結果

struts.xml設定檔中,將一個請求的URI對應到一個Action類,當一個請求匹配某個Action的名稱時,架構就會使用這個Action類處理請求。

<package name="user" namespace="/user" extends="struts-default"> 7         <action name="login" class="cn.test.action.UserAction" method="login"> 8             <result>/login.jsp</result><!-- result不寫name屬性,預設就是success --> 9         </action>10         <action name="register" class="cn.test.action.UserAction" method="register">11             <result>/register.jsp</result>12         </action>13     </package>

配置講解:
Struts2架構會把action result等組織在一個名為package 的邏輯單元中,從而簡化維護工作,提高重用性,每一個包都包含了將要用到的action result等的定義。Struts2中的包可以“繼承”

已經定義好的包,從而繼承原有包的所有定義(包括action result 等的配置)並且可以添加自己包的位置。

struts.xml中使用 package元素定義包,其中:

name屬性為必須,並且唯一的,用來指定包的名稱(被其他包引用)

extends屬性指定要擴充的包,一般預設繼承  Struts-default 包(這個包由struts2架構愛定義,其中配置了大量常用的Struts2的特性。如果沒有這些特性,則簡單的在action中擷取請求資料都無法完成。)

namespace屬性可選,該屬性定義該包中action的命名空間,如果沒有設定該屬性,action被放入預設命名空間中,Struts2架構使用action的名稱和它所在的包的命名空間來標識一個action,預設的命名空間用" "來表示,也可以使用“ / ”來定義一個根命名空間,兩者有區別。當Struts2接收到一個請求時,架構會講URL分為namespace 和action  名稱兩部分,架構首先在namespace 命名空間中尋找這個action,若沒有找到,則再在預設命名空間中尋找。 

例如,請求URL為/mysapce/somespace/some.action ,架構首先會在/mysapce/somespace命名空間下尋找some.action ,如果沒有找到,架構會到預設的命名空間中去尋找

樣本:在上述項目的 struts.xml設定檔中增加 預設命名空間,action元素的name屬性仍然叫login,修改跳轉頁面為index.jsp 

1 <!-- 預設命名空間 -->2     <package name="" namespace="/" extends="struts-default">3         <action name="login" class="cn.test.action.UserAction" method="login">4             <result>/index.jsp</result>5         </action>6     </package>

添加index.jsp頁面

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9   <head>10     <base href="<%=basePath%>">11     <title>My JSP ‘register‘ starting page</title>12   </head>13   14   <body>15     This is my index  JSP page. <br>16   </body>17 </html>

然後重新部署並訪問http://localhost:8080/strutsstu0/login ,結果如下,也就是說,此時處理請求的是預設的根命名空間下的action,頁面跳轉到了index.jsp

  

(3)Result 

 Action類在處理完使用者請求後,會返回一個處理結果,這個結果是一個簡單字串,架構根據這個字串選擇對應的result,因此又將這個字串成為邏輯視圖名稱,這個邏輯視圖名稱由result元素的name屬性來表示,result元素的值(<result> </result> 中的內容)用來指定這個邏輯視圖對應的物理視圖資源的位置,需要注意的是,邏輯視圖名稱只有與物理視圖資源聯絡在以一起才能發揮作用,所以必須配置二者之間的對應關係。

result元素的配置由兩部分組成,一部分是Result所代表的實際資源的位置以及result名稱,另一部分是result的類型,由result元素的type屬性設定

result元素的name屬性不寫,則預設是“success”, type屬性不寫,則預設是"dispatcher",<result >/index.jsp</result> 等價於

<result name="success" type="dispatcher">/index.jsp</result>

總結:struts2應用的這個過程都是按照請求/響應的過程執行的,如所示:

 

整體就三個步驟:

(1)當web容器接收到請求之後,將請求交給web.xml中配置的struts2架構的核心控制器StrutsPrepareAndExecuteFilter 

 (2)由StrutsPrepareAndExecuteFilter 確定請求對應的Action(業務控制器)

(3)架構根據Action返回的結果字串,由核心控制器StrutsPrepareAndExecuteFilter 選擇對應的result ,將結果呈現給使用者

注意:

(a)Action作為業務控制器,只負責返回結果,而不與視圖相關聯,這樣做的優勢在於,當視圖發生變化時,無需修改Action類的代碼,僅需修改設定檔即可

(b)當 StrutsPrepareAndExecuteFilter 調用相應的視圖時,預設採用轉寄的形式(forword)跳轉到指定的JSP頁面

<result name="success" type="dispatcher">/index.jsp</result>

type值可以是:

(1)dispatcher:

預設的結果類型,Struts2內部使用功能Servlet API的RequestDispathcer來轉寄請求到指定的視圖資源,請求中國年包含的請求資料仍然存在

(2)redirect:

請求重新導向,就是伺服器告訴請求說,你自己去重新請求指定的視圖資源吧。redirect結果類型在內部使用的HttpServletResponse對象的sengRedirect()方法將請求重新導向到指定的URL,這意味著請求中包含的參數,屬性,action執行個體以及action封裝的屬性都將全部丟失

(3)redirectAction:

將重新導向到另外一個Action。是使用HttpServletResponse對象的sengRedirect()方法將請求重新導向到另外一個action.也就是說,當請求處理完成後,需要在另一個Action中繼續處理請求時,可以使用redirectAction重新導向到指定Action(由於是重新導向,請求參數也會丟失)

 7.struts設定檔載入路徑

以本機tomcat部署為例:可以看到部署路徑如下:

進入strutsstu0\WEB-INF\classes目錄下,可以看到struts.xml設定檔,Struts2允許將一個設定檔拆分成多個設定檔,但預設只載入 WEB-INF\classes目錄下的struts.xml檔案

被拆分的設定檔需要在struts.xml中引入,例如:  <include file ="struts-user.xml">

 

Struts2基礎-1- 簡單java類實現Action控制器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.