java学习之SpringMVC

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

0x00前言

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。
Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。Spring MVC 是当今业界最主流的 Web 开发框架,以及最热门的开发技能。
在 Spring MVC 框架中,Controller 替换 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果。Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息
0x01springmvc介绍


  • SpringMVC一种基于Java实现MVC模型的轻量级Web框架
  • 使用简单方便开发,是简化版的servlt
  • 用于表现层开发的一种框架
  • 现在都采用注解开发更加方便
0x02SpringMVC简单入门

是属于sping容器的spring又是ioc模式的所要把所有都配置成bean
写一个配置类
  1. //springmvc配置类,本质上还是一个spring配置类
  2. @Configuration
  3. @ComponentScan("com.itheima.controller")
  4. public class SpringMvcConfig {
  5. }
复制代码
写加载类去加载spring容器里的bean
  1. package com.itheima.config;
  2. import org.springframework.web.context.WebApplicationContext;
  3. import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  4. import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
  5. //web容器配置类
  6. public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
  7.     //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
  8.     protected WebApplicationContext createServletApplicationContext() {
  9.         //初始化WebApplicationContext对象
  10.         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
  11.         //加载指定配置类
  12.         ctx.register(SpringMvcConfig.class);
  13.         return ctx;
  14.     }
  15.     //设置由springmvc控制器处理的请求映射路径
  16.     protected String[] getServletMappings() {
  17.         return new String[]{"/"};
  18.     }
  19.     //加载spring配置类
  20.     protected WebApplicationContext createRootApplicationContext() {
  21.         return null;
  22.     }
  23. }
复制代码
控制器
  1. package com.itheima.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. //定义表现层控制器bean
  6. @Controller
  7. public class UserController {
  8.     //设置映射路径为/save,即外部访问路径
  9.     @RequestMapping("/save")
  10.     //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
  11.     @ResponseBody
  12.     public String save(){
  13.         System.out.println("user save ...");
  14.         return "{'info':'springmvc'}";
  15.     }
  16.     //设置映射路径为/delete,即外部访问路径
  17.     @RequestMapping("/delete")
  18.     @ResponseBody
  19.     public String delete(){
  20.         System.out.println("user save ...");
  21.         return "{'info':'springmvc'}";
  22.     }
  23. }
复制代码

  • 简单配置就说的是用@@RequestMapping作为访问的路径
  • @ResponseBody写在函数上面就可以用该函数的返回值作为响应值,也可以设置请求方式
0x03MVC常用注解

0x1配置简化开发
  1. package com.itheima.config;
  2. import org.springframework.web.context.WebApplicationContext;
  3. import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  4. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  5. import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
  6. //web配置类简化开发,仅设置配置类类名即可
  7. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
  8.     protected Class<?>[] getRootConfigClasses() {
  9.         return new Class[]{SpringConfig.class};
  10.     }
  11.     protected Class<?>[] getServletConfigClasses() {
  12.         return new Class[]{SpringMvcConfig.class};
  13.     }
  14.     protected String[] getServletMappings() {
  15.         return new String[]{"/"};
  16.     }
  17. }
  18. /*
  19. public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
  20.     protected WebApplicationContext createServletApplicationContext() {
  21.         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
  22.         ctx.register(SpringMvcConfig.class);
  23.         return ctx;
  24.     }
  25.     protected WebApplicationContext createRootApplicationContext() {
  26.         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
  27.         ctx.register(SpringConfig.class);
  28.         return ctx;
  29.     }
  30.     protected String[] getServletMappings() {
  31.         return new String[]{"/"};
  32.     }
  33. }
  34. */
复制代码
0x2路径配置
  1. @Controller
  2. //类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
  3. @RequestMapping("/user")
  4. public class UserController {
  5.     //请求路径映射
  6.     @RequestMapping("/save")
  7.     @ResponseBody
  8.     public String save(){
  9.         System.out.println("user save ...");
  10.         return "{'module':'user save'}";
  11.     }
  12.     //请求路径映射
  13.     @RequestMapping("/delete")
  14.     @ResponseBody
  15.     public String delete(){
  16.         System.out.println("user delete ...");
  17.         return "{'module':'user delete'}";
  18.     }
  19. }
复制代码

  • 访问第一个方法的路径是/user/save
  • 第二个方法的路径是/user/delete
0x3请求方式和注解
  1. //请求参数
  2. @Controller
  3. public class UserController {
  4.     //普通参数:请求参数与形参名称对应即可完成参数传递
  5.     @RequestMapping("/commonParam")
  6.     @ResponseBody
  7.     public String commonParam(String name ,int age){
  8.         System.out.println("普通参数传递 name ==> "+name);
  9.         System.out.println("普通参数传递 age ==> "+age);
  10.         return "{'module':'common param'}";
  11.     }
  12.     //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
  13.     @RequestMapping("/commonParamDifferentName")
  14.     @ResponseBody
  15.     public String commonParamDifferentName(@RequestParam("name") String userName , int age){
  16.         System.out.println("普通参数传递 userName ==> "+userName);
  17.         System.out.println("普通参数传递 age ==> "+age);
  18.         return "{'module':'common param different name'}";
  19.     }
  20.     //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
  21.     @RequestMapping("/pojoParam")
  22.     @ResponseBody
  23.     public String pojoParam(User user){
  24.         System.out.println("pojo参数传递 user ==> "+user);
  25.         return "{'module':'pojo param'}";
  26.     }
  27.     //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
  28.     @RequestMapping("/pojoContainPojoParam")
  29.     @ResponseBody
  30.     public String pojoContainPojoParam(User user){
  31.         System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
  32.         return "{'module':'pojo contain pojo param'}";
  33.     }
  34.     //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
  35.     @RequestMapping("/arrayParam")
  36.     @ResponseBody
  37.     public String arrayParam(String[] likes){
  38.         System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
  39.         return "{'module':'array param'}";
  40.     }
  41.     //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
  42.     @RequestMapping("/listParam")
  43.     @ResponseBody
  44.     public String listParam(@RequestParam List<String> likes){
  45.         System.out.println("集合参数传递 likes ==> "+ likes);
  46.         return "{'module':'list param'}";
  47.     }
  48.     //集合参数:json格式
  49.     //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  50.     //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
  51.     @RequestMapping("/listParamForJson")
  52.     @ResponseBody
  53.     public String listParamForJson(@RequestBody List<String> likes){
  54.         System.out.println("list common(json)参数传递 list ==> "+likes);
  55.         return "{'module':'list common for json param'}";
  56.     }
  57.     //POJO参数:json格式
  58.     //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  59.     //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
  60.     @RequestMapping("/pojoParamForJson")
  61.     @ResponseBody
  62.     public String pojoParamForJson(@RequestBody User user){
  63.         System.out.println("pojo(json)参数传递 user ==> "+user);
  64.         return "{'module':'pojo for json param'}";
  65.     }
  66.     //集合参数:json格式
  67.     //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  68.     //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
  69.     @RequestMapping("/listPojoParamForJson")
  70.     @ResponseBody
  71.     public String listPojoParamForJson(@RequestBody List<User> list){
  72.         System.out.println("list pojo(json)参数传递 list ==> "+list);
  73.         return "{'module':'list pojo for json param'}";
  74.     }
  75.     //日期参数
  76.     //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
  77.     @RequestMapping("/dataParam")
  78.     @ResponseBody
  79.     public String dataParam(Date date,
  80.                             @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
  81.                             @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
  82.         System.out.println("参数传递 date ==> "+date);
  83.         System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
  84.         System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
  85.         return "{'module':'data param'}";
  86.     }
  87. }
复制代码

  • 请求方式的配置是在路径也就是@RequestMapping后面配上method=request.get/post/put/delete
  • 当输入的参数和获取的参数不同时候用,@RequestParam("name")这种类似的标签给形参绑定值,如果形参和传入值相同的话可以不用谢注解
0x4JSON传输
  1. package com.itheima.controller;import com.itheima.domain.User;import org.springframework.format.annotation.DateTimeFormat;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import java.util.Arrays;import java.util.Date;import java.util.List;//请求参数
  2. @Controller
  3. public class UserController {
  4.     //普通参数:请求参数与形参名称对应即可完成参数传递
  5.     @RequestMapping("/commonParam")
  6.     @ResponseBody
  7.     public String commonParam(String name ,int age){
  8.         System.out.println("普通参数传递 name ==> "+name);
  9.         System.out.println("普通参数传递 age ==> "+age);
  10.         return "{'module':'common param'}";
  11.     }
  12.     //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
  13.     @RequestMapping("/commonParamDifferentName")
  14.     @ResponseBody
  15.     public String commonParamDifferentName(@RequestParam("name") String userName , int age){
  16.         System.out.println("普通参数传递 userName ==> "+userName);
  17.         System.out.println("普通参数传递 age ==> "+age);
  18.         return "{'module':'common param different name'}";
  19.     }
  20.     //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
  21.     @RequestMapping("/pojoParam")
  22.     @ResponseBody
  23.     public String pojoParam(User user){
  24.         System.out.println("pojo参数传递 user ==> "+user);
  25.         return "{'module':'pojo param'}";
  26.     }
  27.     //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
  28.     @RequestMapping("/pojoContainPojoParam")
  29.     @ResponseBody
  30.     public String pojoContainPojoParam(User user){
  31.         System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
  32.         return "{'module':'pojo contain pojo param'}";
  33.     }
  34.     //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
  35.     @RequestMapping("/arrayParam")
  36.     @ResponseBody
  37.     public String arrayParam(String[] likes){
  38.         System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
  39.         return "{'module':'array param'}";
  40.     }
  41.     //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
  42.     @RequestMapping("/listParam")
  43.     @ResponseBody
  44.     public String listParam(@RequestParam List<String> likes){
  45.         System.out.println("集合参数传递 likes ==> "+ likes);
  46.         return "{'module':'list param'}";
  47.     }
  48.     //集合参数:json格式
  49.     //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  50.     //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
  51.     @RequestMapping("/listParamForJson")
  52.     @ResponseBody
  53.     public String listParamForJson(@RequestBody List<String> likes){
  54.         System.out.println("list common(json)参数传递 list ==> "+likes);
  55.         return "{'module':'list common for json param'}";
  56.     }
  57.     //POJO参数:json格式
  58.     //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  59.     //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
  60.     @RequestMapping("/pojoParamForJson")
  61.     @ResponseBody
  62.     public String pojoParamForJson(@RequestBody User user){
  63.         System.out.println("pojo(json)参数传递 user ==> "+user);
  64.         return "{'module':'pojo for json param'}";
  65.     }
  66.     //集合参数:json格式
  67.     //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  68.     //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
  69.     @RequestMapping("/listPojoParamForJson")
  70.     @ResponseBody
  71.     public String listPojoParamForJson(@RequestBody List<User> list){
  72.         System.out.println("list pojo(json)参数传递 list ==> "+list);
  73.         return "{'module':'list pojo for json param'}";
  74.     }
  75.     //日期参数
  76.     //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
  77.     @RequestMapping("/dataParam")
  78.     @ResponseBody
  79.     public String dataParam(Date date,
  80.                             @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
  81.                             @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
  82.         System.out.println("参数传递 date ==> "+date);
  83.         System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
  84.         System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
  85.         return "{'module':'data param'}";
  86.     }
  87. }
复制代码

  • public String listPojoParamForJson(@RequestBody List list)
  • 这个方法中注解代表的意思是形参接受的是请求头中的流量
  • 在config文件里面加上//开启json数据类型自动转换 @EnableWebMvc
  • json是以后很常用的传输方式
0x5响应
  1. @Controller
  2. public class UserController {
  3.     //响应页面/跳转页面
  4.     //返回值为String类型,设置返回值为页面名称,即可实现页面跳转
  5.     @RequestMapping("/toJumpPage")
  6.     public String toJumpPage(){
  7.         System.out.println("跳转页面");
  8.         return "page.jsp";
  9.     }
  10.     //响应文本数据
  11.     //返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
  12.     @RequestMapping("/toText")
  13.     @ResponseBody
  14.     public String toText(){
  15.         System.out.println("返回纯文本数据");
  16.         return "response text";
  17.     }
  18.     //响应POJO对象
  19.     //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
  20.     @RequestMapping("/toJsonPOJO")
  21.     @ResponseBody
  22.     public User toJsonPOJO(){
  23.         System.out.println("返回json对象数据");
  24.         User user = new User();
  25.         user.setName("itcast");
  26.         user.setAge(15);
  27.         return user;
  28.     }
  29.     //响应POJO集合对象
  30.     //返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
  31.     @RequestMapping("/toJsonList")
  32.     @ResponseBody
  33.     public List<User> toJsonList(){
  34.         System.out.println("返回json集合数据");
  35.         User user1 = new User();
  36.         user1.setName("传智播客");
  37.         user1.setAge(15);
  38.         User user2 = new User();
  39.         user2.setName("黑马程序员");
  40.         user2.setAge(12);
  41.         List<User> userList = new ArrayList<User>();
  42.         userList.add(user1);
  43.         userList.add(user2);
  44.         return userList;
  45.     }
  46. }
复制代码

  • 想返回一个页面直接把方法的返回值写成String然后返回那个页面的名字写在哪里
  • 响应文本数据
    返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
  • 响应POJO对象
    //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
  • 响应POJO集合对象
    返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
0x04总结

SpringMvc相较于Servlet开发简单了很多只需要常用的注解,我们需要记住的是它用了那些方式去传输数据和验证数据,方便以后对java框架的审计,mvc有很多内容是和Servlet重复的我只需要大概的复习一遍,解下来还有最后一点mvc的只是就是拦截器。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表