JavaWeb零基础学习Day5——Web基础

一.SpringBoot

1.入门程序                                                                                               

需求:基于SpringBoot开发一个Web应用,浏览器发起请求/hello之后,给浏览器返回一个字符串”Hello Xxx“

第一步:创建springboot工程,并勾选web开发相关依赖

第二步:定义HelloController类,添加方法hello,并添加注解

        创建完成之后,可以删除掉一些不需要的部分,springboot会自动创建包,下面的springbootwebquickstaetApplication是启动类,static是存放比如Html、css这些静态文件,

        template里面存放模板文件,application里面存放springboot的核心配置文件;text目录下存放基本的测试类

package com.itheima;

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

@RestController//表示当前类是一个请求处理类
public class HelloController {
    @RequestMapping("/hello" )//表示前端传递的请求路径
    public String hello(String name){//name是接受将来前端传递过来的name参数
        System.out.println("name:"+name);//将name输出到控制台
        return  "Hello" + name + "-";//给前端响应了一个字符串
    }
}

2.脚手架连接不上解决方案

换成如右图所示,阿里云的URL即可,后续操作与上述入门程序一致

3.入门程序刨析

依赖传递:指在软件项目管理中,当一个库(A)直接依赖另一个库(B),而库(B)又依赖库(C)时,库(A)会间接依赖库(C)。这种依赖关系会自动传递到项目依赖树中,无需显式声明。

也就是说一个main方法运行了内部集成进来的tomcat服务器,而tomcat服务器启动起来之后会将我们所编写的项目代码部署在服务器中,然后就可以打开浏览器进行访问。

而这个web起步开发依赖当中所集成进来tomcat服务器(标红框起来的地方)称之为内嵌的tomcat。

二.HTTP协议

1.概念

特点:

1.基于TCP协议:面向连接,安全

2.基于请求-响应模型:一次请求对应一次相应

3.HTTP协议是无状态的协议:对于事务处理没有记忆能力。

  • 缺点:多次请求间不能共享数据
  • 优点:速度快

无状态的意思:每次请求-响应都是独立的

2.HTTP-请求协议

1)请求数据格式

请求方式-GET请求参数在请求行中,没有请求体,如:/brand/findAll?name=OPPO&stauts=1。GET请求大小在浏览器是有限制的。

请求方式-POST请求参数在请求体中,POST请求大小是没有限制的。

注:请求体与请求头之间隔了一个空行

2)请求数据获取

Web服务器(Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServleRequest),在调用Controller方法的时候传递给了该方法。这样程序员不必直接对协议进行操作,让Web开发更加便捷。

package com.itheima;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
    @RequestMapping("/request")
    public String request(HttpServletRequest request){
        //1.获取请求方式
        String method = request.getMethod();
        System.out.println("method:"+method);
        //2.获取请求url地址
        String url = request.getRequestURL().toString();// http://localhost:8080/request
        System.out.println("url:"+url);

        String uri = request.getRequestURI();
        System.out.println("uri:"+uri);
        //3.获取请求协议
        String protocol = request.getProtocol();// HTTP/1.1
        System.out.println("protocol:"+protocol);

        //4.获取请求参数 - name
        String name = request.getParameter("name");
        System.out.println("name:"+name);
        //获取请求参数 - age
        String age = request.getParameter("age");
        System.out.println("age:"+age);

        //5.请求头 - Accept
        String accept = request.getHeader("Accept");
        System.out.println("accept:"+accept);

        return  "ok";
    }
}

3.HTTP-响应协议

1)响应数据格式

重定向:客户端往服务器端请求失败时,返回3xx并回带B服务器端地址,然后重新请求B服务器端,这是浏览器自动的行为。 

这三个最重要,必须掌握!

2)响应数据获取

Web服务器对HTTP协议的响应数据进行了封装(HttpServletResponse),并在调用Controller方法的时候传递给了该方法。这样,程序员不必直接对协议进行操作,让Web开发更加便捷。

package com.itheima;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

    @RestController
    public class ResponseController {
        //方式一
        @RequestMapping("/response")
        public void response(HttpServletResponse response) throws IOException {
            //1.设置响应状态码
            response.setStatus(401);//状态码不用特别设定,一般浏览器会自动设定
            //2.设置响应头
            response.setHeader("name","itheima");
            //3.设置响应体
            response.getWriter().write("<h1>hello response<h1>");
        }

        //方式二:由Spring官方提供的响应对象ResponseEntity
        @RequestMapping("/response2")
        public ResponseEntity<String> response2(){
            return ResponseEntity.status(401)//响应状态码
                    .header("name","itheima")//响应头
                    .body("<h1>hello response<h1>");//响应体
        }

    }

注:响应状态码和响应头如果没有具体要求,通常不手动设定。服务器会根据请求处理的逻辑,自动设置响应状态码和响应头。

三.SpringBoot Web案例

要求:基于SpringBoot开发一个Web应用程序,最终完成用户列表的渲染展示

package com.itheima.pojo;

import lombok.NoArgsConstructor;
import java.time.LocalDateTime;


// @Data
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Integer age;
    private LocalDateTime updateTime;

    // 全参构造器
    public User(Integer id, String username, String password, String name, Integer age, LocalDateTime updateTime) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.name = name;
        this.age = age;
        this.updateTime = updateTime;
    }

    // 手动getter方法
    public Integer getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public LocalDateTime getUpdateTime() {
        return updateTime;
    }
}

user.java

package com.itheima.controller;

import cn.hutool.core.io.IoUtil;
import com.itheima.pojo.User; // 需要导入User类
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

@RestController//@ResponseBody-> 作用:将controller返回值作为响应体的数据直接响应;返回值是对象/集合->json->响应
public class UserController {
    @RequestMapping("/list")
    public List<User> list() { // 返回类型改为List<User>
        //1.加载并读取user.txt文件,获取文件中的数据
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");
        ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());

        //2.解析用户信息,封装成User对象->list集合
        List<User> userList = lines.stream().map(line -> {
            String[] parts = line.split(",");
            Integer id = Integer.parseInt(parts[0]);
            String username = parts[1];
            String password = parts[2];
            String name = parts[3];
            Integer age = Integer.parseInt(parts[4]);
            LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            return new User(id, username, password, name, age, updateTime); // 创建对象User
        }).toList();


        //3.返回数据(json)
        return userList;
    }
}
UserController.java

小结

1.静态资源存放的位置

  • resources/static

2.@ResponseBody注解的作用

  • 将controller方法的返回值直接写入HTTP响应体
  • 如果是对象或集合,会先转为json,再响应
  • @RestController = @Controller + @ResponseBody

四.分层解耦

1.三层架构

 

遵循单一职责原则,复用性强,方便维护

2.分层解耦

耦合:衡量软件中各个层/各个模块的依赖关联程度

内聚:软件中各个功能模块内部的功能联系

软件设计原则:高内聚低耦合

实现分层解耦的思路:

  • 将项目中的类交给IOC容器管理(IOC,控制反转)
  • 应用程序运行时需要什么对象,直接依赖容器为其提供(DI,依赖注入)

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

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

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

空指针的含义:空指针是编程中常见的概念,表示指针未指向有效内存地址。正确处理空指针可以避免运行时异常,提高代码健壮性。不同语言提供了多种机制(如可选类型、注解、静态检查等)来帮助开发者管理空指针问题。

3.IOC & DI入门

两步走:

1.将Dao及Service层的实现类,交给IOC容器管理。

2.为Controller及Service注入运行时所依赖的对象。

小结

1.@Component将一个类交给IOC容器管理,注意:是加在类上,而非接口上

2.@Autowierd可以从IOC容器中找到

该类型的bean,然后完成依赖注入。

4.IOC详解

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

注:声明bean的时候,可以通过注解的value属性指定bean的名字(一般不需要指定),如果没有指定,默认为类名首字母小写

注意事项:

  • 在Springboot集成Web开发中,声明控制器bean只能用@Controller
  • 声明bean的注解要想生效,需要被扫描到,启动类默认扫描当前包及其子包

5.DI详解

@Resource 与 @Autowired区别

  • @Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的
  • @Autowired默认是按照类型注入,而@Resource默认按照名称注入
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值