`

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

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

解决(四种方式):

方式一:修改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的情况。



方式二:修改拦截页面配置,就是将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的请求。此种情况可能随着项目的扩大,而需要再次修改此配置文件。



方式三:修改struts.xml文件中的后缀映射

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



方式四:自定义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>之前,这样才能够保证它们能够按照正常的顺序处理,否则会出错。

而在需要引用servlet的地方,正常引用即可,如在JSP页面中调用:
    <%
    String path = request.getContextPath();
    %>
    ......
   
    $.ajax({  
    url:'<%=path%>/servlet/jqueryAjax',  
    ......
分享到:
评论

相关推荐

    struts2和servlet的共存问题

    ### Struts2与Servlet共存问题详解 #### 一、问题背景 在Java Web开发中,Struts2框架因其简洁的MVC模式和强大的插件系统而被广泛使用。但在某些场景下,开发者可能需要同时使用Struts2和其他Servlet技术(如...

    java上传与下载——struts2和servlet案例

    本案例聚焦于使用Struts2和Servlet两种不同的技术来实现这一功能。这两个技术都是Java Servlet的重要扩展,用于增强Web应用程序的功能和用户体验。 首先,让我们深入理解Struts2框架。Struts2是一个基于MVC(Model-...

    Struts2访问ServletAPI

    Struts2是一个强大的Java Web应用程序框架,它提供了一种组织和构建MVC(Model-View-Controller)架构的方式。在Struts2框架中,我们有时需要直接与Servlet API交互,例如处理HTTP请求、响应,或者使用Session、...

    Struts2中Servlet的配置

    3. **Struts2与Servlet共存的问题及解决**: 当一个项目同时使用了Struts2框架和直接的Servlet时,可能会遇到问题,因为Struts2有自己的请求处理流程,可能会覆盖或干扰到Servlet的正常工作。为了解决这个问题,...

    关于struts和servlet同时用

    此外,Struts还提供了丰富的插件和扩展,如Struts2-dojo-plugin支持Ajax,Struts2-convention-plugin简化Action配置等,使开发者可以根据需求进行选择。 总之,Struts和Servlet是Java Web开发中不可或缺的工具,...

    struts2和jspServlet上传

    Struts2和JSP Servlet上传是Web开发中的常见场景,主要涉及如何在用户提交表单时处理文件上传请求。这两个技术都是Java Web开发的重要组成部分,Struts2是一个基于MVC设计模式的开源框架,而Servlet是Java EE规范的...

    Struts2之Servlet API及单元测试初识案例struts005

    Struts2中的`ActionServlet`就是对Servlet API的一种扩展,它作为整个框架的调度中心,负责接收请求、调用Action并返回相应的结果。 在Struts2中,Servlet API主要体现在以下几点: 1. **过滤器(Filter)**:...

    Struts2之Servlet文件上传详解案例struts010

    综上所述,本案例“Struts2之Servlet文件上传详解”将引导你了解如何结合Struts2和Servlet实现文件上传功能,包括配置、Action编写、JSP页面设计以及注意事项。通过实践,你将更深入地理解Struts2框架在处理复杂Web...

    servlet和struts2笔记

    ### servlet和struts2笔记 #### 一、Servlet 基础 **Servlet** 是 Java Web 开发中的一种核心技术,它被设计用于处理客户端发送到服务器的 HTTP 请求,并且能够生成响应。Servlet 可以看作是服务器端的小程序,...

    tomcat、struts2、servlet Filter(过滤器) 工作原理

    在IT行业中,Tomcat、Struts2和Servlet Filter是Java Web开发中的重要组成部分。了解它们的工作原理对于构建高效、安全的Web应用程序至关重要。下面将详细阐述这三个组件的基本概念和工作流程。 首先,Tomcat是一个...

    学生信息管理系统,主要用struts2 和servlet实现.zip

    《基于Struts2和Servlet的学生信息管理系统开发详解》 在Java Web开发领域,构建一个高效、易维护的学生信息管理系统是一项常见的任务。本项目利用Struts2框架和Servlet技术,结合MySQL数据库,为教学环境提供了...

    Servlet和Struts2的交互(转载)

    Servlet和Struts2是两种在Java Web开发中广泛使用的框架,它们在构建动态Web应用程序时起着关键作用。Servlet是Java EE规范的一部分,提供了一种服务器端编程模型,用于处理HTTP请求并生成响应。而Struts2是一个基于...

    Struts2和servlet的中文乱码问题

    在Web开发中,尤其是使用Struts2和Servlet框架时,中文乱码问题是一个常见的困扰。本文将详细解析如何解决这两个框架中的中文乱码问题。 首先,我们来看Struts2的情况。在处理中文乱码时,主要涉及到两种HTTP请求...

    Servlet简单模拟Struts2

    为了达到类似Struts2的效果,我们可以创建一个Servlet过滤器(Filter),在`doFilter`方法内进行请求的初步处理和转发。过滤器可以注册到web.xml文件中,对特定URL路径或所有请求进行拦截。 2. **解析自定义XML数据...

    详解Struts2中Action访问Servlet API的几种方法

    详解Struts2中Action访问Servlet API的几种方法 在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象。如果想在Struts2程序中用到...

    Struts2中直接和间接访问ServletAPI以及动态方法调用之感叹号

    在Struts2框架中,直接和间接访问Servlet API以及动态方法调用是两个关键概念,它们对理解和优化应用性能至关重要。 首先,让我们深入理解直接访问Servlet API。在传统的MVC模式中,Servlet扮演着控制器的角色,...

    struts1和struts2的区别

    - **Struts2**: Struts2的Action不直接依赖于Servlet API。Action内部并不直接操作`HttpServletRequest`或`HttpServletResponse`。取而代之的是,通过配置将这些对象注入Action中,或者通过拦截器来处理。 #### ...

    struts2之Action访问Servlet API

    在本文中,我们将详细介绍 Struts2 访问 Servlet API 的几种方法。 一、使用 ActionContext 类 ActionContext 类是 Struts2 框架中一个重要的类,它提供了多种方法来访问 Servlet API。该类可以模拟获取 request、...

    Servlet和Struts2两种方法生成及校验验证吗

    Servlet和Struts2是两种广泛应用于Java Web开发的技术,它们都可以用来处理用户请求并提供相应的服务,包括生成和校验验证码。在这个项目中,我们将会探讨这两种方法如何实现验证码的生成与验证。 首先,让我们来看...

    Struts2 直接访问Servlet API(二十五)

    Struts2是一个非常流行的Java Web框架,它提供了一种组织和控制MVC应用程序的方式。在“Struts2直接访问Servlet API(二十五)”这个主题中,我们可能探讨的是如何在Struts2框架下直接利用Servlet API来实现某些特定...

Global site tag (gtag.js) - Google Analytics