首页 > 编程语言 >JavaWeb学习笔记后端部分

JavaWeb学习笔记后端部分

时间:2024-07-19 22:08:36浏览次数:10  
标签:return String 笔记 name 学习 import com public JavaWeb

后端Web开发

Maven

Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。

image-20240709155020079

Maven作用

依赖管理

image-20240709155147967

统一的项目结构

image-20240709154759785

项目构建

image-20240709154912556

仓库

image-20240709161419270

image-20240709161132316

安装Maven

image-20240709161751323

image-20240709162417610

image-20240709162705286

<mirror>  
  <id>alimaven</id>  
  <name>aliyun maven</name>  
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>          
</mirror>

image-20240709163152423

image-20240709163127689

测试:

mvn -v

image-20240709163334394

配置Maven环境

image-20240709165900228

image-20240709165817714image-20240709165937198

image-20240709170419318

image-20240709165945726

创建Maven项目

image-20240709170135289

坐标

image-20240709212930094

导入Maven项目

image-20240709232811555

image-20240709232830925

依赖配置

image-20240710012523311

仓库网址:https://mvnrepository.com/

依赖传递

image-20240710005706943

显示关系图

image-20240710012618346

A的依赖关系图

image-20240710010730419

B的依赖关系图

image-20240710010738544

C的依赖关系图

image-20240710010744834

排除依赖

image-20240710010827016

image-20240710011430583

image-20240710011301251

依赖范围

image-20240710012918023

生命周期

image-20240710014707654

image-20240710014840162

image-20240710020636804

在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行,上图三套

image-20240710020733297

SpringBoot

入门

image-20240710174538624

image-20240710174645183

image-20240710174703884

入门代码

package com.itheima.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!!!");
        return "Hello world!!!";
    }
}

启动

image-20240710174836709

image-20240710174857394

image-20240710174909693

HTTP协议

image-20240710175709918

请求协议

image-20240710192544415

相应协议

image-20240710194620705

image-20240710194642257

状态码大类
状态码分类 说明
1xx 响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
2xx 成功——表示请求已经被成功接收,处理已完成
3xx 重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
4xx 客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5xx 服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,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

协议解析

image-20240710195842007

image-20240710201506342

Tomcat

image-20240710201406147

基本使用

image-20240710201731663

image-20240710201750243

配置端口号:

image-20240710202615254

部署:将文件移动到webapps文件夹下即可

image-20240710202918101

image-20240710203957125

https://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#using.build-systems.starters

image-20240710204119487

请求响应

image-20240711110803650

请求

postman

image-20240711121245498

简单参数

如果方法形参名称与请求参数名称不匹配,可以使用 @RequestParam 完成映射

原始方法(不要求掌握)

//原始方法
@RestController
public class HelloController {
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request) {
//        获取请求参数
        String name = request.getParameter("name");
        String ageStr = request.getParameter("age");
        int age = Integer.parseInt(ageStr);
        System.out.println(name + ":" + age);
        return "OK";
    }
}

image-20240711123328280

image-20240711123339388

Springboot方式

@RestController
public class HelloController {    
//    Springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String name, int age) {
        System.out.println(name + ":" + age);
        return "OK";
    }
}

GET请求

image-20240711124046160

image-20240711124053167

POST请求

image-20240711124236196

image-20240711124244834

请求参数名与方法变量名不同,不能传递

    @RequestMapping("/simpleParam")
    public String simpleParam(String userName, int age) {
        System.out.println(userName + ":" + age);
        return "OK";
    }

image-20240711125056074

image-20240711125032405

强制传递:注释@RequestParam(name/value="请求参数名", require = true(默认,必须传递name))

	@RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name") String userName, int age) {
        System.out.println(userName + ":" + age);
        return "OK";
    }

image-20240711125329677

image-20240711125422382

image-20240711125459798

不传递会报错,因为默认required=true,除非required=false

image-20240711125552021

image-20240711125634325

required=false,不传递name:

image-20240711125956568

image-20240711125935768

image-20240711124752750

实体参数

要求:请求参数名与形参对象属性名相同

简单实体参数

实体类

public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Springboot方法

@RestController
public class HelloController {
//    实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        System.out.println(user);
        return "OK";
    }
}

image-20240711140008972

image-20240711140020470

复杂实体参数

实体类:address实体类不要封装有参构造函数,否则报错

public class Address {
    private String province;
    private String city;

//    不要写有参构造函数
    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}
public class User {
    private String name;
    private int age;
    private Address address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

Springboot方法

@RestController
public class HelloController {
//  复杂实体方法
    @RequestMapping("/complexPojo")
    public String complexPojo(User user) {
        System.out.println(user);
        return "OK";
    }
}

image-20240711142633477

image-20240711142644825

数组集合参数

image-20240711145749897

@RestController
public class HelloController {
//    数组集合参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby) {
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }
}
数组参数

image-20240711144741417

image-20240711144721608

集合参数

请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系

注意:一定要加注解image-20240711145449040

@RestController
public class HelloController {
//    集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby) {
        System.out.println(hobby);
        return "OK";
    }
}

image-20240711145522033

image-20240711145310933

日期时间参数

使用 @DateTimeFormat 注解完成日期参数格式转换

@RestController
public class HelloController {
//    日期时间参数
    @RequestMapping("/dateParam")
//    方法形参:加注解指定日期格式,声明一个日期时间对象updateTime
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
        System.out.println(updateTime);
        return "OK";
    }
}

image-20240711151746418

image-20240711151755037

JSON参数

JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用 @RequestBody 标识

注意:实体类不要写有参构造器

@RestController
public class HelloController {
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user) {
        System.out.println(user);
        return "OK";
    }
}

image-20240711153821547

// Json参数如下
{
    "name": "itheima", 
    "age": 22, 
    "address": {
        "province": "安徽", 
        "city": "阜阳"
    }
}

image-20240711153138470

路径参数

如果方法形参名称与请求参数名称不匹配,可以使用 @RequestParam 完成映射

@RestController
public class HelloController {
//    路径参数-单个参数
    @RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id) {
        System.out.println(id);
        return "OK";
    }
}

image-20240711154632827

image-20240711154717633

多个参数

// 多个参数
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id, @PathVariable String name) {
    System.out.println(id + ":" + name);
    return "OK";
}

image-20240711155220405

总结-参数

image-20240711155533572

响应

image-20240711200958031

@RestController
public class RequestController {
//		响应-字符串
    @RequestMapping("/Hello")
    public String hello() {
        System.out.println("Hello!!!");
        return "Hello world!!!";
    }
//    响应-对象
    @RequestMapping("/getAddr")
    public Address getAddr() {
        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");
        return addr;
    }
//    响应-集合
    @RequestMapping("/listAddr")
    public List<Address> listAddr() {
        List<Address> list = new ArrayList<>();

        Address addr1 = new Address();
        addr1.setProvince("广东");
        addr1.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陕西");
        addr2.setCity("西安");

        list.add(addr1);
        list.add(addr2);
        return list;
    }
}

响应数据形式不一,不便管理,难以维护

image-20240711202342898

image-20240711202351688

image-20240711202405755

统一响应结果

image-20240711204736561

Result类

/**
 * 统一响应结果封装类
 */
public class Result {
    private Integer code ;//1 成功 , 0 失败
    private String msg; //提示信息
    private Object data; //数据 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(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);
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
@RestController
public class ResponseController {
//    统一响应结果
    //     响应-字符串
    @RequestMapping("/Hello")
    public Result hello() {
        System.out.println("Hello!!!");
        return Result.success("Hello world!!!");
    }
    //    响应-对象
    @RequestMapping("/getAddr")
    public Result getAddr() {
        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");
        System.out.println(addr);
        return Result.success(addr);
    }
    //    响应-集合
    @RequestMapping("/listAddr")
    public Result listAddr() {
        List<Address> list = new ArrayList<>();

        Address addr1 = new Address();
        addr1.setProvince("广东");
        addr1.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陕西");
        addr2.setCity("西安");

        list.add(addr1);
        list.add(addr2);
        System.out.println(addr1);
        System.out.println(addr2);
        System.out.println(list);
        return Result.success(list);
    }
}

image-20240711204431418

image-20240712103838316

image-20240711204452888

响应-案例

image-20240711204942051

image-20240711211038728

Springboot项目的静态资源(html,css,js等前端资源)默认存放目录为:classpath:/static 、 classpath:/public、 classpath:/resources

empController

package com.itheima.controller;

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

import java.util.List;

@RestController
public class empController {
    @RequestMapping("/listEmp")
    public Result listEmp() {
//        动态获取获取静态文件路径,路径中不含中文
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
//        实在不行就拿绝对路径
//        String file = "C:\\Users\\bfs\\Desktop\\JavaWeb\\study\\JavaWeb_project\\springboot-web-quickstart\\src\\main\\resources\\emp.xml";
//        加载emp.xml,并解析数据
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);

//        处理gender、job字段
        empList.stream().forEach(emp -> {
            String gender = emp.getGender(); // gender: 1 男 2 女
            if("1".equals(gender)) {
                emp.setGender("男");
            } else if("2".equals(gender)) {
                emp.setGender("女");
            }

            String job = emp.getJob(); // job: 1:讲师 2:班主任 3:就业指导
            if("1".equals(job)) {
                emp.setJob("讲师");
            } else if("2".equals(job)) {
                emp.setJob("班主任");
            } else if("3".equals(job)) {
                emp.setJob("就业指导");
            }
        });

//        返回结果
        return Result.success(empList);
    }
}

接口调试

image-20240711214651173

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>员工信息</title>
</head>

<link rel="stylesheet" href="element-ui/index.css">
<script src="./js/vue.js"></script>
<script src="./element-ui/index.js"></script>
<script src="./js/axios-0.18.0.js"></script>

<body>
    <h1 align="center">员工信息列表展示</h1>
    <div id="app">
        <el-table :data="tableData" style="width: 100%"  stripe border >
            <el-table-column prop="name" label="姓名" align="center" min-width="20%"></el-table-column>
            <el-table-column prop="age" label="年龄" align="center" min-width="20%"></el-table-column>
            <el-table-column label="图像" align="center"  min-width="20%">
                <template slot-scope="scope">
                    <el-image :src="scope.row.image" style="width: 80px; height: 50px;"></el-image>
                </template>
            </el-table-column>
            <el-table-column prop="gender" label="性别" align="center"  min-width="20%"></el-table-column>
            <el-table-column prop="job" label="职位" align="center"  min-width="20%"></el-table-column>
        </el-table>
    </div>
</body>

<style>
    .el-table .warning-row {
        background: oldlace;
    }
    .el-table .success-row {
        background: #f0f9eb;
    }
</style>

<script>
    new Vue({
        el: "#app",
        data() {
            return {
                tableData: []
            }
        },
        mounted(){
            axios.get('/listEmp').then(res=>{
                if(res.data.code){
                    this.tableData = res.data.data;
                }
            });
        },
        methods: {
        }
    });
</script>
</html>

渲染效果

image-20240711215003468

分层解耦

三层结构

image-20240712174037225

image-20240712174101121

image-20240712205524016

文件结构

image-20240712205651627

dao接口

package com.itheima.dao;

import com.itheima.pojo.Emp;

import java.util.List;

public interface EmpDao {
    List<Emp> listEmp();
}

dao接口的实现类

package com.itheima.dao.impl;

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

import java.util.List;

public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmp() {
//        动态获取获取静态文件路径,路径中不含中文
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
//        实在不行就拿绝对路径
//        String file = "C:\\Users\\bfs\\Desktop\\JavaWeb\\study\\JavaWeb_project\\springboot-web-quickstart\\src\\main\\resources\\emp.xml";
//        加载emp.xml,并解析数据
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
        return empList;
    }
}

service接口

package com.itheima.service;

import com.itheima.pojo.Emp;

import java.util.List;

public interface EmpService {
    List<Emp> listEmp();
}

service接口实现类

package com.itheima.service.impl;

import com.itheima.dao.EmpDao;
import com.itheima.dao.impl.EmpDaoA;
import com.itheima.pojo.Emp;
import com.itheima.service.EmpService;

import java.util.List;

public class EmpServiceA implements EmpService {
    private EmpDao empDao = new EmpDaoA();
    @Override
    public List<Emp> listEmp() {
        List<Emp> empList = empDao.listEmp();

//        处理gender、job字段
        empList.stream().forEach(emp -> {
            String gender = emp.getGender(); // gender: 1 男 2 女
            if("1".equals(gender)) {
                emp.setGender("男");
            } else if("2".equals(gender)) {
                emp.setGender("女");
            }

            String job = emp.getJob(); // job: 1:讲师 2:班主任 3:就业指导
            if("1".equals(job)) {
                emp.setJob("讲师");
            } else if("2".equals(job)) {
                emp.setJob("班主任");
            } else if("3".equals(job)) {
                emp.setJob("就业指导");
            }
        });
        return empList;
    }
}

controller

package com.itheima.controller;

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

import java.util.List;

@RestController
public class empController {
    private EmpService empService = new EmpServiceA();
    @RequestMapping("/listEmpA")
    public Result listEmpA() {
        List<Emp> list = empService.listEmp();
        return Result.success(list);
    }
}

image-20240712210013089

存在的问题:耦合

image-20240712214311380

分层解耦

  • 内聚:软件中各个功能模块内部的功能联系。
  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
  • 软件设计原则:高内聚,低耦合

控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

Bean对象:IOC容器中创建、管理的对象,称之为bean。

image-20240712212247135

image-20240712214735786

image-20240712214746554

IOC

Bean的声明

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一

image-20240714150227500

声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。

使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。

Bean组件扫描

image-20240714174813769

DI

image-20240714212833177

image-20240714212816267

image-20240714212751700

标签:return,String,笔记,name,学习,import,com,public,JavaWeb
From: https://www.cnblogs.com/bfs1201/p/18312462

相关文章

  • Mybatis学习笔记
    Mybatis入门Mybatis简介官网:https://mybatis.org/mybatis-3/zh/index.html入门程序查询user表中数据mapper接口packagecom.itheima.mapper;importcom.itheima.pojo.User;importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Se......
  • 【读书笔记】余华 - 活着
    这本书我是通过微信读书听的有声书,我还粗略的把整个故事给孩子和母亲讲了一遍,给母亲讲的时候有些名字忘记了,还通过ChatGPT整理了一下主要是人物和事件。故事里让我印象最深的是村里开始搞土地改革,龙儿死到临头了才泄气,被五花大绑从福贵身边走过的时候哭着鼻子喊“福贵,我是替......
  • 【数据结构】学习day 1.1线性表中的顺序表
    1 "&"区别(c++)#include<stdio.h>voidtest(intx){   x=2024;   printf("intestx=%d\n",x);}intmain(){   intx=1;   printf("beforetestx=%d\n",x);   test(x);   printf("aftertestx=%d\n"......
  • C#学习笔记
    【持续更新】【2024-07-19】新建对象初始化语句的执行总是在构造函数执行之后,如:classPoint{publicintX=1;publicintY=2;publicPoint(intx,inty){X=x;Y=y;}}c......
  • Javaweb项目|电子商城购物平台的设计与开发+ssm小程序
    Javaweb项目|电子商城购物平台的设计与开发+ssm小程序收藏点赞不迷路 关注作者有好处文末获取源码一、系统展示二、万字文档展示 基于电子商城购物平台的设计与开发+ssm小程序开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat......
  • 学习Java的第五天(2024.7.18)
    1.字符串类:String类String类:是引用类型,默认值为null(注意不是空串"")字符串的声明:publicstaticvoidmain(String[]args){//声明字符串Stringstr="abc你好";System.out.println(str);str=newString("");//和strnewString();输出结果都......
  • 学习Java的第六天(2024.7.19)
    1.容器类、集合类之前学过的容器:数组,但是数组有局限:1.数组存储的数据类型有限制2.数组存储的长度受限2.容器类分为:List,Set,Map3.List类:List是一个接口,他的实现类有:ArrayList,LinkedList,Vectorpublicstaticvoidmain(String[]args){Listlist=newArrayLi......
  • 广义容斥原理学习
    广义容斥原理概念广义容斥原理解决的是:计算所有至少满足\(k\)个性质的方案数之和。同样的,我们可以通过计算所有至少满足\(k\)个性质的方案数之和来计算恰好满足\(k\)个性质的方案数。方法设\(\alpha(k)\)表示所有至少满足\(k\)个性质的方案数之和。容易得到:\[\al......
  • 花几千上万学习Java,真没必要!(十四)
    方法:测试代码1:不带参数,不带返回值的方法packagetestmethod.com;publicclassTestClassMethod{//定义一个不带参数且不带返回值的方法publicstaticvoidmyMethod(){//在这里编写方法体System.out.println("Thisismymethod");}......
  • javaScrip的学习(一)
    目录引言一、java和JavaScript的联系二、js中的弹出框1.alert弹出框2.confirm带确认取消的按钮弹框3.prompt带有提示信息且带有输入框的弹框 4.输出到网页中​三、js引入方式1.放在script标签中2.放在外部js文件中四、执行顺序五、书写规范1.语句结尾加分号......