`
l555iu
  • 浏览: 2816 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
最近访客 更多访客>>
社区版块
存档分类
最新评论

servlet forward action问题以及struts2拦截servlet问题

阅读更多

其实这个问题自己以前就遇到过了但当时没有深入解决就下了定论:Servlet是不能转发到Action的。今天看到他人也有这个问题,所以特意的深入了一下也看了他人的资料。

           这个问题的原因是filter默认拦截的是request,而forwardfilter是不会拦截的,所以想要想struts2拦截forward就需要配置:

<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>
        <dispatcher>request</dispatcher>
        <dispatcher>forward</dispatcher>
    </filter-mapping>

 

另一个问题就是struts2的核心filter配置的是"/*"所以他会拦截所有的请求,如果你配有servlet,你的请求是会先被filter拦截的也就是会进入struts2的流程而不是servlet的,但有时你又真的需要使用的servlet(就像你要整合DWR),为了解决这种情况也有两种解决方案:

              1,在struts2 core包org.apache.struts2下的default.properties:修改这个键值对struts.action.extension=action,当然我们不希望直接在这个文件里改,可以通过在struts.xml中增加常量的方式来配置

                2,在web.xml里添加一个拦截器,过滤我们的Servlet。web.xml文件内容:

<!-- 自定义过滤器,过滤servlet请求。解决struts和servlet冲突问题 -->   
    <filter>   
      <filter-name>ServletFilter</filter-name>   
      <filter-class>org.bts.base.filter.ServletFilters</filter-class>   
      <init-param>   
        <param-name>includeServlets</param-name>   
        <param-value>proxool_admin</param-value>   
      </init-param>   
    </filter>   
    <filter-mapping>   
      <filter-name>ServletFilter</filter-name>   
      <url-pattern>/*</url-pattern>   
    </filter-mapping>   
        
    <!-- 定义Struts2的FilterDispathcer的Filter -->   
 <filter>   
        <filter-name>struts2</filter-name>   
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>   
 </filter>   
 <!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求 -->   
 <filter-mapping>   
  <filter-name>struts2</filter-name>   
  <url-pattern>/*</url-pattern>   
 </filter-mapping>   
   
  <!-- 用于初始化Spring容器的Listener -->   
 <context-param>   
  <param-name>contextConfigLocation</param-name>   
   <param-value>WEB-INF/classes/applicationContext.xml</param-value>   
 </context-param>   
 <listener>   
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
 </listener>   
   
    <!-- 配置proxool管理工具 -->   
 <servlet>   
   <servlet-name>proxool_admin</servlet-name>   
   <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet </servlet-class>   
 </servlet>   
 <servlet-mapping>   
   <servlet-name>proxool_admin</servlet-name>   
   <url-pattern>/proxool_admin</url-pattern>   
 </servlet-mapping>   
 <security-constraint>   
   <web-resource-collection>   
     <web-resource-name>proxool</web-resource-name>   
     <url-pattern>/proxool_admin</url-pattern>   
   </web-resource-collection>   
   <auth-constraint>   
     <role-name>manager</role-name>   
   </auth-constraint>   
 </security-constraint>   
 <login-config>   
   <auth-method>BASIC</auth-method>   
   <realm-name> proxool manager Application</realm-name>   
 </login-config>   
 <security-role>   
   <description>   
     The role that is required to log in to the Manager Application    
   </description>   
   <role-name>manager</role-name>   
 </security-role>   
 <error-page>   
   <error-code>401</error-code>   
   <location>/jsp/error/401.jsp</location>   
 </error-page>   

 过滤器的实现

package org.bts.base.filter;    
   
import java.io.IOException;    
import java.util.ArrayList;    
import java.util.Arrays;    
import java.util.List;    
   
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;    
   
public class ServletFilters implements Filter {    
   
    private List<String> initParameters = new ArrayList<String>();    
    @Override   
    public void destroy() {    
       System.out.println("ServletFilters destroied!");    
    }    
   
    @Override   
    public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {    
            
        HttpServletRequest request = (HttpServletRequest) req;    
        String target = request.getRequestURI();    
        System.out.println("1: "+target);    
        target = target.lastIndexOf("?") > 0 ? target.substring(target    
                .lastIndexOf("/") + 1, target.lastIndexOf("?")    
                - target.lastIndexOf("/")) : target.substring(target    
                .lastIndexOf("/") + 1);    
          System.out.println("2:"+target);    
        if (this.initParameters.contains(target)) {    
            RequestDispatcher rdsp = request.getRequestDispatcher(target);    
            rdsp.forward(req, resp);//转发我们的请求,跳出FilterChain    
        } else   
            chain.doFilter(req, resp);    
   
    }    
   
    @Override   
    public void init(FilterConfig config) throws ServletException {    
        String parameters = config.getInitParameter("includeServlets");    
        System.out.println("************"+config.getFilterName()+" initing with value "+parameters+"********************");    
        this.initParameters.addAll(Arrays.asList(parameters.split(",")));    
    }    
   
}    

 

我个人比较倾向于第一种方法,第二种方案我没有自己测试,来源与他人的文章,使用第一种就是每次要用到action时要在请求url后面加“.action”,当然你如果使用的是struts2的标签那么他会自动加的,而且我认为有.action用来区分其他处理请求和struts的处理请求是需要的。

分享到:
评论
1 楼 withsoftware 2012-09-29  
楼主你好。
            1,在struts2 core包org.apache.struts2下的default.properties:修改这个键值对struts.action.extension=action 这里修改不了啊、不可编辑的啊

相关推荐

    Struts2中Servlet的配置

    当一个项目同时使用了Struts2框架和直接的Servlet时,可能会遇到问题,因为Struts2有自己的请求处理流程,可能会覆盖或干扰到Servlet的正常工作。为了解决这个问题,可以创建一个过滤器,例如`ReDispatcherFilter`...

    servlet模拟struts1工作原理

    Struts1框架的核心组件包括ActionServlet、ActionForm、Action、Tiles以及配置文件(struts-config.xml)。ActionServlet作为控制器,负责拦截所有的HTTP请求,解析请求中的信息,并根据struts-config.xml配置文件来...

    Struts2中实现页面的跳转

    当一个请求到达服务器时,Struts2的前端控制器(通常是一个Servlet,如`StrutsPrepareAndExecuteFilter`)拦截请求,并根据配置文件(struts.xml)来决定哪个Action应该处理这个请求。Action执行完毕后,可以通过...

    ActionServlet深入探讨

    8. **forward**:应用中使用的ActionForward类,默认为`org.apache.struts.action.ActionForward`。 9. **locale**:定义默认使用的Locale对象,当从session中获取不到Locale时,ActionServlet会自动创建并保存一个...

    Struts1与Struts2原理 区别详解汇总

    2. **Action对象**:Struts1中的Action直接与Servlet API耦合,而Struts2中的Action通过拦截器与业务逻辑分离。 3. **配置方式**:Struts1使用`struts-config.xml`文件进行配置,而Struts2主要通过`struts.xml`...

    struts1.x 和 struts2.x向Action里填充jsp参数原理

    本篇文章将深入探讨Struts1.x和Struts2.x在向Action中填充JSP参数的原理。 Struts1.x的工作原理: Struts1的核心是ActionServlet,它是一个实现了Servlet接口的控制器。当用户发起HTTP请求时,请求会被Dispatcher...

    在struts1中使用拦截器——saif-0.1.jar

    2. **创建拦截器**:在saif-0.1.jar中,开发者可能已经定义了一些继承自`org.apache.struts.interceptor.Interceptor`接口的类。这些类实现了拦截器的逻辑,如`doIntercept()`方法。 3. **配置拦截器**:在struts-...

    Struts1框架执行原理(附Action、ActionServlet、ActionForm工作机制)

    本篇文章将深入解析Struts1框架的执行原理,以及Action、ActionServlet、ActionForm三个关键组件的工作机制。 首先,我们来看Struts1的工作流程: 1. 用户通过浏览器发起HTTP请求,请求的目标是应用中的一个JSP或...

    Struts-Action核心代码

    开发者需要掌握ActionServlet的工作原理,以及如何编写Action类、配置`struts-config.xml`、设计Form Bean,以及如何利用Struts的标签库来创建动态的用户界面。通过深入学习和实践,可以更好地利用Struts实现高效的...

    Struts1_Struts2

    - **拦截器(Interceptors)**:Struts2引入了拦截器机制,允许在Action执行前后插入自定义的处理逻辑,如日志、权限验证等。 - **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认的表达式...

    用servlet模拟struts_mvc框架

    在实际项目中,Struts框架提供了更高级的功能,如ActionForm对象收集表单数据,Action类处理业务逻辑,Tiles组件管理视图布局,以及一系列的拦截器来增强功能和性能。但通过Servlet模拟Struts_MVC,我们可以了解其...

    Struts2 简介

    拦截器是Struts2的核心部分,它们允许开发者在Action执行前或执行后插入自定义逻辑,增加了代码的可复用性和可维护性。OGNL是一种强大的表达式语言,用于在模型和视图之间传递数据,它简化了对象的访问和属性设置。 ...

    struts2参数配置

    - **ActionForward**:Struts2中用于控制页面跳转的对象。 - 默认使用`org.apache.struts.action.ActionForward`作为ActionForward实现。 - ActionForward用于定义请求处理完成后页面的跳转逻辑。 ##### 2. **...

    servlet上传 struts下载例子

    5. **Struts配置**:在Struts 1.2中,你需要在struts-config.xml文件中定义Action,配置Action的forward,指向处理下载的Servlet或JSP。同时,可能还需要配置拦截器(interceptors)来处理表单验证和其他业务逻辑。 ...

    struts1原理,struts2原理,spring mvc原理,struts1和struts2,struts和spring mvc

    当用户发起请求时,请求会被Struts1的Front Controller(即ActionServlet)拦截,然后根据配置文件(struts-config.xml)中的映射信息,转发到相应的Action类。Action类处理业务逻辑后,返回一个ActionForward对象,...

    struts1和struts2源代码详解

    1. **请求处理**:Struts1通过ActionServlet,而Struts2使用拦截器链。 2. **配置方式**:Struts1依赖XML,Struts2支持XML和注解,甚至可以完全不写XML。 3. **数据绑定**:Struts1使用ActionForm,Struts2使用...

    struts1&struts2

    本篇文章将详细探讨Struts1和Struts2框架的核心概念、架构以及它们之间的区别。 **Struts1框架** Struts1是在2000年代初期推出的,它的核心设计理念是通过分离业务逻辑、数据模型和用户界面,实现可维护性、可扩展...

Global site tag (gtag.js) - Google Analytics