Struts2框架与servlet共存问题

    今天在做一个项目的时候遇到了一个很奇怪的问题,这个项目的一部分是之前用servlet写的,但是后边打算用struts写,再加入struts框架配置后发现原先的那部分不能正常访问了,之前没这么做过所以很纳闷,struts2配置自认为写的很熟了,应该没什么问题啊,struts.xml文件改了又改还是找不到错误,后来在看到web.xml时突然眼前一亮。。
Struts2框架与servlet共存问题
原来是所有的请求都被struts2拦截了,struts2把servlet当成action了,因为servlet和action都是没有后缀的。
 很是悲剧,要想使servlet和struts各司其职只能是限制struts的拦截范围了,

Struts2框架与servlet共存问题
这里在struts.xml的配置里边加一个这个就可以限制struts只拦截action类型的请求了,当然在发起请求时也是要写清楚http://XXX/XX.action了这个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>



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


   


Struts2框架与servlet共存问题

上一篇:教你的女友拍平淡也浪漫的风景方法教程


下一篇:python中的__dict__,__getattr__,__setattr__