JavaWeb企业级开发---快速入门、请求响应、分层解耦

记录在听黑马课的时候的笔记以及课堂上练习的代码,文章图源于我在听课的时候所截的屏,所以有些不清晰,请见谅。下面是课程链接,可点击自行跳转。

【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)】 https://www.bilibili.com/video/BV1m84y1w7Tb/?share_source=copy_web&vd_source=d521b664e1113402904fa9336bd1d0ac


目录

入门

SpringBoot快速入门

HTTP协议

概述

请求协议

响应协议

协议解析

Tomcat

介绍

基本使用

入门程序解析

请求响应

概述

postman工具

简单参数&实体参数

简单参数

实体参数

数组集合参数

日期参数&JSON参数

路径参数

@ResponseBody&统一响应结果

响应案例

分层解耦

三层架构

IOC-DI引入

IOC&DI入门

IOC详解

DI详解


入门

SpringBoot快速入门

快速入门:

java 复制代码
package com.jianglin.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class helloController {
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("hello");
        System.out.println("Love yourself and love what you love");
        return "hello";
    }
}

HTTP协议

概述

请求协议

响应协议

|-----|---------------------------------|---------------------------------------------------------|
| 状态码 | 英文描述 | 解释 |
| 200 | OK | 客户端请求成功,即处理成功,这是我们最想看到的状态码 |
| 302 | Found | 指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面 |
| 304 | Not Modified | 告诉客户端,你请求的资源至上一次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
| 400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
| 403 | Forbidden | 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
| 404 | Not Found | 请求资源不存在,一般是URL输入有误,或者网站资源被删除了 |
| 405 | Method Not Allowed | 请求方式有误,比如应该用GET请求方式的资源,用了POST |
| 428 | Precondition Required | 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 |
| 429 | Too Many Requests | 指示用户在给定时间内发送了太多请求("限速"),配合Retry-After(多长时间后可以请求)响应头一起使用 |
| 431 | Request Header Fields Too Large | 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 |
| 500 | Internal Server Error | 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 |
| 503 | Service Unavailable | 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 |

状态码大全:https://cloud.tencent.com/developer/chapter/13553

协议解析

Tomcat

介绍

基本使用

入门程序解析

请求响应

概述

postman工具

简单参数&实体参数

简单参数

利用Servlet实现:

java 复制代码
package com.jianglin.controller;

import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
public class requestController {
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request) {
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        return "hello " + name + " " + age;
    }
}

springboot实现:

java 复制代码
package com.jianglin.controller;

import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(String name,Integer age) {
        return "hello " + name + " " + age;
    }
}

当方法形参名称与请求参数名称不匹配,利用注解完成映射:

java 复制代码
package com.jianglin.controller;

import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name,Integer age) {
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age) {
        return "hello " + username + " " + age;
    }
}

实体参数

复杂实体参数实现:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.User;
import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name,Integer age) {
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age) {
        return "hello " + username + " " + age;
    }
    //实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        return user.toString();
    }

    //复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user) {
        return user.toString();
    }
}

数组集合参数

数组参数

数组参数:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.User;
import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name,Integer age) {
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age) {
        return "hello " + username + " " + age;
    }
    //实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        return user.toString();
    }

    //复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user) {
        return user.toString();
    }

    //数组集合参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby) {
        return Arrays.toString(hobby);
    }
}

集合参数

集合参数:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.User;
import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name,Integer age) {
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age) {
        return "hello " + username + " " + age;
    }
    //实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        return user.toString();
    }

    //复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user) {
        return user.toString();
    }

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

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

}

日期参数&JSON参数

日期时间参数

日期时间参数:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.User;
import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.coyote.Request;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name,Integer age) {
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age) {
        return "hello " + username + " " + age;
    }
    //实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        return user.toString();
    }

    //复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user) {
        return user.toString();
    }

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

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

    //日期时间参数
    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-mm-dd HH:mm:ss") LocalDateTime date) {
        return date.toString();
    }

}

JSON参数

JSON参数:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.User;
import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.coyote.Request;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name,Integer age) {
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age) {
        return "hello " + username + " " + age;
    }
    //实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        return user.toString();
    }

    //复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user) {
        return user.toString();
    }

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

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

    //日期时间参数
    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-mm-dd HH:mm:ss") LocalDateTime date) {
        return date.toString();
    }

    //JSON参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user) {
        return user.toString();
    }

}

路径参数

路径参数实现:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.User;
import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.coyote.Request;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class requestController {
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name");
//        String age = request.getParameter("age");
//        return "hello " + name + " " + age;
//    }
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name,Integer age) {
//        return "hello " + name + " " + age;
//    }
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age) {
        return "hello " + username + " " + age;
    }
    //实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        return user.toString();
    }

    //复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user) {
        return user.toString();
    }

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

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

    //日期时间参数
    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-mm-dd HH:mm:ss") LocalDateTime date) {
        return date.toString();
    }

    //JSON参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user) {
        return user.toString();
    }

    //路径参数
    @RequestMapping("/pathParam1/{id}")
    public String pathParam1(@PathVariable Integer id) {
        return id.toString();
    }

    //路径参数
    @RequestMapping("/pathParam2/{id}/{name}")
    public String pathParam2(@PathVariable Integer id,@PathVariable String name) {
        return id.toString()+":"+name;
    }
}

@ResponseBody&统一响应结果

响应实现:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.Address;
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");
        return "hello";
    }

    @RequestMapping("/getAddress")
    public Address getAddress() {
        Address address = new Address();
        address.setProvince("河南");
        address.setCity("濮阳");
        return address;
    }

    @RequestMapping("/listAddress")
    public List<Address> listAddress() {
        List<Address> addressList = new ArrayList<Address>();
        Address address = new Address();
        address.setProvince("河南");
        address.setCity("濮阳");
        addressList.add(address);
        return addressList;
    }
}

统一响应格式,便于管理维护:

java 复制代码
package com.jianglin.controller;

import com.jianglin.pojo.Address;
import com.jianglin.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 Result hello() {
        System.out.println("hello");
//        return new Result(1,"success","hello");
        return Result.success("hello");
    }

    @RequestMapping("/getAddress")
    public Result getAddress() {
        Address address = new Address();
        address.setProvince("河南");
        address.setCity("濮阳");
        return Result.success(address);
    }

    @RequestMapping("/listAddress")
    public Result listAddress() {
        List<Address> addressList = new ArrayList<Address>();
        Address address = new Address();
        address.setProvince("河南");
        address.setCity("濮阳");
        addressList.add(address);
        return Result.success(addressList);
    }

//    @RequestMapping("/hello")
//    public String hello() {
//        System.out.println("hello");
//        return "hello";
//    }
//
//    @RequestMapping("/getAddress")
//    public Address getAddress() {
//        Address address = new Address();
//        address.setProvince("河南");
//        address.setCity("濮阳");
//        return address;
//    }
//
//    @RequestMapping("/listAddress")
//    public List<Address> listAddress() {
//        List<Address> addressList = new ArrayList<Address>();
//        Address address = new Address();
//        address.setProvince("河南");
//        address.setCity("濮阳");
//        addressList.add(address);
//        return addressList;
//    }
}

响应案例

案例代码实现:

java 复制代码
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/>
    </parent>
    <groupId>com.itheima</groupId>
    <artifactId>springboot-emp-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-emp-demo</name>
    
    <dependencies>
        <!-- SpringBoot Web依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- dom4j依赖(解析XML) -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
    </dependencies>
</project>
//Emp.java
package com.jianglin.pojo;

public class Emp {
    private String name;    // 姓名
    private Integer age;    // 年龄
    private String image;   // 头像URL
    private Integer gender; // 性别(1-男,2-女)
    private Integer job;    // 职位(1-讲师,2-班主任,3-就业指导)

    // getter和setter
    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 String getImage() { return image; }
    public void setImage(String image) { this.image = image; }
    public Integer getGender() { return gender; }
    public void setGender(Integer gender) { this.gender = gender; }
    public Integer getJob() { return job; }
    public void setJob(Integer job) { this.job = job; }
}
//XmlParserUtils.java  解析xml文件
package com.jianglin.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class XmlParserUtils {
    /**
     * 解析XML文件为指定类型的集合
     */
    public static <T> List<T> parse(String filePath, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        try {
            // 1. 创建SAXReader对象
            SAXReader reader = new SAXReader();
            // 2. 读取XML文件
            Document document = reader.read(new File(filePath));
            // 3. 获取根元素
            Element rootElement = document.getRootElement();
            // 4. 获取所有emp子元素
            List<Element> empElements = rootElement.elements("emp");

            // 5. 遍历emp元素,封装为Emp对象
            for (Element empElement : empElements) {
                T obj = clazz.newInstance();
                // 设置属性
                setFieldValue(obj, "name", empElement.elementText("name"));
                setFieldValue(obj, "age", Integer.parseInt(empElement.elementText("age")));
                setFieldValue(obj, "image", empElement.elementText("image"));
                setFieldValue(obj, "gender", Integer.parseInt(empElement.elementText("gender")));
                setFieldValue(obj, "job", Integer.parseInt(empElement.elementText("job")));
                list.add(obj);
            }
        } catch (DocumentException | InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return list;
    }

    // 反射设置属性值
    private static <T> void setFieldValue(T obj, String fieldName, Object value) {
        try {
            var field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj, value);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
//EmpController.java
package com.jianglin.controller;

import com.jianglin.pojo.Emp;
import com.jianglin.pojo.Result;
import com.jianglin.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

@RestController
public class EmpController {

    @RequestMapping("/listEmp")
    public Result list(){
        //1.加载并解析emp.xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file,Emp.class);
        //2.对数据进行转换处理
        empList.forEach(emp->{
            //对性别进行处理
            String gender = emp.getGender();
            if ("1".equals(gender)) {
                emp.setGender("男");
            }else if ("2".equals(gender)) {
                emp.setGender("女");
            }
            //对工作类型进行判断
            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);
    }
}

//emp.xml
<?xml version="1.0" encoding="UTF-8"?>
<emps>
    <emp>
        <name>金毛狮王</name>
        <age>55</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg</image>
        <!-- 1:男,2:女 -->
        <gender>1</gender>
        <!-- 1:讲师,2:班主任,3:就业指导 -->
        <job>1</job>
    </emp>
    <emp>
        <name>白眉鹰王</name>
        <age>65</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/2.jpg</image>
        <gender>1</gender>
        <job>1</job>
    </emp>
    <emp>
        <name>青翼蝠王</name>
        <age>45</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/3.jpg</image>
        <gender>1</gender>
        <job>2</job>
    </emp>
    <emp>
        <name>紫衫龙王</name>
        <age>38</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/4.jpg</image>
        <gender>2</gender>
        <job>3</job>
    </emp>
</emps>
//emp.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>员工信息列表</title>
    <style>
        table { width: 800px; margin: 20px auto; border-collapse: collapse; }
        th, td { border: 1px solid #ccc; padding: 10px; text-align: center; }
        th { background-color: #f0f0f0; }
        img { width: 60px; height: 60px; border-radius: 50%; }
    </style>
</head>
<body>
    <h1 style="text-align: center;">员工信息列表展示</h1>
    <table>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>图像</th>
            <th>性别</th>
            <th>职位</th>
        </tr>
        <tbody id="empTableBody">
            <!-- 数据将通过JS动态渲染 -->
        </tbody>
    </table>

    <script>
        // 发送请求获取员工数据
        fetch('/emps')
            .then(response => response.json())
            .then(result => {
                if (result.code === 1) {
                    const emps = result.data;
                    const tableBody = document.getElementById('empTableBody');
                    // 遍历数据生成表格行
                    emps.forEach(emp => {
                        const row = document.createElement('tr');
                        row.innerHTML = `
                            <td>${emp.name}</td>
                            <td>${emp.age}</td>
                            <td><img src="${emp.image}" alt="头像"></td>
                            <td>${emp.gender}</td>
                            <td>${emp.job}</td>
                        `;
                        tableBody.appendChild(row);
                    });
                } else {
                    alert('获取数据失败:' + result.msg);
                }
            });
    </script>
</body>
</html>

分层解耦

三层架构

实现三层架构:

java 复制代码
//dao层
//EmpDao.java
package com.jianglin.dao;

import com.jianglin.pojo.Emp;

import java.util.List;

public interface EmpDao {

    //获取员工列表信息
    public List<Emp> listEmp();
}
//empDaoImpl.java
package com.jianglin.dao.impl;

import com.jianglin.dao.EmpDao;
import com.jianglin.pojo.Emp;
import com.jianglin.utils.XmlParserUtils;

import java.util.List;

public class empDaoImpl implements EmpDao {

    @Override
    public List<Emp> listEmp() {
        //获取数据
        //加载并解析emp.xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file,Emp.class);
        return empList;
    }
}
//service.java
//EmpService.java
package com.jianglin.service;

import com.jianglin.pojo.Emp;

import java.util.List;

public interface EmpService {
    //获取员工列表
    public List<Emp> listEmp();
}
//EmpServiceImpl.java
package com.jianglin.service.impl;

import com.jianglin.dao.EmpDao;
import com.jianglin.dao.impl.empDaoImpl;
import com.jianglin.pojo.Emp;
import com.jianglin.service.EmpService;

import java.util.Collections;
import java.util.List;

public class EmpServiceImpl implements EmpService {
    private EmpDao empDao = new empDaoImpl();
    @Override
    public List<Emp> listEmp() {
        //获取数据信息
        List<Emp> empList = empDao.listEmp();
        //对数据进行转换处理
        empList.forEach(emp->{
            //对性别进行处理
            String gender = emp.getGender();
            if ("1".equals(gender)) {
                emp.setGender("男");
            }else if ("2".equals(gender)) {
                emp.setGender("女");
            }
            //对工作类型进行判断
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            }else if ("2".equals(job)){
                emp.setJob("班主任");
            }else if ("3".equals(job)){
                emp.setJob("就业指导");
            }
        });
        return empList;
    }
}
//EmpController.java
package com.jianglin.controller;

import com.jianglin.pojo.Emp;
import com.jianglin.pojo.Result;
import com.jianglin.service.EmpService;
import com.jianglin.service.impl.EmpServiceImpl;
import com.jianglin.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

@RestController
public class EmpController {

    private EmpService empService = new EmpServiceImpl();
    @RequestMapping("/listEmp")
    public Result list(){
        List<Emp> listEmp = empService.listEmp();
        //响应数据
        return Result.success(listEmp);
    }
}

IOC-DI引入

IOC&DI入门

实现容器管理:

java 复制代码
//EmpController.java
package com.jianglin.controller;

import com.jianglin.pojo.Emp;
import com.jianglin.pojo.Result;
import com.jianglin.service.EmpService;
import com.jianglin.service.impl.EmpServiceImpl;
import com.jianglin.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

@RestController
public class EmpController {

    @Autowired //运行时IOC容器会提供该类型的bean对象,并赋值给该对象,又称依赖注入
    private EmpService empService;
    @RequestMapping("/listEmp")
    public Result list(){
        List<Emp> listEmp = empService.listEmp();
        //响应数据
        return Result.success(listEmp);
    }
}
//empDaoImpl.java
package com.jianglin.dao.impl;

import com.jianglin.dao.EmpDao;
import com.jianglin.pojo.Emp;
import com.jianglin.utils.XmlParserUtils;
import org.springframework.stereotype.Component;

import java.util.List;

@Component//将当前类交给容器管理,成为IOC的bean
public class empDaoImpl implements EmpDao {

    @Override
    public List<Emp> listEmp() {
        //获取数据
        //加载并解析emp.xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file,Emp.class);
        return empList;
    }
}
//EmpServiceImpl.java
package com.jianglin.service.impl;

import com.jianglin.dao.EmpDao;
import com.jianglin.dao.impl.empDaoImpl;
import com.jianglin.pojo.Emp;
import com.jianglin.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;

@Component//将当前类交给容器管理,成为IOC的bean
public class EmpServiceImpl implements EmpService {

    @Autowired //运行时IOC容器会提供该类型的bean对象,并赋值给该对象,又称依赖注入
    private EmpDao empDao;
    @Override
    public List<Emp> listEmp() {
        //获取数据信息
        List<Emp> empList = empDao.listEmp();
        //对数据进行转换处理
        empList.forEach(emp->{
            //对性别进行处理
            String gender = emp.getGender();
            if ("1".equals(gender)) {
                emp.setGender("男");
            }else if ("2".equals(gender)) {
                emp.setGender("女");
            }
            //对工作类型进行判断
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            }else if ("2".equals(job)){
                emp.setJob("班主任");
            }else if ("3".equals(job)){
                emp.setJob("就业指导");
            }
        });
        return empList;
    }
}

如果我们想要实现service层中的EmpServiceImplB的方法,则只需将该类添加@Component注解即可,并将EmpServiceImpl的注解给去掉,这样我们不用去修改其它层(eg,EmpController)的代码,因为容器会自动扫描注解,创建类,从而达到解耦的目的。

IOC详解

@Service、@Repository、@Controller称为@Component的衍生注解

可指定bean的名字,当未设置时,默认是该类的第一个字母小写的类名

bean名一般情况下我们是不用修改的。

DI详解

第一种解决方案:

在想要生效的Service类上面添加一个@Primary注解

方案二:

指定是要用哪个bean

方案三:

resource注解来指定我要注入的是哪个beab,指定bean的名字,那Autowired的这个注解呢,默认是按照类型进行注入的,而resource这个注解是按照名称进行注入的

先按照类型,有多个再按照名称


这篇文章就先更到这里,接下来的内容可查看我的下一篇博客,感谢观看,希望对你有帮助。

相关推荐
jiayong234 小时前
Arthas 完全指南:原理与实战
java·spring·arthas
lsx2024064 小时前
MongoDB 删除文档
开发语言
熊猫比分管理员5 小时前
免费开源代码/免费搭建体育直播系统;赛程、直播、专家卖料三大核心全解析
java
西西学代码5 小时前
【道德经】1-5
学习
Lucky高5 小时前
Pandas库实践3_索引
开发语言·python·pandas
摇滚侠5 小时前
面试实战 问题三十五 Spring bean 的自动装配 介绍一下熟悉的几种设计模式 Java 四种线程池是哪些
java·spring·面试
Sheep Shaun5 小时前
STL:string和vector
开发语言·数据结构·c++·算法·leetcode
小徐Chao努力5 小时前
Go语言核心知识点底层原理教程【Slice的底层实现】
开发语言·算法·golang
EchoL、5 小时前
【论文阅读】HiDDeN:Hiding Data With Deep Networks
论文阅读·笔记·机器学习