Spring MVC框架
一、SpringMVC运行步骤:
1.DispatcherServlet接收客户端的请求;
2.DispatcherServlet使用HandlerMapping查找负责处理该请求的Controller处理器
3.DispatcherServlet将请求分发给对应的Controller处理器
4.Controller处理器完成业务处理后,返回ModelAndView对象
5.DispatcherServlet调用ViewResolver组件对ModelAndView中的逻辑视图名进行解析,
得到真实的视图对象
6.DispatcherServlet对模型对象Model进行视图渲染
二、web.xml配置
Web.xml中配置的DispatherServlet、ContextLoadListener有什么用?
DispatherServlet在web.xml中配置,用于拦截匹配的Request,依据规则分发给Controller处理。
DispatherServlet还可以配置url的后缀。返回响应页面给客户端
三.Controller层注解参数
0.@Controller修饰类,表明该类是属于Controller层的
Controller层可以接收请求,绑定参数,处理方法,响应到视图
1.@RequestMapping为控制器指定可以处理哪些 URL 请求
比如,@RequestMapping("/user")用于处理/user路径下的请求
2.返回的字符串对应的是视图的名称
3.@RequestParam(value="name")String name , 在Controller层的方法参数中, 相当于request.getParameter("name")
4.@ResponseBody 可以以json等格式返回对象,注解作用于方法上方
5.@RestController相当于@ResponseBody 加 @Controller
用@RestController修饰类,那么类里面的方法就相当于有了@ResponseBody,会通过Url生成json.
6.@PathVariable可以将url中占位符 { 变量 } 里面输入的数据绑定到对应的方法参数上。
7.@RequestBody 注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。可以用于方法参数。
我之前有一次在写Controller层里的某个参数为JSONObject的方法时,忘了在参数前面加上@RequestBody,结果用PostMan测试接口,一直出错。
后来在方法里面打断点,调试发现一直没有进入方法里,于是才发现是@RequestBody的坑。。
@Controller @RequestMapping("/user") public class UserController { @Resource(name = "userService") private UserServiceImpl userService; //根据用户id查询用户信息 //通过 http://localhost:8080/user/showUser?id=1访问 @RequestMapping("/showUser") public String toIndex(HttpServletRequest request, Model model){ int userId = Integer.parseInt(request.getParameter("id")); User user = this.userService.getUserById(userId); model.addAttribute("user", user); return "showUser"; } //查询所有的用户 @RequestMapping("/showUsers") public String toShowUsers(HttpServletRequest request) { List<User> userList; userList=this.userService.showUsers(); request.setAttribute("userList",userList); return "showUsers"; } //在数据库中插入表单提交的新用户数据 @RequestMapping("/insert") public String toInsert(HttpServletRequest request, Model model) { int id=Integer.parseInt(request.getParameter("userId")); String account=request.getParameter("account"); String password=request.getParameter("password"); int age=Integer.parseInt(request.getParameter("age")); User user=new User(id,account,password,age); this.userService.insertUser(user); request.setAttribute("user",user); //设置属性,便于在前端页面获取数据 return "finishRegister"; } //尝试从页面请求中获取参数到后台 @RequestMapping("/param") public String testRequestParam(@RequestParam(value="userId") Integer id, @RequestParam(value="account")String userName,
@RequestParam(value="age")int age, @RequestParam(value = "password")String password,
HttpServletRequest request){ User user=new User(id,userName,password,age); request.setAttribute("user",user); return "finishRegister"; } @RequestMapping("/test") public String toTest(){ return "test"; } @RequestMapping("/register") public String toRegister() { return "register"; } //返回json数据 @ResponseBody @RequestMapping("/json") public User getJson(){ User user=new User(); user.setAge(30); user.setId(22); user.setUserName("feng"); user.setPassword("feng"); return user; }
// url占位符输入的数据绑定到方法参数userName,比如,输入http://localhost:8080/user/lin时,userName会赋值为lin
@RequestMapping("/{account}")
public String testParam(@PathVariable("account") String useName){
System.out.println(useName);
return "test";
}