日期:2014-05-16  浏览次数:20423 次

关于struts2的命名空间和jsp页面中路径问题
http://brightmyfuture.blog.sohu.com/116716733.html

    经常被Jsp、Servlet中相对路径和绝对路径问题给搅匀,今天被这个问题结合Struts2的namespace彻底弄的找不到北了,研究了一天,终于大彻大悟,彻底搞懂了这个问题,赶快记下来。
    页面脚本有两种状态,分别是在IDE中的Develop状态以及部署在Web Server以后的运行状态。这两种状态的相对路径是完全不一样的,如果在这混淆了那代码在部署运行后崩溃的几率达到十有八九了。在IDE中的 Develop状态相对的是真实的本页面的相对路径,而在Web Server中处于运行状态的相对路径就不在是前面所述了,而是相对于URL的路径。
  比如配置了如下片段:
<struts>
     <package name="oss" extends="struts-default">  
        <action name="login" class="trh.oss.action.login.LoginRegisterAction">
            <result name="success">/login.jsp</result>
        </action>    
        <action name="*">
            <result>/pages/{1}.jsp</result>
       </action>  
    </package>  
</struts>
    假设有一个访问请求http://localhost:8080/oss/register.action,Struts2的FilterDispatcher将返还register.jsp页面,在物理文件路径上目录结构如下:
/pages
------register.jsp
------registeritem.jsp
------/images
-------------Main_Top.htm
-------------Main_Left_register.htm
-------------Main_Bottom.htm
    register.jsp处于IDE中(如果不用IDE,在本地文件系统中也是一样的)代码如下:
<%@ page language="java" contentType="text/html; charset=gbk"
    pageEncoding="gbk"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>用户注册</title>
        <meta http-equiv=Content-Type content="text/html; charset=gb2312">
        <meta content="MSHTML 6.00.2900.2668" name="generator">
    </head>
    <frameset border="0" frameSpacing="0" rows="118,*,22" frameBorder="no" cols="*">
        <frame name="topFrm" src="images/Main_Top.htm" noResize scrolling="no">
        <frameset border="0" frameSpacing="0" rows="*" frameBorder="no" cols="180,*">
            <frame name="leftFrm" src="images/Main_Left_register.htm" frameBorder="0" noResize>
            <frame name="rightFrm" src="registeritem.jsp" frameBorder="0">
        </frameset>
        <frame name="bottomFrm" src="images/Main_Bottom.htm" noResize scrolling="no">
    </frameset>
    <noframes></noframes>
</html>
    OK!没有任何的问题,可以正常显示。然后令人郁闷的是将其部署在Server上崩溃了,我上午调了一上午,用尽各种办法,什么根路径,什么basePath之类的全用了,就是崩溃,就是不行。
    原因在哪?相对路径是相对URL的路径,不是相对本地文件系统的路径。在本地开发的时候相对的是本地文件系统的路径,而在服务器上运行的时候是相对于 URL的访问路径。故怎么办呢?已经说的很简单了,Struts2的核心有两个组件分别是Action组件和拦截器组件,Struts2是用 Package对其进行管理的,定义包的时候有一个属性叫做namespace,将其制定为pages就一切OK了。
    这样一个完整的请求响应过程为如下:
    1.客户端发出http://localhost:8080/oss/pages/register.action
    2.服务器断Struts2的核心控制器FilterDispatcher截获此请求,用

<action name="*">这个Action的定 义来匹配此请求,并返还/pages/register.jsp物理视图资源,此页面中用到了四个相对路径,全都是相对http://localhost:8080/oss/pages的相对路径。
    3.回传给客户端生成的静态页面。
    一切OK了!路径啊路径,很神奇。