【Struts2學習筆記】struts2.5使用萬用字元配置action跳轉
寫在前面:其實在一年前,還沒有開始寫部落格的時候就已經學過struts2了,只是當時太蠢,無法理解MVC以及struts2的一些“人性化”的設定,過了一年再反過來看struts2就很明白了。只是在struts2.5裡面多了一個機制導致無法像以往一樣簡單的使用萬用字元這種方式來對action進行對映或者說是跳轉吧。
我們先看2.5以前我的們配置檔案是怎麼寫的:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<!-- name是請求的引數 -->
<!-- class是請求反應的類 -->
<!-- method是處理的方法 -->
<action name="*_*"
class="com.baofeidyz.web.action.{1}Action"
method="{2}">
<result name="login">/WEB-INF/views/login.jsp</result>
<result name="ok">/WEB-INF/views/index.jsp</result>
<result name="fail">/WEB-INF/views/login.jsp</result>
</action>
</package>
</struts >
按照struts2給我們設定的邏輯,就是使用 *
號來表示萬用字元,那麼我們如果使用了*_*
則表示有兩個萬用字元了。那麼{1}
與 {2}
代表著兩個萬用字元對應的佔位符。
按照我給出的配置檔案,當我在瀏覽器一段訪問的URL為User_login.action
(注:我在web.xml檔案攔截的是.action*),那麼此時{1}
則對應了 User ,{2}
則對應了login
然而,我們發現在struts2.5中 這樣做是無法執行的,但是當我們手動把第二個*
號改成 login
,同時把 {2}
改成 login
以後呢,發現又是正常的了。
其實看到這裡,大家已經猜到了一些,其實就是struts2不允許你使用萬用字元來訪問非execute方法。其實這個在之前的struts2中已經有一個叫做DMI的action對映方法中有所體現了。DMI是使用 ! 來做區分,但是這種方法呢不安全,如果有心人找到了你的邏輯,然而反覆呼叫一些比較敏感的方法,對於你的程式而言就很危險。同理,如果這裡對於method放開要求,也容易出現這種情況。
所以我們需要在struts.xml檔案的action節點中新增一行程式碼
<allowed-methods>login</allowed-methods>
這裡如果有多個方法需要使用萬用字元的話,直接使用逗號隔開即可。
網上看到有人說使用 * 代替這裡的login,本人實測是不行的,必須要寫全所有的方法(除開execute),沒寫入的都無法執行。
最後貼出我的整個struts.xml檔案
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<!-- name是請求的引數 -->
<!-- class是請求反應的類 -->
<!-- method是處理的方法 -->
<action name="*_*"
class="com.baofeidyz.web.action.{1}Action"
method="{2}">
<result name="login">/WEB-INF/views/login.jsp</result>
<result name="ok">/WEB-INF/views/index.jsp</result>
<result name="fail">/WEB-INF/views/login.jsp</result>
<allowed-methods>login,loginDo</allowed-methods>
</action>
</package>
</struts>