• 前后端交互实例(javaweb05)


    文章开始前,先给大家看一张图,这是黑马javaweb-day05请求响应实例,也是第一个实现了前后端交互,这是我画的流程图,搞懂了前后端是如何交互的.(文件的所有路径不能出现中文,否则会报错,这个我暂时不知道该怎么解决).

     那么这里面涉及到的东西,除了emp.html这是已经提供了的前端页面(其实也不难写,用element写一个表格),还有listemp和browser,其它是这篇文章中我们要重点实现的.

    先来看Emp,这是一个类,它包含表格当中的五个信息:name,age,image,gender,job,这很容易实现

    1.Emp

    1. public class Emp {
    2. private String name;
    3. private Integer age;
    4. private String image;
    5. private String gender;
    6. private String job;
    7. public Emp() {
    8. }
    9. public Emp(String name, Integer age, String image, String gender, String job) {
    10. this.name = name;
    11. this.age = age;
    12. this.image = image;
    13. this.gender = gender;
    14. this.job = job;
    15. }
    16. public String getName() {
    17. return name;
    18. }
    19. public void setName(String name) {
    20. this.name = name;
    21. }
    22. public Integer getAge() {
    23. return age;
    24. }
    25. public void setAge(Integer age) {
    26. this.age = age;
    27. }
    28. public String getImage() {
    29. return image;
    30. }
    31. public void setImage(String image) {
    32. this.image = image;
    33. }
    34. public String getGender() {
    35. return gender;
    36. }
    37. public void setGender(String gender) {
    38. this.gender = gender;
    39. }
    40. public String getJob() {
    41. return job;
    42. }
    43. public void setJob(String job) {
    44. this.job = job;
    45. }
    46. @Override
    47. public String toString() {
    48. return "Emp{" +
    49. "name='" + name + '\'' +
    50. ", age=" + age +
    51. ", image='" + image + '\'' +
    52. ", gender='" + gender + '\'' +
    53. ", job='" + job + '\'' +
    54. '}';
    55. }
    56. }

    当然如果你觉得太长了可以使用lombok,这是后面课程的内容,懂的同学可以看一下下面的实现,不懂的可以直接跳到2

    1.首先引入依赖

    1. <dependency>
    2. <groupId>org.projectlombokgroupId>
    3. <artifactId>lombokartifactId>
    4. dependency>
    5. //不用写版本,springboot自动集成并管理

    2.改造Emp,一下子就简洁多了

    1. import lombok.AllArgsConstructor;
    2. import lombok.Data;
    3. import lombok.NoArgsConstructor;
    4. @Data
    5. @NoArgsConstructor
    6. @AllArgsConstructor
    7. public class Emp {
    8. private String name;
    9. private Integer age;
    10. private String image;
    11. private String gender;
    12. private String job;
    13. }

    2.result

    这个方法我记得在前面的课程已经学过,是一个规范来的,code,msg,和data三个属性

    code:表示接口调用的状态码,通常用于标识接口调用的结果状态,例如成功、失败等。在这里,使用整数类型(Integer)来表示状态码。通常约定,状态码为1表示成功,0或其他值表示失败。

    msg:表示接口调用的消息,通常用于描述接口调用的结果信息,例如成功时可以是"success",失败时可以是具体的错误信息。在这里,使用字符串类型(String)来表示消息。

    1. public class Result {
    2. private Integer code;
    3. private String msg;
    4. private Object data;
    5. public Result(){}
    6. public Result(Integer code,String msg,Object data){
    7. this.code=code;
    8. this.msg=msg;
    9. this.data=data;
    10. }
    11. public Integer getCode() {
    12. return code;
    13. }
    14. public void setCode(Integer code) {
    15. this.code = code;
    16. }
    17. public String getMsg() {
    18. return msg;
    19. }
    20. public void setMsg(String msg) {
    21. this.msg = msg;
    22. }
    23. public Object getData() {
    24. return data;
    25. }
    26. public void setData(Object data) {
    27. this.data = data;
    28. }
    29. public static Result success(Object data){
    30. return new Result(1,"success",data);
    31. }
    32. public static Result success(){
    33. return new Result(1,"success",null);
    34. }
    35. public static Result error(String msg){
    36. return new Result(0,msg,null);
    37. }
    38. @Override
    39. public String toString() {
    40. return "Result{" +
    41. "code=" + code +
    42. ", msg='" + msg + '\'' +
    43. ", data=" + data +
    44. '}';
    45. }
    46. }

    这里我同样提供lombok的简化书写

    1. import lombok.AllArgsConstructor;
    2. import lombok.Data;
    3. import lombok.NoArgsConstructor;
    4. @Data
    5. @AllArgsConstructor
    6. @NoArgsConstructor
    7. public class Result {
    8. private Integer code;
    9. private String msg;
    10. private Object data;
    11. public static Result success(Object data){
    12. return new Result(1,"success",data);
    13. }
    14. public static Result success(){
    15. return new Result(1,"success",null);
    16. }
    17. public static Result error(String msg){
    18. return new Result(0,msg,null);
    19. }
    20. }

    3. XmlParserUtils

    这个其实黑马的资料里给了,但是我还是想说一下里面的内容

    1. import org.dom4j.Document;
    2. import org.dom4j.Element;
    3. import org.dom4j.io.SAXReader;
    4. import java.io.File;
    5. import java.lang.reflect.Constructor;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. public class XmlParserUtils {
    9. public static List parse(String file , Class targetClass) {
    10. ArrayList list = new ArrayList(); //封装解析出来的数据
    11. try {
    12. //1.获取一个解析器对象
    13. SAXReader saxReader = new SAXReader();
    14. //2.利用解析器把xml文件加载到内存中,并返回一个文档对象
    15. Document document = saxReader.read(new File(file));
    16. //3.获取到根标签,获取emps
    17. Element rootElement = document.getRootElement();
    18. //4.通过根标签来获取 user 标签,获取emps中的emp
    19. List elements = rootElement.elements("emp");
    20. //5.遍历集合,得到每一个 user 标签
    21. for (Element element : elements) {
    22. //获取 name 属性
    23. String name = element.element("name").getText();
    24. //获取 age 属性
    25. String age = element.element("age").getText();
    26. //获取 image 属性
    27. String image = element.element("image").getText();
    28. //获取 gender 属性
    29. String gender = element.element("gender").getText();
    30. //获取 job 属性
    31. String job = element.element("job").getText();
    32. //组装数据
    33. //指定构造函数,并关闭不能访问构造函数
    34. Constructor constructor = targetClass.getDeclaredConstructor(String.class, Integer.class, String.class, String.class, String.class);
    35. constructor.setAccessible(true);
    36. //实例化
    37. T object = constructor.newInstance(name, Integer.parseInt(age), image, gender, job);
    38. //加到列表里
    39. list.add(object);
    40. }
    41. } catch (Exception e) {
    42. e.printStackTrace();
    43. }
    44. return list;
    45. }
    46. }

    file里存的是文件的路径,targetClass是类对象(Emp).我们创建一个Arraylist用来存最后解析出来的结构,还记得最开始的那张图吗,在这个实现里我们使用SAXReader来解析emp.xml获取了一个document类,然后通过拆分元素getRootElement获取了emps组件(这里我猜测拆分成了一颗树,emps是根节点),然后通过rootElement.elements("emp");获取所有的emp子元素,接下来通过遍历调用子元素的中的每一个文本element.element("name").getText();

    然后我们通过getDeclaredConstructor(String.class, Integer.class, String.class, String.class, String.class);创造一个针对于Emp的构造函数,并用构造器Constructor来存储,setAccessible为true表示可以调用这个构造函数,通常我们是不能调用这个构造函数的,然后创建一个Emp使用构造函数构造并传参,放入list,最后返回list就得到了Emp所有元素的列表.

    4.EmpController

    1. @RestController
    2. public class EmpController {
    3. @RequestMapping("/listEmp")
    4. public Result list(){
    5. //加载并解析XML文件
    6. //类->类加载器->找到类路径下的emp.xml->获取文件路径
    7. String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
    8. System.out.println(file);
    9. ListempList=com.yhw.utils.XmlParserUtils.parse(file, Emp.class);
    10. empList.stream().forEach(emp -> {
    11. //处理男和女
    12. String gender=emp.getGender();
    13. if("1".equals(gender)){
    14. emp.setGender("男");
    15. }else{
    16. emp.setGender("女");
    17. }
    18. String job=emp.getJob();
    19. if("1".equals(job)){
    20. emp.setJob("讲师");
    21. }else if("2".equals(job)){
    22. emp.setJob("班主任");
    23. }else{
    24. emp.setJob("就业指导");
    25. }
    26. });
    27. //调用result方法
    28. return Result.success(empList);
    29. }
    30. }

    首先说明RestController包含了Responsebody,所以当传输数据时会自动包装成json格式.,开头我们调用getclass获取对象,getclassloader获取类路径(我也不知道什么是类路径,我猜放在resource下他就能找到),它通常包含了xml,img等文件,所以通过它的getResource(文件名)就可以找到emp.xml,然后getfile获取完整路径,调用我们上面讲的XmlparserUtils来解析这个文件获取,由于Arraylist是list的接口,所以直接用list接受,然后我们拿到数据需要处理gender和job遍历list处理gender和job,最后返回Result包装的类对象,在上面我们指定了RequestMapping的路径/listEmp,现在已经映射到这个路径了使用postman是可以请求到数据的,好的后端的任务已经结束了,接下来略带讲一下前端.

    5.frontend UI

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>员工信息title>
    8. head>
    9. <link rel="stylesheet" href="element-ui/index.css">
    10. <script src="./js/vue.js">script>
    11. <script src="./element-ui/index.js">script>
    12. <script src="./js/axios-0.18.0.js">script>
    13. <body>
    14. <h1 align="center">员工信息列表展示h1>
    15. <div id="app">
    16. <el-table :data="tableData" style="width: 100%" stripe border >
    17. <el-table-column prop="name" label="姓名" align="center" min-width="20%">el-table-column>
    18. <el-table-column prop="age" label="年龄" align="center" min-width="20%">el-table-column>
    19. <el-table-column label="图像" align="center" min-width="20%">
    20. <template slot-scope="scope">
    21. <el-image :src="scope.row.image" style="width: 80px; height: 50px;">el-image>
    22. template>
    23. el-table-column>
    24. <el-table-column prop="gender" label="性别" align="center" min-width="20%">el-table-column>
    25. <el-table-column prop="job" label="职位" align="center" min-width="20%">el-table-column>
    26. el-table>
    27. div>
    28. body>
    29. <style>
    30. .el-table .warning-row {
    31. background: oldlace;
    32. }
    33. .el-table .success-row {
    34. background: #f0f9eb;
    35. }
    36. style>
    37. <script>
    38. new Vue({
    39. el: "#app",
    40. data() {
    41. return {
    42. tableData: []
    43. }
    44. },
    45. mounted(){
    46. axios.get('/listEmp').then(res=>{
    47. if(res.data.code){
    48. this.tableData = res.data.data;
    49. }
    50. });
    51. },
    52. methods: {
    53. }
    54. });
    55. script>
    56. html>

    div标签里是一个element的表格,通过new Vue,el="#app"接管了div实现了双向绑定,在data()里我们定义了一恶搞tableData[]数组,表格数据来源data="tableData" ,在mounted(挂载实例的过程)生命中,我们通过axios异步请求then是处理成功后的回调函数,如果成功,且res.data.code状态码为1不为0,(注意第一个data是包含code,msg和data的)第二data是data里的data)执行完成后挂载到网页.

  • 相关阅读:
    自定义卷积核的分组转置卷积如何实现?
    【自学开发之旅】Flask-标准化返回-连接数据库-分表-orm-migrate-增删改查(三)
    实战PyQt5: 140-QChart图表之烛台图
    IEDA 自动生成类注释和方法注释
    微服务负载均衡器Ribbon实战
    Elasticsearch7教程(2) 更新文档 painless script案例
    自知识蒸馏(知识蒸馏二)
    centos系统下RabbitMQ安装教程
    解析post requests方法返回的response信息
    C++面试八股文:了解auto关键字吗?
  • 原文地址:https://blog.csdn.net/Colinnian/article/details/137937342