项目要求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共存问题详解 #### 一、问题背景 在Java Web开发中,Struts2框架因其简洁的MVC模式和强大的插件系统而被广泛使用。但在某些场景下,开发者可能需要同时使用Struts2和其他Servlet技术(如...
本案例聚焦于使用Struts2和Servlet两种不同的技术来实现这一功能。这两个技术都是Java Servlet的重要扩展,用于增强Web应用程序的功能和用户体验。 首先,让我们深入理解Struts2框架。Struts2是一个基于MVC(Model-...
Struts2是一个强大的Java Web应用程序框架,它提供了一种组织和构建MVC(Model-View-Controller)架构的方式。在Struts2框架中,我们有时需要直接与Servlet API交互,例如处理HTTP请求、响应,或者使用Session、...
3. **Struts2与Servlet共存的问题及解决**: 当一个项目同时使用了Struts2框架和直接的Servlet时,可能会遇到问题,因为Struts2有自己的请求处理流程,可能会覆盖或干扰到Servlet的正常工作。为了解决这个问题,...
此外,Struts还提供了丰富的插件和扩展,如Struts2-dojo-plugin支持Ajax,Struts2-convention-plugin简化Action配置等,使开发者可以根据需求进行选择。 总之,Struts和Servlet是Java Web开发中不可或缺的工具,...
Struts2和JSP Servlet上传是Web开发中的常见场景,主要涉及如何在用户提交表单时处理文件上传请求。这两个技术都是Java Web开发的重要组成部分,Struts2是一个基于MVC设计模式的开源框架,而Servlet是Java EE规范的...
Struts2中的`ActionServlet`就是对Servlet API的一种扩展,它作为整个框架的调度中心,负责接收请求、调用Action并返回相应的结果。 在Struts2中,Servlet API主要体现在以下几点: 1. **过滤器(Filter)**:...
综上所述,本案例“Struts2之Servlet文件上传详解”将引导你了解如何结合Struts2和Servlet实现文件上传功能,包括配置、Action编写、JSP页面设计以及注意事项。通过实践,你将更深入地理解Struts2框架在处理复杂Web...
### servlet和struts2笔记 #### 一、Servlet 基础 **Servlet** 是 Java Web 开发中的一种核心技术,它被设计用于处理客户端发送到服务器的 HTTP 请求,并且能够生成响应。Servlet 可以看作是服务器端的小程序,...
在IT行业中,Tomcat、Struts2和Servlet Filter是Java Web开发中的重要组成部分。了解它们的工作原理对于构建高效、安全的Web应用程序至关重要。下面将详细阐述这三个组件的基本概念和工作流程。 首先,Tomcat是一个...
《基于Struts2和Servlet的学生信息管理系统开发详解》 在Java Web开发领域,构建一个高效、易维护的学生信息管理系统是一项常见的任务。本项目利用Struts2框架和Servlet技术,结合MySQL数据库,为教学环境提供了...
Servlet和Struts2是两种在Java Web开发中广泛使用的框架,它们在构建动态Web应用程序时起着关键作用。Servlet是Java EE规范的一部分,提供了一种服务器端编程模型,用于处理HTTP请求并生成响应。而Struts2是一个基于...
在Web开发中,尤其是使用Struts2和Servlet框架时,中文乱码问题是一个常见的困扰。本文将详细解析如何解决这两个框架中的中文乱码问题。 首先,我们来看Struts2的情况。在处理中文乱码时,主要涉及到两种HTTP请求...
为了达到类似Struts2的效果,我们可以创建一个Servlet过滤器(Filter),在`doFilter`方法内进行请求的初步处理和转发。过滤器可以注册到web.xml文件中,对特定URL路径或所有请求进行拦截。 2. **解析自定义XML数据...
详解Struts2中Action访问Servlet API的几种方法 在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象。如果想在Struts2程序中用到...
在Struts2框架中,直接和间接访问Servlet API以及动态方法调用是两个关键概念,它们对理解和优化应用性能至关重要。 首先,让我们深入理解直接访问Servlet API。在传统的MVC模式中,Servlet扮演着控制器的角色,...
- **Struts2**: Struts2的Action不直接依赖于Servlet API。Action内部并不直接操作`HttpServletRequest`或`HttpServletResponse`。取而代之的是,通过配置将这些对象注入Action中,或者通过拦截器来处理。 #### ...
在本文中,我们将详细介绍 Struts2 访问 Servlet API 的几种方法。 一、使用 ActionContext 类 ActionContext 类是 Struts2 框架中一个重要的类,它提供了多种方法来访问 Servlet API。该类可以模拟获取 request、...
通过本文的介绍,我们可以了解到Servlet和Struts的基本概念及其在构建Web应用程序中的作用。虽然直接使用Servlet和JSP可以快速实现简单的Web应用,但对于更复杂的应用程序,采用如Struts这样的框架可以带来更好的...
Servlet和Struts2是两种广泛应用于Java Web开发的技术,它们都可以用来处理用户请求并提供相应的服务,包括生成和校验验证码。在这个项目中,我们将会探讨这两种方法如何实现验证码的生成与验证。 首先,让我们来看...