Обмен технологиями

Разработка веб-сервера — запрос ответа

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Оглавление

Предисловие

просить

простые параметры

оригинальный метод

Весенний путь

Искаженная обработка почтового запроса

Параметры сущности

Простые параметры сущности

Параметры сложной сущности

Редактировать

параметры коллекции массива

Параметры массива

Редактировать

Параметры сбора

параметр даты

Редактировать

Параметры Json

Редактировать

Передать данные JSON

JSON-массив

объект json (POJO)

коллекция json (POJO)

Уведомление

параметры пути

Путь сопоставления запроса

@RequestMapping

Параметры запроса

ответ

@ResponseBody

Единые результаты ответа


Предисловие

Запрос: Получить данные запроса

Ответ: Установить данные ответа

Архитектура BS Браузер/Сервер, режим архитектуры браузер/сервер, клиенту нужен только браузер, а логика и данные приложения хранятся на сервере (Простота в обслуживании, средний опыт

Архитектура CS Клиент/Сервер, режим архитектуры клиент/сервер (Разработка и сопровождение хлопотны, но опыт хороший

просить

простые параметры

оригинальный метод

Получить вручную через HttpServletRequest.

  1. import jakarta.servlet.http.HttpServletRequest;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class RequestController {
  6. @RequestMapping("/SimpleParam")
  7. public String SimpleParam(HttpServletRequest request){ //返回的字符串类型是String
  8. String name=request.getParameter("name");
  9. String age=request.getParameter("age"); //通过这个方法得到字符串类型的
  10. int age1=Integer.parseInt(age); //将年龄进行类型转换
  11. System.out.println(name+":"+age1); //设置返回格式
  12. return "OK";
  13. }
  14. }

Весенний путь

Простые параметры:Имя параметра совпадает с именем формальной переменной параметра.определение формальных параметров означает получение параметров

  1. @RestController
  2. public class RequestController {
  3. @RequestMapping("/SimpleParam")
  4. public String SimpleParam(String name,Integer age){
  5. System.out.println(name+":"+age);
  6. return "OK";
  7. }
  8. }

Обратите внимание, что здесь указаны все URL-адреса почтальона.http://localhost:8080/SimpleParam?name=tom&age=10

Оба вышеперечисленных запроса являются запросами на публикацию. Если это запрос на публикацию, вам нужно только ввести URL-адрес в Postman.http://localhost:8080/SimpleParam

Искаженная обработка почтового запроса

Если в сообщении есть китайские иероглифы, на заднем плане будут отображаться искаженные символы, поэтому установите фильтр в конфигурации.

Добавьте фильтр в веб-контейнер и укажите набор символов. Специальный фильтр символов предоставляется в пакете Spring-web.

  1. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
  2.    protected Class<?>[] getRootConfigClasses() {
  3.        return new Class[0];
  4.   }
  5.    protected Class<?>[] getServletConfigClasses() {
  6.        return new Class[]{SpringMvcConfig.class};
  7.   }
  8.    protected String[] getServletMappings() {
  9.        return new String[]{"/"};
  10.   }
  11.    //乱码处理
  12.    @Override
  13.    protected Filter[] getServletFilters() {
  14.        CharacterEncodingFilter filter = new CharacterEncodingFilter();
  15.        filter.setEncoding("UTF-8");
  16.        return new Filter[]{filter};//如果有多个过滤器,在这里用,隔开
  17.   }
  18. }

Обратите внимание, что этот процесс предназначен для сообщения. Если get передается на китайском языке, искаженные символы все равно будут отображаться.

Если имя параметра метода не соответствует имени параметра запроса, вы можете использовать @RequestParam для завершения сопоставления.

  1. @RestController
  2. public class RequestController {
  3. @RequestMapping("/SimpleParam")
  4. public String SimpleParam(@RequestParam(name="name") String username, Integer age){ //引号中写的是请求参数名
  5. System.out.println(username+":"+age);
  6. return "OK";
  7. }
  8. }

Обязательный атрибут в @PequestParam по умолчанию имеет значение true, что означает, что параметр запроса должен быть передан. Если он не передан, будет сообщено об ошибке. Если параметр является необязательным (то есть он может быть передан или нет), то Для обязательного атрибута можно установить значение false (таким образом, не будет сообщено об ошибке, если вы его передадите или нет)

Параметры сущности

Простые параметры сущности

Имя параметра запроса такое же, как имя атрибута формального параметра, просто определите Pojo для его получения.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/SimpleParam1")
  4. public String SimplePojo(user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }
  1. public class user {
  2. private String name;
  3. private Integer age;
  4. //加getter和setter方法toString
  5. }

URL-адрес здесьhttp://localhost:8080/SimpleParam1?name=cat&age=29

Параметры сложной сущности

Имя параметра запроса совпадает с именем атрибута формального параметра., вы можете получать параметры вложенных атрибутов pojo в соответствии с отношениями иерархии объектов.

  1. public class user {
  2. private String name;
  3. private Integer age;
  4. private Address address;
  5. //加getter和setter和toString
  6. }
  1. public class Address {
  2. private String province;
  3. private String city;
  4. //加getter和setter还有toString
  5. }
  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/ComplexParam1")
  4. public String ComplexParam(user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }

параметры коллекции массива

Параметры массива

Имя параметра запроса совпадает с формальным именем группы параметров, и существует несколько запросов., определите формальный параметр типа массива для получения параметров

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/arrayParam")
  4. public String ArrayParam(String[] hobby) {//在这里建立一个数组,然后后面的名称和传入参数相同
  5. System.out.println(Arrays.toString(hobby));
  6. return "yes";
  7. }
  8. }

Параметры сбора

Имя параметра запроса совпадает с именем формальной коллекции параметров, и существует несколько параметров запроса.@RequestParamСвязь параметров привязки

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/listParam")
  4. public String ArrayParam(@RequestParam List<String> hobby) {
  5. System.out.println(hobby);
  6. return "yes";
  7. }
  8. }

параметр даты

Используйте аннотацию @DateTimeFormat для завершения преобразования формата параметра даты.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/dateParam")
  4. public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime) {
  5. System.out.println(updateTime);
  6. return "yes";
  7. }
  8. }

  1. //日期参数    
  2. //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd   @RequestMapping("/dataParam")    
  3. @ResponseBody    
  4. public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){        
  5. System.out.println("参数传递 date ==> "+date);        
  6. System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);        
  7. System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);        
  8. return "{'module':'data param'}";   }
  9. }
  10. //@DateTimeFormat是形参注解,用在SpringMVC控制器方法形参前面,用于设定日期时间型数据格式//属性:pattern:日期时间格式字符串

Получить тест:

http://localhost:8080/springmvc_04_request_param/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08

Параметры Json

Имя ключа параметра json совпадает с именем атрибута объекта формального параметра. Вы можете получить параметры, определив формальный параметр типа Pojo. Вам необходимо использовать идентификатор @RequestBody.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/jsonParam")
  4. public String jsonParam(@RequestBody user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }
  9. //user这和前面的复杂实体参数一样

Инкапсулируйте json в класс пользовательской сущности через @requestbody

Передать данные JSON

Сначала импортируйте координаты

  1. <dependency>
  2.  <groupId>com.fasterxml.jackson.core</groupId>
  3.  <artifactId>jackson-databind</artifactId>
  4.  <version>2.9.0</version>
  5. </dependency>

Включить поддержку автоматического преобразования данных Json.

  1. @Configuration
  2. @ComponentScan("com.itheima.controller")
  3. //开启json数据类型自动转换
  4. @EnableWebMvc
  5. public class SpringMvcConfig {
  6. }
JSON-массив
   
  1. //集合参数:json格式
  2.    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3.    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
  4. //它用来将请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
  5.    @RequestMapping("/listParamForJson")
  6.    @ResponseBody
  7.    public String listParamForJson(@RequestBody List<String> likes){
  8.        System.out.println("list common(json)参数传递 list ==> "+likes);
  9.        return "{'module':'list common for json param'}";
  10.   }
объект json (POJO)
  1. //POJO参数:json格式
  2. //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3. //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
  4. @RequestMapping("/pojoParamForJson")
  5. @ResponseBody
  6. public String pojoParamForJson(@RequestBody User user){
  7.    System.out.println("pojo(json)参数传递 user ==> "+user);
  8.    return "{'module':'pojo for json param'}";
  9. }

При выполнении запроса Get:

  1. {
  2.    "name":"xixi",
  3.    "age":21,
  4.    "address":{
  5.        "provice":"taiyuan",
  6.        "city":"taiyuan"
  7.   }
  8. }
коллекция json (POJO)
  1. //集合参数:json格式
  2. //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3. //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
  4. @RequestMapping("/listPojoParamForJson")
  5. @ResponseBody
  6. public String listPojoParamForJson(@RequestBody List<User> list){
  7.    System.out.println("list pojo(json)参数传递 list ==> "+list);
  8.    return "{'module':'list pojo for json param'}";
  9. }

При выполнении запроса Get:

  1. [{"name":"xixi","age":12},
  2. {"name":"haha","age":21}
  3. ]
Уведомление

параметры пути

Передавайте параметры непосредственно через URL-адрес запроса. Используйте {...} для определения параметров пути. Для получения параметров пути необходимо использовать @PathVariable.

параметр пути

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/path/{id}")
  4. public String pathParam(@PathVariable Integer id) {
  5. System.out.println(id);
  6. return "yes";
  7. }
  8. }

URL-адрес, проверенный почтальоном:http://localhost:8080/path/1

Несколько параметров пути

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/path/{id}/{name}")
  4. public String pathParam(@PathVariable Integer id ,@PathVariable String name) {
  5. System.out.println(id+":"+name);
  6. return "yes";
  7. }
  8. }

URL-адрес, проверенный почтальоном:http://localhost:8080/path/1/cat

Путь сопоставления запроса

Вопрос: Пути, запрошенные при разработке, должны быть разные, но если пути одинаковые, то будет выдано сообщение об ошибке, какой из них следует вызывать----------обычно через.Установите имя модуля в качестве префикса к пути запроса.

@RequestMapping

Это аннотация метода и аннотация класса.

Поместите его над определением метода контроллера SpringMVC.

Используется для установки пути запроса метода контроллера., если вы устанавливаете текущий метод контроллера в классе, запросите префикс пути доступа

  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. }

Свойства: значение (по умолчанию): Запросить путь доступа.Или префикс пути доступа

Параметры запроса

@RequestParam — это формальная аннотация параметра, расположенная перед определением параметра метода контроллера SpringMVC, используемая для связывания связи между параметрами запроса и параметрами метода процессора.

Параметры: требуется: является ли это обязательным параметром. DefaultValue: значение параметра по умолчанию.

ответ

@ResponseBody

Являются ли аннотации методов и аннотации классов

Расположен в методе/классе контроллера

ФункцияНепосредственный ответ на возвращаемое значение метода. Если тип возвращаемого значения является объектом или коллекцией сущности, он будет преобразован в ответ формата JSON.

@RestController=@Controller+@ResponseBody

  1. @RestController
  2. public class ResponseController {
  3. @RequestMapping("/hello")
  4. public String hello(){
  5. System.out.println("hello world");
  6. return "hello world~";
  7. }
  8. @RequestMapping("/getAddr")
  9. public Address getAddr(){
  10. Address addr=new Address();
  11. addr.setProvince("山西");
  12. addr.setCity("太原");
  13. return addr;
  14. }
  15. @RequestMapping("/listAddr")
  16. public List<Address> ListAddr(){
  17. List<Address> list=new ArrayList<>();
  18. Address addr=new Address();
  19. addr.setProvince("山西");
  20. addr.setCity("太原");
  21. Address addr2=new Address();
  22. addr2.setProvince("山");
  23. addr2.setCity("太");
  24. list.add(addr);
  25. list.add(addr2);
  26. return list;
  27. }
  28. }

Тест вводится в почтальонhttp://localhost:8080/listAddrВот и все, другие подобные

Каждый метод, доступный извне, называется функциональным интерфейсом (например, выше есть три интерфейса), а путь — это путь доступа к ним.

Проблема заключается в том, что результаты их ответов различны, а окончательный анализ результатов более затруднителен, поэтому результаты ответов необходимо унифицировать.

Единые результаты ответа

  1. public class Result {
  2. private Integer code;
  3. private String msg;
  4. private Object data;
  5. public Result(){
  6. }
  7. public Result(Integer code,String msg,Object data){
  8. this.code=code;
  9. this.msg=msg;
  10. this.data=data;
  11. }
  12. public Integer getCode() {
  13. return code;
  14. }
  15. public void setCode(Integer code) {
  16. this.code = code;
  17. }
  18. public String getMsg() {
  19. return msg;
  20. }
  21. public void setMsg(String msg) {
  22. this.msg = msg;
  23. }
  24. public Object getData() {
  25. return data;
  26. }
  27. public void setData(Object data) {
  28. this.data = data;
  29. }
  30. public static Result success(Object data){
  31. return new Result(1,"success",data);
  32. }
  33. public static Result success(){
  34. return new Result(1,"success",null);
  35. }
  36. public static Result error(String msg){
  37. return new Result(0,msg,null);
  38. }
  39. @Override
  40. public String toString() {
  41. return "Result{" +
  42. "code=" + code +
  43. ", msg='" + msg + ''' +
  44. ", data=" + data +
  45. '}';
  46. }
  47. }
  1. @RestController
  2. public class ResponseController {
  3. @RequestMapping("/hello")
  4. public Result hello(){
  5. System.out.println("hello world");
  6. //return new Result(1,"success","hello world");
  7. return Result.success("hello world~");//需要给前端传送数据
  8. }
  9. @RequestMapping("/getAddr")
  10. public Result getAddr(){
  11. Address addr=new Address();
  12. addr.setProvince("山西");
  13. addr.setCity("太原");
  14. return Result.success(addr);
  15. }
  16. @RequestMapping("/listAddr")
  17. public Result ListAddr(){
  18. List<Address> list=new ArrayList<>();
  19. Address addr=new Address();
  20. addr.setProvince("山西");
  21. addr.setCity("太原");
  22. Address addr2=new Address();
  23. addr2.setProvince("山");
  24. addr2.setCity("太");
  25. list.add(addr);
  26. list.add(addr2);
  27. return Result.success(list);
  28. }
  29. }