Osheep

时光不回头,当下最重要。

SpringMVC必掌握的知识

一、Spring MVC 背景介绍:

Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

二、核心原理:
  1. 用户发送请求给服务器。
  2. 服务器收到请求。发现DispatchServlet可以处理。于是调用DispatchServlet。
  3. DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller。
  4. Controller开始执行。
  5. Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。
  6. DispatchServlet将执视图对象中的数据,输出给服务器。
  7. 服务器将数据输出给客户端。
三、spring相关包含义:

Sping相关jar包含义

四、注解的使用:
  1. @Component、@Controller、@service、@Repository
    只需要在对应的类上加上一个@Component注解,就将该类定义为一个Bean了,相当于配置文件中的<bean id="" class=""/>使用@Component注解定义的Bean,默认的名称(id)是小写开头的非限定类名。如UserDaoImpl类默认的Bean名称就是userDaoImpl。可以自己指定Bean的名称: @Component(“userDao”) , 它可代替@Controller、@service、@Repository,但不推荐使用,因为spring还提供了更加细化的注解形式:@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层 Bean,和展示层Bean。在Spring以后的版本中可能会给它们追加更多的语义。所以,推荐使用@Repository、@Service、@Controller来替代@Component。

  2. @RequestMapping
    @RequestMapping ( "/roles" )在类前面定义,则将url和类绑定。
    @RequestMapping ( "/test" )在方法前面定义,则将url和类的方法绑定。可混合使用想调用具体方法则 /roles/test

  3. @RequestParam
    一般用于将指定的请求参数付给方法中形参。示例代码如下:

     //@RequestMapping(params="method=test1")
     //上面这种写法表示在类上做了url了,通过/roles?method=test1这样去访问
     @RequestMapping ( "/test1" )
     public String reg5(@RequestParam("username")String name) { 
         System.out.println("HelloController.handleRequest()");
         System.out.println(uname); 
       return "index";
     }
    

    这样,就会将前台username参数的值赋给name了。当然,如果请求参数名称和形参名称保持一致,则不需要这种写法。

  4. @SessionAttributes
    将ModelMap中指定的属性放到session中。示例代码如下:

     @Controller
     @RequestMapping ( "/roles" )
     @SessionAttributes({"user","test"})   
     public class RolesController {
         @RequestMapping ( "/test1" )    
         public String test1(ModelMap map) {
             User u=new User();
             u.setUsername("测试");
             map.addAttribute("user",u);
            //因为定义的@SessionAttributes中包含user,
            //这里赋值给ModelMap后自动赋值给了session域中也叫user
          return "index";
         }
     }
    

    HTML代码:

     <body>
        <h1>**********${requestScope.user.username}</h1>
        <h1>**********${sessionScope.user.username}</h1>
    </body>
    
  5. @ModelAttribute
    这个注解可以跟@SessionAttributes配合在一起用。使用的前提是session域中已经有值才可以,session的值通过该注解自动赋给指定变量。

     @RequestMapping ( "/test2" )    
     public String test2(@ModelAttribute("user")User u) { 
         System.out.println(u.getUsername()); 
        return "redirect:/index.jsp";
     }
    

    通过上面@ModelAttribute(“user”)自动将session中的user对象赋值给了形参u对象,在方法内部可直接使用。

五、转发和重定向的使用
  1. 转发:在SpringMVC中默认的请求处理就是转发,代码写法:

     @RequestMapping ( "/test3" )   
     public String test3() { 
          return "forward:test2";
          //forward:即可设置转发,不写默认就是转发
     }
    
  2. 重定向:使用关键字“redirect:”代码写法:

      @RequestMapping ( "/test4" )   
      public String test4() { 
          return "redirect:/index.jsp";
      }
    
六、ModelMap

ModelMap是map的实现,可以在其中存放属性,作用域同request。下面这个示例,我们可以在modelMap中放入数据,然后在forward的页面上显示这些数据。通过el表达式、JSTL、java代码均可。

七、ModelAndView模型视图类

见名知意,从名字上我们可以知道ModelAndView中的Model代表模型,View代表视图。即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了view属性。
经查看源码发现:
view是一个object对象,一般用来存放视图名称
model是一个ModelMap的对象,是个Map实现,具体可参考第六点。

点赞