struts2下面如何同时使用servlet,就是如何实现struts与servlet共存
问题
项目要求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-patte>/*</url-patte> </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-patte>/servlet/jqueryAjax.servlet</url-patte> </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-patte>*.action</url-patte></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-patte>*.do</url-patte></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-patte>*.jsp</url-patte></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-patte>/user/*</url-patte></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-patte>/*</url-patte></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-patte>/*</url-patte></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-patte>/*</url-patte></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-patte>/servlet/jqueryAjax</url-patte> </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-patte>/servlet/jsonView</url-patte> </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/
作者:那些年的事儿
来源链接:https://www.cnblogs.com/nayitian/archive/2013/03/04/2942537.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。