JavaWeb后端基础(4)

这一篇就开始是做一个项目了,在项目里学习,我主要记录在学习过程中遇到的问题,以及一些知识点

Restful风格

一种软件架构风格

在REST风格的URL中,通过四种请求方式,来操作数据的增删改查。

  • GET : 查询

  • POST :新增

  • PUT : 修改

  • DELETE :删除

我们看到如果是基于REST风格,定义URL,URL将会更加简洁、更加规范、更加优雅。

@RequestMapping注解

开发里经常用下面这种风格

  • GET方式:@GetMapping

  • POST方式:@PostMapping

  • PUT方式:@PutMapping

  • DELETE方式:@DeleteMapping

数据封装

实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。

手动结果映射、起别名、开启驼峰命名

手动结果映射

java 复制代码
@Results({@Result(column = "create_time", property = "createTime"),
          @Result(column = "update_time", property = "updateTime")})
@Select("select id, name, create_time, update_time from dept")
public List<Dept> findAll();

起别名

java 复制代码
@Select("select id, name, create_time createTime, update_time updateTime from dept")
public List<Dept> findAll();

开启驼峰命名 (推荐)

如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。驼峰命名规则: abc_xyz => abcXyz

在application.yml中做如下配置,开启开关

java 复制代码
mybatis:
  configuration:
    map-underscore-to-camel-case: true

实体类的属性与数据库表中的字段名严格遵守驼峰命名。

Nginx反向代理

  1. location:用于定义匹配特定uri请求的规则。

  2. ^~ /api/:表示精确匹配,即只匹配以/api/开头的路径。

  3. rewrite:该指令用于重写匹配到的uri路径。

  4. proxy_pass:该指令用于代理转发,它将匹配到的请求转发给位于后端的指令服务器。

简单参数接收

方案一:通过原始的 HttpServletRequest 对象获取请求参数

java 复制代码
/**
* 根据ID删除部门 - 简单参数接收: 方式一 (HttpServletRequest)
*/
@DeleteMapping("/depts")
public Result delete(HttpServletRequest request){
    String idStr = request.getParameter("id");
    int id = Integer.parseInt(idStr);
    
    System.out.println("根据ID删除部门: " + id);
    return Result.success();
}

方案二:通过Spring提供的 @RequestParam 注解,将请求参数绑定给方法形参

java 复制代码
@DeleteMapping("/depts")
public Result delete(@RequestParam("id") Integer deptId){
    System.out.println("根据ID删除部门: " + deptId);
    return Result.success();
}

方案三:如果请求参数名与形参变量名相同,直接定义方法形参即可接收。(省略@RequestParam)

java 复制代码
@DeleteMapping("/depts")
public Result delete(Integer id){
    System.out.println("根据ID删除部门: " + deptId);
    return Result.success();
}

JSON参数接收

  • JSON格式的参数,通常会使用一个实体对象进行接收 。

  • 规则:JSON数据的键名与方法形参对象的属性名相同,并需要使用@RequestBody注解标识。

java 复制代码
/**
 * 新增部门 - POST http://localhost:8080/depts   请求参数:{"name":"研发部"}
 */
@PostMapping("/depts")
public Result save(@RequestBody Dept dept){
    System.out.println("新增部门, dept=" + dept);
    deptService.save(dept);
    return Result.success();
}

路径参数接收

/depts/1/depts/2 这种在url中传递的参数,我们称之为路径参数

路径参数:通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用 **@PathVariable**获取路径参数。

java 复制代码
/**
 * 根据ID查询 - GET http://localhost:8080/depts/1
 */
@GetMapping("/depts/{id}")
public Result getById(@PathVariable Integer id){
    System.out.println("根据ID查询, id=" + id);
    Dept dept = deptService.getById(id);
    return Result.success(dept);
}

日志

导入依赖---->配置**logback.xml**---->记录日志

Logback配置文件

如果需要输出日志到控制台。添加如下配置:

XML 复制代码
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%msg表示日志消息,%n表示换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
    </encoder>
</appender>

如果需要输出日志到文件。添加如下配置:

XML 复制代码
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- 日志文件输出的文件名, %i表示序号 -->
        <FileNamePattern>D:/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
        <!-- 最多保留的历史日志文件数量 -->
        <MaxHistory>30</MaxHistory>
        <!-- 最大文件大小,超过这个大小会触发滚动到新文件,默认为 10MB -->
        <maxFileSize>10MB</maxFileSize>
    </rollingPolicy>

    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%msg表示日志消息,%n表示换行符 -->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
    </encoder>
</appender>

日志开关配置 (开启日志(ALL),取消日志(OFF))

java 复制代码
<!-- 日志输出级别 -->
<root level="ALL">
    <!--输出到控制台-->
    <appender-ref ref="STDOUT" />
    <!--输出到文件-->
    <appender-ref ref="FILE" />
</root>

logback日志级别

|-------|----------------------------------------|
| 日志级别 | 说明 |
| trace | 追踪,记录程序运行轨迹 【使用很少】 |
| debug | 调试,记录程序调试过程中的信息,实际应用中一般将其视为最低级别 【使用较多】 |
| info | 记录一般信息,描述程序运行的关键事件,如:网络连接、io操作 【使用较多】 |
| warn | 警告信息,记录潜在有害的情况 【使用较多】 |
| error | 错误信息 【使用较多】 |

@Slf4j

lombok中提供的@Slf4j注解,可以简化定义日志记录器这步操作。添加了该注解,就相当于在类中定义了日志记录器,就下面这句代码:

private static Logger log = LoggerFactory. getLogger(Xxx. class);

相关推荐
看到我,请让我去学习10 分钟前
Qt— 布局综合项目(Splitter,Stacked,Dock)
开发语言·qt
代码的余温14 分钟前
SQL性能优化全攻略
数据库·mysql·性能优化
GUET_一路向前23 分钟前
【C语言防御性编程】if条件常量在前,变量在后
c语言·开发语言·if-else·防御性编程
曳渔24 分钟前
UDP/TCP套接字编程简单实战指南
java·开发语言·网络·网络协议·tcp/ip·udp
三千道应用题41 分钟前
WPF&C#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表
开发语言·c#·wpf
hqxstudying1 小时前
JAVA项目中邮件发送功能
java·开发语言·python·邮件
咪咪渝粮1 小时前
JavaScript 中constructor 属性的指向异常问题
开发语言·javascript
最初的↘那颗心1 小时前
Java HashMap深度解析:原理、实现与最佳实践
java·开发语言·面试·hashmap·八股文
小兔兔吃萝卜1 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
亲爱的马哥1 小时前
重磅更新 | 填鸭表单TDuckX2.9发布!
java