功能
主页跳转
主页跳转有两种方式。
- 同过spring的拼接,即在application.properties文件中指定页面保存的位置和要拼接的后缀名。
- 通过Thymeleaf组件来做拼接,Thymeleaf默认在项目目录中的templates目录下寻找指定名称的页面,如果未做设置,默认寻找html后缀的页面。
以上两种方式都学要在controller中返回要跳转的页面的名称,做页面跳转的Controller需要用@Controller注解标注。其中的方法也不需要用@ResponseBody标注。
单文件和多文件的上传
编写上传文件业务代码之前应该先在application.properties中规定上传文件的大小限制和请求容量的大小。
用户在前端页面上传任意文件之后,页面会向Controller发送请求和文件。
Controller收到请求和文件之后具体流程如下:
- 获取地址
- 创建文件夹
- 设置新的文件名
- 执行保存操作
- 执行完成后查询一下保证文件确实被保存
- 返回结果
误区
Controller扮演的角色只是一个为前端页面返回相应的角色,控制器,即,根据请求调用不同Service中执行不同业务的方法。
Service扮演的角色是,执行业务逻辑。将业务逻辑在此处实现,然后提供给Controller调用。
Demo代码分析
config包
此目录中主要是各种组件的配置类。
主要使用的注解也是@Configuration。
DruidConfig
数据库监控器配置文件。
此处主要是声明可以访问配置页面的ip的黑白名单以及设置用户名单。
配置页面的访问地址为:http://127.0.0.1:8080/druid/login.html
此Config类中需要声明如下两个Bean
- public ServletRegistrationBean statViewServlet(){};
- public FilterRegistrationBean statFilter(){}
第一个Bean,主要是设置Servlet注册的实体类,这里面主要声明了ip白名单、ip黑名单、后台的管理用户以及管理用户的权限。
第二个Bean,设置拦截器,设置如何访问可以访问到数据库监控器页面。
FastJsonConfig
此配置类可能需要到WebMvcConfigurerAdaptor这个类,但是在Spring 5.0之后就认为这个类是过时的,现在较为通用的方法是使用Bean来替代。
将HttpMessageConverters做为一个Bean来处理。
配置FastJSON时的步骤如下:
- 创建JSON消息转换器
- 创建配置类(序列化JSON串的配置)
- 解决中文乱码问题(可能)
大多数情况下,中文需要主动设置,不然会出现中文乱码的问题。
关于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有两种方法:
- 创建普通的Java类并继承HTTPServlet类,需要配合单独的Config才能被装配。
- 创建普通的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。