Spring MVC结果跳转方式

Spring MVC有下面几种方式实现将结果显示到UI(User Interface 用户界面简称)上。


1 . 设置ModelAndView对象,根据view的名称和视图解析器,跳转到指定的页面。
页面:视图解析器的前缀+viewname+视图解析器后缀
其实是一种转发的方式。

ModelAndView mv=new ModelAndView();
        mv.addObject("msg", "hello Spring mvc annotation");
        mv.setViewName("hello");//web-inf/jsp/hello.jsp
        return mv;

2 . 通过Servlet api对象来实现(用了参数HttpServletRequest req,HttpServletResponse resp)
这种方式不需要返回ModelAndView,也不需要配置视图解析器。

@RequestMapping("/hello")
    public void hello(HttpServletRequest req,HttpServletResponse resp) throws  IOException, ServletException {
        //输出
        //resp.getWriter().println("hello Spring MVC use httpServlet api"); //会抛出IOException
        //重定向
        //resp.sendRedirect("index.jsp");//会抛出IOException
        //转发
        req.getRequestDispatcher("index.jsp").forward(req, resp);//会抛出IOException,ServletException

    }

3 . 通过Spring MVC来转发和重定向——没有视图解析器的时候(比较少,因为通常都会配置视图解析器)

@RequestMapping("/hello1")
    public String hello(){
        //转发1
        return "index.jsp";//注意是没有视图解析器的时候,默认和转发2相同
        //转发2
        //return "forward:index.jsp";
        //重定向
        //return  "redirect:index.jsp";
    }

参考中文文档视图解析器部分


4 . 通过Spring MVC转发和重定向——有视图解析器的时候

@RequestMapping("/hello2")
    public String hello2(){
        //转发1
        //return "hello";//  web-inf/jsp/hello.jsp
        //重定向
        return  "redirect:hello.do";//重定向与有无视图解析器无关,没用到
    }

调试记载:

  1. 在第二个通过Servlet api对象时,转发和重定向index.jsp都要放在Web-Root下,放在web-inf是到达不了的
  2. 调试三和四,会发现重定向与有没有视图解析器没有关系,因为没用到视图解析器,重定向相当于访问时在URL地址后面加上hello.do,就是普通的重定向,但是必须写完全(在xml文件里设置了*.do,所以不写完全会被拦截)
  3. 改变JSP的默认打开编辑器windows→perferences→Editors→File Associations这里写图片描述
    JSP Editor 直接显示代码(推荐)
    Visual JSp Designer(会出现代码图形界面展示)

额外知识点:
重定向和转发的区别:

重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
URL地址栏不变就是转发,变了就是重定向


Servlet3.0对异步处理提供了支持。(Servlet3是Tomcat7出现的新特性,Tomcat6之前的版本不支持Servlet3,所以需要先安装tomcat7,Spring MVC3.2以后才支持)
阻塞的Servlet
每个请求到达Web应用后,Web应用会为其分配一个线程来专门负责该请求,直到响应发送前,该线程都不会被线程池回收。若有些请求需要长时间处理(比如某些耗时运算或者需要等待某个资源),就会阻塞线程,若这类的请求很多,许多线程都将被长时间占用,对于系统就会产生较大负担,甚至会造成程序的效能瓶颈。
基本上一些需要长时间处理的请求,用户通常也不要求请求后就立即响应。如果可以让这类请求先释放分配给该请求的线程,让Web应用有机会将线程资源分配给其它请求,这样就可以减轻系统负担。而原先释放了所分配线程的请求,其响应将被延后,直到任务完成后再对用户发送响应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值