森网站建设,深圳医疗网站建设报价,济南网络优化网址,丹东网站建设平台目录
一、SpringMVC简介
二、RequestMapping#xff1a;请求路径映射
三、RestController
四、请求限定
五、请求处理
1.使用普通变量#xff0c;收集请求参数
2.使用RequestParam明确指定获取参数
3.目标方法参数是一个pojo
4.RequestHeader#xff1a;获取请求…目录
一、SpringMVC简介
二、RequestMapping请求路径映射
三、RestController
四、请求限定
五、请求处理
1.使用普通变量收集请求参数
2.使用RequestParam明确指定获取参数
3.目标方法参数是一个pojo
4.RequestHeader获取请求头信息
5.CookieValue注解获取cookie信息
6.使用pojo级联封装复杂属性
7.RequestBody获取请求体的JSON数据
8.单/多文件上传
9.HttpEntity获取整个请求
10.传入原生API
六、响应处理
1.返回JSON:自动将返回的对象转为JSON格式
2.文件下载 一、SpringMVC简介 Spring MVC是一个基于Java的实现MVC(Model-View-Controller)设计模式的Web应用程序框架。它是Spring框架的一部分专门用于构建Web应用程序。以下是Spring MVC的一些关键特性 请求驱动Spring MVC以请求为中心所有的操作都是围绕请求进行的。 灵活的控制器开发者可以定义自己的控制器来处理请求控制器可以是一个普通的 Java类里面包含一个或多个处理请求的方法。 视图解析器Spring MVC提供了灵活的视图解析机制可以根据返回值自动选择视图模板进行渲染。 数据绑定Spring MVC提供了强大的数据绑定功能可以将请求参数自动绑定到控制器方法的参数上。 模型和视图控制器可以向视图传递模型数据这些数据可以是简单的值也可以是复杂的对象。 拦截器Spring MVC支持拦截器可以在请求处理的不同阶段执行自定义逻辑。 异常处理Spring MVC提供了异常处理器可以集中处理控制器方法抛出的异常。 国际化Spring MVC支持国际化可以根据不同地区的用户显示不同的内容。 集成测试Spring MVC提供了测试支持可以方便地进行集成测试。 RESTful 支持Spring MVC支持构建RESTful Web服务。 Spring MVC通过注解(如Controller、RequestMapping、RequestParam等)简化了配置和开发过程使得开发者可以更专注于业务逻辑的实现。它与Spring框架的其他模块(如Spring Security、Spring Data JPA)紧密集成提供了一个完整的企业级Web应用程序开发解决方案。
二、RequestMapping请求路径映射
引入依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency
Controller
public class HelloController {ResponseBody // 把返回值放到响应体中RequestMapping(/hello)public String hello(){return hello 你好~~; // 默认认为返回值是跳到一个页面}
} 精确路径必须全局唯一 路径位置通配符多个都能匹配上精确匹配优先 * 匹配任意多个字符(0~n)不能匹配多个路径 **匹配任意多层路径 ? 匹配任意单个字符(1) 精确程度完全匹配 ? * ** 三、RestController RestController用于定义一个控制器类该类中的所有方法默认返回的是数据而不是视图。 作用RestController是Controller和ResponseBody的组合注解。它表明该类中的所有方法返回的数据直接写入HTTP响应体中而不是返回一个视图。 使用场景通常用于构建RESTful Web 服务返回JSON或XML格式的数据。
四、请求限定
RestController
public class RequestMappingLimitController {/*** 限制请求方式*/RequestMapping(value /test01, method {RequestMethod.POST, RequestMethod.GET})public String test01() {return test01;}/*** 限制请求参数*/RequestMapping(value /test02, params {age18, username, gender!1})public String test02() {return test02;}/*** 限制请求头*/RequestMapping(value /test03, headers {usernameadmin})public String test03() {return test03;}/*** 限制请求内容类型* application/json表示浏览器必须使用json格式发送数据*/RequestMapping(value /test04, consumes application/json)public String test04() {return test04;}/*** 限制响应内容类型* text/html;charsetutf-8表示浏览器必须使用html格式接收数据*/RequestMapping(value /test05, produces text/html;charsetutf-8)public String test05() {return h1test05h1;}
}五、请求处理
1.使用普通变量收集请求参数
RequestMapping(/handle01)
public String handle01(Integer id,String name) {System.out.println(id);System.out.println(name);return ok;
}
2.使用RequestParam明确指定获取参数 defaultValue如果参数没有传递则使用默认值 required是否必须传递默认为true value指定参数名 无论请求参数带到了请求体中还是没有带到请求体中都可以直接用RequestParam或者同一个变量名获取到参数值。 RequestMapping(/handle02)
public String handle02(RequestParam(id) Integer id,RequestParam(required false, defaultValue admin) String name) {System.out.println(id);System.out.println(name);return ok;
}
3.目标方法参数是一个pojo 如果目标方法参数是一个pojoSpringMVC会自动把请求参数和pojo属性对应起来 效果1.pojo的所有属性值都是来自于请求参数 2.请求参数必须和pojo属性名一致否则无法对应 3.如果请求参数没有和pojo属性对应上封装为null也可以给出默认值 RequestMapping(/handle03)
public String handle03(Person person) {System.out.println(person);return ok;
} 运行结果
Person(id12, name李四)
4.RequestHeader获取请求头信息
RequestMapping(/handle04)
public String handle04(RequestHeader(host) String host,RequestHeader(User-Agent) String userAgent,RequestHeader(Accept) String Accept) {System.out.println(host);System.out.println(userAgent);System.out.println(Accept);return ok;
}
5.CookieValue注解获取cookie信息
RequestMapping(/handle05)
public String handle05(CookieValue String username) {System.out.println(username);return ok;
} 6.使用pojo级联封装复杂属性
Data
public class Person {private Integer id;private String name;private Address address;private String[] hobbies;
}Data
public class Address {private String street;private String city;private String state;private String zipCode;
}
RequestMapping(/handle06)
public String handle06(Person person) {System.out.println(person);return ok;
} 运行结果
Person(id101, nameadmin, addressAddress(street平安大街, city北京, state东城区, zipCode100101), hobbies[唱, 跳, rap, 篮球])
7.RequestBody获取请求体的JSON数据 RequestBody获取请求体的JSON数据自动转为对象 如果是RequestBody Person person则得到一个对象如果是RequestBody String str则直接接收JSON字符串 RequestMapping(/handle07)
public String handle07(RequestBody Person person) {System.out.println(person);return ok;
} 运行结果
Person(id101, nameadmin, addressAddress(street平安大街, city北京, state东城区, zipCode100101), hobbies[唱, 跳, rap, 篮球])8.单/多文件上传
RequestParam取出文件项封装为MultipartFile就可以拿到文件内容
application.properties
# 每个单独上传的文件不能超过 50MB
spring.servlet.multipart.max-file-size50MB
# 限制整个 multipart/form-data 请求的最大允许大小
spring.servlet.multipart.max-request-size100MB
RequestMapping(/handle08)
public String handle08(Person person,RequestParam(headerImg) MultipartFile headerImgFile,RequestParam(lifeImg) MultipartFile[] lifeImgFiles) throws IOException {System.out.println(person);System.out.println(原始文件名 headerImgFile.getOriginalFilename());System.out.println(获取表单字段的名称 headerImgFile.getName());System.out.println(文件大小 headerImgFile.getSize());System.out.println(文件流 headerImgFile.getInputStream());System.out.println(文件类型 headerImgFile.getContentType());// 文件保存到本地headerImgFile.transferTo(new File(D:\\img\\ headerImgFile.getOriginalFilename()));System.out.println(文件数组 Arrays.toString(lifeImgFiles));if (lifeImgFiles.length 0) {for (MultipartFile lifeImgFile : lifeImgFiles) {lifeImgFile.transferTo(new File(D:\\img\\ lifeImgFile.getOriginalFilename()));}}return ok;
} 运行结果
Person(id13, nameadmin, addressnull, hobbiesnull)
原始文件名girl.png
获取表单字段的名称headerImg
文件大小4360
文件流java.io.FileInputStream7d79526d
文件类型image/png
文件数组[org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFiled0bebd7, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile57e61fe3, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile7f3c2d62, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile48e1e2d2]9.HttpEntity获取整个请求
RequestMapping(/handle09)
public String handle09(HttpEntityPerson entity) {// 获取请求头信息System.out.println(请求头 entity.getHeaders());// 获取请求体信息System.out.println(请求体 entity.getBody());return ok;
} 运行结果
请求头[user-agent:Apifox/1.0.0 (https://apifox.com), accept:*/*, host:localhost:8080, accept-encoding:gzip, deflate, br, connection:keep-alive, content-length:281, Content-Type:application/json;charsetUTF-8]
请求体Person(id101, nameadmin, addressAddress(street平安大街, city北京, state东城区, zipCode100101), hobbies[唱, 跳, rap, 篮球])10.传入原生API
RequestMapping(/handle10)
public void handle10(HttpServletRequest req,HttpServletResponse resp,HttpMethod method) throws IOException {System.out.println(请求方法 method);String username req.getParameter(username);System.out.println(username);resp.getWriter().write(ok username);
} 运行结果
请求方法GET
admin
六、响应处理
1.返回JSON:自动将返回的对象转为JSON格式
RequestMapping(/resp01)
public Person resp01() {Person person new Person();person.setId(1);person.setName(张三);Address address new Address();address.setStreet(北七家街道);address.setCity(北京市);address.setState(北京市);address.setZipCode(100000);person.setAddress(address);person.setHobbies(new String[]{打游戏, 看电影});return person;
} 2.文件下载
方式一
RequestMapping(/download)
public ResponseEntityInputStreamResource download() throws IOException {try (FileInputStream fileInputStream new FileInputStream(G:\\64q\\student\\group9\\baseProj\\src\\main\\webapp\\imgs\\girl.png);) {// 一次性读取所有文件会溢出// byte[] bytes fileInputStream.readAllBytes();// 解决文件名中文乱码问题String encode URLEncoder.encode(头像.png, UTF-8);// 解决文件过大OOM问题(内存溢出)InputStreamResource resource new InputStreamResource(fileInputStream);return ResponseEntity// 创建一个状态码为 200 (OK) 的响应.ok()// 设置响应的内容类型为二进制流适用于文件下载。.contentType(MediaType.APPLICATION_OCTET_STREAM)// 内容大小fileInputStream.available()只是一个估计值并不一定准确。.contentLength(fileInputStream.available())// 添加响应头指示浏览器将此响应作为附件下载并设置下载后的文件名为编码后的文件名。.header(Content-Disposition, attachment; filename encode)// 设置响应体为 InputStreamResource即文件内容.body(resource);}
} 方式二
AutowiredHttpServletRequest request;GetMapping(/test1)public ResponseEntitybyte[] download(String name) throws IOException {//获取文件路径String realPath request.getServletContext().getRealPath(/save/);//文件的全路径String allPath realPath name;//获取下载需要的文件流信息FileInputStream inputStream new FileInputStream(allPath);//获取流的数组byte[] buffer new byte[inputStream.available()];//读取inputStream.read(buffer);//文件下载的时候,显示的名字,需要改文件名了,再修改//设置响应的头信息,告诉浏览器,返回的是文件HttpHeaders httpHeaders new HttpHeaders();//设置响应的头信息,访问文件名中文乱码httpHeaders.setContentDispositionFormData(attachment, URLEncoder.encode(name,utf-8));ResponseEntitybyte[] responseEntity new ResponseEntity(buffer,httpHeaders, HttpStatus.OK);return responseEntity;}
方式三
AutowiredHttpServletResponse response;GetMapping(/test2)public void download2(String name) throws FileNotFoundException, UnsupportedEncodingException {//获取文件路径String realPath request.getServletContext().getRealPath(/save/);//文件的全路径String allPath realPath name;//判断文件是否存在File file new File(allPath);if (!file.exists()){throw new FileNotFoundException(name文件不存在);}//代码能执行到这一行,说明文件肯定存在//编码格式是utf-8的文件名String encodeFileName URLEncoder.encode(name, StandardCharsets.UTF_8.toString());//设置头信息 headerresponse.setHeader(Content-Disposition,attachment;filename*UTF-8encodeFileName);//使用 try--with --resources 关闭流try(FileInputStream inputStream new FileInputStream(file);OutputStream outputStream response.getOutputStream()){IOUtils.copy(inputStream,outputStream);outputStream.flush();} catch (IOException e) {throw new RuntimeException(e);}}