博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
action和servlet共存(转)
阅读量:6122 次
发布时间:2019-06-21

本文共 5563 字,大约阅读时间需要 18 分钟。

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

 

问题

项目要求struts2和servlet能够共存,就是struts的请求发给struts处理,servlet的请求发给servlet处理。目前web.xml文件应该是类似于如下的配置: 

实验了修改constant变量让action只针对拦截的指定后缀进行处理,使得servlet可以正常使用,亲测有效。其他需要时候试试。

struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*

在请求应用时,struts2将会截获所有请求,对于servlet请求将不能够正常响应;原因是struts2把servlet当成action了,因为servlet和action都是没有后缀的。

解决(四种方式)

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

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

jqueryAjaxServlet
com.clzhang.sample.struts2.servlet.jQueryAjaxServlet
jqueryAjaxServlet
/servlet/jqueryAjax.servlet

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

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

这样就可以正常处理servlet的请求了。此种情况适合于小范围使用servlet的情况。

2. 修改拦截页面配置,就是将struts的相关拦截配置一下

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

struts2
*.action
struts2
*.do
struts2
*.jsp
struts2
/user/*

这样也同样可以正常处理servlet的请求。此种情况可能随着项目的扩大,而需要再次修改此配置文件。

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

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中配置:    
redisp
com.clzhang.sample.struts2.FilterServlet
redisp
/*
并且此过滤器必须在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
includes = new ArrayList
(); public void init(FilterConfig config) throws ServletException { // 如果使用第二种方式过滤,则需要以下代码// this.includes.addAll(Arrays.asList(config.getInitParameter(// "includeServlets").split(","))); }}

2).修改web.xml,类似如下格式:

redisp
com.clzhang.sample.struts2.FilterServlet
redisp
/*
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
jqueryAjaxServlet
com.clzhang.sample.struts2.servlet.jQueryAjaxServlet
jqueryAjaxServlet
/servlet/jqueryAjax
jsonViewServlet
com.clzhang.sample.struts2.servlet.JsonViewServlet
jsonViewServlet
/servlet/jsonView
index.jsp
index.html

注意,<filter-name>redisp</filter-name>必须放置于<filter-name>struts2</filter-name>之前,这样才能够保证它们能够按照正常的顺序处理,否则会出错。

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

<%    String path = request.getContextPath();    %>    ......        $.ajax({       url:'<%=path%>/servlet/jqueryAjax',       ......
你可能感兴趣的文章
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
【FJOI2015】金币换位问题
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>
面试总结
查看>>
Chrome浏览器播放HTML5音频没声音的解决方案
查看>>
easyui datagrid 行编辑功能
查看>>
类,对象与实例变量
查看>>
HDU 2818 (矢量并查集)
查看>>
【转】php字符串加密解密
查看>>
22. linux 常用命令
查看>>