下面是文章是我在網上看到的,覺得寫的還不錯,我拿過來,修改了一些作者沒有說到的地方.......
1. 在apache中配置
2. 用URLRewrite(詳細:重點是UrlRewrite+Struts2)
1) 從http://tuckey.org/urlrewrite/ 下載最新的jar包下來,現時我用的是Url Rewrite3.2
2) 將urlrewrite.xml拷貝到WEB-INF目錄下
3) 在web.xml中配置其攔截器。注意,攔截器應放在strutsFilter的前面:
[一般順序是這樣子的來排版的,字符編碼過濾器, Hibernate Open Session In View 過濾器,UrlRewrite過濾器、struts過濾器。假如你有用到這些過濾器的話,就這樣子拍,否則有時候會出現一些莫名其妙的問題。。。。。。。。]
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>encodingFilter</filter-name> <filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST </dispatcher>
<dispatcher>FORWARD </dispatcher>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
<dispatcher>REQUEST </dispatcher>
<dispatcher>FORWARD </dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
其中,<dispatcher>REQUEST </dispatcher>和<dispatcher>FORWARD </dispatcher> 主要說明該攔截器攔截的請求包括客戶端的請求和從服務器端forward的請求。在很多的網文中,都提到struts2的<url-pattern>/*</url-pattern> 我試過,這樣是會報內存溢出異常的。上述的是2.16的版本的配置。
以下是urlrewrite.xml的配置
<rule>
<from>/test.dhtml</from>
<to type="forward">test.action</to>
</rule>
<rule>
<from>^/([a-zA-Z]+)/save/id/([a-zA-Z0-9]*).dhtml</from>
<to type="forward">$1!save.action?id=$2</to>
</rule>
<rule>
<from>^/([a-zA-z]+)/([a-zA-Z0-9]*).dhtml</from>
<to type="forward">%{context-path}/$1!$2.action</to>
</rule>
<rule>
<from>^/content/([a-zA-Z]+.*).html</from>
<to type="forward">/WEB-INF/content/login-error.jsp</to>
</rule>
之前如果在web.xml中設置<dispatcher>的話,則一直都不能forward都對應的action中去。以上 在地址欄中輸入 http://lacalhost:8080/應用名/test.dhtml 就可以映射到test.action中。如果要映射test!save.action可以寫成 test/save.dhtml就可以了。
看 test-access.jsp的代碼(這裏,我用了Convention的零配置,所以test-access.jsp在 WEB-INF/content目錄中)
<s:form action="test/save.dhtml" method="POST">
<s:textfield name="msg" label="輸入信息"/>
<s:token name="token"/>
<s:submit value="確定" />
</s:form>
這裏加入了 token令牌,主要是防止表單重複提交的。
那麼,我們可以將在@Result中的錯誤頁面也可以寫成html的形式了,因爲在上面配置了。
<rule>
<from>^/content/([a-zA-Z]+.*).html</from>
<to type="forward">/WEB-INF/content/$1.jsp</to>
</rule>
將所有的html轉換成.jsp來處理。
那麼,在@Result中 我們就可以這樣寫:
@Result(name="invalid.token",location="/content/error.html",type="redirect")})
在重複提交的情況下,URL會轉向到/WEB-INF/content/error.jsp中。
但是上述<s:form action="test/save.dhtml" method="POST">並不是一種好的方式。它在一定程度上依賴了UrlRewrite。我們希望,在<s:form/>中依然寫test!save.action 但是在頁面中顯示的是test/save.dhtml。那麼我們可以用<outBund-rule/>標籤。
此標籤的原理是,頁面通過UrlRewrite過濾器後,這個過濾器會遍歷這個頁面,用設定的正則來替換頁面中的URL。如:
<outbound-rule>
<from>/test!save.action</from>
<to type="redirect">/test/save.dhtml</to>
</outbound-rule>
注意:在uoutbound-rule的<from>標籤裏面如果出現“?”號,要把它轉義,轉義後是: “/?“,不然會出現404找不到錯誤。
這樣,在jsp中寫的<s:form action=”test!save.action”> 而通過編譯後在客戶端中的源碼就可以看到:<form id="test" name="test" action="/strutsTest/test/save.dhtml" method="POST">
到此,還是不能進行映射,我們還要進行對test/save.dhtml進行<role/>映射。
<rule>
<from>^/test/save.dhtml</from>
<to type="forward">test!save.action</to>
</rule>
總結:UrlRewrite這種方式雖好,但是他在每次匹配一個頁面的時候都會遍歷urlrewrite.xml中的所有<role/> 所以,在用的時候,應該注意,儘量將<role/>的個數做到越少。那就需要儘量寫出更通用的正則表達式。儘量讓代碼規範性。這也是高質量代碼的要求。
簡單的介紹一下常用的正規表示式:
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
常用的&要用 &來表示。$1,$2代表與你配置正規表達式>/(\w+)/(\w+)/相對應的參數。<to type="forward">默認的是 type="forward".
1. 轉向HTML頁面的url配置規則:
a) 沒有參數:loginAction是對應轉向的Action,login是Action裏面執行的方法,Action和方法名之間用下劃線連接,$1是Acton名字;$2是方法名。例如:http://localhost:8080/struts2/loginAction_login.html
<rule>
<from>^/([a-zA-Z]+?)_([a-zA-Z]+?)\.html$</from>
<to type="forward">/$1!$2.do</to>
</rule>
b) 一個參數:33是要傳遞的參數,同樣Action和方法名以及參數之間的連接都是使用下劃線,例如:http://localhost:8080/struts2/loginAction_login_33.html
<rule>
<from>
^/([a-zA-Z]+?)_([a-zA-Z]+?)_([0-9a-zA-Z]+?)\.html$
</from>
<to type="forward">/$1!$2.do?id=$3</to>
</rule>
c) 多個參數:33,ydf和2012-03-31都是參數,例如http://localhost:8080/struts/login_more_33_ydf_2012-03-31.html
<rule>
<from> ^/([a-zA-Z]+?)_([a-zA-Z]+?)_([0-9a-zA-Z]+?)_([0-9a-zA-Z]+?)_([0-9a-zA-Z]+?)\.html$
</from>
<to type="forward">
/$1!$2.do?id=$3&name=$4&date=$5
</to>
</rule>
注意:
1. 在uoutbound-rule的<from>標籤裏面如果出現“?”號,要把它轉義,轉義後是: “/?“,不然會出現404找不到錯誤。
2. 如果是多參數配置在url參數拼接時注意&符號的轉義:如<to type="forward">/$1!$2.do?id=$3&name=$4&date=$5</to>
附加:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- UrlRewriteFilter filter -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<!-- Struts2 filter -->
<!--
在做上傳文件的時候,要在web.xml中增加ActionContextCleanUp這個filter,如果不增加,會發生第一次上傳取不到文件的情況
-->
<filter>
<filter-name>struts2-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<!-- 如果使用Urlrewrite,要指定filter-mapping的dispatcher方式 -->
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts2-cleanup</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
</web-app>
urlrewrite.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
"http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
<urlrewrite>
<rule>
<note>
<!-- 這是一個通用請求url rewrite
將請求forword url加上".action"的處理器上。例:
請求 http://{domain}/user/login 將被forward到 http://{domain}/user/login.do
請求 http://{domain}/user/login/ 將被forward到 http://{domain}/user/login.do
請求 http://{domain}/user/logout/ 將被forward到 http://{domain}/user/logout.do
-->
<!--
<from>^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?.html$</from>
<to type="forward">/$1.do</to>
-->
</note>
<!-- 匹配URL:login_reg_33.html,執行login Action的reg方法,帶一個參數:33 -->
<from>^/([a-zA-Z]+?)_([a-zA-Z]+?)_([0-9a-zA-Z]+?)\.html$</from>
<to type="forward">/$1!$2.do?id=$3</to>
</rule>
<!-- 匹配URL:login_reg_33.html,執行login Action的reg方法,多個參數:33,ydf,2012-03-31 -->
<!-- 注意多個參數之間連接的&需要換爲&轉移 -->
<rule>
<from>^/([a-zA-Z]+?)_([a-zA-Z]+?)_([0-9a-zA-Z]+?)_([0-9a-zA-Z]+?)_([0-9a-zA-Z]+?)\.html$</from>
<to type="forward">/$1!$2.do?id=$3&name=$4&date=$5</to>
</rule>
<!-- 匹配URL:login_login.html,執行login Action的login方法 -->
<rule>
<from>^/([a-zA-Z]+?)_([a-zA-Z]+?)\.html$</from>
<to type="forward">/$1!$2.do</to>
</rule>
<!-- 匹配URL:user3/login/test/baidu/login_login.html,任意長度路徑 ,執行login Action的login方法 -->
<rule>
<from>^/[_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+/[^~]+?\/([^\/]+?)_([^\.]+?)\.html$</from>
<to type="forward">/$1!$2.do</to>
</rule>
</urlrewrite>