前言
本篇文章主要讲述SpringBoot整合Jsp,实现一个简单的用户增删改查示例工程。若需工程源代码,可以直接跳到底部,通过链接下载工程代码。
SpringBoot整合Jsp
开发准备
环境要求
JDK: 1.8
SQL: MySql
这里我们需要在mysql中建立一张用户表,用于存储用户的信息。
数据库脚本如下:
CREATE TABLE `tb_user` (
`id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`username` varchar(10) DEFAULT NULL COMMENT '用户名',
`sex` int(1) DEFAULT NULL COMMENT '性别,0:女, 1:男',
`password` varchar(50) DEFAULT NULL COMMENT '密码',
`age` int(3) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
新建好表之后,我们再来创建工程。
我们的这个工程是通过maven创建一个普通的web工程。
创建好工程之后,我们需要下载相应的jar包,然后再来进行相关的开发。
这些jar包我们在pom.xml文件中添加springBoot和Jsp相关的jar即可。
相关的注释以及写在其中了,这里就不在过多讲述了。
Maven依赖如下:
<dependencies>
<!-- Spring Boot Web 依赖 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<!-- Spring Boot 热部署 class文件之后会自动重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.0.1.RELEASE</version>
<optional>true</optional>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.0.1.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- Spring Boot JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<!--fastjson 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.14</version>
</dependency>
<!--JSP 依赖 -->
<!-- servlet依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- tomcat的支持.-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>8.5.15</version>
<scope>provided</scope>
</dependency>
</dependencies>
相关的Jar包下载完毕之后,我们再来确认项目的工程结构。
首先是后台相关包说明:
src/main/java
com.dwqin.controller - Controller层
com.dwqin.dao - 数据操作层 DAO
com.dwqin.pojo - 实体类
com.dwqin.service - 业务逻辑层
com.dwqin.StartApplication - 应用启动类
src/main/java/resources
application.yml - 应用配置文件,应用启动会自动读取配置
前端的相关文件存放说明:
src/main/webapp
pages - JSP文件的存放路径
WEB-INF - web.xml web相关的核心配置
整体工程结构图:
工程结构确认之后,我们再来添加相应的配置。
只需在application.yml 添加相应的配置即可。
数据源的配置和之前的差不多,需要注意的是Jsp的相关配置。
由于springBoot默认的支持的模版是Thymeleaf,所以这里我们需要进行相应的更改。
配置如下:
#服务属性配置
server:
port: 8082
spring:
application:
name: springboot-jsp-thymeleaf
mvc:
view:
prefix: /pages/
suffix: .jsp
datasource:
url: jdbc:mysql://127.0.0.1:3306/dwqin?useSSL=false&characterEncoding=utf-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
jpa:
show-sql: true # 打印sql
generate-ddl: false # 自动建表
database: MySQL # 数据库类型
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
代码编写
其实这里的代码和之前文章讲述的基本一致,唯一有点区别的是,这里我是用JPA实现对数据库进行操作的(也就是顺便说下JPA这个框架的使用)。
首先是实体类,这里因为用了JPA,所以和之前的有点不同,添加了一些注解。
Entity:表示这是个实体类。
Table:该实体类映射的数据表名。
Column:指定该字段的属性,nullable 表示是否非空,unique 表示是否是唯一。
那么实体类的代码如下:
@Entity
@Table(name = "tb_user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String username;
@Column(name = "sex")
private Integer sex;
@Column(name = "password")
private String password;
@Column(name = "age")
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
由于用的是JPA,dao层这块只需继承JpaRepository该类即可,需要指定实体类和主键类型。
dao层代码如下:
public interface UserDao extends JpaRepository<User, Long>, JpaSpecificationExecutor<User>{
}
业务层这块和之前一样调用即可,虽然用的是JPA,但是方法也是很简单的,新增和修改就用save,删除就是delete,findOne就是通过ID查找,findAll就是查询所有等等。
services代码如下:
public interface UserService {
public boolean addUser(User user);
public boolean updateUser(User user);
public boolean deleteById(Long id);
public User findUserById(Long id);
public List<User> findAll();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public boolean addUser(User user) {
boolean flag = false;
try {
userDao.save(user);
flag = true;
} catch (Exception e) {
System.out.println("新增失败!");
e.printStackTrace();
}
return flag;
}
@Override
public boolean updateUser(User user) {
boolean flag = false;
try {
userDao.save(user);
flag = true;
} catch (Exception e) {
System.out.println("修改失败!");
e.printStackTrace();
}
return flag;
}
@Override
public boolean deleteById(Long id) {
boolean flag = false;
try {
userDao.deleteById(id);
flag = true;
} catch (Exception e) {
System.out.println("删除失败!");
e.printStackTrace();
}
return flag;
}
@Override
public User findUserById(Long id) {
return userDao.findById(id).get();
}
@Override
public List<User> findAll() {
return userDao.findAll();
}
}
到了控制层这块,这里提供还是提供接口给Jsp进行调用,不过这里类的注解就不能用之前的RestController这个注解,这个注解以json的格式返回数据,但是我们有时返回的时候需要跳转界面,所以应该使用Controller这个注解。如果想在某个方法中返回的数据格式是json的话,在该方法上加上ResponseBody这个注解即可。
控制层代码如下:
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/index")
public ModelAndView sign_demo() {
return new ModelAndView("/index");
}
@RequestMapping("/list")
public String list(Model model) {
List<User> userList = userService.findAll();
model.addAttribute("userList", userList);
return "user/list";
}
@RequestMapping("/toAdd")
public String toAdd() {
return "user/userAdd";
}
@RequestMapping(value = "/add")
public String add(User user) {
userService.addUser(user);
return "redirect:/list";
}
@RequestMapping("/toEdit")
public String toEdit(Model model, Long id) {
User user = userService.findUserById(id);
model.addAttribute("user", user);
return "user/userEdit";
}
@RequestMapping("/edit")
public String edit(User user) {
userService.updateUser(user);
return "redirect:/list";
}
@RequestMapping("/toDelete")
public String delete(Long id) {
userService.deleteById(id);
return "redirect:/list";
}
}
启动类:
StartApplication.java
@SpringBootApplication
public class StartApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(StartApplication.class);
springApplication.run(args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(StartApplication.class);
}
}
前端jsp代码如下:
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>index</title>
</head>
<body>
<p><a href="<%=request.getContextPath()%>/list">用户列表</a></p>
<a href="<%=request.getContextPath()%>/toAdd">添加用户</a>
</body>
</html>
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>list</title>
<style>
.tb {
border-collapse: collapse;
}
.tb tr th, .tb tr td {
border: 1px solid #666666;
text-align: center;
}
</style>
</head>
<body>
<h2>用户列表</h2>
<a href="<%=request.getContextPath()%>/toAdd">添加用户</a>
<br/><br/>
<table class="tb">
<tr>
<th>序号</th>
<th>用户名</th>
<th>性别</th>
<th>密码</th>
<th>年龄</th>
<th>编辑</th>
<th>删除</th>
</tr>
<c:forEach items="${userList}" var="userItem" varStatus="userStatus">
<tr>
<td>${userItem.id}</td>
<td>${userItem.username}</td>
<c:choose>
<c:when test="${userItem.sex eq '1'}"><td>男</td></c:when>
<c:otherwise><td>女</td></c:otherwise>
</c:choose>
<td>${userItem.password}</td>
<td>${userItem.age}</td>
<td><a href="<%=request.getContextPath()%>/toEdit?id=${userItem.id}">编辑</a></td>
<td><a href="<%=request.getContextPath()%>/toDelete?id=${userItem.id}">删除</a></td>
</tr>
</c:forEach>
</table>
<br/><br/>
<div><a href="<%=request.getContextPath()%>/index">返回首页</a></div>
</body>
</html>
userAdd.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>add</title>
</head>
<body>
<h2>添加用户</h2>
<form action="<%=request.getContextPath()%>/add" method="post">
<label>
用户名:<input type="text" name="username">
</label>
<br/><br/>
<label>
性别:
<input type="radio" name="sex" value="1">男
<input type="radio" name="sex" value="0">女
</label>
<br/><br/>
<label>
密 码:<input type="password" name="password">
</label>
<br/><br/>
<label>
年 龄:<input type="text" name="age">
</label>
<br/><br/>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
<br/><br/>
<div><a href="<%=request.getContextPath()%>/index">返回首页</a></div>
</body>
</html>
userEdit.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>edit</title>
</head>
<body>
<h2>编辑用户</h2>
<form action="<%=request.getContextPath()%>/edit" method="post">
<input type="hidden" name="id" value="${user.id}">
<label>
用户名:<input type="text" name="username" value="${user.username}">
</label>
<br/>
<label>
性别:
<input type="radio" name="sex" ${user.sex eq '1' ? 'checked="checked"':""} value="1">男
<input type="radio" name="sex" ${user.sex eq '0' ? 'checked="checked"':""} value="0">女
</label>
<br/>
<label>
密 码:<input type="text" name="password" value="${user.password}">
</label>
<br/>
<label>
年 龄:<input type="text" name="age" value=${user.age}>
</label>
<br/><br/>
<input type="submit" value="修改">
</form>
<br/><br/>
<div><a href="<%=request.getContextPath()%>/index">返回首页</a></div>
</body>
</html>
功能测试
我们直接点击StartApplication启动项目,在浏览器上输入地址查看效果。
1.主界面: http://localhost:8082/index
2.列表页:http://localhost:8082/list
3.添加页面:http://localhost:8082/toAdd
4. 编辑页面:http://127.0.0.1:8082/toEdit?id=7
源代码下载地址: https://download.youkuaiyun.com/download/qq_35161159/11966735