仿论坛项目--开发社区首页

• 开发流程

  • 1次请求的执行过程
    • 分步实现
  • 开发社区首页,显示前10个帖子
  • 开发分页组件,分页显示所有的帖子
    在这里插入图片描述

项目调试技巧

• 响应状态码的含义
• 服务端断点调试技巧
• 客户端断点调试技巧
• 设置日志级别,并将日志输出到不同的终端
https://logback.qos.ch

版本控制

• 认识Git

  • Git简介
  • Git的安装与配置
    • Git常用命令
  • 将代码提交至本地仓库
  • 将代码上传至远程仓库
    • IDEA集成Git
  • 在IDEA中配置并使用Git
    https://git-scm.com

#账号配置
git config --list
git config --global user.name “lihonghe”
git config --global user.email “lihonghe@nowcoder.com”
#本地仓库
git init
git status -s
git add *
git commit -m ‘…’
#生成秘钥
ssh-keygen -t rsa -C “lihonghe@nowcoder.com”
#推送已有项目
git remote add origin
https://git.nowcoder.com/334190970/Test.git
git push -u origin master
#克隆已有仓库
git clone https://git.nowcoder.com/334190970/Test.git

发送邮件

• 邮箱设置

  • 启用客户端SMTP服务
    • Spring Email
  • 导入 jar 包
  • 邮箱参数配置
  • 使用 JavaMailSender 发送邮件
    • 模板引擎
  • 使用 Thymeleaf 发送 HTML 邮件
    在这里插入图片描述
    问题:
    版本不一致: 您的父 Spring Boot 版本是 3.3.1,但您使用的却是 Spring-boot-starter-mail 2.7.5 版。 这种不匹配会导致兼容性问题。
    将 Spring Boot 父版本更新为 3.1.3(上次更新时的最新稳定版本)。 删除了 spring-boot-starter-mail 中的版本。 删除了重复的 spring-boot-starter-test 依赖关系。 保留了 mysql-connector-j 和 mybatis-spring-boot-starter 的版本,因为它们不受 Spring Boot 管理。

javax.mail.* 包
这是 JavaMail API 的原始包名,它最初是作为 Java EE 的一部分提供的。随着时间的推移,JavaMail API 被迁移到了一个独立的模块,并且包名也发生了变化。

jakarta.mail.* 包
随着 Java EE 迁移到 Jakarta EE,原来的 javax.* 包名也被迁移到了 jakarta.* 命名空间。因此,JavaMail API 也随之迁移到了 jakarta.mail.* 包名下。

配置文件
spring.mail.host=smtp.sina.com
spring.mail.port=465
spring.mail.username=邮箱名
spring.mail.password=新浪邮箱的授权码
spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.auth=true

// 生成随机字符串
public static String generateUUID() {
return UUID.randomUUID().toString().replaceAll(“-”, “”);
}

// MD5加密
// hello -> abc123def456
// hello + 3e4a8 -> abc123def456abc  密码后面加字符串,提高安全性
public static String md5(String key) {
    if (StringUtils.isBlank(key)) {
        return null;
    }
    return DigestUtils.md5DigestAsHex(key.getBytes());
}

开发注册功能

• 访问注册页面

  • 点击顶部区域内的链接,打开注册页面。
    • 提交注册数据
  • 通过表单提交数据。
  • 服务端验证账号是否已存在、邮箱是否已注册。
  • 服务端发送激活邮件。
    • 激活注册账号
  • 点击邮件中的链接,访问服务端的激活服务。

会话管理

• HTTP的基本性质

  • HTTP是简单的
  • HTTP是可扩展的
  • HTTP是无状态的,有会话的
    • Cookie
  • 是服务器发送到浏览器,并保存在浏览器端的一小块数据。
  • 浏览器下次访问该服务器时,会自动携带块该数据,将其发送给服务器。
    • Session
  • 是JavaEE的标准,用于在服务端记录客户端信息。
  • 数据存放在服务端更加安全,但是也会增加服务端的内存压力。
    在这里插入图片描述

生成验证码

• Kaptcha

  • 导入 jar 包
  • 编写 Kaptcha 配置类
  • 生成随机字符、生成图片

开发登录、退出功能

• 访问登录页面

  • 点击顶部区域内的链接,打开登录页面。
    • 登录
  • 验证账号、密码、验证码。
  • 成功时,生成登录凭证,发放给客户端。
  • 失败时,跳转回登录页。
    • 退出
  • 将登录凭证修改为失效状态。
  • 跳转至网站首页。

显示登录信息

• 拦截器示例

  • 定义拦截器,实现HandlerInterceptor
  • 配置拦截器,为它指定拦截、排除的路径
    • 拦截器应用
  • 在请求开始时查询登录用户
  • 在本次请求中持有用户数据
  • 在模板视图上显示用户数据
  • 在请求结束时清理用户数据

账号设置

• 上传文件

  • 请求:必须是POST请求
  • 表单:enctype=“multipart/form-data”
  • Spring MVC:通过 MultipartFile 处理上传文件
    • 开发步骤
  • 访问账号设置页面
  • 上传头像
  • 获取头像

检查登录状态

• 使用拦截器

  • 在方法前标注自定义注解
  • 拦截所有请求,只处理带有该注解的方法
    • 自定义注解
  • 常用的元注解:
    @Target、@Retention、@Document、@Inherited
  • 如何读取注解:
    Method.getDeclaredAnnotations()
    Method.getAnnotation(Class annotationClass

@Target 注解

@Target 注解用于指定一个注解能够应用到哪些程序元素上。ElementType 枚举定义了多个不同的目标位置,比如方法、字段、构造函数等。

例如,@Target(ElementType.METHOD) 表示该注解只能用在方法上。
ElementType 的常用值:

METHOD:方法。
FIELD:字段。
CONSTRUCTOR:构造函数。
PARAMETER:参数。
TYPE:类、接口、枚举等类型声明。
LOCAL_VARIABLE:局部变量。
ANNOTATION_TYPE:注解类型。
PACKAGE:包。

@Retention 注解

@Retention 注解用于指定注解的生命周期,即注解在哪个阶段是有效的。RetentionPolicy 枚举提供了三个不同的策略:

SOURCE:注解只存在于源码阶段,在编译时会被丢弃。
CLASS:注解会在编译时被保留下来,但是运行时不可见。
RUNTIME:注解会在编译时被保留下来,并且在运行时也可见。

使用示例

下面是一个简单的例子,展示如何使用 @Target 和 @Retention 来定义一个自定义注解:

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

// 定义一个自定义注解,表示该方法需要日志记录

@Target(ElementType.METHOD) // 只能应用到方法上

@Retention(RetentionPolicy.RUNTIME) // 运行时可见

public @interface Loggable {

String value() default "";  // 默认值为空字符串

}

应用自定义注解

接下来,你可以在方法上应用这个注解:

public class MyClass {

@Loggable(value = "这是一个需要记录日志的方法")

public void doSomething() {

    // 方法体

}

}

检查注解

在运行时,你可以通过反射来获取这个注解:

public class Main {

public static void main(String[] args) {

    Method method = MyClass.class.getMethod("doSomething");

    Loggable loggable = method.getAnnotation(Loggable.class);

    if (loggable != null) {

        System.out.println("Log Value: " + loggable.value());

    }

}

}

注意事项

如果没有显式地指定 @Target 和 @Retention,那么默认情况下,注解可以应用于所有类型的元素,并且在编译期会被丢弃(相当于 SOURCE)。
当你定义了一个注解处理器(annotation processor),或者需要在运行时通过反射访问注解信息时,通常会使用 RUNTIME 作为保留策略。
如果只是在编译时需要使用某些信息(例如生成额外的代码),那么可以使用 CLASS 作为保留策略,但注意此时在运行时无法通过反射获取这些注解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值