diff --git a/chapter-4-spring-boot-validating-form-input/pom.xml b/chapter-4-spring-boot-validating-form-input/pom.xml new file mode 100644 index 0000000..35ab84c --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + spring.boot.core + chapter-4-spring-boot-validating-form-input + 0.0.1-SNAPSHOT + jar + + chapter-4-spring-boot-validating-form-input + 第四章表单校验案例 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M4 + + + + + UTF-8 + UTF-8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + com.h2database + h2 + runtime + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.1.RELEASE + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone + + false + + + + + diff --git a/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/ValidatingFormInputApplication.java b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/ValidatingFormInputApplication.java new file mode 100644 index 0000000..1825f04 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/ValidatingFormInputApplication.java @@ -0,0 +1,12 @@ +package spring.boot.core; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ValidatingFormInputApplication { + + public static void main(String[] args) { + SpringApplication.run(ValidatingFormInputApplication.class, args); + } +} diff --git a/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/domain/User.java b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/domain/User.java new file mode 100644 index 0000000..535d3a5 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/domain/User.java @@ -0,0 +1,91 @@ +package spring.boot.core.domain; + +import org.hibernate.validator.constraints.NotEmpty; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + * 用户实体类 + *

+ * Created by bysocket on 21/07/2017. + */ +@Entity +public class User implements Serializable { + + /** + * 编号 + */ + @Id + @GeneratedValue + private Long id; + + /** + * 名称 + */ + @NotEmpty(message = "姓名不能为空") + @Size(min = 2, max = 8, message = "姓名长度必须大于 2 且小于 20 字") + private String name; + + /** + * 年龄 + */ + @NotNull(message = "年龄不能为空") + @Min(value = 0, message = "年龄大于 0") + @Max(value = 300, message = "年龄不大于 300") + private Integer age; + + /** + * 出生时间 + */ + @NotEmpty(message = "出生时间不能为空") + private String birthday; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", birthday=" + birthday + + '}'; + } +} diff --git a/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/domain/UserRepository.java b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/domain/UserRepository.java new file mode 100644 index 0000000..6e40f4a --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/domain/UserRepository.java @@ -0,0 +1,12 @@ +package spring.boot.core.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * 用户持久层操作接口 + * + * Created by bysocket on 21/07/2017. + */ +public interface UserRepository extends JpaRepository { + +} diff --git a/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/service/UserService.java b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/service/UserService.java new file mode 100644 index 0000000..8111e6f --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/service/UserService.java @@ -0,0 +1,24 @@ +package spring.boot.core.service; + + +import spring.boot.core.domain.User; + +import java.util.List; + +/** + * User 业务层接口 + * + * Created by bysocket on 24/07/2017. + */ +public interface UserService { + + List findAll(); + + User insertByUser(User user); + + User update(User user); + + User delete(Long id); + + User findById(Long id); +} diff --git a/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/service/impl/UserServiceImpl.java b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..9da3385 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/service/impl/UserServiceImpl.java @@ -0,0 +1,57 @@ +package spring.boot.core.service.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import spring.boot.core.domain.User; +import spring.boot.core.domain.UserRepository; +import spring.boot.core.service.UserService; + +import java.util.List; + +/** + * User 业务层实现 + * + * Created by bysocket on 24/07/2017. + */ +@Service +public class UserServiceImpl implements UserService { + + private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class); + + @Autowired + UserRepository userRepository; + + @Override + public List findAll() { + return userRepository.findAll(); + } + + @Override + public User insertByUser(User user) { + LOGGER.info("新增用户:" + user.toString()); + return userRepository.save(user); + } + + @Override + public User update(User user) { + LOGGER.info("更新用户:" + user.toString()); + return userRepository.save(user); + } + + @Override + public User delete(Long id) { + User user = userRepository.findById(id).get(); + userRepository.delete(user); + + LOGGER.info("删除用户:" + user.toString()); + return user; + } + + @Override + public User findById(Long id) { + LOGGER.info("获取用户 ID :" + id); + return userRepository.findById(id).get(); + } +} diff --git a/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/web/UserController.java b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/web/UserController.java new file mode 100644 index 0000000..3eb0360 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/java/spring/boot/core/web/UserController.java @@ -0,0 +1,112 @@ +package spring.boot.core.web; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import spring.boot.core.domain.User; +import spring.boot.core.service.UserService; + +import javax.validation.Valid; + +/** + * 用户控制层 + * + * Created by bysocket on 24/07/2017. + */ +@Controller +@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在 /users +public class UserController { + + @Autowired + UserService userService; // 用户服务层 + + /** + * 获取用户列表 + * 处理 "/users" 的 GET 请求,用来获取用户列表 + * 通过 @RequestParam 传递参数,进一步实现条件查询或者分页查询 + */ + @RequestMapping(method = RequestMethod.GET) + public String getUserList(ModelMap map) { + map.addAttribute("userList", userService.findAll()); + return "userList"; + } + + /** + * 显示创建用户表单 + * + * @param map + * @return + */ + @RequestMapping(value = "/create", method = RequestMethod.GET) + public String createUserForm(ModelMap map) { + map.addAttribute("user", new User()); + map.addAttribute("action", "create"); + return "userForm"; + } + + /** + * 创建用户 + * 处理 "/users" 的 POST 请求,用来获取用户列表 + * 通过 @ModelAttribute 绑定参数,也通过 @RequestParam 从页面中传递参数 + */ + @RequestMapping(value = "/create", method = RequestMethod.POST) + public String postUser(ModelMap map, + @ModelAttribute @Valid User user, + BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + map.addAttribute("action", "create"); + return "userForm"; + } + + userService.insertByUser(user); + + return "redirect:/users/"; + } + + + /** + * 显示需要更新用户表单 + * 处理 "/users/{id}" 的 GET 请求,通过 URL 中的 id 值获取 User 信息 + * URL 中的 id ,通过 @PathVariable 绑定参数 + */ + @RequestMapping(value = "/update/{id}", method = RequestMethod.GET) + public String getUser(@PathVariable Long id, ModelMap map) { + map.addAttribute("user", userService.findById(id)); + map.addAttribute("action", "update"); + return "userForm"; + } + + /** + * 处理 "/users/{id}" 的 PUT 请求,用来更新 User 信息 + * + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + public String putUser(ModelMap map, + @ModelAttribute @Valid User user, + BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + map.addAttribute("action", "update"); + return "userForm"; + } + + userService.update(user); + return "redirect:/users/"; + } + + /** + * 处理 "/users/{id}" 的 GET 请求,用来删除 User 信息 + */ + @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) + public String deleteUser(@PathVariable Long id) { + + userService.delete(id); + return "redirect:/users/"; + } +} \ No newline at end of file diff --git a/chapter-4-spring-boot-validating-form-input/src/main/resources/application.properties b/chapter-4-spring-boot-validating-form-input/src/main/resources/application.properties new file mode 100644 index 0000000..51350c6 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/resources/application.properties @@ -0,0 +1,2 @@ +## 是否显示 SQL 语句 +spring.jpa.show-sql=true \ No newline at end of file diff --git a/chapter-4-spring-boot-validating-form-input/src/main/resources/static/css/default.css b/chapter-4-spring-boot-validating-form-input/src/main/resources/static/css/default.css new file mode 100755 index 0000000..4da3051 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/resources/static/css/default.css @@ -0,0 +1,2 @@ +/* contentDiv */ +.contentDiv {padding:20px 60px;} \ No newline at end of file diff --git a/chapter-4-spring-boot-validating-form-input/src/main/resources/static/images/favicon.ico b/chapter-4-spring-boot-validating-form-input/src/main/resources/static/images/favicon.ico new file mode 100755 index 0000000..e5a2934 Binary files /dev/null and b/chapter-4-spring-boot-validating-form-input/src/main/resources/static/images/favicon.ico differ diff --git a/chapter-4-spring-boot-validating-form-input/src/main/resources/templates/userForm.html b/chapter-4-spring-boot-validating-form-input/src/main/resources/templates/userForm.html new file mode 100644 index 0000000..f60c4e0 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/resources/templates/userForm.html @@ -0,0 +1,58 @@ + + + + + + + + + 用户管理 + + + +

+ +
《 Spring Boot 2.x 核心技术实战》第二章快速入门案例
+ + + 用户管理 + + +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+    + +
+
+
+
+ + \ No newline at end of file diff --git a/chapter-4-spring-boot-validating-form-input/src/main/resources/templates/userList.html b/chapter-4-spring-boot-validating-form-input/src/main/resources/templates/userList.html new file mode 100644 index 0000000..3d680f1 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/main/resources/templates/userList.html @@ -0,0 +1,46 @@ + + + + + + + + + 用户列表 + + + + +
+ +
《 Spring Boot 2.x 核心技术实战》第二章快速入门案例
+ + + + 用户列表 + + + + + + + + + + + + + + + + + + + +
用户编号名称年龄出生时间管理
删除
+ +
创建用户
+
+ + + \ No newline at end of file diff --git a/chapter-4-spring-boot-validating-form-input/src/test/java/spring/boot/core/ValidatingFormInputApplicationTests.java b/chapter-4-spring-boot-validating-form-input/src/test/java/spring/boot/core/ValidatingFormInputApplicationTests.java new file mode 100644 index 0000000..a8c5570 --- /dev/null +++ b/chapter-4-spring-boot-validating-form-input/src/test/java/spring/boot/core/ValidatingFormInputApplicationTests.java @@ -0,0 +1,16 @@ +package spring.boot.core; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ValidatingFormInputApplicationTests { + + @Test + public void contextLoads() { + } + +}