項目中servlet和struts2共存的解決方案

j2ee中的最基本技術就是jsp和servlet,其中jsp本質上還是servlet,只不過servlet出現得更早,而且

servlet不僅僅是一種技術,而且是一種規範,目前Tomcat7.0支持最新版本的規範Servlet3.0,這個在web.xml中的前兩行就可以看到,說到struts2,其實在我看來本質都是一樣的,都是作爲MVC設計模式中Controller控制器層,只不過strut2要比servlet強大得多,首先strut2中的acion已經去掉request,session等底層API,而是直接操作屬性進行控制,跳轉的時候也是無需調用request.getRequestDispatcher("/index.jsp").forward(request,respone)類似這樣的代碼,直接return "物理資源視圖",而且struts2支持多種返回類型還有衆多插件等等功能.總之項目中應該很少用到像servlet這種偏底層的屌絲來處理業務邏輯請求,但是如果項目真的需要servlet這種底層技術來做一些處理的話,那麼需要和strut2共存

這時候引發一個問題,像我們以前那樣的web.xml中如下配置:

<!-- 配置Struts2的Filter -->

<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>

<servlet>

 <servlet-name>Authcode</servlet-name>

 <servlet-class>com.cippus.util.Identity</servlet-class>

</servlet>

<servlet-mapping>

 <servlet-name>Authcode</servlet-name>

 <url-pattern>/authcode</url-pattern>

</servlet-mapping>

其實這樣的話如果在瀏覽器中直接訪問http:localhost:8080/authcode那麼會報錯,錯誤

原因就在於strut2的filter是攔截所有請求,然後對於authcode這種url它會默認當做action

處理,相當於請求autchcode.action,這樣如果struts2.xml中沒有配置名爲authcode的action

那麼就會報錯,其實解決方法很簡單,

第一種就是寫一個action名爲authcode,然後execute

方法裏什麼都不做直接return "success",然後action裏面配置result

<result name="success">/authcode</result>

這樣的話業務邏輯請求先經過strut2的filter處理然後在return /authcode這樣就提交到了servlet

的處理範圍,就可以正確處理了,但是這樣方案的缺點是就是每有一個servlet就有一個冗餘的action

需要跳轉到相應的servlet中.代碼冗餘過多而且strut2和servlet名字相同容易混淆

第二種就是利用servlet的特性,隱藏後臺具體實現技術,這一點確實比struts2還有強,雖然現在有很多

url重寫的包,struts2默認只會攔截以.action結尾的請求(如果沒有會加上),但是servlet可以配置成任

意後綴和任意形式,只要和別的框架和資源不衝突就好

例如上面的示例servlet可以這樣配置:

<servlet-mapping>

 <servlet-name>Authcode</servlet-name>

 <url-pattern>/authcode.php</url-pattern>

<url-pattern>/authcode.aspx</url-pattern>

<url-pattern>/authcode.jsp</url-pattern>

</servlet-mapping>

這樣配置那三種url都可以映射到servlet處理類中去處理,這樣就隱藏後臺技術實現,當然url不能和

真實的jsp和php等文件重名,所以基於以上思想我們可以這樣改:

<servlet-name>Authcode</servlet-name>

 <url-pattern>/authcode.do</url-pattern>

熟悉strut框架的朋友會知道,strut1的默認請求路徑結尾就是.do,當然我的工程中沒有采用

struts1所以就可以這樣映射,如果有的話請換另外一個不衝突的後綴.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章