一、知识体系搭建

1.1 Java web的工作过程

其中主要涉及到三个层次:表现层、业务层、持久层。如图所示。
image.png
其中的详细信息如下:

  1. 表现层:(本次学习的重点)
    1. 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示
    2. 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端
    3. 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)
  2. 业务层:
    1. 我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关
    2. web 层依赖业务层,但是业务层不依赖 web 层。
    3. 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。
    4. 事务应该放到业务层来控制
  3. 持久层
    1. dao 层
    2. 负责数据持久化,包括数据层即数据库和数据访问层
    3. 数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口
    4. 业务层需要通过数据访问层将数据持久化到数据库中
    5. 持久层就是和数据库交互,对数据库表进行曾删改查的

三者之间的程序间关系如下:
image.png

1.2 表现层的处理逻辑

其中有一个中央处理器(前端控制器)——Dispatcher Servlet,这是最基础的也是最关键的一个核心,其配置位于web.xml中
image.png
spring mvc中每部分的角色的分工非常明确,其中的主角有如下几个:

角色 位置 备注
前端控制器(DispatcherServlet)






web.xml 示例
处理器映射器(HandlerMapping)(springmvc三大组件之一) 配置方式有两种:1. 通过注解配置,在于各个类中;2. 写在springmvc.xml中 通过 默认配置
处理器适配器(HandlerAdapter)(springmvc三大组件之一) 通过 默认配置
视图解析器(ViewResolver)(springmvc三大组件之一) springmvc.xml 示例
处理器或页面控制器(Controller)
命令对象(Command 请求参数绑定到的对象就叫命令对象)
表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
验证器( Validator)

实现流程

  1. 启动服务器, 加载一些配置文件
    1. DispatcherServlet对象创建
    2. springmvc.xml被加载
    3. HelloController被加载进来
  2. 发送请求,后台处理请求

1.3 前后端的数据传输

前端测试代码如下:

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>测试数据绑定--前后端数据传输</title>
  5. </head>
  6. <body>
  7. <h1>测试数据绑定--前后端数据传输</h1>
  8. <h2>测试数据绑定--简单初级版</h2>
  9. <a href="/params/testParamController">测试是否创建成功controller</a>
  10. <br>
  11. <a href="/params/testParamSimpleSingleParam?username=张三">测试接收前端数据----初级版单参数</a>
  12. <br>
  13. <a href="/params/testParamSimpleMultiParam?username=张三&password=888888">测试接收前端数据----初级版多参数</a>
  14. <br>
  15. <h2>测试数据绑定--简单中级版--javabean</h2>
  16. <form action="/params/testParamSimpleJavaBeanParam" method="post">
  17. <label>姓名:</label>
  18. <input type="text" name="username"/><br>
  19. <label>密码:</label>
  20. <input type="password" name="password"/><br>
  21. <label>金额:</label>
  22. <input type="text" name="money"/>
  23. <br><label>英文名:</label>
  24. <input type="text" name="user.ename"/>
  25. <br><label>年龄:</label>
  26. <input type="text" name="user.age"/>
  27. <br>
  28. <input type="submit" value="提交"/>
  29. </form>
  30. </body>
  31. </html>

1.3.1 入门操作—创建controller

  1. /**
  2. * 请求参数的绑定
  3. */
  4. @Controller
  5. @RequestMapping("/params")
  6. public class ParamController {
  7. /**
  8. * 测试是否创建成功controller
  9. * @return
  10. */
  11. @RequestMapping("/testParamController")
  12. public String testParamController(){
  13. System.out.println("测试是否创建成功...");
  14. return "success";
  15. }
  16. }

1.3.2 简单初级版单参数

  1. /**
  2. * 测试接收前端数据----简单初级版单参数
  3. * @param username
  4. * @return
  5. */
  6. @RequestMapping("/testParamSimpleSingleParam")
  7. public String testParamSimpleSingleParam(String username){
  8. System.out.println("测试接收前端数据--初级版单参数...");
  9. System.out.println("名字:"+username);
  10. return "success";
  11. }

1.3.3 简单初级版多参数

  1. /**
  2. * 测试接收前端数据----简单初级版多参数
  3. * @param username
  4. * @return
  5. */
  6. @RequestMapping("/testParamSimpleMultiParam")
  7. public String testParamSimpleMultiParam(String username, String password){
  8. System.out.println("测试接收前端数据--初级版多参数...");
  9. System.out.println("名字:"+username);
  10. System.out.println("密码:"+password);
  11. return "success";
  12. }

1.3.4 简单中级版——使用javabean

  1. package com.tipsyspirit.vo;
  2. import java.io.Serializable;
  3. /**
  4. * 参数中存在的引用类型
  5. **/
  6. public class User implements Serializable {
  7. private String ename;
  8. private Integer age;
  9. public String getEname() {
  10. return ename;
  11. }
  12. public void setEname(String ename) {
  13. this.ename = ename;
  14. }
  15. public Integer getAge() {
  16. return age;
  17. }
  18. public void setAge(Integer age) {
  19. this.age = age;
  20. }
  21. @Override
  22. public String toString() {
  23. return "User{" +
  24. "ename='" + ename + '\'' +
  25. ", age=" + age +
  26. '}';
  27. }
  28. }
  1. package com.tipsyspirit.vo;
  2. import java.io.Serializable;
  3. /**
  4. * 封装的javabean对象
  5. **/
  6. public class Account implements Serializable {
  7. private String username;
  8. private String password;
  9. private Double money;
  10. private User user;
  11. public User getUser() {
  12. return user;
  13. }
  14. public void setUser(User user) {
  15. this.user = user;
  16. }
  17. public String getUsername() {
  18. return username;
  19. }
  20. public void setUsername(String username) {
  21. this.username = username;
  22. }
  23. public String getPassword() {
  24. return password;
  25. }
  26. public void setPassword(String password) {
  27. this.password = password;
  28. }
  29. public Double getMoney() {
  30. return money;
  31. }
  32. public void setMoney(Double money) {
  33. this.money = money;
  34. }
  35. @Override
  36. public String toString() {
  37. return "Account{" +
  38. "username='" + username + '\'' +
  39. ", password='" + password + '\'' +
  40. ", money=" + money +
  41. ", user=" + user +
  42. '}';
  43. }
  44. }
  1. /**
  2. * 测试接收前端数据----简单中级版----使用javabean
  3. * @param username
  4. * @return
  5. */
  6. @RequestMapping("/testParamSimpleJavaBeanParam")
  7. public String testParamSimpleJavaBeanParam(Account account){
  8. System.out.println("测试接收前端数据----简单中级版----使用javabean...");
  9. System.out.println("名字:"+account.getUsername());
  10. System.out.println("密码:"+account.getPassword());
  11. System.out.println("金钱:"+account.getMoney());
  12. System.out.println(account.toString());
  13. return "success";
  14. }

1.3.5 简单中级版——存在复杂类型的JavaBean

  1. package com.tipsyspirit.vo;
  2. /**
  3. * 封装的javabean对象
  4. **/
  5. import java.io.Serializable;
  6. import java.util.List;
  7. import java.util.Map;
  8. public class Account implements Serializable {
  9. private String username;
  10. private String password;
  11. private Double money;
  12. private User user;
  13. private List<User> list;
  14. @Override
  15. public String toString() {
  16. return "Account{" +
  17. "username='" + username + '\'' +
  18. ", password='" + password + '\'' +
  19. ", money=" + money +
  20. ", user=" + user +
  21. ", list=" + list +
  22. ", map=" + map +
  23. '}';
  24. }
  25. public List<User> getList() {
  26. return list;
  27. }
  28. public void setList(List<User> list) {
  29. this.list = list;
  30. }
  31. public Map<String, User> getMap() {
  32. return map;
  33. }
  34. public void setMap(Map<String, User> map) {
  35. this.map = map;
  36. }
  37. private Map<String, User> map;
  38. public User getUser() {
  39. return user;
  40. }
  41. public void setUser(User user) {
  42. this.user = user;
  43. }
  44. public String getUsername() {
  45. return username;
  46. }
  47. public void setUsername(String username) {
  48. this.username = username;
  49. }
  50. public String getPassword() {
  51. return password;
  52. }
  53. public void setPassword(String password) {
  54. this.password = password;
  55. }
  56. public Double getMoney() {
  57. return money;
  58. }
  59. public void setMoney(Double money) {
  60. this.money = money;
  61. }
  62. }
  1. /**
  2. * jsp页面展示的内容,主要是参数绑定部分
  3. **/
  4. <br><label>英文名:</label>
  5. <input type="text" name="user.ename"/>
  6. <br><label>年龄:</label>
  7. <input type="text" name="user.age"/>
  8. <br>
  9. <br><label>英文名1:</label>
  10. <input type="text" name="list[0].ename"/>
  11. <br><label>年龄1:</label>
  12. <input type="text" name="list[0].age"/>
  13. <br>
  14. <br><label>英文名2:</label>
  15. <input type="text" name="list[1].ename"/>
  16. <br><label>年龄2:</label>
  17. <input type="text" name="list[1].age"/>
  18. <br>
  19. <br><label>英文名11:</label>
  20. <input type="text" name="map['one'].ename"/>
  21. <br><label>年龄11:</label>
  22. <input type="text" name="map['one'].age"/>
  23. <br>
  24. <br><label>英文名22:</label>
  25. <input type="text" name="map['two'].ename"/>
  26. <br><label>年龄22:</label>
  27. <input type="text" name="map['two'].age"/>
  28. <br>