SpringBoot入门级Demo搭建心得

功能

主页跳转

主页跳转有两种方式。

  1. 同过spring的拼接,即在application.properties文件中指定页面保存的位置和要拼接的后缀名。
  2. 通过Thymeleaf组件来做拼接,Thymeleaf默认在项目目录中的templates目录下寻找指定名称的页面,如果未做设置,默认寻找html后缀的页面。

以上两种方式都学要在controller中返回要跳转的页面的名称,做页面跳转的Controller需要用@Controller注解标注。其中的方法也不需要用@ResponseBody标注。

单文件和多文件的上传

编写上传文件业务代码之前应该先在application.properties中规定上传文件的大小限制和请求容量的大小。

用户在前端页面上传任意文件之后,页面会向Controller发送请求和文件。

Controller收到请求和文件之后具体流程如下:

  1. 获取地址
  2. 创建文件夹
  3. 设置新的文件名
  4. 执行保存操作
  5. 执行完成后查询一下保证文件确实被保存
  6. 返回结果

误区

Controller扮演的角色只是一个为前端页面返回相应的角色,控制器,即,根据请求调用不同Service中执行不同业务的方法。

Service扮演的角色是,执行业务逻辑。将业务逻辑在此处实现,然后提供给Controller调用。

Demo代码分析

config包

此目录中主要是各种组件的配置类。

主要使用的注解也是@Configuration。

DruidConfig

数据库监控器配置文件。

此处主要是声明可以访问配置页面的ip的黑白名单以及设置用户名单。

配置页面的访问地址为:http://127.0.0.1:8080/druid/login.html

此Config类中需要声明如下两个Bean

  1. public ServletRegistrationBean statViewServlet(){};
  2. public FilterRegistrationBean statFilter(){}

第一个Bean,主要是设置Servlet注册的实体类,这里面主要声明了ip白名单、ip黑名单、后台的管理用户以及管理用户的权限。

第二个Bean,设置拦截器,设置如何访问可以访问到数据库监控器页面。

FastJsonConfig

此配置类可能需要到WebMvcConfigurerAdaptor这个类,但是在Spring 5.0之后就认为这个类是过时的,现在较为通用的方法是使用Bean来替代。

将HttpMessageConverters做为一个Bean来处理。

配置FastJSON时的步骤如下:

  1. 创建JSON消息转换器
  2. 创建配置类(序列化JSON串的配置)
  3. 解决中文乱码问题(可能)

大多数情况下,中文需要主动设置,不然会出现中文乱码的问题。

关于FastJSON

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean 。

LoggerConfig

在此处声明日志的过滤器。

SessionConfig

在此处声明登录的过滤器。

TestServletConfigOne

Servlet的第一种装配方式,通过@Bean来装配Servlet。

TestServletConfigTwo

Servlet的第二种装配方式,在自定义的Servlet用@WebServlet注解标注后,在MyApplication中@ServletComponentScan注解,启动扫描Servlet类的程序。

controller包

关于页面跳转的Controller需要用@Controller来标注,其中的方法也不用@ResponseBody来标注,只需要一个@RequestMapping来接收请求即可。

不需要跳转的Controller,只需要@RestController来标注,其中的方法也是用@RequestMapping来标注即可,如果用@Controller标注也可,不过方法需要用@ResponseBody标注。

entity包

如果实体类对应的表的主键是自增的,在实体类中对应的字段应该用@GeneratedValue(strategy = GenerationType.IDENTITY)来标注,不然在保存数据时“hibernate_sequence”表可能会出现问题。

在@Column(name = “username”)或@Table(name = “username”),在这两个注解中的“username”如果是“userName”的话会被自动翻译成“user_name”。

filter包

这个包主要存放拦截器类。

当前Demo主要配置了一个登录拦截器和一个操作记录拦截器。

登录拦截器不多说。

操作记录拦截器主要用于记录来自前端的请求、请求内容、发出请求的主机Ip、时间等记录。

jpa包

为和LogEntity、StudentEntity和UserEntity对象相关提供一系列比较基础的SQL查询。

SQL查询可扩展。

servlet包

创建Servlet有两种方法:

  1. 创建普通的Java类并继承HTTPServlet类,需要配合单独的Config才能被装配。
  2. 创建普通的Java类并继承HTTPServlet类,然后使用@WebServlet(urlPatterns = “/xxxxx”)注解,最后在MyApplication中使用@ServletComponentScan注解。

页面

无亮点。

SpringBoot配置

有application.properties和application.yml两种。

properties不做说明。

yml中有语法高亮,第一次使用需要导入相应的插件。

MyApplication类

无亮点。

Demo码云网址:https://gitee.com/Casablanca9907/introduction_to_springbook

补充

关于@Controller源码

源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

关于@RestController

源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

关于@ResponseBody

源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}

关于@Configuration

源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

关于@ServletComponentScan

源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ServletComponentScanRegistrar.class})
public @interface ServletComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};

    @AliasFor("value")
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}

关于SpringBoot的日志类

代码

//logback组件(注意包的所属:org.slf4j)
private final static Logger logger = LoggerFactory.getLogger(LoginController.class);
logger.info("xxxxxx");

HandlerInterceptor类

源码

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

解析

其中preHandle、postHandle、afterComplication三个方法执行顺序:preHandle——handler——postHandle——view渲染——afterComplication。

如果preHandle返回false,则直接从preHandle跳到afterComplication。

发布了24 篇原创文章 · 获赞 8 · 访问量 1875

猜你喜欢

转载自blog.csdn.net/qq_40462579/article/details/90680282
今日推荐