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";//重定向与有无视图解析器无关,没用到
}
调试记载:
- 在第二个通过Servlet api对象时,转发和重定向index.jsp都要放在Web-Root下,放在web-inf是到达不了的
- 调试三和四,会发现重定向与有没有视图解析器没有关系,因为没用到视图解析器,重定向相当于访问时在URL地址后面加上hello.do,就是普通的重定向,但是必须写完全(在xml文件里设置了*.do,所以不写完全会被拦截)
- 改变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应用有机会将线程资源分配给其它请求,这样就可以减轻系统负担。而原先释放了所分配线程的请求,其响应将被延后,直到任务完成后再对用户发送响应。