likes
comments
collection
share

传统SpringMVC使用介绍

作者站长头像
站长
· 阅读数 22

传统SpringMVC使用介绍

传统SpringMVC使用,以及在使用中的一些技巧❤️

@RequestMapping注解

  • DispatcherServlet截获请求后就通过控制器上的@RequestMapping注解提供的映射信息确定请求所对应的处理方法
  • 可以使用params参数和headers参数 更加精准的映射请求
@RequestMapping(value="testParamsAndHeaders")
    ,params={"address", "age!=25"}
    ,headers={"Accept-Language=en-US,zh;q=0.8"}
  • 支持Ant风格通配符
    • ?:匹配文件名中的一个字符。例如: /student/get?? 匹配 /student/getaa/student/getbb
    • *:匹配文件名中的任意字符。例如:/student/*/createStudent 匹配 student/aa/createStudent 或者 student/bb/createStudent
    • **:匹配多层路径。例如:/student/**/createStudent 匹配 /student/createStudent 或者student/aa/bb/createStudent
  • @PathVariable可以用来将url中的占位符映射到目标方法参数中
@RequestMapping("/testPathVariable/{name}")
public String testPathVariable(@PathVariable("name" String name)){
    return name;
}
  • 可以将POST请求转化成标准的PUT或者DELETE请求
    • 需要配置HiddenHttpMethodFilter
    • 需要发送POST请求
    • 需要在发送POST请求的时候携带一个name="_method" 的隐藏域,值是DELETE 或者 PUT
<!--配置org.Springframework.web.filter.HiddenHttpMethodFilter,可以把POST请求转为DELETE或者是PUT请求-->
<filter>
    <filter-name>HiddentHttpMethodFilter</filter-name>
    <filter-class>org.Springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddentHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<form action="testRest" method="post">
    <input type="hidden" name="_method" value="PUT" />
    <input type="submit" value="test" />
</form>
  • @RequestParam 可以用来映射请求参数
//value:请求参数的参数名,defaultValue :如果没有这个参数的默认值,required:是否是必须的默认是true
@RequestMapping("/testRequestParam)
public String testRequestParam(@RequestParam(value="name" defaultValue="小红") String name){
    return name
}
  • @RequestHeader 映射请求头 用法同@RequestParam
@RequestMapping("/testRequestHeader)
public String testRequestHeader(@RequestHeader(value="Auth" String auth)){
    return auth;
}
  • @cookieValue 映射cookie值 用法同@RequestParam
@RequestMapping("testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String id){
    return id;
}

参数处理

  • MVCHandler方法可以接收一下参数,进行自动填充
    • HttpServletRequest
    • HttpServletResponse
    • HttpSession
    • java.util.Map
    • org.springframework.ui.Model
    • org.springframework.ui.ModelMap
  • controller处理方法的返回值
    • ModelAndView:处理方法的返回值是这个的时候,可以向该对象中添加数据
    • Map及Model:入参为Map或者Model的时候,可以直接向map中添加键值对,会自动保存到request域对象中,页面返回时自动添加其中
    • @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性,除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中。例:@SessionAttributes(value="{name}",types={String.class})会把放入到map中的参数放到session中
    • ModelAttribute:方法入参标注该注解后,入参的对象就会放在数据模型中
//控制器处理方法的返回结果是ModelAndView的时候,它既包含视图信息,也包含模型数据信息。
//添加模型数据:

//ModelAndView.addObject(String attributeName,Object attributeValue)
//ModelAndView.addAllObject(Map modelMap)

//其中模型数据会依次遍历request,setAttribute(modelName,modelValue),即添加到request域对象中
//设置视图:

//void setView(View view)
//void setViewName(String viewName)

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    ModelAndView modelAndView = new ModelAndView("/testModelAndView");
    modelAndView.addObject("name", "小红");
    return modelAndView;
}
//1) Map:入参为Map的时候,可以直接向map中添加键值对,会自动保存到request域对象中,页面返回时自动添加其中
//2)Model:入参为Model的时候,可以直接向Model中添加键值对,会自动保存到request域对象中,页面返回时自动添加其中

@RequestMapping("/testMap")
public void testMap(Map<Stirng, Object> map, Model model){
    map.put("name", "小红");
    model.addAttribute("address", "xx");
}
//除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中。
//例:@SessionAttributes(value="{name}",types={String.class})
//会把放入到map中的参数放到session中

@SessionAttributes(value="{name}", types={String.class})

@RequestMapping("/testSessionAttributes")
public void testSessionAttributes(Map<Stirng, Object> map){
    map.put("name", "小红");
}
//有ModelAttribute注解标注的方法,会在每个目标方法执行之前被SpringMvc调用!

//其中HttpServletRequst对象是同一个,所以可以在有ModelAttribute注解标注的方法的入参传入request, 同时
//request.setAttribute(arg0, arg1);之后在目标url中可以request.getAttribute() 出来

//执行过程:先执行有ModelAttribute注解标注的方法,将pojo放入map或model中,此时pojo还没有放入request域
//中,所以不能用request.getAttribute方法获取pojo。然后执行目标方法,将map或model中的pojo传入目标方
//法,在将前台传过来的数据一一set,这样就能达到 前台没有传过来的数据没有改变,而不是null.

//也可以不往model中加,直接将需要添加的值设置成方法的返回值,也一样会放在model中。key就是返回值的名字,
//如果需要指定key 那就在@modelattribute注解的value属性中指定:

@ModelAtribute(value="preStudent")
public Object modelAttribute(){
    Student student = new Student();
    student.setName("小红");
    student.setAge(25);
    student.setAddress("xx");
    return student;
}

//其中@ModelAttribute注解也可以放在目标方法的参数上,可以指定一个参数名进行绑定:
@ModelAtribute
public void modelAttribute(Model model){
    Student student = new Student();
    student.setName("小红");
    student.setAge(25);
    student.setAddress("xx");
    model.addAttribute("preStudent", student);
}

@RequestMapping("/testModelAttribute")
public void testModelAttribute(@ModelAttribute("preStudent") student){
    System.out.println(student);
}

//其中如果model中没有对应的key,并且当前handler也没有用@sessionAttributes注解标记,则会通过反射的方式
//新建一个对象,此时该对象必须有一个无参构造器。如果用@sessionAttributes注解标记并且其vaule属性与key一
//致,则会强制在session中取,如果没有取到则会抛出一个异常。