今天在同事的应用出了一个小错误,与struts2有关,这里记录一下。
描述:web应用下有一个目录“static”,现在要访问其中的“top.html”文件,即访问“localhost:8080/static/top.html”,服务器总是抱404错误。
原因:在struts2的FilterDispatcher类的doFilter方法中,如果请求的是静态资源,struts2会判断该请求是否可以处理,这里的代码如下:
String resourcePath = RequestUtils.getServletPath(request);
if ("".equals(resourcePath) && null != request.getPathInfo()) {
resourcePath = request.getPathInfo();
}
if (staticResourceLoader.canHandle(resourcePath)) {
staticResourceLoader.findStaticResource(resourcePath, request, response);
} else {
// this is a normal request, let it pass through
chain.doFilter(request, response);
}
// The framework did its job here
return;
其中,在DefaultStaticContentLoader类的canHandle方法中会对请求路径进行判断:
public boolean canHandle(String resourcePath) {
return serveStatic &&
(resourcePath.startsWith("/struts") || resourcePath.startsWith("/static"));
}
这里,serveStatic的值为true,再加上要访问的资源以“/static”开头,所以这里返回true。
然后,会进入DefaultStaticContentLoader类的findStaticResource方法,该方法的第一行语句是:
String name = cleanupPath(path);
这里,cleanupPath方法的定义如下:
/**
* @param path requested path
* @return path without leading "/struts" or "/static"
*/
protected String cleanupPath(String path) {
//path will start with "/struts" or "/static", remove them
return path.substring(7);
}
struts2把“/static”截掉了,这样,后面再进行解析的时候,就变成了解析对“/top.html”的请求,所以会报404错误。
总结:悲剧的错误,还以为是自己程序的bug,改了半天。需要加强对开源程序中具体实现的了解。
分享到:
相关推荐
这个是Struts2的配置向导-里面还含有Struts2的工作原理图,我想这个对大家的学习是非常有好处的。
关于web开发中最烦恼的一件事就是如何来确定url的问题,特别是在struts2中!看过这篇,立马让你豁然开朗!
这是使用Eclipse 3.3, JDK 6.0,以及Tomcat 6.0翻写的Struts2的演示程序。它是了解和学习Struts2的好例子。
最近开发项目的时候,遇到Struts2需要URL重写的问题,总结了下资料,和大家分享!!
本资源适合刚接触Struts和Ognl的小伙伴交流学习,欢迎吐槽。
利用Struts 2框架创建一个web项目chap2_e22,实现用户登录过程。具体要求是在loginAction类中分别用login()和registered()处理用户登录和注册的过程,分别创建login.jsp和register.jsp两个页面实现登录和注册的...
1、MVC 概述 2、Struts1.x简述 3、Struts2概述 4、编写一个struts2应用程序 5、Struts2的核心配置文件 6、Action的实现 7、拦截器
应用Struts2,对数据库进行增删改查,并在jsp界面中显示出来.jar包很完整,在里面
wrapper在struts2中的应用装饰者设计模式在Struts2框架中的应用
Struts2校验框架应用
浪曦_Struts2应用开发系列_第1讲.Struts2入门与配置_swf
Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来作为Web框架进行开发,掌握Struts2是每个进行Web开发的Java程序员的一项必备技能。 本视频对Struts2...
将Struts应用迁移到Struts 2(一)将Struts应用迁移到Struts 2(一)
关于struts2的常用标签的应用
struts2实现改写在url后缀的方法,如XX.do--->改写为xx.html等,方便试用,一目了然
该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。 struts.url.https.port 该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用...
ssh2中的urlrewrite和Struts2的生成静态页面
该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口. struts.url.https.port 该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务...
Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点:MVC 2模型的使用、功能齐全的标志库(Tag Library)、开放源代码。而Spring的出现,...
建立你的第一个Struts2应用程序