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
写一个配置类- //springmvc配置类,本质上还是一个spring配置类
- @Configuration
- @ComponentScan("com.itheima.controller")
- public class SpringMvcConfig {
- }
复制代码 写加载类去加载spring容器里的bean- package com.itheima.config;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
- import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
- //web容器配置类
- public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
- //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
- protected WebApplicationContext createServletApplicationContext() {
- //初始化WebApplicationContext对象
- AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
- //加载指定配置类
- ctx.register(SpringMvcConfig.class);
- return ctx;
- }
- //设置由springmvc控制器处理的请求映射路径
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- //加载spring配置类
- protected WebApplicationContext createRootApplicationContext() {
- return null;
- }
- }
复制代码 控制器- package com.itheima.controller;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- //定义表现层控制器bean
- @Controller
- public class UserController {
- //设置映射路径为/save,即外部访问路径
- @RequestMapping("/save")
- //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
- @ResponseBody
- public String save(){
- System.out.println("user save ...");
- return "{'info':'springmvc'}";
- }
- //设置映射路径为/delete,即外部访问路径
- @RequestMapping("/delete")
- @ResponseBody
- public String delete(){
- System.out.println("user save ...");
- return "{'info':'springmvc'}";
- }
- }
复制代码
- 简单配置就说的是用@@RequestMapping作为访问的路径
- @ResponseBody写在函数上面就可以用该函数的返回值作为响应值,也可以设置请求方式
0x03MVC常用注解
0x1配置简化开发
- package com.itheima.config;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
- import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
- import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
- //web配置类简化开发,仅设置配置类类名即可
- public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
- protected Class<?>[] getRootConfigClasses() {
- return new Class[]{SpringConfig.class};
- }
- protected Class<?>[] getServletConfigClasses() {
- return new Class[]{SpringMvcConfig.class};
- }
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- }
- /*
- public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
- protected WebApplicationContext createServletApplicationContext() {
- AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
- ctx.register(SpringMvcConfig.class);
- return ctx;
- }
- protected WebApplicationContext createRootApplicationContext() {
- AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
- ctx.register(SpringConfig.class);
- return ctx;
- }
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- }
- */
复制代码 0x2路径配置
- @Controller
- //类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
- @RequestMapping("/user")
- public class UserController {
- //请求路径映射
- @RequestMapping("/save")
- @ResponseBody
- public String save(){
- System.out.println("user save ...");
- return "{'module':'user save'}";
- }
- //请求路径映射
- @RequestMapping("/delete")
- @ResponseBody
- public String delete(){
- System.out.println("user delete ...");
- return "{'module':'user delete'}";
- }
- }
复制代码
- 访问第一个方法的路径是/user/save
- 第二个方法的路径是/user/delete
0x3请求方式和注解
- //请求参数
- @Controller
- public class UserController {
- //普通参数:请求参数与形参名称对应即可完成参数传递
- @RequestMapping("/commonParam")
- @ResponseBody
- public String commonParam(String name ,int age){
- System.out.println("普通参数传递 name ==> "+name);
- System.out.println("普通参数传递 age ==> "+age);
- return "{'module':'common param'}";
- }
- //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
- @RequestMapping("/commonParamDifferentName")
- @ResponseBody
- public String commonParamDifferentName(@RequestParam("name") String userName , int age){
- System.out.println("普通参数传递 userName ==> "+userName);
- System.out.println("普通参数传递 age ==> "+age);
- return "{'module':'common param different name'}";
- }
- //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
- @RequestMapping("/pojoParam")
- @ResponseBody
- public String pojoParam(User user){
- System.out.println("pojo参数传递 user ==> "+user);
- return "{'module':'pojo param'}";
- }
- //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
- @RequestMapping("/pojoContainPojoParam")
- @ResponseBody
- public String pojoContainPojoParam(User user){
- System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
- return "{'module':'pojo contain pojo param'}";
- }
- //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
- @RequestMapping("/arrayParam")
- @ResponseBody
- public String arrayParam(String[] likes){
- System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
- return "{'module':'array param'}";
- }
- //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
- @RequestMapping("/listParam")
- @ResponseBody
- public String listParam(@RequestParam List<String> likes){
- System.out.println("集合参数传递 likes ==> "+ likes);
- return "{'module':'list param'}";
- }
- //集合参数:json格式
- //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
- //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
- @RequestMapping("/listParamForJson")
- @ResponseBody
- public String listParamForJson(@RequestBody List<String> likes){
- System.out.println("list common(json)参数传递 list ==> "+likes);
- return "{'module':'list common for json param'}";
- }
- //POJO参数:json格式
- //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
- //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
- @RequestMapping("/pojoParamForJson")
- @ResponseBody
- public String pojoParamForJson(@RequestBody User user){
- System.out.println("pojo(json)参数传递 user ==> "+user);
- return "{'module':'pojo for json param'}";
- }
- //集合参数:json格式
- //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
- //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
- @RequestMapping("/listPojoParamForJson")
- @ResponseBody
- public String listPojoParamForJson(@RequestBody List<User> list){
- System.out.println("list pojo(json)参数传递 list ==> "+list);
- return "{'module':'list pojo for json param'}";
- }
- //日期参数
- //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
- @RequestMapping("/dataParam")
- @ResponseBody
- public String dataParam(Date date,
- @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
- @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
- System.out.println("参数传递 date ==> "+date);
- System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
- System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
- return "{'module':'data param'}";
- }
- }
复制代码
- 请求方式的配置是在路径也就是@RequestMapping后面配上method=request.get/post/put/delete
- 当输入的参数和获取的参数不同时候用,@RequestParam("name")这种类似的标签给形参绑定值,如果形参和传入值相同的话可以不用谢注解
0x4JSON传输
- 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;//请求参数
- @Controller
- public class UserController {
- //普通参数:请求参数与形参名称对应即可完成参数传递
- @RequestMapping("/commonParam")
- @ResponseBody
- public String commonParam(String name ,int age){
- System.out.println("普通参数传递 name ==> "+name);
- System.out.println("普通参数传递 age ==> "+age);
- return "{'module':'common param'}";
- }
- //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
- @RequestMapping("/commonParamDifferentName")
- @ResponseBody
- public String commonParamDifferentName(@RequestParam("name") String userName , int age){
- System.out.println("普通参数传递 userName ==> "+userName);
- System.out.println("普通参数传递 age ==> "+age);
- return "{'module':'common param different name'}";
- }
- //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
- @RequestMapping("/pojoParam")
- @ResponseBody
- public String pojoParam(User user){
- System.out.println("pojo参数传递 user ==> "+user);
- return "{'module':'pojo param'}";
- }
- //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
- @RequestMapping("/pojoContainPojoParam")
- @ResponseBody
- public String pojoContainPojoParam(User user){
- System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
- return "{'module':'pojo contain pojo param'}";
- }
- //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
- @RequestMapping("/arrayParam")
- @ResponseBody
- public String arrayParam(String[] likes){
- System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
- return "{'module':'array param'}";
- }
- //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
- @RequestMapping("/listParam")
- @ResponseBody
- public String listParam(@RequestParam List<String> likes){
- System.out.println("集合参数传递 likes ==> "+ likes);
- return "{'module':'list param'}";
- }
- //集合参数:json格式
- //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
- //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
- @RequestMapping("/listParamForJson")
- @ResponseBody
- public String listParamForJson(@RequestBody List<String> likes){
- System.out.println("list common(json)参数传递 list ==> "+likes);
- return "{'module':'list common for json param'}";
- }
- //POJO参数:json格式
- //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
- //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
- @RequestMapping("/pojoParamForJson")
- @ResponseBody
- public String pojoParamForJson(@RequestBody User user){
- System.out.println("pojo(json)参数传递 user ==> "+user);
- return "{'module':'pojo for json param'}";
- }
- //集合参数:json格式
- //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
- //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
- @RequestMapping("/listPojoParamForJson")
- @ResponseBody
- public String listPojoParamForJson(@RequestBody List<User> list){
- System.out.println("list pojo(json)参数传递 list ==> "+list);
- return "{'module':'list pojo for json param'}";
- }
- //日期参数
- //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
- @RequestMapping("/dataParam")
- @ResponseBody
- public String dataParam(Date date,
- @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
- @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
- System.out.println("参数传递 date ==> "+date);
- System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
- System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
- return "{'module':'data param'}";
- }
- }
复制代码
- public String listPojoParamForJson(@RequestBody List list)
- 这个方法中注解代表的意思是形参接受的是请求头中的流量
- 在config文件里面加上//开启json数据类型自动转换 @EnableWebMvc
- json是以后很常用的传输方式
0x5响应
- @Controller
- public class UserController {
- //响应页面/跳转页面
- //返回值为String类型,设置返回值为页面名称,即可实现页面跳转
- @RequestMapping("/toJumpPage")
- public String toJumpPage(){
- System.out.println("跳转页面");
- return "page.jsp";
- }
- //响应文本数据
- //返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
- @RequestMapping("/toText")
- @ResponseBody
- public String toText(){
- System.out.println("返回纯文本数据");
- return "response text";
- }
- //响应POJO对象
- //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
- @RequestMapping("/toJsonPOJO")
- @ResponseBody
- public User toJsonPOJO(){
- System.out.println("返回json对象数据");
- User user = new User();
- user.setName("itcast");
- user.setAge(15);
- return user;
- }
- //响应POJO集合对象
- //返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
- @RequestMapping("/toJsonList")
- @ResponseBody
- public List<User> toJsonList(){
- System.out.println("返回json集合数据");
- User user1 = new User();
- user1.setName("传智播客");
- user1.setAge(15);
- User user2 = new User();
- user2.setName("黑马程序员");
- user2.setAge(12);
- List<User> userList = new ArrayList<User>();
- userList.add(user1);
- userList.add(user2);
- return userList;
- }
- }
复制代码
- 想返回一个页面直接把方法的返回值写成String然后返回那个页面的名字写在哪里
- 响应文本数据
返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
- 响应POJO对象
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
- 响应POJO集合对象
返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
0x04总结
SpringMvc相较于Servlet开发简单了很多只需要常用的注解,我们需要记住的是它用了那些方式去传输数据和验证数据,方便以后对java框架的审计,mvc有很多内容是和Servlet重复的我只需要大概的复习一遍,解下来还有最后一点mvc的只是就是拦截器。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |