struts2 全局转发后URL变了..怎么回事呢?
cbywxy
2008-12-26
在WEB-ROOT下有这样的页面index.jsp,里面只有一句代码: <action name="login" class="com.test.LoginAction" method="login"> <result name="success">success.jsp</result> </action>
另外还有一个配置: <package name="test2" extends="struts-default" namespace="/bg/member">
<global-results>
<action name="good" class="com.test.MemberAction" > <result name="success">member.jsp</result> </action>
第二个配置中配置的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标准干的事。
所以如果你的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标准干的事。
所以如果你的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>会报错呢? |