action不能往jsp中传递数据的问题

本文通过一个具体的Struts应用案例,详细解析了在Struts框架中使用redirect与forward的区别,尤其关注它们对请求数据传递的影响。通过对比两种方式的行为,帮助读者理解何时使用哪种跳转方式。
摘要由CSDN通过智能技术生成

struct z中一个action的配置如下:

 
    path="/library"
    parameter="method"
    name="libraryForm"
    scope="request"
    validate="true"
    type="org.springframework.web.struts.DelegatingActionProxy">
   
        name="listLibrarys"
        path="/form/listlibrarys.jsp"
        redirect="true" />
     
     
   

action 中部分源代码:

 public ActionForward list(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  log.debug("list library ");
  
  List list = libraryManagerService.listLibrarys();
  
  if(list == null) log.debug("there is not any library ,because list is null");
  else log.debug("there are " + list.size() + " librarys .");
  
  request.setAttribute("list", list) ;
 // request.getSession().setAttribute("list", list);
  return mapping.findForward("listLibrarys");
 }
 

jsp中部分源代码:


 














${library.code}
${library.name}
${library.buildTime}
">添加
">修改
">删除

 

问题:


一次也不能循环.

在action的 List list = libraryManagerService.listLibrarys();后中加入:

 log.debug("list size="+list.size());

运行结果:list size=6.

 原因是:

 
        name="listLibrarys"
        path="/form/listlibrarys.jsp"
        redirect="true" />

中的redirect="true".直接转向后.request中的数据丢失.

改为redirect="false"即可.

 

redirect 决定了action在使用forward跳转的时候是使用

RequestDispatcher rd = getServletContext().getRequestDispatcher(uri).forward(request, response);

还是

 response.sendRedirect(response.encodeRedirectURL(uri));

在structs的类RequestProcessor中processForwardConfig方法里面有如下代码:

 if(forward.getRedirect())//判断redirect是否为true
        {
            if(uri.startsWith("/"))
                uri = request.getContextPath() + uri;
            response.sendRedirect(response.encodeRedirectURL(uri));
        } else
        {
            doForward(uri, request, response);
        }

其中的方法doForward如下:

protected void doForward(String uri, HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        RequestDispatcher rd = getServletContext().getRequestDispatcher(uri);
        if(rd == null)
        {
            response.sendError(500, getInternal().getMessage("requestDispatcher", uri));
            return;
        } else
        {
            rd.forward(request, response);
            return;
        }

这两种跳转方法的区别是:

forward 会将 request state , bean 等等信息带往下一个 jsp

redirect 是送到 client 端后,再由client向服务器发送request,服务器接收到后来发的request中已经不包含上次的request的state,bean等信息了。所以在jsp中就接收不到相应的数据

转载于:https://my.oschina.net/hpujsj/blog/6822

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值