servlet
用java编写的服务器端程序
客户端发送请求至服务器
服务器启动并调用servlet,servlet根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回给客户端
javaweb的工作原理
在springboot进行web程序开发时,内置了一个核心的servlet程序dispatcherservlet,称之为核心控制器.
dispatcherservlet负责接收页面发送的请求,根据资源链接执行的规则,将请求再分发给部署在tomcat中的请求处理器controller,请求处理器处理完请求之后,最终再由dispatcherservlet给浏览器响应数据.
浏览器发送请求到后端服务器tomcat后,tomcat会负责解析这些请求数据,将解析后数据传递到servlet程序的httpservletrequest对象,意味着httpservletrequest对象可以获取到请求数据.同时传递了一个httpservletresponse对象,来给浏览器设置响应数据.
请求:浏览器->http->tomcat(内置servlet解析)->request对象->数据
响应:数据->response对象->servlet解析->http->浏览器
请求
接收页面传递来的请求数据
后端接收前端传递的数据
底层依赖于getset方法进行取值(反射)
postman
一款功能强大的网页调试和发送网页http请求的chrome插件
用于接口测试
接口测试:模拟前端发送请求,检验数据传输的正确性
界面功能如下所示
后端资源链接不能重复
简单参数
通过servlet中提供的api httpservletrequest可以获取请求的相关信息
@requestmapping("/simpleparam") public string simpleparam(httpservletrequest request){ string name = request.getparameter("name"); string age = request.getparameter("age"); system.out.println(name+" : "+age); return "ok"; } //request对象中包含请求数据,可以直接通过getparameter()方法进行获取
使用springboot方式
在springboot环境中,对原始的api进行了封装,接收参数形式更加简单.
可以直接定义同名参数接收数据.
@requestmapping("/simpleparam") public string simpleparam(string name , integer age ){ system.out.println(name+" : "+age); return "ok"; }
使用postman进行测试
快速提交带参数的请求
参数名不一致
可以使用@requestparam进行映射
用法如下
@requestmapping("/simpleparam") public string simpleparam(@requestparam("username") string name ,integer age){ system.out.println(name+" : "+age); return "ok"; } //在形参前加上注解完成映射
实体参数
如果参数数量比较多,可以通过封装到一个pojo对象的方式进行数据封装
参数名需与pojo属性名一致
简单实体对象
定义一个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; } @override public string tostring() { return "user{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
在controller方法中传入pojo对象接受数据
@requestmapping("/simplepojo") public string simplepojo(user user){ system.out.println(user); return "ok"; } //pojo对象接受与其属性名相同的参数
复杂实体对象
在实体类中的一个或多个属性为其他实体类的对象
封装需要遵循如下规则:
请求参数名与形参对象的属性名相同,即接收属性中的实体类对象属性时,参数需要为对象.属格式.
数组集合参数
数组参数
请求参数名和形参对象属性名相同且请求参数为多个.
即接收多个同名参数
传递形式:
集合
集合参数
请求参数名和形参集合对象名字相同且请求参数为多个
使用@requestparam绑定参数关系
@requestmapping("/listparam") public string listparam(@requestparam list<string> hobby){ system.out.println(hobby); return "ok"; }
传递形式
日期参数
对日期类型的参数进行封装的时候,需要通过@datetimeformat注解,以及其中的pattern属性来设置日期格式
pattern属性中制定了前端传递参数时的规格.
@requestmapping("/dateparam") public string dateparam(@datetimeformat(pattern = "yyyy-mm-dd hh:mm:ss") localdatetime updatetime){ system.out.println(updatetime); return "ok"; }
传递形式
json参数
比较复杂的参数可以通过json格式进行传输,json数据键名和形参对象属性名相同,定义pojo类型形参即可接收参数,controller方法需要使用@requestbody注解
使用实体类对象接受
@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"; }
传递形式
响应
@restcontroller注解
包含@controller注解和@responsebody注解
controller注解声明类为控制器
responsebody将返回值解析为json或者xml格式
可以在controller类中响应一个实体对象或者集合
eg:
响应一个实体类对象
@requestmapping("/simpleparam") public string simpleparam( string name , integer age){ user user = new user(); user.setname(); user.setage(); return user; }
响应一个集合
@requestmapping("/list") public arraylist<string> simpleparam( string name , integer age){ arraylist<string> list = new arraylist<>(); return list; }
无论响应数据形式是什么,都应该以result形式返回(统一规范)
result
{ integer code//1:成功 0:失败 string msg//响应码 描述字符串 object data//使用object类型可以接收任意数据 static result success(data){ //返回成功时的result } static result error(msg){ //返回失败时的result } }
综合案例(解析xml文件传递到前端页面)
前端
页面绑定js数据,数据绑定钩子函数请求的数据
钩子函数:
mounted() { axios.get("/user").then(result=>( this.tabledata=result.data.data )) },
在组件加载阶段使用axios异步请求数据
后端
读取解析xml文件
string file = 类名.class//获取字节码文件 .getclassloader()//获取类加载器 .getresource()//获得资源 .file()//文件路径 xmlparserutils.parse(file)对xml进行解析,得到一个对象集合
调用result里的success方法
返回成功对象
return result.success(list);
分层解耦
三层架构
数据访问->逻辑访问->请求处理
数据访问:
负责业务数据的维护操作,包括增,删,改,查等操作
逻辑处理:
负责业务逻辑处理的代码
请求处理,响应数据:
负责,接收页面的请求,给页面响应数据
按照三个组成部分,将代码分为三层
controller(控制层)
接收前端发送的请求,对请求进行处理,并响应数据
service(业务层)
处理具体的业务逻辑,对数据进行处理
dao/mapper(数据访问层/持久层)
负责数据的访问操作,包含数据的增删改查操作
分层解耦
内聚:软件中各个功能模块内部的功能联系
耦合:软件中各个层(模块)之间的依赖关联程度
ioc/di技术(inversion of control/dependency injection)
ioc容器中管理的对象称为bean
@component(加在实现类上)
@primary有多个实现类对象时优先用被primary注解标注的
把实现类对象直接放入ioc容器中(控制反转)
@autowired(加在声明对象语句上)
把ioc容器中的对象拿出来(依赖注入)
解决创建对象时产生的耦合
userservice a = new userservice(); //左侧通过实现接口实现多态进行解耦 //右侧通过ioc/di思想解决
bean的声明
把对象交给ioc容器管理,需要以如下注解代替@component
dao层->@repository(自定义名字(默认类名小写))
service层->@service(自定义名字(默认类名小写))
controller层->@controller(自定义名字(默认类名小写))
其他类对象->@componet(自定义名字(默认类名小写))
以上四大注解生效需要被组件扫描注解@componentscan扫描
默认扫描范围为引导类所在包以及其子包
bean注入
@primary优先使用本类对象
@qualifier(“str”)选择名字为str的bean对象进行使用
由springboot框架提供
@resource(name=“str”)选择名字为str的bean对象使用
由java提供
rvice();
//左侧通过实现接口实现多态进行解耦
//右侧通过ioc/di思想解决
#### bean的声明 把对象交给ioc容器管理,需要以如下注解代替@component dao层->@repository(自定义名字(默认类名小写)) service层->@service(自定义名字(默认类名小写)) controller层->@controller(自定义名字(默认类名小写)) 其他类对象->@componet(自定义名字(默认类名小写)) 以上四大注解生效需要被组件扫描注解@componentscan扫描 默认扫描范围为引导类所在包以及其子包 #### bean注入 @primary优先使用本类对象 @qualifier("str")选择名字为str的bean对象进行使用 由springboot框架提供 @resource(name="str")选择名字为str的bean对象使用 由java提供
总结
到此这篇关于java springbootweb请求响应的文章就介绍到这了,更多相关java springbootweb请求响应内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论