当前位置: 首页 > news >正文

8.6 JavaWeb(请求响应 P67-P74)

BS架构:Browser/Response,浏览器/服务器架构模式,客户端只需要浏览器,应用程序的逻辑和数据存储在服务端(维护方便,体验一般)

CS架构:Client/Server,客户端/服务器架构模式(开发、维护麻烦,但体验好)

请求

Postman

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件,常用于进行接口测试

官网下载即可:Download Postman | Get Started for Free

注意注册时需要科学上网

简单参数

1.原始方式:在原始的Web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取

package com.itheima.controller;import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 测试请求参数接收*/
@RestController
public class RequestController {//原始方式@RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request) {//获取请求参数String name = request.getParameter("name");String ageStr = request.getParameter("age");int  age = Integer.parseInt(ageStr);System.out.println(name + ":" + age);return "OK";}
}

运行启动程序,在Postman中访问URL:http://localhost:8080/simpleParam?name=Tom&age=10

原始方式仅作了解即可,较繁琐且需要手动类型转换

2.SpringBoot方式

若参数名与形参名相同,定义形参即可接收参数

@RestController
public class RequestController {//SpringBoot方式@RequestMapping("/simpleParam")public String simpleParam(String name, Integer age) {System.out.println(name + ":" + age);return "OK";}
}

若方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射

@RestController
public class RequestController {//SpringBoot方式@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name", required = false) String username, Integer age) {System.out.println(username + ":" + age);return "OK";}
}

该注解的required属性默认为true,代表请求参数必须传递,如果没有传递则会报错,如果修改为false,则该参数不传递也可以正常运行(可选),该参数值为null

实体参数

实体参数对象:

简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可

先定义User类封装name和age

package com.itheima.pojo;public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

再定义注解

package com.itheima.controller;import com.itheima.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {//SpringBoot方式@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name", required = false) String username, Integer age) {System.out.println(username + ":" + age);return "OK";}//实体参数@RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println(user);return "OK";}
}

使用get方式访问/simplePojo

复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

package com.itheima.pojo;public class Address {private String province;private String city;public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}
}
package com.itheima.pojo;public class User {private String name;private Integer age;private Address address;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}
//实体参数@RequestMapping("/complexPojo")public String ComplexPojo(User user) {System.out.println(user);return "OK";}

数组集合参数

数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数

//数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return "OK";}

集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系

//集合参数@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}

日期参数

使用@DateTimeFormat注解完成日期参数格式转换

//日期时间参数@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {System.out.println(updateTime);return "OK";}

Json参数

Json数据键名与形参对象属性名相同,定义Pojo类型形参即可接收参数,需要使用@RequestBody标识

//json参数@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}

路径参数

通过URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数

//路径参数@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "OK";}//路径参数@RequestMapping("/path/{id}/{name}")public String pathParam2(@PathVariable Integer id, @PathVariable String name) {System.out.println(id + ":" + name);return "OK";}

响应

@ResponseBody注解

类型:方法注解、类注解

位置:Controller方法/类上

作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换成Json格式响应

说明:@RestController = @Controller + @ResponseBody

统一响应结果

package com.itheima.pojo;/*** 统一响应结果封装类*/
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datepublic Result() {}public Result(Integer code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static Result success(Object data){return new Result(1, "success", data);}public static Result success(){return new Result(1, "success", null);}public static Result error(String msg){return new Result(0, msg, null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}
package com.itheima.controller;import com.itheima.pojo.Address;
import com.itheima.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;/*** 测试响应数据*/
@RestController
public class ResponseController {/*@RequestMapping("/hello")public String hello(){System.out.println("Hello World ~");return "Hello World ~";}@RequestMapping("/getAddr")public Address getAddr(){Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");return addr;}@RequestMapping("/listAddr")public List<Address> listAddr(){List<Address> list = new ArrayList<>();Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");Address addr2 = new Address();addr2.setProvince("陕西");addr2.setCity("西安");list.add(addr);list.add(addr2);return list;}*/@RequestMapping("/hello")public Result hello(){System.out.println("Hello World ~");//return new Result(1,"success","Hello World ~");return Result.success("Hello World ~");}@RequestMapping("/getAddr")public Result getAddr(){Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");return Result.success(addr);}@RequestMapping("/listAddr")public Result listAddr(){List<Address> list = new ArrayList<>();Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");Address addr2 = new Address();addr2.setProvince("陕西");addr2.setCity("西安");list.add(addr);list.add(addr2);return Result.success(list);}
}

案例

需求:加载并解析emp.xml文件中的数据,完成数据处理,并在页面展示

分析:1.在pom.xml文件中引入dom4j的依赖,用于解析xml文件

           2.引入资料中提供的解析XML的工具类XMLParserUtils、对应的实体类Emp、XML文件emp.xml

           3.引入资料中提供的静态页面文件,放在resources下的static目录下

           4.编写Controller程序,处理请求,响应数据

package com.itheima.controller;import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class EmpController {@RequestMapping("/listEmp")public Result list(){//1. 加载并解析emp.xmlString file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> empList = XmlParserUtils.parse(file, Emp.class);//2. 对数据进行转换处理 - gender, jobempList.stream().forEach(emp -> {//处理 gender 1: 男, 2: 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");}else if("2".equals(gender)){emp.setGender("女");}//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");}else if("2".equals(job)){emp.setJob("班主任");}else if("3".equals(job)){emp.setJob("就业指导");}});//3. 响应数据return Result.success(empList);}}

http://www.dtcms.com/a/317194.html

相关文章:

  • 生成模型实战 | GPT-2(Generative Pretrained Transformer 2)详解与实现
  • 医疗AI中GPU部署的“非对等全节点架构“方案分析(中)
  • 企业级MCP部署实战:从开发到生产的完整DevOps流程
  • 【C++】unordered系列容器使用及封装
  • 高温环境误检率↓76%!陌讯轻量化检测算法在短袖短裤识别的工业实践
  • Mac 洪泛攻击笔记总结补充
  • Vue2博客项目笔记(完结)
  • 面试问题11
  • 20-C语言:第21~22天笔记
  • V2X通信标准与消息数据结构详解
  • 异构系统数据集成之数据源管理:打通企业数据孤岛的关键一步
  • docker环境搭建
  • Qt Frameless Widget跨平台无边框窗口
  • 基于最大似然估计的卡尔曼滤波与自适应模糊PID控制的单片机实现
  • 鼠标下滑时回跳问题
  • 从“更优”到“更智”:V5.7.3 的交互革新、模式扩展与体验跃迁
  • NodeJs学习日志(1):windows安装使用node.js 安装express,suquelize,sqlite,nodemon
  • ESP32:2.搭建UDP服务器
  • 参考线程池构建一个高性能、配置驱动的Docker容器池
  • Linux---第二天---基础指令
  • copy_file_range系统调用及示例
  • 使用Nginx部署前后端分离项目
  • Docker的安装,服务器与客户端之间的通信
  • Linux基础命令的生产常用命令及其示例简单解释
  • 电子电气架构 ---如何焕新升级为 48V 电气架构
  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • 玩转 InfluxDB 3:用 HTTP API 快速创建高效数据表
  • Python科学计算:从基础到工程仿真的完整指南
  • 【java】DDD架构同普通微服务项目的区别
  • 23.统计分析:从数据中挖掘洞察