struts2 全局转发后URL变了..怎么回事呢?

cbywxy 2008-12-26

在WEB-ROOT下有这样的页面index.jsp,里面只有一句代码:
        <a href="login.action"></a>
然后在配置文件中是这样的
         <package name="test" extends="struts-default" namespace="/">
           

                  <action name="login" class="com.test.LoginAction"   method="login"> 

                      <result name="success">success.jsp</result>

                 </action>

         <package>

 

 

另外还有一个配置:

        <package name="test2" extends="struts-default" namespace="/bg/member"> 
               <interceptors>
                          <interceptor name="command"
                                    class="com.interceptor.CommandActionInterceptor">
              </interceptors>

 

 

              <global-results>
                        <result name="toIndex">/index.jsp</result>
             </global-results>

 

             <action name="good" class="com.test.MemberAction" > 

                      <result name="success">member.jsp</result>

             </action> 

        <package>

 

第二个配置中配置的command 拦截器的作用是在访问 good.action时候,拦截并返回"toIndex",这样转发到index.jsp .但是当在转发后的这个index.jsp页面中单击连接的时候,地址栏中显示的地址却是..(省略)../bg/member/login.action,因为在这个命名空间下更本没有login.action的配置。所有出现错误。

       这个问题也是最近才发现的。找了很久也不知道是什么原因,请大家有遇到过的。指点指点。。     

 

kyo100900 2008-12-26
加个contextPath :



<a href="<%=request.getContextPath()%>/login.action"></a> 



cbywxy 2008-12-26
这个我之前就试过了。能够解决问题。但是我觉的纳闷了,为什么转发后的连接地址会变呢? 源代码没有变。就是在点击的时候就变了。
fangwei 2008-12-28
cbywxy 写道
这个我之前就试过了。能够解决问题。但是我觉的纳闷了,为什么转发后的连接地址会变呢? 源代码没有变。就是在点击的时候就变了。

 

 当你请求good.action后location即地址栏的值会变成//127.0.0.1:8086/bg/member/good.action

经过你的拦截器command,此时页面转向index.jsp,虽然该页面的超链接写法为<a href="login.action"></a>,但是当你点击该链接执行的将会是//127.0.0.1:8086/bg/member/login.action,也就是会在login.action前面加上当前的相对路径//127.0.0.1:8086/bg/member/

如果超链接写法改为<a href="/login.action"></a>,那么执行的将是//127.0.0.1:8086/login.action

 

出现这种情况跟struts2没有任何关系,因为这完全是浏览器根据html标准干的事。

  • 当超链接不以/开头时,浏览器会在前面加上当前的相对路径。
  • 当超链接以/开头时,浏览器会在前面加上当前的主机路径即ip:port。

所以如果你的web程序部署在非ROOT目录下(拿tomcat为例),比如demo目录下,你的超链接最好写成<a href="<%=request.getContextPath()%>/login.action"></a>。这个时候页面的源文件为<a href="/demo/login.action"></a>,此时以/开头,浏览器会处理为//127.0.0.1:8086/demo/login.action

gaohuier 2008-12-29
在页面中加上
 <base href="<%=basePath%>">

或者
<html: base/>

这样就可以把当前页面的相对路径定死了,不用那么麻烦去写绝对路径
gaohuier 2008-12-29
gaohuier 写道
在页面中加上
 <base href="<%=basePath%>">

或者
<html: base/>

这样就可以把当前页面的相对路径定死了,不用那么麻烦去写绝对路径




前者表示在项目的根目录下,后者表示在页面所在的当前目录之下!
cbywxy 2008-12-29
非常感觉各位的指点。这个问题可以pass了。再次谢谢!!
wenxiang_tune 2009-05-13
fangwei 写道
cbywxy 写道
这个我之前就试过了。能够解决问题。但是我觉的纳闷了,为什么转发后的连接地址会变呢? 源代码没有变。就是在点击的时候就变了。

 

 当你请求good.action后location即地址栏的值会变成//127.0.0.1:8086/bg/member/good.action

经过你的拦截器command,此时页面转向index.jsp,虽然该页面的超链接写法为<a href="login.action"></a>,但是当你点击该链接执行的将会是//127.0.0.1:8086/bg/member/login.action,也就是会在login.action前面加上当前的相对路径//127.0.0.1:8086/bg/member/

如果超链接写法改为<a href="/login.action"></a>,那么执行的将是//127.0.0.1:8086/login.action

 

出现这种情况跟struts2没有任何关系,因为这完全是浏览器根据html标准干的事。

  • 当超链接不以/开头时,浏览器会在前面加上当前的相对路径。
  • 当超链接以/开头时,浏览器会在前面加上当前的主机路径即ip:port。

所以如果你的web程序部署在非ROOT目录下(拿tomcat为例),比如demo目录下,你的超链接最好写成<a href="<%=request.getContextPath()%>/login.action"></a>。这个时候页面的源文件为<a href="/demo/login.action"></a>,此时以/开头,浏览器会处理为//127.0.0.1:8086/demo/login.action

非常感谢!!

 

 

walacewang 2010-05-17
应该和浏览器没有关系,应该是JSPContainer干的吧。


<base href="<%=basePath%>"> 
这个学习了。
JaneLan 2010-05-19
我的strut.xml文件中为什么加<global-results>
                        <result name="toIndex">/index.jsp</result>
             </global-results>会报错呢?
Global site tag (gtag.js) - Google Analytics