IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java_SpirngMVC_restful规范 -> 正文阅读

[Java知识库]Java_SpirngMVC_restful规范

一、SpringMVC的介绍

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,可以理解为这个框架包含了servlet的功能并代替了它。

二、SpirngMVC的依赖坐标

<!--springmvc-->
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.10.RELEASE</version>
</dependency>
 <!--servlet-->
<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
</dependency>

最重要的SpringMVCConfig.java配置类:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan({"cn.itheima.controller","cn.itheima.config"})
//其实controller和servlet是相似的处理前端页面和后端的链接的是web层框架
//扫描controller下的类中的注解,尽量将springmvc的注解和spring的注解分开扫描,不会占过多不必要的内存
//毕竟spring的bean和springmvc的bean的格式不同也用不上
@EnableWebMvc
public class SpringMVCConfig {
}

三、对SpringMVC进行配置

使用SpringMVC其实是在tomcat接收到浏览器的请求后将请求交给DispatcherServlet,将DispatcherServlet加入到Spring中让DispatcherServlet来对后台的controller,Bean等进行管理。
DispatchaerServlet.java(注释里面有详细解释)

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

import javax.servlet.Filter;

//这个文件在tomcat开启会被自动扫描
public class DispatcherServlet extends AbstractDispatcherServletInitializer {
//    为啥web的ioc不一样,因为这里东西给springMVC的dispatcherServlet调用,所以跟以前容器的结构不一样
    /*
    * 保存格式:   键:访问路径  值:{当前controller对象,当前对象中的方法}
    * */
//    让Controller的类(bean)加载进web的ioc容器中,这个容器中的内容是为了让dispatcherServlet执行的
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();
        annotationConfigWebApplicationContext.register(SpringMVCConfig.class);

        return annotationConfigWebApplicationContext;
    }
//设置springmvc的管理范围
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
//加载spring的ioc容器
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    // 添加post请求过滤器,解决请求过程中的中文乱码问题,但不能解决返回中中文乱码的问题
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("utf-8");
        return new Filter[]{characterEncodingFilter};
    }
}

简写版:

//简写版
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class DispathcerServlet2 extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringMVCConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpirngConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

四、在未使用restful风格时使用的到的注解

4.1

@Configuration:标明是一个注解类。
@ComponentScan({"cn.itheima.controller","cn.itheima.config"}):扫描controller包小的“@Controller”注解。
@EnableWebMvc: 传递日期类型参数必须在配置类上使用@EnableWebMvc注解。其功能之一:根据类型匹配对应的类型转换器
@Controller:将其按照一个Controller对象,保存进web的IOC容器中,其实和"@Conpoment"类似只不过保存在ioc容器中的格式不一样。
@RequestMapping(“/path”):设置访问路径,可以写在方法上,也可以写在类的上面用来区分不同的controller。
@ResponseBody:告诉springmvc这是数据不是页面,相当于,曾经写的servelet中的Response响应体,resp.getWrite().write(" ")。若是不加则会被当成页面来跳转。
@RequestParam:保证与浏览器url中发送的参数名称一致,用来获取参数的值

4.2使用的演示

import cn.itheima.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

//将其按照一个Controller对象,保存进web的IOC容器中,其实和@Conpoment类似只不过保存在ioc容器中的格式不一样
@Controller
@RequestMapping("/user")
public class UserController {
//    设置访问路径
    @RequestMapping("/findAll")
//    告诉mvc这是数据不是页面,相当于,曾经写的servelet中的Response响应体,resp.getWrite().write("")
//    若是不加则会被当成页面来跳转
    @ResponseBody
    public String findAll(String name,int age){
        System.out.println("我执行了");
        System.out.println("=====>"+name);
        System.out.println("=====>"+age);
        return "[{'name1':'chen'},{'name2':'qing'},{'name3':'xv}]";
    }

    @RequestMapping("/addUser")

    @ResponseBody
    public String addUser(User user){
        System.out.println("我执行了");
        System.out.println("=====>"+user);
        return "[{'name1':'chen'},{'name2':'qing'},{'name3':'xv}]";
    }

    @RequestMapping("/selectById")
    @ResponseBody
    public String addUser(@RequestParam("id") int ids){//保证与浏览器url中发送的参数名称一致
        System.out.println("我执行了");
        System.out.println("=====>"+ids);
        return "[{'name1':'chen'},{'name2':'qing'},{'name3':'xv}]";
    }
}

集合类型参数

请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
在这里插入图片描述

五、在对JSON串操作时出现的注解

@RequestBody:给JSON用的,因为你的参数是从请求体重传过来的,需要标注一下,当检测到前端传的json串时会自动封装成对象。
@DateTimeFormat:针对的是路径上的参数用来处理前端传过来的日期类型比如:"2012-08-12",或"2012/08/12"等。
@JsonFormat(pattern=“yyyy-MM-dd”):针对引用类型中出现Date类型,将其放在类中Date类型的属性的头上
@Jsonignore:转json串时忽略类中的头上有该注解的属性

使用演示:

import cn.itheima.pojo.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.ResponseBody;

import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/Json")
public class JsonController {
    //    json数组的传递
    //["chen","qing","xv"]
    @RequestMapping("/array")
    @ResponseBody
    public String arrayList(@RequestBody List<String> list) {
        System.out.println("我执行了");
        System.out.println(list);
        return "[{'woshishei':'皮卡丘'},{'woshishei':'皮卡丘'}]";
    }

    //    接收Json对象的,参数名字和类中属性名字相同就可以自动赋值
    //   {"username":"陈庆旭1","password":"1234561"}
    @RequestMapping("/duixiang")
    @ResponseBody
    public String JsonUser(@RequestBody User user) {
        System.out.println("我执行了");
        System.out.println(user);
        return "[{'woshishei':'皮卡丘'},{'woshishei':'皮卡丘'}]";
    }
    
//    接收Json对象的数组,前端样式:
 //[{"username":"***1","password":"123***1"},{
 //   "username":"***2","password":"12****2"},{
 //   "username":"***3","password":"12****3"}]
    @RequestMapping("/duixiangs")
    @ResponseBody
    public String JsonUsers(@RequestBody List<User> users){//因为你的参数是从请求体重传过来的
        System.out.println("我执行了");
        System.out.println(users);
        return "[{'woshishei':'皮卡丘'},{'woshishei':'皮卡丘'}]";
    }
//    接收日期类型
    @RequestMapping("/dates")
    @ResponseBody
    public String JsonData(@DateTimeFormat(pattern = "yyyy/MM/dd") Date date){
        System.out.println(date);
        return "lksj";
    }
}

解决响应数据是中文乱码的问题:

import cn.itheima.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/resp")
public class ResponseController {
    @RequestMapping("/a")
    @ResponseBody
    public User resp(){
        User user = new User();
        user.setUsername("皮卡丘");
        user.setPassword("123456");
//        因为使用了@EnableWebMVC,所以系统检测出返回的是一个json对象时会自动转变成json发给前端,如果响应的是String则
//        可以改成@RequestMapping(value="/resp",produces="text/html;charset=utf-8")
        return user;
    }
}

六、在使用了restful风格之后的注解使用

@RestController:是@ResponseBody+@Controller的结合
@PostMapping:这是请求方法加上@RequestMapping的综合写法,post表示添加操作
@GetMapping("/{id}"):get表示查找操作,请求路径中可以携带参数
@PutMapping:表示更新操作
@DeleteMapping("/{bookId}"):表示删除操作
@PathVariable:用在restful风格上的,因为name是在请求路径上的,所以使用@PathVariable标注一下和GetMapping他们配合使用

使用演示:

import cn.itheima.pojo.Book;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController//是@ResponseBody+@Controller
@RequestMapping("/books")
public class RestfulController {

    @PostMapping//这是请求方法加上@RequestMapping的综合写法
    public String addBook(@RequestBody Book book) {
        System.out.println(book);
        return "success";
    }
    
//如果注解方式相同则会冲突
/*    @GetMapping("/{name}")
    //如果请求路径中有参数需要接收,形如:http://localhost:8080/day04SpringMVC/books/2
//    rest风格不需要显示出准确的操作方法,但是路径按照格式写成“/XXXs”的样式
//    在rest风格中,请求路径中的参数可以不使用“?name=xxx&age=15”的形式,直接写数值就可以
//    保证参数名和GetMapping中的占位符相同
    public int getBook(@PathVariable String name) {//因为name是在请求路径上的,所以使用@PathVariable
        System.out.println("查询name为:" + name + "的书籍");
        return 2;
    }*/

    @GetMapping("/{id}")
   public String getBook2(@PathVariable int id) {//因为name是在请求路径上的,所以使用@PathVariable
        System.out.println("查询id为:" + id + "的书籍");
        return "success";
    }

    @PutMapping
    public int update(@RequestBody Book book) {
        System.out.println("修改:" + book);
        return 2;
    }

    @DeleteMapping("/{bookId}")
    public int deleteById(@PathVariable int bookId) {
        System.out.println("删除编号为:" + bookId + "的书籍");
        return 2;
    }

}

七、在对页面进行整合时

因为在DispatcherServlet.java中配置springMVC时配置了:

//设置springmvc的管理范围
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

表示将所有操作都交给springmvc管理,所以关于页面的静态文件都会被拦截,因此需要配置一下过滤器:
webSpport.java:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebSupport extends WebMvcConfigurationSupport {
//    配置该类为了使springMvc对这些静态文件放行
//  以后有什么文件需要放行,也在这里配置
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:07:52  更:2022-07-17 16:11:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:52:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码