springmvc-day01

1.springMVC入门案例制作

springMVC项目的开发采用1+N技术
一次性工作
创建工程,设置服务器,加载工程
导入坐标
创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
springMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
多次工作
定义处理请求的控制器类
定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
在这里插入图片描述

(1)导入springMVC技术的坐标

<dependencies>
//servlet的依赖
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
//spring框架的依赖
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>
//tomcat服务器
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path></path>
        </configuration>
      </plugin>
    </plugins>
  </build>

(2)创建SpringMVC控制器类(等同于Servlet功能),新建一个controller包,放UserController
(这里为N)

/**
 * 制作控制器类,等同于servlet
 */

@Controller         //1.必须是一个spring管控的bean
public class UserController {

    @RequestMapping("/save")    //3.设置当前方法的访问路径
    @ResponseBody               //4.设置响应结果为json数据
    public String save() {    //2.定义具体处理请求的方法
        System.out.println("user save ...");
        return "{'moudle':'springmvc'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete() {
        System.out.println("user delete ...");
        return "{'moudle':'springmvc delete'}";
    }
}

(3)初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean,新建一个config包,下放SpringMvcConfig

/**
 * 定义配置类加载controller对应的bean
 */

@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

(4)初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求,在config包下新建ServletContainersInitConfig

/**
 * 定义servlet容器的配置类
 */

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {

    //加载springMVC配置
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置tomcat接收的请求哪些归springMVC处理
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //设置spring相关配置
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

2.能够根据需求设置请求路径

@Controller
@RequestMapping("/user")		//设置请求路径的前缀,访问路径为http://localhost/user/save
public class UserController {
		@RequestMapping("/save")
		@ResponseBody
		public String save(){
		System.out.println("user save ...");
		return "{'module':'user save'}";
	}
}

3.能够完成json格式请求参数的接收

(1)导入jackson坐标,用于将json转为各种类型

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
</dependency>

(2)在springmvc类中加入@EnableWebMvc注解,开启json数据类型自动转换

@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}

(3)在controller包下的UserController类中加入编写如下方法

//集合参数: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'}";
    }

三种json传递与接收的postman测试
普通数据类型集合参数:json格式
GET请求方式
请求路径为http://localhost/listParamForJson

//普通数据类型集合参数: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'}";
    }

传递参数

["game","music","travel"]

POJO参数:json格式
POST请求方式
请求路径为http://localhost/pojoParamForJson

//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'}";
    }

传递参数

{	//这里是对象里面嵌套对象name和age是普通数据类型,address为引用数据类型需要再封装为一个json对象"name"、"age"、"address"都只是名称,要保证与pojo实体类的类型一致
    "name":"itcast",
    "age":15,
    "address":{
        "province":"beijing",
        "city":"beijing" 
    }
}

POJO数据类型集合参数:json格式
POST请求方式
请求路径为http://localhost:80/listPojoParamForJson

//集合参数: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'}";
    }

传递参数

[	//首先这是一个数组,数组元素为对象,在json中用[]表示数组,用{}表示对象
    {"name":"itcast","age":15},
    {"name":"itheima","age":12}
]

日期参数
GET请求方式
请求路径为http://localhost:80/dateParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08

    //日期参数
    //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    @RequestMapping("/dateParam")
    @ResponseBody
    public String dataParam(Date date, //这里的pattern指的是前面传递参数的格式是否匹配,如果匹配则正确接收并转成一个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'}";
    }

4.能够完成json格式数据的响应

响应POJO对象
GET请求,请求路径为http://localhost/toJsonPOJO

//响应POJO对象  HttpMessageConvert接口实现json数据的转换(在jackson中)
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的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;
    }

响应的数据为

{
    "name": "itcast",
    "age": 15
}

响应POJO对象集合
GET请求,请求路径为http://localhost/toJsonList

//响应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;
    }

响应数据为

[	//首先返回一个数组,数组元素为两个json对象
    {
        "name": "传智播客",
        "age": 15
    },
    {
        "name": "黑马程序员",
        "age": 12
    }
]

5.能够基于RESTful实现页面数据的交互

(1)制作SpringMVC控制器,并通过PostMan测试接口功能

@RestController
@RequestMapping("/books")
public class BookController {

    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book save ==> "+ book);
        return "{'module':'book save success'}";
    }

    @GetMapping
    public List<Book> getAll(){
        System.out.println("book getAll is running ...");
        List<Book> bookList = new ArrayList<Book>();

        Book book1 = new Book();
        book1.setType("计算机");
        book1.setName("SpringMVC入门教程");
        book1.setDescription("小试牛刀");
        bookList.add(book1);

        Book book2 = new Book();
        book2.setType("计算机");
        book2.setName("SpringMVC实战教程");
        book2.setDescription("一代宗师");
        bookList.add(book2);

        Book book3 = new Book();
        book3.setType("计算机丛书");
        book3.setName("SpringMVC实战教程进阶");
        book3.setDescription("一代宗师呕心创作");
        bookList.add(book3);

        return bookList;
    }

}

在这里插入图片描述
(2)设置对静态资源的访问放行,在config包下新建一个SpringMvcSupport,为的是防止所有的资源请求都被MVC拦截,对某些前端资源进行放行

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    //设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //当访问/pages/????时候,从/pages目录下查找内容
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

(3)前端页面通过异步提交访问后台控制器

//添加
saveBook () {
    axios.post("/books",this.formData).then((res)=>{ 
     
    });
},
//主页列表查询
getAll() {    
    axios.get("/books").then((res)=>{        
   		this.dataList = res.data;	//将返回值绑定表单显示
	});
},
SpringMVC 中,我们可以通过 ResponseBody 注解返回音频流,具体步骤如下: 1. 在 Controller 中定义一个返回类型为 ResponseEntity<byte[]> 的方法,该方法需要使用 @ResponseBody 注解标注。 2. 在方法中获取音频文件的字节数组,并将其放入 ResponseEntity 对象中返回。 3. 在 ResponseEntity 对象中设置 Content-Type、Content-Disposition 等响应头,以便浏览器正确解析音频流并进行播放。 示例代码如下: ```java @RequestMapping("/audio") @ResponseBody public ResponseEntity<byte[]> getAudio() throws IOException { // 读取音频文件字节数组 InputStream in = getClass().getResourceAsStream("/static/audio/sample.mp3"); byte[] audioBytes = IOUtils.toByteArray(in); // 设置响应头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("audio/mpeg")); headers.setContentDispositionFormData("attachment", "sample.mp3"); // 返回音频流 return new ResponseEntity<>(audioBytes, headers, HttpStatus.OK); } ``` 上述代码中,我们将音频文件 sample.mp3 放在了项目的 /static/audio 目录下。在方法中,我们使用 IOUtils.toByteArray() 方法将音频文件转换为字节数组,并将其放入 ResponseEntity 对象中返回。在设置响应头时,我们使用 MediaType.parseMediaType() 方法设置 Content-Type,使用 setContentDispositionFormData() 方法设置 Content-Disposition。最后,我们通过 new ResponseEntity<>(audioBytes, headers, HttpStatus.OK) 创建 ResponseEntity 对象并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值