页面跳转问题

zll_lover 2008-06-26 11:11:42
<action

input="/web/newOperator.jsp"
name="addOperatorForm"
path="/addOperator"
scope="request"
type="struts.action.AddOperatorAction">
<forward
name="success"
path="/web/saveInfo.jsp"
/>
</action>
这是一个action,我的页面saveInfo.jsp里面用了相对路径,可以正常访问,
但是如果我在后台利用return mapping.findForward("success");来操作,为什么页面中的图片,以及连接
路径都发生了变化,因为是相对路径,其中的超链接都在web文件夹内,可这样跳转页面链接路径不变可
链接的地址就没有了web,变成local:success.jsp了,为什么呢?
好奇怪,明明跳转页面成功了啊
...全文
950 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zll_lover 2008-07-03
  • 打赏
  • 举报
回复
好的我试试先揭帖了
WZC0202 2008-07-02
  • 打赏
  • 举报
回复
写入跟目录, 要动态获取
zxbyhcsdn 2008-07-01
  • 打赏
  • 举报
回复
3.4. forward和redirect的问题
3.4.1. 绝对路径与相对路径
如果咱们使用的URL网址是以“/”开头的,那么这个网址就叫做绝对路径。

如果咱们使用的URL网址不是“/”开头的,那么这个网址就叫做相对路径。

3.4.1.1. 相对路径
在相对路径上,两者的表现是相同的。

看看lingo-sample/03-03/这个例子,如果我们去请求relative/forward.jsp或redirect.jsp,然后从这里再跳转向它下面的result/result.jsp会怎样呢?

forward的例子:

<%request.getRequestDispatcher("result/result.jsp").forward(request, response);%>

这里的相对路径就是result/result.jsp。

因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,执行forward的时候会寻找当前路径下的result/result.jsp,找到之后便转发请求。

redirect的例子:

<%response.sendRedirect("result/result.jsp");%>

这里的相对路径也是result/result.jsp。

因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,执行redirect的时候会把当前路径加上result/result.jsp,把结果作为重定向的地址发送给浏览器,浏览器再去请求/03-03/relative/result/result.jsp,从而得到响应。

3.4.1.2. 绝对路径
问题出现了,绝对路径在forward和redirect中出现了差别,还是刚才的情况,但使用绝对路径的时候写法便不同了。

forward的例子:

<%request.getRequestDispatcher("/relative/result/result.jsp").forward(request, response);%>

这里的绝对路径就是/relative/result/result.jsp。

在本地测试时,forward把http://localhost:8080/03-03/当作根路径,在它的基础上计算绝对路径。

这是由jsp的部署方式决定的,webapp里可以放好多项目,为了让这些项目可以互不影响、独立运行,不能让请求从一个项目直接在服务器内部转移到另一个项目。为了防止出现这种情况,在执行forward的时候干脆把项目的路径当作根目录,开发者看不到其他项目,也就不会出现问题了。

redirect的例子:

<%response.sendRedirect("/03-03/absolute/result/result.jsp");%>

这里的绝对路径却是/03-03/absolute/result/result.jsp。

在本地测试时,redirect把http://localhost:8080/当作根路径,在它的基础上计算绝对路径。

因为redirect会让浏览器重新发起一个新请求,所以不会搅乱服务器里多个项目之间的关系,也就不需要对它做限制,如果需要在多个项目之间进行跳转,就只能使用redirect。不过因为重新发起了新的请求,上次请求的那些数据都会丢失,如果有什么重要的数据,记得要重新设置。

3.4.2. forward导致找不到图片
找不到图片,找不到js脚本,找不到css样式表,都属于这个问题。

要演示这个问题,是非常容易的,只需要满足两个条件:

forward前后的jsp页面不在一个目录下。

forward后的jsp页面里使用相对路径引用一些资源,图片,js脚本,css样式表什么的。

03-04里就模拟了这样一个环境,你进入http://localhost:8080/03-04/,选择“有问题的”:


打开03-04可以看到如下的目录结构:

|--+ 03-04
|--- index.jsp
|--- test.jsp
|--+ result
|--- success.jsp
|--- failure.jsp
|--- lingo.png

刚才咱们看到的页面是failure.jsp,它里边显示图片的部分是:

<img src="lingo.png" />

这时候就有疑问了,lingo.png和failure.jsp明明在同一个目录下,为什么无法显示。

现在请在无法显示的图片上,点击鼠标右键,选择属性,让我们看一下图片的请求地址:


图片的位置本来在http://localhost:8080/03-04/result/lingo.png,但请求的地址却是http://localhost:8080/03-04/lingo.png。问题就是丢掉了中间的/result。

再试一次index.jsp上的“没问题的”:


这次我们看到的页面是success.jsp,它里边显示图片的部分是:

<img src="result/lingo.png" />

结果手工加上result这段路径后就可以显示图片了。

这个问题还要追溯到浏览器对html的处理方式,在html里包含的图片,css样式表,js脚本,视频等等外部资源,都需要浏览器再次向服务器发起请求。

如果这些外部资源使用了相对路径,浏览器就会在当前请求路径的基础上,加上相对路径拼接出完整的http请求,发送给服务器。这个例子中,我们请求http://localhost:8080/03-04/test.jsp,浏览器得到的当前路径就是http://localhost:8080/03-04/,failure.jsp中图片的相对路径是lingo.png,那么拼接的结果是http://localhost:8080/03-04/lingo.png。

不要怪浏览器太傻,是因为使用forward的时候浏览器并不清楚这些改变。它一直认为,既然自己请求的是test.jsp,返回的自然就是test.jsp的内容,那么再使用test.jsp当作当前路径去计算相对路径当然没有问题。是我们欺骗了浏览器,在服务器偷偷改变了请求流向,返回了其他页面的内容。

清楚了以上的请求流程,就知道如何应对这种问题了。

第一种方法:不要在不同目录之间使用forward做请求转发,保证当前路径不发生变化。

第二种方法:像上例一样修改图片路径,或全部改为绝对路径。

请根据实际需要进行选择。

god3626 2008-07-01
  • 打赏
  • 举报
回复
学习!
hlayy_86 2008-06-30
  • 打赏
  • 举报
回复
路径问题,因为加了一个"/",不加"/"和加是有区别的.如3楼理解
bao0437 2008-06-30
  • 打赏
  • 举报
回复
在jsp页面上加上base 试试
zll_lover 2008-06-30
  • 打赏
  • 举报
回复
up
zll_lover 2008-06-26
  • 打赏
  • 举报
回复
我做了一个简单的测试
form下的userLogin.jsp
<html:form action="/userLogin">
<html:submit/><html:cancel/>
<a href="userAdd.jsp">aaaa</a>
< ml:form>

<action
path="/userLogin"
scope="request"
type="com.yourcompany.struts.action.UserLoginAction"
validate="true">
<forward name="success" path="/form/userLogin.jsp" />
</action>

UserLoginAction:
return mapping.findForward("success");
也就是说当我们进入userlogin.jsp页面的时候,可以进入form下的userAdd页面
可如果我们在点击登陆通过action来转向的进入userLogin页面的话,无法进入userAdd
因为链接变成了webroot/userAdd.jsp了,到底该如何解决呢?
zll_lover 2008-06-26
  • 打赏
  • 举报
回复
哦就是说我的做法没有问题,就该出现这样的现象对吗?
总感觉有点别扭啊
sd5816690 2008-06-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zll_lover 的回复:]
但是对于这样的问题必须要这样解决吗?
为什么我那样不行呢?
[/Quote]

可以象你那样做,但是麻烦一些
9楼我说的方法,就不用考虑当前位置和相对位置了
zll_lover 2008-06-26
  • 打赏
  • 举报
回复
但是对于这样的问题必须要这样解决吗?
为什么我那样不行呢?
sd5816690 2008-06-26
  • 打赏
  • 举报
回复
可以这样:

struts-config.xml:
<global-forwards>
<forward name="Charge" path="/web/Charge.jsp"></forward>
</global-forwards>

JSP页面:
<html:link forward="Charge">Charge.jsp</html:link>

这样框架自动给你加工程名
HTML代码自动变成了<a href="/工程名/web/Charge.jsp">Charge.jsp</a>
zll_lover 2008-06-26
  • 打赏
  • 举报
回复
我在跳转的时候确实加上的input="/web/newOperator.jsp"
并且该页可以显示,但是该页里面的链接比如说<a href="Charge.jsp">配置业务费用</A></TD>
并且目录是这样的webroot>web>charge.jsp,newoperator.jsp。
应该是没有问题的,可现在如果return mapping.findForward("success")操作,
web/newOperator.jsp确实是找到了,但是我在页里面设置的<a href="Charge.jsp">的真实路径就是webroot>charge.jsp了,
不知道现在说的是否明白,谢谢大家了
forerver121 2008-06-26
  • 打赏
  • 举报
回复
路径问题....比如你连接后是/localhost:8080/项目名/(??)页面.jsp
如果你中间(??)还有一层.但最后显示没有(??)的话..你就在你跳转的时候在前面加上/(??)/页面.jsp就行了
不知道你是不是这个意思
zabaglione 2008-06-26
  • 打赏
  • 举报
回复
学习
jhandsome007 2008-06-26
  • 打赏
  • 举报
回复
3 楼的说的没错,要理解好相对路径!
sd5816690 2008-06-26
  • 打赏
  • 举报
回复
说错了,不是success.jsp,而是saveInfo.jsp
sd5816690 2008-06-26
  • 打赏
  • 举报
回复
/addOperator.do表示http://localhost:8080/工程名/addOperator.do


所以使用/addOperator.do跳转后,当前路径就变成了
http://localhost:8080/工程名/


但是success.jsp里面的相对路径是相对
http://localhost:8080/工程名/web/ 的,所以出错
zidasine 2008-06-26
  • 打赏
  • 举报
回复
没有理解lz的意思 ........

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧