- RequestMapping请求映射方式
1.规则:
- @RequestMapping可以设置在类上,也可以设置在方法上
- 请求的映射规则是:类上的RequestMapping + ‘/’+ 方法上的RequestMapping
- 如果没有写 / ,SpringMVC会自动补全
- 类上的RequestMapping可以省略,这时直接用方法的RequestMapping访问
- 路径不可重复
2. @RequestMapping的两种映射规则
1)@RequestMapping在用于方法上
@Controller
public class HelloWorldSpringMvc{
private static final String SUCCESS = “success”;
@RequestMapping(“/hello”)
public String testHelloWorld(){
System.out.pringln(“Hello World!”)
return SUCCESS;
}
}
浏览器访问路径:http://localhost:9898/hello 成功跳转到success页面
2)@RequestMapping在用于类上
@Controller
@RequestMapping(“springmvc”)
public class HelloWorldSpringMvc{
private static final String SUCCESS = “success”;
@RequestMapping(“/hello”)
public String testHelloWorld(){
System.out.pringln(“Hello World!”)
return SUCCESS;
}
}
如果后面没有配置路径则还是和原来配置在方法上面一样同过访问http://localhost:9898/hello能够成功跳转success页面,
这里配置了/springmvc如果还是访问原路径怎会报找不到页面。
正确访问的地址应该为http://localhost:9898/springmvc/hello
2. springMVC之其他映射请求
1)Ant风格,其实就是通配符映射,有以下3种方式:
? 匹配一个字符,如/hello? 可以陪陪/hello1,但是不能购匹配/hello或/hello12
* 匹配一个或者多个字符,如/hello/*,可以匹配/hello/demo,但是不能匹配/hello/hello/demo
** 匹配零个或多个路径,如 /hello/**,可以匹配/hello/demo或/hello/hello/demo
@Controller
@RequestMapping(“springmvc”)
public class HelloWorldSpringMvc{
private static final String SUCCESS = “success”;
@RequestMapping(“/hello/**”)
public String testHelloWorld(){
System.out.pringln(“Hello World!”)
return SUCCESS;
}
}
http://localhost:9898/springmvc/hello/hello
2)占位符映射@RequestMapping(value="/users/{userId}")
@RequestMapping(value="/users/{userId}") :
其中{xxx}占位符, 请求的 URL 可以是 “/users/123456”或“/users/abcd”,
通过@PathVariable 可以提取 URI 模板模式中的{xxx}中的xxx变量。
@Controller
@RequestMapping(“springmvc”)
public class HelloWorldSpringMvc{
private static final String SUCCESS = “success”;
@RequestMapping(“/hello/{userId}”)
public ModelAndView testHelloWorld(@PathVariable(“userId”)Long userId){
ModelAndView mv = new ModelAndView(SUCCESS);
mv.addObject(“msg”, “占位符映射 userId:” + userId);
return mv;
}
}
如果url没有userId或者userId类型不对会报错。
3)请求方式限定@RequestMapping(value=“/hello”,method=RequestMethod.POST)
已经限定为POST请求如果其他请求则会报错
@Controller
@RequestMapping(“springmvc”)
public class HelloWorldSpringMvc{
private static final String SUCCESS = “success”;
@RequestMapping(value=“/hello”,method=RequestMethod.POST)
public ModelAndView testHelloWorld(){
ModelAndView mv = new ModelAndView(SUCCESS);
mv.addObject(“msg”, “这里是POST请求!”);
return mv;
}
}
4)请求参数限定@RequestMapping(value=“/hello”,param={“userid”})
通过@RequestMapping注解的params属性来对请求的参数进行限定:
例如@RequestMapping(value=“/hello”,param={“userid”})
要求请求的参数中必须带有userId参数。
参数的限制规则如下:
Params=”userId” 请求参数中必须包含userid
Params=”!userId” 请求参数中不能包含userId
Params=“userId!=1“ 请求参数中必须包含userId,但是userId的值不能为1
Params={“userId“,”name”} 请求参数中必须包含userId和name 参数
@Controller
@RequestMapping(“springmvc”)
public class HelloWorldSpringMvc{
private static final String SUCCESS = “success”;
@RequestMapping(value=“/hello”,params=“userId”)
public ModelAndView testHelloWorld((@RequestParam(“userId”)Long userId){
ModelAndView mv = new ModelAndView(SUCCESS);
mv.addObject(“msg”, “userId:” + userId);
return mv;
}
}
5)@ModelAttribute注解
①可以用来修饰方法会在被修饰的目标方法前先被springMVC调用。
②可以用来修饰目标方法中的对象参数,springMVC会使用对象参数中的value属性值在implicitModel中查找对应的对象,如果该对象存在,该对象就会被直接传入到目标方法的对象参数中;springMVC会以对象参数的value为key,参数对象为value存入到request中。
6)接收JSON格式请求
@ResponseBody 是把返回值的Pojo对象变为JSON字符串,称为序列化
/**
* 将查询或处理或其他操作完成后的对象以json格式返回到前台
*
@RequestMapping("/testJson")
@ResponseBody
public List<User> getAllUsers(){
return xxxxxxDao.getAllUsers();
}
- 当SpringMVC读取到方法上的@ResponseBody注解时,就知道该方法不再使用默认的视图解析器解析视图,而是直接把结果写到响应体中,这样就需要对结果进行转换。
- SpringMVC会从框架中查找有没有定义MessageConvertor(消息转换器),通过消息转换器转换结果,返回对应视图
- 在SpringMVC的注解驱动类中,会进行默认的消息转换器注册,因为我们引入了jacksonJson包,所以会注册JSON的消息转换器
- 因为只有JSON消息转换器可以对Java对象序列化,因此这里默认用了JSON转换
注解驱动类中的代码:
@RequestBody 是把接收到的JSON字符串变为Pojo对象,称为反序列化
/**
*将前台传过来的JSON数据转换为Java对象
*
*/
@RequestMapping("testJsonn")
public void testJson(@RequestBody()List<user> users){
//todo 对传入的对象进行处理
}
7)@ResponseStatus注解
该注解是springMVCrestful风格的页面响应样式
@ResponseStatus(reason="测试",value=HttpStatus.NOT_FOUND)
@RequestMapping("/testResponseStatus")
public String testResponseStatus(){
//内部代码完全执行成功即本方法正常执行无任何异常
return "success";
}
如图虽然代码内部完全正常执行但是响应的时候会呈现如下页面
8)@InitBinder注解
@InitBinder注解只对@Controller方法有效,在controlller方法中通过表单传过来的对象被它初始化绑定到 WebDataBinder中
在表单传过来的的数据初始化时可以干掉你不想要的值。
例如:不想要页面传来的lastName值
@InitBinder
public void initBinder(WebDataBinder binder){
binder.setDisallowedFields("lastName");
}
lastName被在initBinder方法中被干掉了。