问题
一个遗留的Java EE项目,使用Struts 2框架。项目文件数量众多,且架构略有点混乱。
现需要对项目中的部分JSP页面进行修改。问题在于:点击某个链接后,浏览器地址栏只显示“包名”和action的名称,例如:/StrutsDemo/math/toInput.do,无法快速得知到底跳转到了哪个JSP文件(/jsps/input.jsp)。
换句话说:Struts 2框架使用的是MVC架构,JSP文件的路径对于浏览器是不可见的。
尝试2种方法:
(1)由于项目中存在大量内容相似的JSP页面,无法通过查找页面内字符串的方法来定位对应页面。
(2)直接对Struts配置文件进行搜索:只能定位到对应的action,无法快速得知跳转到了哪个result。
而且对于使用通配符(*)作为名称的action,集成了多个result,就更加难以定位了。
<action name="*" class="test.HotelAction" method="{1}">
<result name="inputpage">/jsps/hotel/input_hotel.jsp</result>
...
</action>
思考
Struts 2遵循MVC架构。在MVC架构中,Model(JSP)对于View(客户端浏览器)不可见。但是Model(JSP)对于Controller (Struts 2)是可见的。因此,让Controller (Struts 2)输出调试日志即可。
解决方法
解法1:(最佳方案)
在log4j的配置文件中,把Struts的日志输出级别改为debug,并重新部署项目。
然后,当点击某个链接时,Struts 2就会在控制台输出所访问URI对应的真实JSP路径了。
解法2:
(破坏MVC架构,且需改动多处代码,非最佳方案)
在<result>中加入type="redirect":
<action name="toLogin"class="loginAction"
method="toLogin">
<resultname="success" type="redirect">/loginBefore.jsp</result>
</action>