如何解决Sitemesh演示应用的404错误问题
先别急,咱们一步步拆解这个问题——你能访问index.html说明应用部署基本正常,但menu.jsp和hours.jsp报404,核心可能是路径不匹配或者配置规则没覆盖到请求,再结合日志排查就能定位问题:
一、先确认访问路径是否正确
从你的文件结构来看,menu.jsp和hours.jsp是放在WebContent/data/目录下的,但你访问的是localhost:8080/mesh/menu.jsp,正确的访问路径应该是:
localhost:8080/mesh/data/menu.jsp localhost:8080/mesh/data/hours.jsp
直接访问根路径下的menu.jsp自然会报404,因为文件根本不在那里。另外你的decorators.xml里配置的<pattern>/data/*</pattern>也说明只有/data/下的页面才会被SiteMesh装饰,所以必须先访问正确的路径。
二、检查SiteMesh配置的有效性
先核对你的配置文件是否存在隐性问题:
1. web.xml配置
你的web.xml里SiteMesh过滤器的配置是正确的,url-pattern: /*会拦截所有请求,但要确保:
- SiteMesh的jar包已经正确添加到
WEB-INF/lib目录下(从文件结构看你已经加了,这点没问题) - 过滤器类
com.opensymphony.sitemesh.webapp.SiteMeshFilter没有拼写错误
2. decorators.xml配置
你的装饰器规则是<pattern>/data/*</pattern>,这个规则只会匹配/data/开头的请求,所以如果访问非/data/路径的JSP,不会触发SiteMesh,但核心还是先确保文件路径和访问路径一致。
三、开启JBoss EAP的详细日志,追踪请求流向
控制台没有日志输出是因为默认日志级别太高,你可以修改JBoss的配置开启DEBUG级别的日志,看看请求到底有没有到达容器、有没有被SiteMesh处理:
- 打开JBoss EAP安装目录下的
standalone/configuration/standalone.xml - 找到
<subsystem xmlns="urn:jboss:domain:logging:1.5">节点,添加以下日志配置:
<logger category="com.opensymphony.sitemesh"> <level name="DEBUG"/> </logger> <logger category="org.apache.catalina"> <level name="DEBUG"/> </logger>
- 重启JBoss,再次访问报错的路径,控制台会输出详细的请求处理日志:
- 可以看到请求是否被SiteMesh过滤器拦截
- 可以看到容器是否尝试查找对应的JSP文件,以及查找的路径是什么
四、验证JSP是否被正确编译部署
JBoss会自动编译JSP文件到临时目录,你可以检查以下位置:JBOSS_HOME/standalone/tmp/vfs/deployment/deployment[你的应用部署文件名]/WEB-INF/work/
看看是否存在menu_jsp.class和hours_jsp.class文件:
- 如果不存在,说明JSP文件没有被编译,可能是文件权限问题,或者Eclipse部署时没有把
data目录包含进去 - 可以右键项目 →
Properties→Deployment Assembly,确认data目录是否被添加到部署路径中
五、额外排查点
- 检查JBoss EAP 6.4的JSP容器配置:确保
standalone.xml中web子系统开启了JSP支持(默认是开启的,但可以核对) - 清理JBoss的临时文件:删除
JBOSS_HOME/standalone/tmp和JBOSS_HOME/standalone/data/content下的内容,重新部署应用,避免缓存导致的问题
附:你的当前配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>mesh</display-name> <filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
decorators.xml
<?xml version="1.0" encoding="UTF-8"?> <decorators defaultdir="/decorators"> <decorator name="basic-theme" page="basic-theme.jsp"> <pattern>/data/*</pattern> </decorator> </decorators>
文件结构

内容的提问来源于stack exchange,提问作者Aaron

