如何让struts2和servlet的共存

一、问题的提出
  
先让我们看下web.xml中struts2和servlet的配置:

 
<!-- struts2
拦截页面请求的配置
-->

  
<filter>
   
   
<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>
   
<filter-mapping>
   
   
<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

   
<!-- servlet
的配置
-->
   
<servlet>
   
   
<servlet-name>ImageServlet</servlet-name>

<servlet-class>com.servlets.ImageServlet

</servlet-class>
   
</servlet>
   
<servlet-mapping>
   
   
<servlet-name>ImageServlet</servlet-name>

<url-pattern>/myImageServlet/*</url-pattern>

</servlet-mapping>
 
当我们在页面在请求应用时,
struts2将会截获所有请求,对于servlet请求将不能够正常响应的
(报错信息为:HTTP Status 404 - There is no Action
mapped for namespace / and action name
myImageServlet.
,
这是因为struts2servlet当成action了,因为servletaction都是没有后缀的.

二、解决方案
  
解决方法目前有四种:
方法1
  
统一在
servlet后面加上.servlet结尾(包括web.xml配置文件中和页面上使用servlet的地方)

方法2(比较通用奥):

在struts.xml中的<struts>的节点下面添加struts2处理的请求后缀

常量:
<!--  

该属性指定需要
Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。 


如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
 
 --> 
<constant name="struts.action.extension"
value="action" />

方法3

在web.xml中修改struts2拦截页面请求的配置:
原:
  
<filter>
   
   
<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>
   
<filter-mapping>
   
   
<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

现:

<filter-mapping>
     
<filter-name>struts2</filter-name>

<url-pattern>*.action</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的请求路径不必改变

方法4

自定义filter对servlet进行过滤:
##############################################
#
该类是定义了一个过滤器(随便你放在摸个包下面),当既用到struts2有用到servlet时,
#
必须用该过滤器对所有的servlet做一次过滤,否则servlet将无法正常运行。
#
同时web.xml中,在定义struts的核心控制器的过滤器前面添加该过滤器,添加代码如下:
* <filter>
*  
<filter-name>redisp</filter-name>

*  
<filter-class>filters.ReDispatcherFilter(该过滤器的类名)</filter-class>
*  
<init-param>
*   
<param-name>includeServlets</param-name>

*   
<param-value>所配置的servlet,注意是那url-pattern</param-value>

*  
</init-param>
* </filter>
* <filter-mapping>
*  
<filter-name>redisp</filter-name>

*  
<url-pattern>/*</url-pattern>

*
</filter-mapping>
*该类也可以直接继承StrutsPrepareAndExecuteFilter
###########################################################
public class ReDispatcherFilter implements Filter {

public void destroy() {
   // TODO Auto-generated method
stub
}

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);
  
System.out.println(target);
  
if(this.includes.contains(target))
   {
   
RequestDispatcher rdsp =
request.getRequestDispatcher(target);

System.out.println("go..............."+rdsp);
   
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(",")));

}

}
怕大家还是配置错误,给一个web.xml的配置实例。

<filter>
       
<filter-name>redisp</filter-name>

<filter-class>
com.xheditor.servlet.ReDispatcherFilter</filter-class>

<init-param>
           
<param-name>includeServlets</param-name>

<param-value>UploadFileServlet</param-value>

</init-param>
    
</filter>
   
<filter-mapping>
       
<filter-name>redisp</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<!--
struts2
拦截页面请求的配置
-->
  
<filter>
   
   
<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>
   
<filter-mapping>
   
   
<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>
   
<!-- servlet的配置
-->
   
<servlet>
   
   
<servlet-name>ImageServlet</servlet-name>

<servlet-class>com.servlets.ImageServlet

</servlet-class>
   
</servlet>
   
<servlet-mapping>
   
   
<servlet-name>ImageServlet</servlet-name>

<url-pattern>/myImageServlet/*</url-pattern>

</servlet-mapping>

时间: 2024-11-08 03:40:27

如何让struts2和servlet的共存的相关文章

让struts2和servlet共存

因为struts2默认的是拦截所有的请求 由配置文件可以看出 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-n

struts2访问servlet的API

1.struts作为控制器,正常很多时候要访问到servlet的API,常用功能: (1).获取请求参数,控制界面跳转 (2).把共享数据存储于request,session,servletContext中,获取作用域中的数据 宏观的来说,应该有三种访问方式. 2.第一种:实现接口,访问Action时完成注入 ServletContextAware void setServletContext(javax.servlet.ServletContext context) ServletReques

struts2将servlet对象注入到Action中

在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口: a. ServletRequestAware: 实现该接口的Action可以直接访问Request对象,该接口中提供void setServletRequest(HttpServletRequest request) 方法,实现此接口的Action控制类通过setServletRequestHttpServlet(HttpServlet request)方法将request对象

Struts2 -- 获取Servlet API

在struts2中获取Servlet API有三种方式: 1.通过ActionContext来获取       1.获取一个ActionContext对象.                ActionContext context=ActionContext.getContext();            2.获取servlet api                注意:通过ActionContext获取的不是真正的Servlet API,而是一个Map集合.                

Struts2之Servlet API及单元测试初识

可以无视的声明:对于博文中出现的错别字,以及语义不对给大家造成的困扰向大家致歉,同时也希望朋友给予包容和谅解.鄙人现在真的忙的快要疯了,早晨一起床就是赶快发博文,然后就是维护自己网站.上午基本就这几样就没了,下午就是写软文,找友链.晚上就是给大家写博文了.有时碰到有课,都得一样一样往后推,但我不想推掉每日一篇的博文.所以博文出现的个别可以忽视的错误,大家就别计较了.当然我并不是说大家就不用联系我了,关于学习交流的问题,还是希望大家积极交流的.So 奋斗吧,骚年!!! 一.学习案例:通过在Logi

Struts2 与Servlet API解耦,耦合的访问方式

一.与Servlet API解耦的访问方式 1.为了避免与Servlet API耦合在一起,方便Action类做单元测试,  Struts2对HttpServletRequest.HttpSession和ServletContext进行了封装,  构造了三个Map对象来替代这三种对象,在Action中,  直接使用HttpServletRequest.HttpSession.ServletContext对应的Map对象来保存和读取数据.  要获得这三个Map对象,可以使用com.opensymp

Struts2访问Servlet API的几种方式

struts2提供了三种方式访问servlet API:大致分为两类 1. ActionContext: public static ActionContext getContext() :获得当前Action的ActionContext实例. public Object get(Object key) :此方法类似于调用HttpServletRequest的getAttribute(String name)方法. public void put(Object key, Object value

struts2、servlet中返回json数据格式

json数据格式在现在的web开发中应用的是非常多的,基本上现在都用json在前后传数据.那么在struts和servlet中这么返回json格式呢?JSON数据在传递过程中,其实就是传递一个普通的符合JSON语法格式的字符串而已,所谓的"JSON对象"是指对这个JSON字符串解析和包装后的结果,所以我们要做的就是构造一个满足JSON格式的字符串就好了,这是原理切记切记啊,下面我已代码的方式演示几种方法. 需求:我们从前端输入用户名+密码,后端以json格式返回用户名+密码,前端ale

Struts2(七) Struts2访问Servlet的API

当接受表单参数,向页面保持数据时.要用到Struts访问Servlet 的API .下面只做参考,有错误或不同意见可以发送邮箱[email protected]  .建议大家看struts文档,源代码 1.struts2通过ActionContext访问 com.opensymphony.xwork2.ActionContext;类有很多方法这里只列举几个常用的方法: 列举个小例子 Struts2的核心配置web.xml 就不做说明了  .前面已经操作过: Struts.xml <?xml ve