绍兴网站快速排名优化成都网站建设与开发
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:21
当前位置: 首页 > news >正文
绍兴网站快速排名优化,成都网站建设与开发,免费网站app代码,攀枝花建设网站HTTP请求 前后端分离 在这种模式下#xff0c;前端技术人员基于接口文档#xff0c;开发前端程序#xff1b;后端技术人员也基于接口文档#xff0c;开发后端程序。
由于前后端分离#xff0c;对我们后端技术人员来讲#xff0c;在开发过程中前端技术人员基于接口文档开发前端程序后端技术人员也基于接口文档开发后端程序。
由于前后端分离对我们后端技术人员来讲在开发过程中是没有前端页面的那我们怎么测试自己所开发的程序呢
方式1像之前SpringBoot入门案例中一样直接使用浏览器。在浏览器中输入地址测试后端程序。 弊端在浏览器地址栏中输入地址这种方式都是GET请求如何我们要用到POST请求怎么办呢 要解决POST请求需要程序员自己编写前端代码比较麻烦
方式2使用专业的接口测试工具课程中我们使用Postman工具
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
Postman原是Chrome浏览器的插件可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求
使用Postman还可以在发起请求时携带一些请求参数、请求头等信息 简单参数
简单参数在向服务器发起请求时向服务器传递的是一些普通的请求数据。 后端程序如何接收前端传过来的参数
1.原始方式
在原始的Web程序当中需要通过Servlet中提供的APIHttpServletRequest请求对象获取请求的相关信息。比如获取请求参数
Tomcat接收到http请求时把请求的相关信息封装到HttpServletRequest对象中
在Controller中我们要想获取Request对象可以直接在方法的形参中声明 HttpServletRequest 对象。然后就可以通过该对象来获取请求信息
RestController
public class RequestController {//原始方式RequestMapping(/simpleParam)public String simpleParam(HttpServletRequest request){// http://localhost:8080/simpleParam?nameTomage10// 请求参数 nameTomage10 有2个请求参数// 第1个请求参数 nameTom 参数名:name参数值:Tom// 第2个请求参数 age10 参数名:age , 参数值:10String name request.getParameter(name);//name就是请求参数名String ageStr request.getParameter(age);//age就是请求参数名int age Integer.parseInt(ageStr);//需要手动进行类型转换System.out.println(name : age);return OK;}
}
2.Springboot方式
在Springboot的环境中对原始的API进行了封装接收参数的形式更加简单。 如果是简单参数参数名与形参变量名相同定义同名的形参即可接收参数。
RestController
public class RequestController {// http://localhost:8080/simpleParam?nameTomage10// 第1个请求参数 nameTom 参数名:name参数值:Tom// 第2个请求参数 age10 参数名:age , 参数值:10//springboot方式RequestMapping(/simpleParam)public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致System.out.println(name : age);return OK;}
}
postman测试( GET 请求) postman测试( POST请求 ) 结论不论是GET请求还是POST请求对于简单参数来讲只要保证请求参数名和Controller方法中的形参名保持一致就可以获取到请求参数中的数据值。 参数名不一致
如果方法形参名称与请求参数名称不一致controller方法中的形参还能接收到请求参数值吗
可以使用Spring提供的RequestParam注解完成映射
在方法形参前面加上 RequestParam 然后通过value属性执行请求参数名从而完成映射。代码如下
RestController
public class RequestController {// http://localhost:8080/simpleParam?nameTomage20// 请求参数名name//springboot方式RequestMapping(/simpleParam)public String simpleParam(RequestParam(name) String username , Integer age ){System.out.println(username : age);return OK;}
}
注意事项
RequestParam中的required属性默认为true默认值也是true代表该请求参数必须传递如果不传递将报错 如果该参数是可选的可以将required属性设置为false
RequestMapping(/simpleParam)
public String simpleParam(RequestParam(name name, required false) String username, Integer age){
System.out.println(username : age);
return OK;
} 实体参数
在使用简单参数做为数据传递方式时前端传递了多少个请求参数后端controller方法中的形参就要书写多少个。如果请求参数比较多通过上述的方式一个参数一个参数的接收会比较繁琐。
此时我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装需要遵守如下规则请求参数名与实体类的属性名相同
RestController
public class RequestController {//实体参数简单实体对象RequestMapping(/simplePojo)public String simplePojo(User user){System.out.println(user);return OK;}
} 复杂实体对象
复杂实体对象指的是在实体类中有一个或多个属性也是实体对象类型的。如下 User类中有一个Address类型的属性Address是一个实体类 复杂实体对象的封装需要遵守如下规则 请求参数名与形参对象属性名相同按照对象层次结构关系即可接收嵌套实体类属性参数。
RestController
public class RequestController {//实体参数复杂实体对象RequestMapping(/complexPojo)public String complexPojo(User user){System.out.println(user);return OK;}
} 数组集合参数
数组
数组集合参数的使用场景在HTML的表单中有一个表单项是支持多选的(复选框)可以提交选择的多个值。 数组参数请求参数名与形参数组名称相同且请求参数为多个定义数组类型形参即可接收参数 RestController
public class RequestController {//数组集合参数RequestMapping(/arrayParam)public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return OK;}
}
在前端请求时有两种传递形式
方式一 xxxxxxxxxx?hobbygamehobbyjava
方式二xxxxxxxxxxxxx?hobbygame,java
集合
集合参数请求参数名与形参集合对象名相同且请求参数为多个RequestParam 绑定参数关系
默认情况下请求中参数名相同的多个值是封装到数组。如果要封装到集合要使用RequestParam绑定参数关系 RestController
public class RequestController {//数组集合参数RequestMapping(/listParam)public String listParam(RequestParam ListString hobby){System.out.println(hobby);return OK;}
}
日期参数
在一些特殊的需求中可能会涉及到日期类型数据的封装。
因为日期的格式多种多样如2022-12-12 10:05:45 、2022/12/12 10:05:45那么对于日期类型的参数在进行封装的时候需要通过DateTimeFormat注解以及其pattern属性来设置日期的格式。 DateTimeFormat注解的pattern属性中指定了哪种日期格式前端的日期参数就必须按照指定的格式传递。 后端controller方法中需要使用Date类型或LocalDateTime类型来封装传递的参数。
RestController
public class RequestController {//日期时间参数RequestMapping(/dateParam)public String dateParam(DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) LocalDateTime updateTime){System.out.println(updateTime);return OK;}
}
JSON参数post请求
在前后端进行交互时如果是比较复杂的参数前后端通过会使用JSON格式的数据进行传输。 JSON是开发中最常用的前后端数据交互方式 Postman在发送请求时如何传递json格式的请求参数 在服务端的controller方法中如何接收json格式的请求参数 传递json格式的参数在Controller中会使用实体类进行封装。 封装规则JSON数据键名与形参对象属性名相同定义POJO类型形参即可接收参数。需要使用 RequestBody标识。 RequestBody注解将JSON数据映射到形参的实体类对象中JSON中的key和实体类中的属性名保持一致 Post测试方法 路径参数 前端通过请求URL直接传递参数 后端使用{…}来标识该路径参数需要使用PathVariable获取路径参数 RestController
public class RequestController {//路径参数RequestMapping(/path/{id})public String pathParam(PathVariable Integer id){System.out.println(id);return OK;}
} 传递多个路径参数 RestController
public class RequestController {//路径参数RequestMapping(/path/{id}/{name})public String pathParam2(PathVariable Integer id, PathVariable String name){System.out.println(id : name);return OK;}
}
响应
ResponseBody注解 类型方法注解、类注解 位置书写在Controller方法上或类上 作用将方法返回值直接响应给浏览器 如果返回值类型是实体对象/集合将会转换为JSON格式后在响应给浏览器
在类上添加的RestController注解是一个组合注解。 RestController Controller ResponseBody
Target({ElementType.TYPE}) //元注解修饰注解的注解
Retention(RetentionPolicy.RUNTIME) //元注解
Documented //元注解
Controller
ResponseBody
public interface RestController {AliasFor(annotation Controller.class)String value() default ;
}
结论在类上添加RestController就相当于添加了ResponseBody注解。 类上有RestController注解或ResponseBody注解时表示当前类下所有的方法返回值做为响应数据 方法的返回值如果是一个POJO对象或集合时会先转换为JSON格式在响应给浏览器
统一响应结果
在真实的项目开发中无论是哪种方法我们都会定义一个统一的返回结果。方案如下 前端只需要按照统一格式的返回结果进行解析(仅一种解析方案)就可以拿到数据。
统一的返回结果使用类来描述在这个结果中包含 响应状态码当前请求是成功还是失败 状态码信息给页面的提示信息 返回的数据给前端响应的数据字符串、对象、集合
public class Result {private Integer code;//响应码1 代表成功; 0 代表失败private String msg; //响应码 描述字符串private Object data; //返回的数据public 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(){return new Result(1,success,null);}//查询 成功响应(把查询结果做为返回数据响应给前端)public static Result success(Object data){return new Result(1,success,data);}//失败响应public static Result error(String msg){return new Result(0,msg,null);}
} //响应统一格式的结果RequestMapping(/listAddr)public Result listAddr(){ListAddress 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);}
} 案例
需求加载并解析xml文件中的数据完成数据处理并在页面展示 获取员工数据返回统一响应结果在页面渲染展示
在SpringBoot项目中静态资源默认可以存放的目录 classpath:/static/ classpath:/public/ classpath:/resources/ classpath:/META-INF/resources/
classpath 代表的是类路径在maven的项目中其实指的就是 src/main/resources 或者 src/main/java但是java目录是存放java代码的所以相关的配置文件及静态资源文档就放在 src/main/resources下。
1.在pom.xml文件中引入dom4j的依赖用于解析XML文件
dependencygroupIdorg.dom4j/groupIdartifactIddom4j/artifactIdversion2.1.3/version
/dependency
Contriller代码
RestController
public class EmpController {RequestMapping(/listEmp)public Result list(){//1. 加载并解析emp.xmlString file this.getClass().getClassLoader().getResource(emp.xml).getFile();//System.out.println(file);ListEmp 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);}
}
统一返回结果实体类
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);}
} 分层解耦
在我们进行程序设计以及程序开发时尽可能让每一个接口、类、方法的职责更单一些单一职责原则。 单一职责原则一个类或一个方法就只做一件事情只管一块功能。 这样就可以让类、接口、方法的复杂度更低可读性更强扩展性更好也更利用后期的维护。 我们之前开发的程序呢并不满足单一职责原则。下面我们来分析下之前的程序 那其实我们上述案例的处理逻辑呢从组成上看可以分为三个部分 数据访问负责业务数据的维护操作包括增、删、改、查等操作。 逻辑处理负责业务逻辑处理的代码。 请求处理、响应数据负责接收页面的请求给页面响应数据。
按照上述的三个组成部分在我们项目开发中呢可以将代码分为三层 Controller控制层。接收前端发送的请求对请求进行处理并响应数据。 Service业务逻辑层。处理具体的业务逻辑。 Dao数据访问层(Data Access Object)也称为持久层。负责数据访问操作包括数据的增、删、改、查。
基于三层架构的程序执行流程 前端发起的请求由Controller层接收Controller响应数据给前端 Controller层调用Service层来进行逻辑处理Service层处理完后把处理结果返回给Controller层 Serivce层调用Dao层逻辑处理过程中需要用到的一些数据要从Dao层获取 Dao层操作文件中的数据Dao拿到的数据会返回给Service层
三层架构的好处 复用性强 便于维护 利用扩展
控制反转 Inversion Of Control简称IOC。对象的创建控制权由程序自身转移到外部容器这种思想称为控制反转。
对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为IOC容器或Spring容器
依赖注入 Dependency Injection简称DI。容器为应用程序提供运行时所依赖的资源称之为依赖注入。
程序运行时需要某个资源此时容器就为其提供这个资源。
例EmpController程序运行时需要EmpService对象Spring容器就为其提供并注入EmpService对象
IOC容器中创建、管理的对象称之为bean对象
第1步删除Controller层、Service层中new对象的代码 第2步Service层及Dao层的实现类交给IOC容器管理
使用Spring提供的注解Component 就可以实现类交给IOC容器管理 第3步为Controller及Service注入运行时依赖的对象
使用Spring提供的注解Autowired 就可以实现程序运行时IOC容器自动注入需要的依赖对象 IOC详解
IOC控制反转就是将对象的控制权交给Spring的IOC容器由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。
而Spring框架为了更好的标识web应用程序开发当中bean对象到底归属于哪一层又提供了Component的衍生注解 RestController Controller ResponseBody 标注在控制层类上 Service 标注在业务层类上 Repository 标注在数据访问层类上
要把某个对象交给IOC容器管理需要在对应的类上加上如下注解之一
注解说明位置ControllerComponent的衍生注解标注在控制器类上ServiceComponent的衍生注解标注在业务类上RepositoryComponent的衍生注解标注在数据访问类上由于与mybatis整合用的少Component声明bean的基础注解不属于以上三类时用此注解
在IOC容器中每一个Bean都有一个属于自己的名字可以通过注解的value属性指定bean的名字。如果没有指定默认为类名首字母小写。 注意事项: 声明bean的时候可以通过value属性指定bean的名字如果没有指定默认为类名首字母小写。 使用以上四个注解都可以声明bean但是在springboot集成web开发中声明控制器bean只能用Controller。
组件扫描 使用四大注解声明的bean要想生效还需要被组件扫描注解ComponentScan扫描 ComponentScan注解虽然没有显式配置但是实际上已经包含在了引导类声明注解 SpringBootApplication 中默认扫描的范围是SpringBoot启动类所在包及其子包。 手动添加ComponentScan注解指定要扫描的包
DI详解
Autowired注解默认是按照类型进行自动装配的去IOC容器中找某个类型的对象然后完成注入操作
使用Primary注解当存在多个相同类型的Bean注入时加上Primary注解来确定默认的实现 使用Qualifier注解指定当前要注入的bean对象。 在Qualifier的value属性中指定注入的bean的名称。
Qualifier注解不能单独使用必须配合Autowired使用 使用Resource注解是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。 Autowird 与 Resource的区别 Autowired 是spring框架提供的注解而Resource是JDK提供的注解 Autowired 默认是按照类型注入而Resource是按照名称注入
- 上一篇: 绍兴网站建设技术外包深圳网站建设首选上榜网络
- 下一篇: 绍兴网站快速排名优化网站的域名和密码
相关文章
-
绍兴网站建设技术外包深圳网站建设首选上榜网络
绍兴网站建设技术外包深圳网站建设首选上榜网络
- 技术栈
- 2026年03月21日
-
绍兴网站的优化做编程网站有哪些内容
绍兴网站的优化做编程网站有哪些内容
- 技术栈
- 2026年03月21日
-
绍兴市中等专业学校网站什么是专业网站
绍兴市中等专业学校网站什么是专业网站
- 技术栈
- 2026年03月21日
-
绍兴网站快速排名优化网站的域名和密码
绍兴网站快速排名优化网站的域名和密码
- 技术栈
- 2026年03月21日
-
绍兴兴住房和城乡建设局网站成都app制作开发公司
绍兴兴住房和城乡建设局网站成都app制作开发公司
- 技术栈
- 2026年03月21日
-
绍兴做团购的网站深圳建设工程质量协会网站
绍兴做团购的网站深圳建设工程质量协会网站
- 技术栈
- 2026年03月21日
