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

问题

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

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

<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',
......

action和servlet共存(转)的更多相关文章

  1. Struts2 Action与Servlet API耦合

    单元测试在开发中是非常重要的一个环节程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的Struts2将Action与Servlet的API进行解耦之后,就使得单元测试变得非常 ...

  2. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  3. struts2的action访问servlet API的三种方法

    学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...

  4. Struts 2读书笔记-----Action访问Servlet API

    Action访问Servlet API Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试. 对于Web应用的控制器而言,不访问ServletAPI是几 ...

  5. Action访问Servlet API的三种方法

    一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器 ...

  6. html文件form表单action调用servlet连接mysql数据库实例

    web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...

  7. 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  8. Action访问Servlet的API

    Action访问Servlet的API_,主要访问如下: 1.>获取request对象 2.>获取请求参数 3.>获取response对象,可用于传递cookie 3.>获取作 ...

  9. Struts2 执行流程 以及 Action与Servlet比较 (个人理解)

    上图提供了struts2的执行流程.如下: 1:从客户端发出请求(HTTPServletRequest). 2:请求经过各种过滤器(filter),注:一般情况下,如SiteMesh等其他过滤器要放在 ...

随机推荐

  1. 翻翻git之---一个丰富的通知工具类 NotifyUtil

    转载请注明出处王亟亟的大牛之路 P1(废话板块.今天还加了个小广告) 昨天出去浪,到家把麦麦当当放出来玩一会就整到了12点多..早上睡过头了. .简直心酸. ... 近期手头上有一些职位能够操作,然后 ...

  2. 在linux oracle 10g/11g x64bit环境中,goldengate随os启动而自己主动启动的脚本

    在linux.oracle 10g/11g x64bit环境中,goldengate随os启动而自己主动启动的脚本 背景描写叙述: goldengate安装于/u01/ggs文件夹下 rhel5.5 ...

  3. intel电源管理技术中I2C和SVID

    1.I2C总线架构图: 2.Gemini Lake平台所支持的PMIC 是哪种类型? POR 是SVID PMIC, i2c PMIC 会影响性能. 3.SerialVID, 总共有三个信号线 时钟( ...

  4. HDU 3461 Code Lock(并查集的应用+高速幂)

    * 65536kb,仅仅能开到1.76*10^7大小的数组. 而题目的N取到了10^7.我開始做的时候没注意,用了按秩合并,uset+rank达到了2*10^7所以MLE,所以貌似不能用按秩合并. 事 ...

  5. scrapy递归抓取网页数据

    scrapy spider的parse方法能够返回两种值:BaseItem.或者Request.通过Request能够实现递归抓取. 假设要抓取的数据在当前页,能够直接解析返回item(代码中带**凝 ...

  6. 不安装Oracle客户端也能使用PL/SQL

    解压缩 instantclient_12_1 到 D:\Oracle\instantclient_12_1 在文件夹内建立目录, /NETWORK/ADMIN 在该目录下,新建文件tnsnames.o ...

  7. Nonblocking Memory Refresh&2018ISCA/Security& 非阻塞内存刷新

    Abstract 我们提议的非阻塞刷新工作是一次刷新内存块中的一部分数据,并在内存块中使用冗余数据,如RS码,在块中计算块的刷新/不可读数据以满足读取请求.作为概念的证明,我们将非阻塞刷新应用于服务器 ...

  8. 调试Scrapy过程中的心得体会

    1.大量抓取网页时出现“Memory Error”解决办法:设置一个队列,每当爬虫空闲时才向队列中放入请求,例如: from scrapy import signals, Spider from sc ...

  9. php 字符串内容是数组格式 转换成数组

    一个简单的应用.. 例, $str    =    "array( 'USD'=>'1', 'GBP'=>'0.6494', 'EUR'=>'0.7668' ,'JPY'= ...

  10. 07 redi sorder set结构及命令详解

    zadd key score1 value1 score2 value2 .. 添加元素 redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lil ...