lishunli / nutz

Automatically exported from code.google.com/p/nutz

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

问个弱弱的问题,怎么实现内部跳转?forward方式

GoogleCodeExporter opened this issue · comments

可以通过@OK,@fail来实现redirect 方式 的跳转,那forward方式呢?
主要是我经常会从一个视图跳到另外一个去,同时要带很多参�
��....

Original issue reported on code.google.com by zkgale@gmail.com on 12 May 2010 at 9:31

刚刚看了一下代码,发现,其实如果把JspView改造一下,就很容易�
��现上面我说到的功能,但是
JspView却有一些限制,使我感觉丧失了很多灵活性...

我直接来个简化版的,希望能用上,这个可以把所有请求直接根
据URL进行forword跳转,不再对是否是
JSP进行限制

Original comment by zkgale@gmail.com on 12 May 2010 at 10:39

  • Added labels: ****
  • Removed labels: ****

Attachments:

后面我想了想,说实话,我觉得jspView这个类有点不是很好,
1. 只能对JSP进行跳转,不能扩展成其它类型的路径跳转
2. 
在@OK,@Fail中有些让人误解,而且,就为了减少最后的那个JSP,感��
�有些过了
3. 
关于web-inf做为前缀,也有些让人误解吧,为什么在这里不对路��
�进行统一的规定呢?而且如果真
要加前缀,为什么不在主模块上加个URL前缀的配置呢?

Original comment by zkgale@gmail.com on 12 May 2010 at 1:35

  • Added labels: ****
  • Removed labels: ****
首先, JspView 本身就只是负责跳转到jsp文件.
第二, 可以使用ServerRedirectView进行内部跳转.

Original comment by wendal1985@gmail.com on 13 May 2010 at 2:10

  • Added labels: ****
  • Removed labels: ****
ServerRedirectView不能实现内部跳转

resp.sendRedirect(path);
resp.flushBuffer();
上面是最后两句,response的sendRedirect是重定向请求,也就是向客�
��端发一个转向,然后由客户
端来发送请求,虽然这个可以进行跳转,但是不能传递上一次请
求中的参数,我更希望的是,我上一
个请求中的参数能在下一个请求中使用,这才是内部跳转...


比如,我在一个具有分页功能的列表中,要点击查看某项的详细
信息,那么查看后我要怎么回到我刚
才看的那一页呢?只能把页数也传起走,而如果用response.sendRedir
ect的话,我就得手动去处理
一下URL使它把页数带起走,但是,如果我用RequestDispatcher.forword��
�话,我就根本不用手动去
处理页数,直接跳过去后就能得到最原始的页数参数

Original comment by zkgale@gmail.com on 13 May 2010 at 2:20

  • Added labels: ****
  • Removed labels: ****
不太明白这个需求

一般的请求顺序是:

   HTTP request -> 某入口函数 -> 某一个View -> HTTP respone

为什么需要在一个 View 里决定内部的跳转呢? 

在入口函数里,它可以通过 @Ok/@Fail 来决定内部跳转的目标 
View
它也可以直接返回一个 View 对象,这个 View 对象比 @Ok/@Fail 
有更高的优先级

总之, View 将是整个 HTTP 
请求的一个终点,它不会再跳转了,它只负责渲染 HTTP Response

Original comment by zozoh...@gmail.com on 13 May 2010 at 7:06

  • Added labels: Module-Mvc
  • Removed labels: ****
"比如,我在一个具有分页功能的列表中,要点击查看某项的详��
�信息,那么查看后我要怎么回到我刚
才看的那一页呢"

-- 点击查看某项的详细信息后,那么你已经写了 RESPONSE 
给浏览器了,你必须在你输出的页面上写一个链接:
<a href="/my/list?pn=23">回到列表</a>
才行

Original comment by zozoh...@gmail.com on 13 May 2010 at 7:11

  • Added labels: ****
  • Removed labels: ****
 HTTP request -> 某入口函数 -> 某入口函数 -> 某入口函数 -> 某入口函数 -> 某一个View -
> HTTP respone

以上是我的需求,即一个方法处理完后,转到另外一个进行处理
,如,我保存完后,直接要显示所有内
容.
但是上面的形式有个问题,即第二个,第三个函数不得再得参数
注入...所以就改成下面的形式:

 HTTP request -> 某入口函数 -> 某一个View -> 某入口函数 -> 某一个View -> 某入口函数 -
> 某一个View -> HTTP respone

而view中使用RequestDispatcher.forword,这样,第二个函数就能够进行�
��数注入了

Original comment by zkgale@gmail.com on 13 May 2010 at 7:15

  • Added labels: ****
  • Removed labels: ****
整个过程有点像多重过滤器...

Original comment by zkgale@gmail.com on 13 May 2010 at 7:30

  • Added labels: ****
  • Removed labels: ****
入口函数A -> 入口函数 B -> 入口函数 C

那么应该在 A 里面,先调用 B 再调用 C,不是吗?
如果这样, B, C 的参数应该由 A 来提供

Original comment by zozoh...@gmail.com on 13 May 2010 at 1:22

  • Added labels: ****
  • Removed labels: ****
对呀,但是有两个问题
1. 最后返回的是C的视图
2. 在请求A的时候就得把B/C要用到的参数传过来
这样的话,如果可以直接通过view跳转到B,C的话,就不用在每个��
�数内手动调用函数了噻,对用户来
说就少了个步骤了噻,是不?
而且,因为有@OK,@Fail所以,可以直接转给多个,如果是手动调的��
�,是不是要写个IF呢?

Original comment by zkgale@gmail.com on 13 May 2010 at 1:28

  • Added labels: ****
  • Removed labels: ****
改进JspView,使其变成ForwardView的子类.

内部重定向使用广泛

改造后需要更新文档.

Original comment by wendal1985@gmail.com on 17 Oct 2010 at 10:06

  • Changed state: Accepted
  • Added labels: FAQ, Milestone-1.a.33, Type-Enhancement, Usability
  • Removed labels: Type-Defect
没必要让 JSP View 成为 ForwardView 
的子类,如果需要考虑的话,应该是提供

@Ok("fw:/abc/bbc")

这个 ForwordView 提供的就是根据 URL 获取一个 
ActionInvoking,并且调用, 即,可以把
NutServlet.service() 方法那几行代码 copy 一下

Original comment by zozoh...@gmail.com on 17 Oct 2010 at 12:03

  • Added labels: ****
  • Removed labels: ****
或者,让 NutServlet 本身就有一个 ForwardView 的属性,在 
DefaultViewmaker 里,如果类型是 fw
那么直接返回 NutServlet 里面的 ForwardView

Original comment by zozoh...@gmail.com on 17 Oct 2010 at 12:05

  • Added labels: ****
  • Removed labels: ****
我的思路是这样的:
1. 我喜欢jspview那种对路径的定义,
2. 但我不一样是重定向到jsp,也许是.nut, 或者其他的servlet, 
例如FreeMaker的.ftl(通过FreeMakerServlet)

现在Jspview,非常容易拓展成通用的ForwardView, 
因为jsp这个字符,只存在于构造方法而已. 
轻微改动,就可重定向到任何一种后缀,甚至没有后缀的地址.

Original comment by wendal1985@gmail.com on 17 Oct 2010 at 1:34

  • Added labels: ****
  • Removed labels: ****
Fix in r1601

Original comment by wendal1985@gmail.com on 18 Oct 2010 at 5:35

  • Changed state: Fixed
  • Added labels: ****
  • Removed labels: ****