网站设计岗位做哪些事情,seo建站推广,wordpress500错误,示范校建设 成果网站文章目录 ① —— 请求 ——一、简单参数 RequestParam1.1 参数与形参 命名相同1.2 参数与形参 命名不同 二、实体参数2.1 简单实体对象2.2 复杂实体对象 三、数组集合参数3.1 数组3.2 集合 RequestParam 四、日期参数 DateTimeFormat五、JSON参数 RequestBody六、路径参数 Pat… 文章目录 ① —— 请求 ——一、简单参数 RequestParam1.1 参数与形参 命名相同1.2 参数与形参 命名不同 二、实体参数2.1 简单实体对象2.2 复杂实体对象 三、数组集合参数3.1 数组3.2 集合 RequestParam 四、日期参数 DateTimeFormat五、JSON参数 RequestBody六、路径参数 PathVariable七、请求头参数 RequestHeader② —— 响应 ——八、ResponseBody九、统一响应结果Result工具类9.1 Result工具类代码9.2 静态资源 十、案例测试 解析xml前端显示数据10.1 解析xml文件10.2 加载解析xml 数据转换处理10.3 问题分析 十一、分层解耦11.1 三层架构11.2 分层解耦11.3 解耦思路11.4 IoC DI11.4.1 IoC 详解11.4.2 组件扫描11.4.3 DI 详解 总结 ① —— 请求 ——
一、简单参数 RequestParam
1.1 参数与形参 命名相同
参数名与形参变量名相同定义形参即可接收参数。
RestController
RequestMapping(hello)
public class HelloController {GetMapping(show)public String show(String name,String age){System.out.println(name! Hello World! ! age);return name Hello World! age ;}
}参数名或形参名不同 传入传出数值为空Null
1.2 参数与形参 命名不同
使用注解 RequestParam 当形参名字不同时绑定与参数对应的新名字通过注解完成映射
// name : 命名
// required 默认为TRUE 即必须有FALSE允许没有即为可以空Null
RequestParam(name age,required false) String age挂载注解后默认required默认为TRUE即必须传参否则报错
二、实体参数
Data
public class User {private String name;private Integer age;
}2.1 简单实体对象 GetMapping(show1)public String show1(User user){System.out.println(user);return user.toString();}参数名和实体类属性名需要一致 否则属性为空Null
2.2 复杂实体对象
Address 实体类
Data
public class Address {private String province;private String city;
}User类中有一个Address类型的属性Address是一个实体类请求参数名与形参对象属性名相同按照对象层次结构关系即可接收嵌套实体类属性参数。
contoller: GetMapping(show1)public String show1(User user){System.out.println(user);return user.toString();}三、数组集合参数 数组集合参数的使用场景在HTML的表单中有一个表单项是支持多选的(复选框)可以提交选择的多个值。 多个值是怎么提交的呢其实多个值也是一个一个的提交。 后端程序接收上述多个值的方式有两种
数组集合
3.1 数组
controller GetMapping(show2)public String show2(String[] hobby){System.out.println(Arrays.toString(hobby));return Arrays.toString(hobby);}3.2 集合 RequestParam
集合参数请求参数名与形参集合对象名相同且请求参数为多个RequestParam 绑定参数关系 默认情况下请求中参数名相同的多个值是封装到数组。如果要封装到集合要使用RequestParam绑定参数关系 GetMapping(show3)public String show3(RequestParam ListString hobby){System.out.println(hobby);return hobby.toString();}四、日期参数 DateTimeFormat 在一些特殊的需求中可能会涉及到日期类型数据的封装: 因为日期的格式多种多样如2023-12-12 10:05:45 、2023/12/12 10:05:45那么对于日期类型的参数在进行封装的时候需要通过DateTimeFormat注解以及其pattern属性来设置日期的格式。 GetMapping(show4)public String show4(DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) LocalDateTime updateTime){System.out.println(updateTime);return updateTime.toString();}DateTimeFormat注解的pattern属性中指定了哪种日期格式前端的日期参数就必须按照指定的格式传递。后端controller方法中需要使用Date类型或LocalDateTime类型来封装传递的参数。
五、JSON参数 RequestBody
服务端Controller方法接收JSON格式数据
传递json格式的参数在Controller中会使用实体类进行封装。封装规则JSON数据键名与形参对象属性名相同定义POJO类型形参即可接收参数。需要使用 RequestBody标识。RequestBody注解将JSON数据映射到形参的实体类对象中JSON中的key和实体类中的属性名保持一致
controller PostMapping(list)public String list(RequestBody User user){System.out.println(user);return user.toString();}六、路径参数 PathVariable
路径参数:直接在请求的URL中传递参数: http://localhost:8080/hello/path/wake/20 GetMapping(path/{name}/{id})public String path(PathVariable String name,PathVariable Integer id){System.out.println(name id);return name id;}七、请求头参数 RequestHeader GetMapping(head)public String head(RequestHeader String name){System.out.println(name);return name;}② —— 响应 ——
八、ResponseBody
类型方法注解、类注解位置写在Controller方法上或类上作用将方法返回值直接响应给浏览器 如果返回值类型是实体对象/集合将会转换为JSON格式后在响应给浏览器 直接在类上加 RestController 即可 RestController Controller ResponseBody RestController源码
Target({ElementType.TYPE}) //元注解修饰注解的注解
Retention(RetentionPolicy.RUNTIME) //元注解
Documented //元注解
Controller
ResponseBody
public interface RestController {AliasFor(annotation Controller.class)String value() default ;
}类上有RestController注解或ResponseBody注解时 表示当前类下所有的方法返回值做为响应数据 方法的返回值如果是一个POJO对象或集合时会先转换为JSON格式在响应给浏览器
测试
回显对象数据 GetMapping(show1)public User show1(User user){System.out.println(user);user.setAge(99);return user;}回显集合数据 PostMapping(list)public ListUser list(RequestBody User user){ListUser list new ArrayList();user.setName(DougWake);list.add(user);return list;}九、统一响应结果Result工具类
前面所编写的这些Controller方法中返回值各种各样没有任何的规范 在真实的项目开发中无论是哪种方法我们都会定义一个统一的返回结果。方案如下 前端只需要按照统一格式的返回结果进行解析(仅一种解析方案)就可以拿到数据。 统一的返回结果使用类来描述在这个结果中包含 响应状态码 code当前请求是成功还是失败 状态码信息 msg给页面的提示信息 返回的数据 data给前端响应的数据字符串、对象、集合
9.1 Result工具类代码
Result工具类
package com.wake.utils;/*** 全局统一返回结果类*/
public class ResultT {// 返回码private Integer code;// 返回消息private String message;// 返回数据private T data;public Result(){}// 返回数据protected static T ResultT build(T data) {ResultT result new ResultT();if (data ! null)result.setData(data);return result;}public static T ResultT build(T body, Integer code, String message) {ResultT result build(body);result.setCode(code);result.setMessage(message);return result;}public static T ResultT build(T body, ResultCodeEnum resultCodeEnum) {ResultT result build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}/*** 操作成功* param data baseCategory1List* param T* return*/public staticT ResultT ok(T data){ResultT result build(data);return build(data, ResultCodeEnum.SUCCESS);}public ResultT message(String msg){this.setMessage(msg);return this;}public ResultT code(Integer code){this.setCode(code);return this;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code code;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}public T getData() {return data;}public void setData(T data) {this.data data;}
}Result 响应码 枚举类
package com.wake.utils;/*** 统一返回结果状态信息类*/
public enum ResultCodeEnum {SUCCESS(200, success),USERNAME_ERROR(501, usernameError),PASSWORD_ERROR(503, passwordError),NOTLOGIN(504, notLogin),USERNAME_USED(505, userNameUsed);private Integer code;private String message;private ResultCodeEnum(Integer code, String message) {this.code code;this.message message;}public Integer getCode() {return code;}public String getMessage() {return message;}
}返回统一的响应结果
9.2 静态资源
资源地址可以在yml配置文件中修改改完就直接覆盖默认路径。 在SpringBoot项目中静态资源默认可以存放的目录 classpath:/static/classpath:/public/classpath:/resources/classpath:/META-INF/resources/ classpath 代表的是类路径在maven的项目中其实指的就是 src/main/resources 或者 src/main/java但是java目录是存放java代码的所以相关的配置文件及静态资源文档就放在 src/main/resources下。 【SpringBoot3】整合SpringMVC_静态资源处理
前端资源放这了
十、案例测试 解析xml前端显示数据
10.1 解析xml文件
dom4j的依赖用于解析XML文件
dependencygroupIdorg.dom4j/groupIdartifactIddom4j/artifactIdversion2.1.3/version
/dependency解析XML的工具类XMLParserUtils
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;public class XmlParserUtils {public static T ListT parse(String file , ClassT targetClass) {ArrayListT list new ArrayListT(); //封装解析出来的数据try {//1.获取一个解析器对象SAXReader saxReader new SAXReader();//2.利用解析器把xml文件加载到内存中,并返回一个文档对象Document document saxReader.read(new File(file));//3.获取到根标签Element rootElement document.getRootElement();//4.通过根标签来获取 user 标签ListElement elements rootElement.elements(emp);//5.遍历集合,得到每一个 user 标签for (Element element : elements) {//获取 name 属性String name element.element(name).getText();//获取 age 属性String age element.element(age).getText();//获取 image 属性String image element.element(image).getText();//获取 gender 属性String gender element.element(gender).getText();//获取 job 属性String job element.element(job).getText();//组装数据ConstructorT constructor targetClass.getDeclaredConstructor(String.class, Integer.class, String.class, String.class, String.class);constructor.setAccessible(true);T object constructor.newInstance(name, Integer.parseInt(age), image, gender, job);list.add(object);}} catch (Exception e) {e.printStackTrace();}return list;}
}10.2 加载解析xml 数据转换处理
案例读取xml 加载数据转换解析 显示在前端页面
实体类
Data
AllArgsConstructor
NoArgsConstructor
public class Emp {private String name;private Integer age;private String image;private String gender;private String job;
}controller
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);}
}http://localhost:8080/emp.html :
10.3 问题分析
我们会发现案例中解析XML数据获取数据的代码处理数据的逻辑的代码给页面响应的代码全部都堆积在一起了全部都写在controller方法中了。
十一、分层解耦 单一职责原则一个类或一个方法就只做一件事情只管一块功能。 数据访问负责业务数据的维护操作包括增、删、改、查等操作。Dao/Mapper逻辑处理负责业务逻辑处理的代码。service请求处理、响应数据负责接收页面的请求给页面响应数据。controller 11.1 三层架构 Controller控制层。接收前端发送的请求对请求进行处理并响应数据。Service业务逻辑层。处理具体的业务逻辑。Dao/Mapper数据访问层(Data Access Object)也称为持久层。负责数据访问操作包括数据的增、删、改、查。
基于三层架构的程序执行流程
前端发起的请求由Controller层接收Controller响应数据给前端Controller层调用Service层来进行逻辑处理Service层处理完后把处理结果返回给Controller层Service层进行业务处理MD5加密等调用Dao层逻辑处理过程中需要用到的一些数据要从Dao层获取Dao层与数据库相关联Dao拿到的数据会返回给Service层
11.2 分层解耦 【Java】面向对象 OOP_OOP三大特性之一封装_为什么需要封装 程序中高内聚的体现 程序中耦合代码的体现
高内聚、低耦合的目的是使程序模块的可重用性、移植性大大增强。
11.3 解耦思路 不能在EmpController中使用new对象。
提供一个容器容器中存储一些对象(例EmpService对象)controller程序从容器中获取EmpService类型的对象
11.4 IoC DI
控制反转 Inversion Of Control简称IOC。对象的创建控制权由程序自身转移到外部容器这种思想称为控制反转。这个容器称为IOC容器或Spring容器 依赖注入 Dependency Injection简称DI。容器为应用程序提供运行时所依赖的资源称之为依赖注入。程序运行时需要某个资源此时容器就为其提供这个资源。例EmpController程序运行时需要EmpService对象Spring容器就为其提供并注入EmpService对象
IOC容器中创建、管理的对象称之为bean对象
使用IOC容器 把需要的资源 装进去使用DI将容器内的资源拿来用 【Spring】IoC容器 控制反转 与 DI依赖注入 概念 第一期 【Spring】IoC容器 控制反转 与 DI依赖注入 三种实现方式 总结 第五期 11.4.1 IoC 详解
注解说明位置ControllerComponent的衍生注解标注在控制器类上ServiceComponent的衍生注解标注在业务类上RepositoryComponent的衍生注解标注在数据访问类上由于与mybatis整合用的少Component声明bean的基础注解不属于以上三类时用此注解 其实底层都是Component注解 在IOC容器中每一个Bean都有一个属于自己的名字可以通过注解的value属性指定bean的名字。 如果没有指定默认为类名首字母小写。 注意事项: 声明bean的时候可以通过value属性指定bean的名字如果没有指定默认为类名首字母小写。使用以上四个注解都可以声明bean但是在springboot集成web开发中声明控制器bean只能用Controller。 11.4.2 组件扫描
bean想要生效还需要被组件扫描
模拟测试 运行程序后报错 使用四大注解声明的bean要想生效还需要被组件扫描注解ComponentScan扫描 ComponentScan注解虽然没有显式配置但是实际上已经包含在了引导类声明注解 SpringBootApplication 中 默认扫描的范围是SpringBoot启动类所在包及其子包。 也可以手动添加ComponentScan注解指定要扫描的包不建议 推荐做法将我们定义的controllerservicedao这些包都放在引导类所在包com.wake下这样我们定义的bean就会被自动的扫描到
11.4.3 DI 详解
Autowired 注解
自动装配默认是按照类型进行自动装配的去IOC容器中找某个类型的对象然后完成注入操作
如果在IOC容器中存在多个相同类型的bean对象会出现什么情况呢 程序报错显示需要一个单一Bean但是存在两个。 如何解决上述问题呢Spring提供了以下几种解决方案 Primary Qualifier Resource
Primary注解 确定默认的实现 Qualifier注解
指定当前要注入的bean对象。 在Qualifier的value属性中指定注入的bean的名称。Qualifier注解不能单独使用必须配合Autowired使用
Resource注解
是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。 面试题 Autowird 与 Resource的区别 Autowired 是spring框架提供的注解而Resource是JDK提供的注解Autowired 默认是按照类型注入而Resource是按照名称注入 总结
使用自动构建SpringBoot 报错
错误: 找不到或无法加载主类 com.wake.SpringbootTestPartApplication 原因: java.lang.ClassNotFoundException: com.wake.SpringbootTestPartApplication
解决 maven
clean
comlile