其实这个问题自己以前就遇到过了但当时没有深入解决就下了定论: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的处理请求是需要的。
分享到:
相关推荐
当一个项目同时使用了Struts2框架和直接的Servlet时,可能会遇到问题,因为Struts2有自己的请求处理流程,可能会覆盖或干扰到Servlet的正常工作。为了解决这个问题,可以创建一个过滤器,例如`ReDispatcherFilter`...
Struts1框架的核心组件包括ActionServlet、ActionForm、Action、Tiles以及配置文件(struts-config.xml)。ActionServlet作为控制器,负责拦截所有的HTTP请求,解析请求中的信息,并根据struts-config.xml配置文件来...
当一个请求到达服务器时,Struts2的前端控制器(通常是一个Servlet,如`StrutsPrepareAndExecuteFilter`)拦截请求,并根据配置文件(struts.xml)来决定哪个Action应该处理这个请求。Action执行完毕后,可以通过...
8. **forward**:应用中使用的ActionForward类,默认为`org.apache.struts.action.ActionForward`。 9. **locale**:定义默认使用的Locale对象,当从session中获取不到Locale时,ActionServlet会自动创建并保存一个...
2. **Action对象**:Struts1中的Action直接与Servlet API耦合,而Struts2中的Action通过拦截器与业务逻辑分离。 3. **配置方式**:Struts1使用`struts-config.xml`文件进行配置,而Struts2主要通过`struts.xml`...
本篇文章将深入探讨Struts1.x和Struts2.x在向Action中填充JSP参数的原理。 Struts1.x的工作原理: Struts1的核心是ActionServlet,它是一个实现了Servlet接口的控制器。当用户发起HTTP请求时,请求会被Dispatcher...
2. **创建拦截器**:在saif-0.1.jar中,开发者可能已经定义了一些继承自`org.apache.struts.interceptor.Interceptor`接口的类。这些类实现了拦截器的逻辑,如`doIntercept()`方法。 3. **配置拦截器**:在struts-...
本篇文章将深入解析Struts1框架的执行原理,以及Action、ActionServlet、ActionForm三个关键组件的工作机制。 首先,我们来看Struts1的工作流程: 1. 用户通过浏览器发起HTTP请求,请求的目标是应用中的一个JSP或...
开发者需要掌握ActionServlet的工作原理,以及如何编写Action类、配置`struts-config.xml`、设计Form Bean,以及如何利用Struts的标签库来创建动态的用户界面。通过深入学习和实践,可以更好地利用Struts实现高效的...
- **拦截器(Interceptors)**:Struts2引入了拦截器机制,允许在Action执行前后插入自定义的处理逻辑,如日志、权限验证等。 - **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认的表达式...
在实际项目中,Struts框架提供了更高级的功能,如ActionForm对象收集表单数据,Action类处理业务逻辑,Tiles组件管理视图布局,以及一系列的拦截器来增强功能和性能。但通过Servlet模拟Struts_MVC,我们可以了解其...
拦截器是Struts2的核心部分,它们允许开发者在Action执行前或执行后插入自定义逻辑,增加了代码的可复用性和可维护性。OGNL是一种强大的表达式语言,用于在模型和视图之间传递数据,它简化了对象的访问和属性设置。 ...
- **ActionForward**:Struts2中用于控制页面跳转的对象。 - 默认使用`org.apache.struts.action.ActionForward`作为ActionForward实现。 - ActionForward用于定义请求处理完成后页面的跳转逻辑。 ##### 2. **...
5. **Struts配置**:在Struts 1.2中,你需要在struts-config.xml文件中定义Action,配置Action的forward,指向处理下载的Servlet或JSP。同时,可能还需要配置拦截器(interceptors)来处理表单验证和其他业务逻辑。 ...
当用户发起请求时,请求会被Struts1的Front Controller(即ActionServlet)拦截,然后根据配置文件(struts-config.xml)中的映射信息,转发到相应的Action类。Action类处理业务逻辑后,返回一个ActionForward对象,...
1. **请求处理**:Struts1通过ActionServlet,而Struts2使用拦截器链。 2. **配置方式**:Struts1依赖XML,Struts2支持XML和注解,甚至可以完全不写XML。 3. **数据绑定**:Struts1使用ActionForm,Struts2使用...
本篇文章将详细探讨Struts1和Struts2框架的核心概念、架构以及它们之间的区别。 **Struts1框架** Struts1是在2000年代初期推出的,它的核心设计理念是通过分离业务逻辑、数据模型和用户界面,实现可维护性、可扩展...