Compartilhamento de tecnologia

Desenvolvimento de back-end da Web – solicitar resposta

2024-07-12

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

Índice

Prefácio

perguntar

parâmetros simples

método original

Caminho da primavera

Processamento distorcido da solicitação pós-solicitação

Parâmetros de entidade

Parâmetros de entidade simples

Parâmetros de entidade complexos

Editar

parâmetros de coleção de array

Parâmetros de matriz

Editar

Parâmetros de coleção

parâmetro de data

Editar

Parâmetros JSON

Editar

Passar dados json

matriz json

objeto json (POJO)

coleção json (POJO)

Perceber

parâmetros de caminho

Solicitar caminho de mapeamento

@RequestMapping

Parâmetros de solicitação

resposta

@CorpoDeResposta

Resultados de resposta unificada


Prefácio

Solicitação: obtenha dados da solicitação

Resposta: Definir dados de resposta

Arquitetura BS Navegador/Servidor, modo de arquitetura navegador/servidor, o cliente só precisa do navegador, e a lógica e os dados do aplicativo são armazenados no servidor (Fácil de manter, experiência média

Arquitetura CS Cliente/Servidor, modo de arquitetura cliente/servidor (O desenvolvimento e a manutenção são problemáticos, mas a experiência é boa

perguntar

parâmetros simples

método original

Obtenha manualmente através de 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. }

Caminho da primavera

Parâmetros simples:O nome do parâmetro é igual ao nome formal da variável do parâmetro, definir parâmetros formais significa receber parâmetros

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

Observe que os URLs do carteiro aqui são todoshttp://localhost:8080/SimpleParam?name=tom&age=10

Ambos os itens acima são solicitações get. Quando for uma solicitação de postagem, você só precisa inserir a URL no carteiro.http://localhost:8080/SimpleParam

Processamento distorcido da solicitação pós-solicitação

Se houver caracteres chineses na postagem, caracteres distorcidos aparecerão no fundo, então defina o filtro na configuração.

Adicione um filtro ao contêiner da web e especifique o conjunto de caracteres. Um filtro de caracteres dedicado é fornecido no pacote 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. }

Observe que este processo é para postagem. Se get for passado em chinês, caracteres ilegíveis ainda aparecerão.

Se o nome do parâmetro do método não corresponder ao nome do parâmetro da solicitação, você poderá usar @RequestParam para concluir o mapeamento.

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

O atributo obrigatório em @PequestParam é padronizado como verdadeiro, o que significa que o parâmetro de solicitação deve ser passado. Se não for passado, será relatado um erro. Se o parâmetro for opcional (ou seja, pode ser passado ou não). o atributo obrigatório pode ser definido como falso (desta forma, nenhum erro será relatado se você passar ou não)

Parâmetros de entidade

Parâmetros de entidade simples

O nome do parâmetro da solicitação é igual ao nome do atributo do parâmetro formal, basta definir o Pojo para recebê-lo.

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

A URL aqui éhttp://localhost:8080/SimpleParam1?name=cat&age=29

Parâmetros de entidade complexos

O nome do parâmetro de solicitação é igual ao nome do atributo do parâmetro formal., você pode receber parâmetros de atributos pojo aninhados de acordo com o relacionamento de hierarquia de objetos.

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

parâmetros de coleção de array

Parâmetros de matriz

O nome do parâmetro de solicitação é igual ao nome formal do grupo de parâmetros e há diversas solicitações., defina o parâmetro formal do tipo array para receber parâmetros

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

Parâmetros de coleção

O nome do parâmetro de solicitação é igual ao nome formal da coleção de parâmetros e há vários parâmetros de solicitação.@RequestParamRelacionamento de parâmetro de associação

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

parâmetro de data

Use a anotação @DateTimeFormat para concluir a conversão do formato do parâmetro de data

  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:日期时间格式字符串

Faça o teste:

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

Parâmetros JSON

O nome da chave do parâmetro json é igual ao nome do atributo do objeto do parâmetro formal. Você pode receber parâmetros definindo o parâmetro formal do tipo Pojo.

  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这和前面的复杂实体参数一样

Encapsular json na classe de entidade do usuário por meio de @requestbody

Passar dados json

Importe as coordenadas primeiro

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

Habilite o suporte para conversão automática de dados Json

  1. @Configuration
  2. @ComponentScan("com.itheima.controller")
  3. //开启json数据类型自动转换
  4. @EnableWebMvc
  5. public class SpringMvcConfig {
  6. }
matriz 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.   }
objeto 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. }

Ao fazer uma solicitação Get:

  1. {
  2.    "name":"xixi",
  3.    "age":21,
  4.    "address":{
  5.        "provice":"taiyuan",
  6.        "city":"taiyuan"
  7.   }
  8. }
coleção 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. }

Ao fazer uma solicitação Get:

  1. [{"name":"xixi","age":12},
  2. {"name":"haha","age":21}
  3. ]
Perceber

parâmetros de caminho

Passe parâmetros diretamente através do URL da solicitação Use {...} para identificar os parâmetros do caminho. Você precisa usar @PathVariable para obter os parâmetros do caminho.

um parâmetro de caminho

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

O URL testado pelo carteiro éhttp://localhost:8080/caminho/1

Vários parâmetros de caminho

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

O URL testado pelo carteiro éhttp://localhost:8080/caminho/1/cat

Solicitar caminho de mapeamento

Pergunta: Os caminhos solicitados durante o desenvolvimento devem ser diferentes, mas se houver os mesmos caminhos, será relatado um erro não sei qual deles deve ser chamado----------geralmente através.Defina o nome do módulo como um prefixo para o caminho da solicitação

@RequestMapping

É anotação de método e anotação de classe

Coloque-o acima da definição do método do controlador SpringMVC

Usado para definir o caminho de solicitação do método do controlador, se estiver configurando o método do controlador atual na classe, solicite o prefixo do caminho de acesso

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

Propriedades: valor (padrão): Caminho de acesso da solicitação.Ou prefixo do caminho de acesso

Parâmetros de solicitação

@RequestParam é uma anotação de parâmetro formal, localizada na frente da definição de parâmetro do método do controlador SpringMVC, usada para vincular o relacionamento entre os parâmetros de solicitação e os parâmetros do método do processador.

Parâmetros: obrigatório: se é um parâmetro obrigatório DefaultValue: o valor padrão do parâmetro

resposta

@CorpoDeResposta

São anotações de método e anotações de classe

Localizado no método/classe do controlador

A função éResponder diretamente ao valor de retorno do método. Se o tipo de valor de retorno for um objeto/coleção de entidade, ele será convertido em uma resposta no formato 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. }

O teste é inserido no carteirohttp://localhost:8080/listaEnd.É isso, outros semelhantes

Cada método exposto externamente é chamado de interface funcional (por exemplo, existem três interfaces acima), e o caminho é o caminho de acesso.

O problema enfrentado é que os resultados das respostas são diferentes e a análise final dos resultados é mais problemática, por isso os resultados das respostas precisam ser unificados.

Resultados de resposta unificada

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