目录
- 项目简介
- 思考 & 改进
- 1.Jsp都是同步请求---->改成异步Ajax【完成】
- 2.前端用Jsp技术落后----->用Vue框架【完成】
- 3.架构问题:配置数据和Java代码耦合【完成】
- 3.SQL语句和Java代码耦合【完成】
- 4.架构问题:servlet只能处理一个请求
- 5.响应方式为响应一个Json,但是servlet写法很繁琐
- 6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换
- 7.全局配置文件繁琐,xml和java必须一一对应
- springBoot相关技术
- Spring核心容器——从配置文件到注解开发 & 创建对象+成员变量赋值 & 增强方法
- SpringMvc学习——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关
- springBoot学习——spring+springMVC & 集成mybatis & 拦截器
- SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试
- 上述问题SpringBoot的解决方案
- 4.架构问题:servlet只能处理一个请求
- 5.响应方式为响应一个Json,但是servlet写法很繁琐
- 6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换
- 7.全局配置文件繁琐,xml和java必须一一对应
- SpringBoot项目搭建
- 1.项目总体结构
- pom.xml文件
- 2.主配置application.yml文件
- 3.springMvc配置类:拦截器+静态资源映射
- 拦截器实体类
- 4.主启动类@SpringBootApplication
项目简介
本项目是一个简单的图书管理系统,本博客在tomcat中采用servlet 和vue和mybatis技术实现如下功能:
- 用户登陆,输入用户名,密码,登陆成功后保存到session中,跳转到首页;
- 用户注册,输入相关信息,以及验证码,注册成功到登陆页面;
- 用户信息修改,昵称修改,密码修改;
- 图书信息页面:展示所有信息,到数据分页显示,到分页展示+模糊查询+只看自己的书;
- 新增图书信息,新增一条图书信息,类型下拉框选择,书名,简介输入,session中获取用户名和id,数据插入数据库中,再回到图书信息页面;
- 删除图书信息:只能删除自己的书,删除成功再回到图书信息页面;
- 修改图书信息:原有的信息进行回显,修改成功后再回到图书信息页面;
- 图书类型分类统计:按照图书类型进行统计,数量为0显示0
思考 & 改进
1.Jsp都是同步请求---->改成异步Ajax【完成】
JavaWeb项目【源码】——图书项目1.0:Tomcat版本 + Servlet + Filter + Jsp + bootstrap & JavaScript初步 + Ajax初步
2.前端用Jsp技术落后----->用Vue框架【完成】
JavaWeb项目【源码】——图书项目2.0:Tomcat版本 & Vue + axios + Servlet + Lombok + JDBC + MySQL技术栈实现
3.架构问题:配置数据和Java代码耦合【完成】
3.SQL语句和Java代码耦合【完成】
JavaWeb项目【源码】——图书项目3.0:Tomcat版本 & Mybatis + vue + axios + js + mysql + log4j 技术栈实现
4.架构问题:servlet只能处理一个请求
5.响应方式为响应一个Json,但是servlet写法很繁琐
resp.getWriter().write(JSON.toJSONString(new ResData(
// 4.new PageInfo对象,共享页数等,以及查询到的数据List<Company> list = companyService.queryByLikeNameLimit(pageNum, pageSize,name);PageInfo<Company> pageInfo = new PageInfo<>(pageNum, pageSize, total, pages, list);resp.getWriter().write(JSON.toJSONString(new ResData(200, "ok", pageInfo)));
6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换
String name = req.getParameter("name");String typeId = req.getParameter("typeId");String birthday = req.getParameter("birthday");
当用的时候,如果想要的类型其实不是String,还需要自己转换格式
// 日期类型转换private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {comUser.setBirthday(sdf.parse(birthday));} catch (ParseException e) {throw new RuntimeException(e);}// int类型转换opus.setTypeId(Integer.parseInt(typeId));
7.全局配置文件繁琐,xml和java必须一一对应
springBoot相关技术
Spring核心容器——从配置文件到注解开发 & 创建对象+成员变量赋值 & 增强方法
Spring核心容器——从配置文件到注解开发 & 创建对象+成员变量赋值 & 增强方法
SpringMvc学习——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关
SpringMvc学习——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关
之前的模式下:
在spring中集成mybatis
配置文件application.xml文件,加入mybatis相关
server:port: 80# 1.连接数据库——对应之前 xml文件的数据库
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 123# mybatis其他配置
mybatis:# 2.给实体类起别名,首字母小写type-aliases-package: com.tianju.entityconfiguration:# 3.开启驼峰命名map-underscore-to-camel-case: true# 4.让日志生效log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 5.扫描sql的位置mapper-locations: classpath:/mapper/*Mapper.xml
springBoot学习——spring+springMVC & 集成mybatis & 拦截器
springBoot学习——spring+springMVC & 集成mybatis & 拦截器
SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试
SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试
上述问题SpringBoot的解决方案
4.架构问题:servlet只能处理一个请求
5.响应方式为响应一个Json,但是servlet写法很繁琐
resp.getWriter().write(JSON.toJSONString(new ResData(
// 4.new PageInfo对象,共享页数等,以及查询到的数据List<Company> list = companyService.queryByLikeNameLimit(pageNum, pageSize,name);PageInfo<Company> pageInfo = new PageInfo<>(pageNum, pageSize, total, pages, list);resp.getWriter().write(JSON.toJSONString(new ResData(200, "ok", pageInfo)));
在springMvc下,响应一个json @ResponseBody;
要点:
-
响应是json,要加@ResponseBody;
-
时间显示的问题,要GMT+8:
-
@JsonFormat(pattern = “yyyy-MM-DD hh:mm:ss”, timezone = “GMT+8”)
-
如果一个controller响应都是json则,可以用@RestController代替 @Controller 和 @ResponseBody
package com.tianju.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 响应的json*/
@Data
@NoArgsConstructor
@AllArgsConstructorpublic class ResData {private Integer code;private String msg;private Object data;
}
注意这里,日期转换格式写错了,DD要改成小写dd
6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换
String name = req.getParameter("name");String typeId = req.getParameter("typeId");String birthday = req.getParameter("birthday");
当用的时候,如果想要的类型其实不是String,还需要自己转换格式
// 日期类型转换private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {comUser.setBirthday(sdf.parse(birthday));} catch (ParseException e) {throw new RuntimeException(e);}// int类型转换opus.setTypeId(Integer.parseInt(typeId));
在springMvc下,参数自动进行了类型的匹配,通常前端传的是一个JSON队形,后端接收要加上@RequestBody注解
要点:
- 前端传参用Json对象传;
- 后端接收需要加上@RequestBody注解;
- 实体类中规定日期的格式, @JsonFormat(pattern = “yyyy-MM-dd”)
前端发送对象的方式:
(1) user对象逐个赋值,发送post请求
let user = {}
user.username = this.username;
user.password = this.password;
user.sex = this.sex;
user.birthday = this.birthday;
axios.post("/user/register",user)
(2) 直接创建好user对象,发送post请求
let user = {"username":this.username,"password":this.password,"sex":this.sex,"birthday":this.birthday,
}
axios.post("/user/register",user)
后端接收要加上@RequestBody,在类上加 @JsonFormat(pattern = “yyyy-MM-dd”)
// 在登陆页面,用户点击登陆按钮,处理请求@RequestMapping("register")@ResponseBody// 如果前端用json对象发,后端需要加上@RequestBodypublic ResData register(@RequestBody User user){System.out.println(user);return new ResData(200, "ok", null);}
7.全局配置文件繁琐,xml和java必须一一对应
在spring中集成mybatis
配置文件application.xml文件,加入mybatis相关
server:port: 80# 1.连接数据库——对应之前 xml文件的数据库
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 123# mybatis其他配置
mybatis:# 2.给实体类起别名,首字母小写type-aliases-package: com.tianju.entityconfiguration:# 3.开启驼峰命名map-underscore-to-camel-case: true# 4.让日志生效log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 5.扫描sql的位置mapper-locations: classpath:/mapper/*Mapper.xml
SpringBoot项目搭建
1.项目总体结构
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>SpringBootOpus</artifactId><version>1.0-SNAPSHOT</version><!-- 继承一个父--><parent><groupId>org.springframework.boot</groupId><version>2.3.0.RELEASE</version><artifactId>spring-boot-starter-parent</artifactId></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- 做web项目的包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- 前端模板引擎,功能类似于jsp--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- 其他需要的包,fastjson commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.22</version></dependency><!-- mybatis的包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.12</version></dependency><!-- mysql --><!-- springboot内置了mysql的jar,不用写版本号,至于为什么不用spring-boot-strater-mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version></dependency></dependencies><!-- 构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
2.主配置application.yml文件
# 注释
server:port: 80## spring相关的配置
spring:# 连接数据库datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 123## 设置上传文件大小servlet:multipart:max-file-size: 10MB # 设置单个文件最大大小为10MB
# # 另一种解决方案
# thymeleaf:
# cache: false
# prefix: classpath:/templates
# suffix: .html## mybatis相关配置
mybatis:# 起别名的包在哪里type-aliases-package: com.tianju.entity# 写sql的xml文件,放在这个文件夹下mapper-locations: classpath:/mapper/*Mapper.xml# 驼峰命名 + 日志configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplimgLocation: D:/620/
3.springMvc配置类:拦截器+静态资源映射
package com.tianju.config;import com.tianju.interceptor.LoginAuthorInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** springMvc的配置类* 1.是配置类:@Configuration* 2.是springMvc的配置类:implements WebMvcConfigurer*/
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {@AutowiredLoginAuthorInterceptor loginAuthorInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginAuthorInterceptor).addPathPatterns("/**") // 拦截谁,表示都拦截.excludePathPatterns("/user/loginPage","/user/login","/user/registerPage","/user/register","/image/get","/js/**","/css/**","/bootstrap/**","/img/**");}// 静态资源映射@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 1.浏览器访问哪个链接,2.映射到哪里registry.addResourceHandler("/bookImg/**") // 访问的连接.addResourceLocations("file:D:/620/bookImg/"); // 映射的位置}
}
拦截器实体类
package com.tianju.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** spring的拦截器* 1.在容器中,@Component* 2.是拦截器,实现接口 implements HandlerInterceptor*/
@Component
public class LoginAuthorInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 如果没有登陆,就去登陆页面; 如果登陆了,就放行;HttpSession session = request.getSession();Object user = session.getAttribute("user");if (user==null){// 没有登陆,重定向到登陆页面response.sendRedirect("/user/loginPage");return false;}// 登陆了,放行return true;}
}
4.主启动类@SpringBootApplication
package com.tianju;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class);}
}