传统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;
}
参数处理
MVC
的Handler
方法可以接收一下参数,进行自动填充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中取,如果没有取到则会抛出一个异常。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END