本周介绍SpringBoot项目Web开发的项目内容,及常用的CRUD操作,阅读本章前请阅读【SpringBoot】SpringBoot与Thymeleaf模版(六)的相关内容

Web开发

  项目搭建

  1、新建一个SpringBoot的web项目。pom.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>com.test</groupId>
  8. <artifactId>test-springboot-web2</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10.  
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>2.1.8.RELEASE</version>
  15. </parent>
  16.  
  17. <properties>
  18.  
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  21. <java.version>1.8</java.version>
  22. </properties>
  23.  
  24. <dependencies>
  25.  
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-web</artifactId>
  29. </dependency>
  30.  
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  34. </dependency>
  35.  
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41.  
  42. </dependencies>
  43.  
  44. <!-- SpringBoot打包插件,可以将代码打包成一个可执行的jar包 -->
  45. <build>
  46. <plugins>
  47. <plugin>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-maven-plugin</artifactId>
  50. </plugin>
  51. </plugins>
  52. </build>
  53.  
  54. </project>

  2、配置文件application.properties如下:

  1. # 项目端口
  2. server.port=8081
  3. # 项目访问路径
  4. server.servlet.context-path=/test
  5.  
  6. # 禁用thymeleaf缓存
  7. spring.thymeleaf.cache=false
  8.  
  9. # mvc参数日期格式
  10. spring.mvc.date-format=yyyy-MM-dd

  3、在浏览器中使用地址http://localhost:8081/test/即可访问项目

  4、项目目录结构

    

  登录功能

  1、编写登录LoginController.java;逻辑验证用户名和密码,登录成功后在session中存入熟悉loginUser

  1. package com.test.springboot.controller;
  2.  
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.util.StringUtils;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7.  
  8. import javax.servlet.http.HttpServletRequest;
  9. import java.util.Map;
  10.  
  11. @Controller
  12. public class LoginController {
  13.  
  14. @PostMapping(value = "/user/login")
  15. public String login(@RequestParam("username") String username,
  16. @RequestParam("password") String password,
  17. Map<String, Object> map, HttpServletRequest request){
  18. System.out.println("======");
  19. if(!StringUtils.isEmpty(username) && "123456".equals(password)) {
  20. // 登陆成功
  21. // 防止表单重复提交,可以重定向到主页
  22. request.getSession().setAttribute("loginUser", username);
  23. return "redirect:/main.html";
  24. }else {
  25. // 登陆失败
  26. map.put("msg", "用户名或密码错误");
  27. return "login";
  28. }
  29.  
  30. }
  31.  
  32. }

  2、新建拦截器LoginHandlerInterceptor.java;逻辑:在session中判断是否存在属性loginUser,存在即已登录,不存在未登录

  1. package com.test.springboot.component;
  2.  
  3. import org.springframework.web.servlet.HandlerInterceptor;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9.  
  10. public class LoginHandlerInterceptor implements HandlerInterceptor {
  11.  
  12. @Override
  13. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
  14. Object user = request.getSession().getAttribute("loginUser");
  15. if(user == null) {
  16. // 未登录
  17. request.setAttribute("msg", "没有权限请先登录");
  18. request.getRequestDispatcher("/index.html").forward(request, response);
  19. }else{
  20. // 已登录
  21. return true;
  22. }
  23. return false;
  24. }
  25. }

  3、在SpringMvc中添加拦截器

  1. package com.test.springboot.config;
  2.  
  3. import com.test.springboot.component.LoginHandlerInterceptor;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  6. import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
  7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8.  
  9. // @EnableWebMvc // 全面接管SpringMVC,所有的WebMvc自动配置都失效,如静态资源的访问都失效
  10. @Configuration
  11. public class MyMvcConfig implements WebMvcConfigurer {
  12.  
  13. // 添加视图映射
  14. @Override
  15. public void addViewControllers(ViewControllerRegistry registry) {
  16. // // 浏览器访问 "/success2" 重定向到 "/success"
  17. // registry.addRedirectViewController("/success2", "/success");
  18. // // 浏览器访问 "/success2" 转发 "/success"
  19. // registry.addViewController("/success3").setViewName("/success");
  20.  
  21. // 首页
  22. registry.addViewController("/").setViewName("login");
  23. registry.addViewController("/index.html").setViewName("login");
  24.  
  25. registry.addViewController("/main.html").setViewName("main");
  26.  
  27. }
  28.  
  29. // 添加拦截器
  30. @Override
  31. public void addInterceptors(InterceptorRegistry registry) {
  32.  
  33. // springboot静态映射已做好,无需在拦截器中处理静态资源
  34. registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
  35. .excludePathPatterns("/", "/index.html", "/user/login");
  36. }
  37. }

  4、编辑登录界面login.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>login</title>
  6. </head>
  7. <body style="text-align: center;">
  8. <h3>登录</h3>
  9. <form th:action="@{/user/login}" method="post">
  10. <p>用户名:<input type="text" name="username" /></p>
  11. <p>密 码: <input type="password" name="password" /></p>
  12. <input type="submit" value="提交" />
  13. </form>
  14. 提示1:[[${msg}]]
  15. </body>
  16. </html>

  5、编辑主页面main.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>main</title>
  6. </head>
  7. <body style="text-align: center;">
  8. <h3>主页</h3>
  9. <br>
  10. [[${session.loginUser}]]
  11. <h4><a th:href="@{/emps}">员工列表</a></h4>
  12. 提示-:[[${msg}]]
  13. </body>
  14. </html>

  6、测试,在浏览器中打开地址:http://localhost:8081/test

    

  CURD功能

  1、新建员工Controller,内容如下:

  1. package com.test.springboot.controller;
  2.  
  3. import com.test.springboot.dao.DepartmentDao;
  4. import com.test.springboot.dao.EmployeeDao;
  5. import com.test.springboot.entities.Department;
  6. import com.test.springboot.entities.Employee;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.ui.Model;
  10. import org.springframework.web.bind.annotation.*;
  11.  
  12. import java.util.Collection;
  13.  
  14. @Controller
  15. public class EmployeeController {
  16.  
  17. @Autowired
  18. private EmployeeDao employeeDao;
  19.  
  20. @Autowired
  21. private DepartmentDao departmentDao;
  22.  
  23. // 查询所有员工列表
  24. @GetMapping("/emps")
  25. public String list(Model model){
  26. Collection<Employee> employees = employeeDao.getAll();
  27.  
  28. // 放在请求域中
  29. model.addAttribute("emps", employees);
  30.  
  31. return "emp/list";
  32. }
  33.  
  34. // 添加员工页面
  35. @GetMapping("/emp")
  36. public String toAddPage(Model model){
  37. // 查询所有部门
  38. Collection<Department> departments = departmentDao.getDepartments();
  39. model.addAttribute("depts", departments);
  40. return "emp/add";
  41. }
  42.  
  43. @GetMapping("/emp/{id}")
  44. public String toEditPage(@PathVariable("id") Integer id , Model model){
  45.  
  46. Employee employee = employeeDao.get(id);
  47. model.addAttribute("emp", employee);
  48.  
  49. Collection<Department> departments = departmentDao.getDepartments();
  50. model.addAttribute("depts", departments);
  51. return "emp/add";
  52. }
  53.  
  54. // 员工添加
  55. @PostMapping("/emp")
  56. public String addEmp(Employee employee){
  57. System.out.println("员工信息:" + employee);
  58. // 返回员工列表界面
  59. // redirect:表示重定向到某个界面
  60. // forward:表示转发到某个界面
  61. employeeDao.save(employee);
  62. return "redirect:/emps";
  63. }
  64.  
  65. //员工修改;需要提交员工id;
  66. @PutMapping("/emp")
  67. public String updateEmployee(Employee employee){
  68. System.out.println("修改的员工数据:"+employee);
  69. employeeDao.save(employee);
  70. return "redirect:/emps";
  71. }
  72.  
  73. //员工删除
  74. @DeleteMapping("/emp/{id}")
  75. public String deleteEmployee(@PathVariable("id") Integer id){
  76. employeeDao.delete(id);
  77. return "redirect:/emps";
  78. }
  79.  
  80. }

  2、员工DAO

  1. package com.test.springboot.dao;
  2.  
  3. import java.util.Collection;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6.  
  7. import com.test.springboot.entities.Department;
  8. import com.test.springboot.entities.Employee;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Repository;
  11.  
  12. @Repository
  13. public class EmployeeDao {
  14.  
  15. private static Map<Integer, Employee> employees = null;
  16.  
  17. @Autowired
  18. private DepartmentDao departmentDao;
  19.  
  20. static{
  21. employees = new HashMap<Integer, Employee>();
  22.  
  23. employees.put(1001, new Employee(1001, "E-AA", "aa@163.com", 1, new Department(101, "D-AA")));
  24. employees.put(1002, new Employee(1002, "E-BB", "bb@163.com", 1, new Department(102, "D-BB")));
  25. employees.put(1003, new Employee(1003, "E-CC", "cc@163.com", 0, new Department(103, "D-CC")));
  26. employees.put(1004, new Employee(1004, "E-DD", "dd@163.com", 0, new Department(104, "D-DD")));
  27. employees.put(1005, new Employee(1005, "E-EE", "ee@163.com", 1, new Department(105, "D-EE")));
  28. }
  29.  
  30. private static Integer initId = 1006;
  31.  
  32. public void save(Employee employee){
  33. if(employee.getId() == null){
  34. employee.setId(initId++);
  35. }
  36.  
  37. employee.setDepartment(departmentDao.getDepartment(employee.getDepartment().getId()));
  38. employees.put(employee.getId(), employee);
  39. }
  40.  
  41. //查询所有员工
  42. public Collection<Employee> getAll(){
  43. return employees.values();
  44. }
  45.  
  46. public Employee get(Integer id){
  47. return employees.get(id);
  48. }
  49.  
  50. public void delete(Integer id){
  51. employees.remove(id);
  52. }
  53. }

  3、部门DAO

  1. package com.test.springboot.dao;
  2.  
  3. import java.util.Collection;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6.  
  7. import com.test.springboot.entities.Department;
  8. import org.springframework.stereotype.Repository;
  9.  
  10. @Repository
  11. public class DepartmentDao {
  12.  
  13. private static Map<Integer, Department> departments = null;
  14.  
  15. static{
  16. departments = new HashMap<Integer, Department>();
  17.  
  18. departments.put(101, new Department(101, "D-AA"));
  19. departments.put(102, new Department(102, "D-BB"));
  20. departments.put(103, new Department(103, "D-CC"));
  21. departments.put(104, new Department(104, "D-DD"));
  22. departments.put(105, new Department(105, "D-EE"));
  23. }
  24.  
  25. public Collection<Department> getDepartments(){
  26. return departments.values();
  27. }
  28.  
  29. public Department getDepartment(Integer id){
  30. return departments.get(id);
  31. }
  32.  
  33. }

  4、员工对象

  1. package com.test.springboot.entities;
  2.  
  3. import java.util.Date;
  4.  
  5. public class Employee {
  6.  
  7. private Integer id;
  8. private String lastName;
  9.  
  10. private String email;
  11. //1 male, 0 female
  12. private Integer gender;
  13. private Department department;
  14. private Date birth;
  15.  
  16. public Integer getId() {
  17. return id;
  18. }
  19.  
  20. public void setId(Integer id) {
  21. this.id = id;
  22. }
  23.  
  24. public String getLastName() {
  25. return lastName;
  26. }
  27.  
  28. public void setLastName(String lastName) {
  29. this.lastName = lastName;
  30. }
  31.  
  32. public String getEmail() {
  33. return email;
  34. }
  35.  
  36. public void setEmail(String email) {
  37. this.email = email;
  38. }
  39.  
  40. public Integer getGender() {
  41. return gender;
  42. }
  43.  
  44. public void setGender(Integer gender) {
  45. this.gender = gender;
  46. }
  47.  
  48. public Department getDepartment() {
  49. return department;
  50. }
  51.  
  52. public void setDepartment(Department department) {
  53. this.department = department;
  54. }
  55.  
  56. public Date getBirth() {
  57. return birth;
  58. }
  59.  
  60. public void setBirth(Date birth) {
  61. this.birth = birth;
  62. }
  63. public Employee(Integer id, String lastName, String email, Integer gender,
  64. Department department) {
  65. super();
  66. this.id = id;
  67. this.lastName = lastName;
  68. this.email = email;
  69. this.gender = gender;
  70. this.department = department;
  71. this.birth = new Date();
  72. }
  73.  
  74. public Employee() {
  75. }
  76.  
  77. @Override
  78. public String toString() {
  79. return "Employee{" +
  80. "id=" + id +
  81. ", lastName='" + lastName + '\'' +
  82. ", email='" + email + '\'' +
  83. ", gender=" + gender +
  84. ", department=" + department +
  85. ", birth=" + birth +
  86. '}';
  87. }
  88.  
  89. }

  5、部门对象

  1. package com.test.springboot.entities;
  2.  
  3. public class Department {
  4.  
  5. private Integer id;
  6. private String departmentName;
  7.  
  8. public Department() {
  9. }
  10.  
  11. public Department(int i, String string) {
  12. this.id = i;
  13. this.departmentName = string;
  14. }
  15.  
  16. public Integer getId() {
  17. return id;
  18. }
  19.  
  20. public void setId(Integer id) {
  21. this.id = id;
  22. }
  23.  
  24. public String getDepartmentName() {
  25. return departmentName;
  26. }
  27.  
  28. public void setDepartmentName(String departmentName) {
  29. this.departmentName = departmentName;
  30. }
  31.  
  32. @Override
  33. public String toString() {
  34. return "Department [id=" + id + ", departmentName=" + departmentName + "]";
  35. }
  36.  
  37. }

  6、员工列表界面 list.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>add</title>
  6. </head>
  7. <body style="text-align: center;">
  8. <h3>员工列表</h3>
  9. <a th:href="@{/emp}">添加员工</a>
  10. <table>
  11. <thead>
  12. <tr>
  13. <tr>
  14. <th>#</th>
  15. <th>lastName</th>
  16. <th>email</th>
  17. <th>gender</th>
  18. <th>department</th>
  19. <th>birth</th>
  20. <th>操作</th>
  21. </tr>
  22. </tr>
  23. </thead>
  24. <tbody>
  25. <tr th:each="emp:${emps}">
  26. <td th:text="${emp.id}"></td>
  27. <td>[[${emp.lastName}]]</td>
  28. <td th:text="${emp.email}"></td>
  29. <td th:text="${emp.gender} == 0 ? '女' : '男'"></td>
  30. <td th:text="${emp.department.departmentName}"></td>
  31. <td th:text="${#dates.format(emp.birth, 'yyyy-MM-dd HH:mm')}"></td>
  32. <td>
  33. <a th:href="@{/emp/} + ${emp.id}">编辑</a>
  34.  
  35. <form id="deleteEmpForm" method="post" th:action="@{/emp/}+${emp.id}">
  36. <input type="hidden" name="_method" value="delete"/>
  37. <button th:attr="del_uri=@{/emp/}+${emp.id}" type="submit">删除</button>
  38. </form>
  39. </td>
  40. </tr>
  41. </tbody>
  42. </table>
  43. </body>
  44. </html>

  7、员工新增界面 add.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>list</title>
  6. </head>
  7. <body style="text-align: center;">
  8. <h3>添加员工</h3>
  9.  
  10. <!-- 发送put请求修改员工数据 -->
  11. <!--
  12. 1、SpringMVC中配置HiddenHttpMethodFilter(SpringBoot自动配置)
  13. 2、页面创建一个post表单
  14. 3、创建一个input项,name="_method"; 值就是我们指定的请求方式
  15. -->
  16. <form th:action="@{/emp}" method="post">
  17. <input type="hidden" name="_method" value="put" th:if="${emp!=null}"/>
  18. <input type="hidden" name="id" th:value="${emp.id}" th:if="${emp!=null}" />
  19. <p>lastName:<input type="text" name="lastName" th:value="${emp != null}?${emp.lastName}"/></p>
  20. <p>email: <input type="text" name="email" th:value="${emp != null}?${emp.email}" /></p>
  21. <p>gender:
  22. <input type="radio" name="gender" value="1" th:checked="${emp != null}?${emp.gender==1}">
  23. <input type="radio" name="gender" value="0" th:checked="${emp != null}?${emp.gender==0 }">
  24. </p>
  25. <p>department:
  26. <select name="department.id" >
  27. <option th:each="dept:${depts}" th:value="${dept.id}" th:selected="${emp != null}?${dept.id == emp.department.id}" th:text="${dept.departmentName}"></option>
  28. </select>
  29. <p>birth: <input type="text" name="birth" th:value="${emp != null}?${#dates.format(emp.birth, 'yyyy-MM-dd')}"/></p>
  30. <input type="submit" th:value="${emp != null? '修改' : '添加'}" />
  31. </form>
  32. </body>
  33. </html>

  6、测试如下:

    

【SpringBoot】SpringBoot Web开发(八)的更多相关文章

  1. SpringBoot学习(七)-->SpringBoot在web开发中的配置

    SpringBoot在web开发中的配置 Web开发的自动配置类:在Maven Dependencies-->spring-boot-1.5.2.RELEASE.jar-->org.spr ...

  2. SpringBoot:Web开发

    西部开源-秦疆老师:基于SpringBoot 2.1.6 的博客教程 , 基于atguigu 1.5.x 视频优化 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处 ...

  3. SpringBoot之WEB开发-专题二

    SpringBoot之WEB开发-专题二 三.Web开发 3.1.静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资 ...

  4. springboot java web开发工程师效率

    基础好工具 idea iterm2 和 oh-my-zsh git 热加载 java web项目每次重启时间成本太大. 编程有一个过程很重要, 就是试验, 在一次次试验中探索, 积累素材优化调整程序模 ...

  5. SpringBoot与Web开发

    web开发1).创建SpringBoot应用,选中我们需要的模块:2).SpringBoot已经默认将这些场景已经配置好了,只需要在配置文件中指定少量配置就可以运行起来3).自己编写业务代码: 自动配 ...

  6. SpringBoot日记——Web开发篇

    准备开始实战啦!~~~~ 我们先来看,SpringBoot的web是如何做web开发的呢?通常的步骤如下: 1.创建springboot应用,指定模块: 2.配置部分参数配置: 3.编写业务代码: 为 ...

  7. 十二、springboot之web开发之静态资源处理

    springboot静态资源处理 Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性. 建议大家使用Spring Boot的默 ...

  8. SpringBoot(四) Web开发 --- Thymeleaf、JSP

    Spring Boot提供了spring-boot-starter-web为Web开发予以支持,spring-boot-starter-web为我们提供了嵌入的Tomcat以及Spring MVC的依 ...

  9. 【SpringBoot】Web开发

    一.简介 1.1 引入SpringBoot模块 1.2 SpringBoot对静态资源的映射规则 二.模版引擎 2.1 简介 2.2 引入thymeleaf 2.3 Thymeleaf使用 一.简介 ...

  10. SpringBoot的Web开发

    一.创建Web项目 创建的时候勾选对应web选项即可,会自动引入相应的starter,pom如下: <dependency> <groupId>org.springframew ...

随机推荐

  1. windows驱动不要签名

    BCDEDIT -SET LOADOPTIONS DISABLE_INTEGRITY_CHECKSBCDEDIT -SET TESTSIGNING ON

  2. 【学CG系列】web之审查元素

    一.审查元素的作用 审查元素(你的F12)可以做到定位网页元素.实时监控网页元素属性变化的功能,可以及时调试.修改.定位.追踪检查.查看嵌套 ,修改样式和查看js动态输出信息,是开发人员得心应手的好工 ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-play-circle

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. G - Traffic

    vin is observing the cars at a crossroads. He finds that there are n cars running in the east-west d ...

  5. 数据结构——KMP(串)

    KMP一个非常经典的字符串模式匹配算法,虽然网上有很多kmp算法的博客,但是为了更好的理解kmp我还是自己写了一遍(这个kmp的字符串存储是基于堆的(heap),和老师说的定长存储略有不同,字符串索引 ...

  6. l5213. 玩筹码

    这道题本应该很简单的但是我把他复杂化了,所以没有在第一时间里A出来.我们来看看题目 看上去是不是很复杂,思路是有,但是,很难实现.我最开始的时候是认为有三种情况,左边筹码最多,右边筹码最多,中间筹码最 ...

  7. tornado+peewee-async+peewee+mysql(一)

    前言: 需要异步操作MySQL,又要用orm,使用sqlalchemy需要加celery,觉得比较麻烦,选择了peewee-async 开发环境 python3.6.8+peewee-async0.5 ...

  8. 054-for循环

    <?php for($i=1;$i<=5;$i++){ echo "$i<br />"; //循环体 } ?>

  9. 第二阶段scrum-7

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 部署云服务器完成,链接数据库完成,消息收发正在制作.

  10. 经验分享:如何搞定Personal Statement?

    最近又到申请季啦,如何自己DIY申请,如何准备文书成为众多留学生关心的问题.不管是你申请本科,硕士,还是博士,相信这篇文章都能帮助到你.下面来说一下文书中一个很重要的组成,就是个人陈述Personal ...