日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

struts2下面如何同时使用servlet,就是如何实现struts与servlet共存

發布時間:2024/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 struts2下面如何同时使用servlet,就是如何实现struts与servlet共存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.cnblogs.com/nayitian/archive/2013/03/04/2942537.html

問題

項目要求struts2和servlet能夠共存,就是struts的請求發給struts處理,servlet的請求發給servlet處理。目前web.xml文件應該是類似于如下的配置:?

<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>/*</url-pattern></filter-mapping>

在請求應用時,struts2將會截獲所有請求,對于servlet請求將不能夠正常響應;原因是struts2把servlet當成action了,因為servlet和action都是沒有后綴的。

解決(四種方式)

1. 修改servlet的相關配置,統一在servlet后面加上“.servlet”

1). 修改web.xml配置文件形如:

<servlet> <servlet-name>jqueryAjaxServlet</servlet-name> <servlet-class>com.clzhang.sample.struts2.servlet.jQueryAjaxServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>jqueryAjaxServlet</servlet-name> <url-pattern>/servlet/jqueryAjax.servlet</url-pattern> </servlet-mapping>

2).修改調用servlet的地方,形如:

<%String path = request.getContextPath();%>......$.ajax({ url:'<%=path%>/servlet/jqueryAjax.servlet', ......

這樣就可以正常處理servlet的請求了。此種情況適合于小范圍使用servlet的情況。

2. 修改攔截頁面配置,就是將struts的相關攔截配置一下

修改web.xml文件如下內容:

<filter-mapping><filter-name>struts2</filter-name><url-pattern>*.action</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.do</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/user/*</url-pattern></filter-mapping>

這樣也同樣可以正常處理servlet的請求。此種情況可能隨著項目的擴大,而需要再次修改此配置文件。

3. 修改struts.xml文件中的后綴映射

<constant name="struts.action.extension" value="action"></constant>

4. 自定義Filter實現過濾

1).創建實現類,代碼參考如下:

package com.clzhang.sample.struts2;import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest;/*** 這是一個過濾servlet的filter;就是攔截servlet的處理請求,自行轉向處理,而不是由struts處理。* 有二種過濾方式,一種是判斷uri中是否包含“/servlet/”;* 另一種是所有servlet在初始化參數中指定。* 需要在web.xml中配置:<filter><filter-name>redisp</filter-name><filter-class>com.clzhang.sample.struts2.FilterServlet</filter-class><!--如果使用第二種方式過濾,則需要下面的代碼<init-param><param-name>includeServlets</param-name><param-value>jqueryAjax,jsonView</param-value></init-param>--></filter><filter-mapping><filter-name>redisp</filter-name><url-pattern>/*</url-pattern></filter-mapping>并且此過濾器必須在struts2的過濾器上面。* @author Administrator**/ public class FilterServlet implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;// 第一種方式(二選 一)String target = request.getRequestURI();target = target.lastIndexOf("?") > 0 ? target.substring(target.lastIndexOf("/") + 1,target.lastIndexOf("?") - target.lastIndexOf("/")) : target.substring(target.lastIndexOf("/") + 1);if (request.getRequestURI().indexOf("/servlet/") > 0) {// request.getRequestURI()格式應該形如:/st/servlet/jqueryAjax,// 其中st是項目名,servlet是所有servlet都增加的前綴,用于能夠判斷出是servlet。// if只判斷請求uri是否包含/servlet/,如果包含則處理;RequestDispatcher rdsp = request.getRequestDispatcher(target);rdsp.forward(req, resp);} else {chain.doFilter(req, resp);}// 第二種方式 (二選 一)/**if (this.includes.contains(target)) {// target取出的值則直接是jqueryAjax,在web.xml中配置即可。// if判斷請求uri最后的那部分是否包含在配置文件中,如果包含,則處理RequestDispatcher rdsp = request.getRequestDispatcher(target);rdsp.forward(req, resp);} else {chain.doFilter(req, resp);}*/}private ArrayList<String> includes = new ArrayList<String>();public void init(FilterConfig config) throws ServletException {// 如果使用第二種方式過濾,則需要以下代碼 // this.includes.addAll(Arrays.asList(config.getInitParameter( // "includeServlets").split(",")));} }

2).修改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"><filter><filter-name>redisp</filter-name><filter-class>com.clzhang.sample.struts2.FilterServlet</filter-class><!--如何使用第二種方式過濾,則需要下面的代碼<init-param><param-name>includeServlets</param-name><param-value>jqueryAjax,jsonView</param-value></init-param>--></filter><filter-mapping><filter-name>redisp</filter-name><url-pattern>/*</url-pattern></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>/*</url-pattern></filter-mapping><servlet> <servlet-name>jqueryAjaxServlet</servlet-name> <servlet-class>com.clzhang.sample.struts2.servlet.jQueryAjaxServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>jqueryAjaxServlet</servlet-name> <url-pattern>/servlet/jqueryAjax</url-pattern> </servlet-mapping><servlet> <servlet-name>jsonViewServlet</servlet-name> <servlet-class>com.clzhang.sample.struts2.servlet.JsonViewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>jsonViewServlet</servlet-name> <url-pattern>/servlet/jsonView</url-pattern> </servlet-mapping> <welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>index.html</welcome-file></welcome-file-list> </web-app>

注意,<filter-name>redisp</filter-name>必須放置于<filter-name>struts2</filter-name>之前,這樣才能夠保證它們能夠按照正常的順序處理,否則會出錯。

3). 而在需要引用servlet的地方,正常引用即可,如在JSP頁面中調用:

<%String path = request.getContextPath();%>......$.ajax({ url:'<%=path%>/servlet/jqueryAjax', ......

?

本文參考:

http://www.blogjava.net/xcp/archive/2012/08/05/384824.html

http://zhyx5017192.blog.163.com/blog/static/309251282012111985237499/


總結

以上是生活随笔為你收集整理的struts2下面如何同时使用servlet,就是如何实现struts与servlet共存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。