一、知识体系搭建
1.1 Java web的工作过程
其中主要涉及到三个层次:表现层、业务层、持久层。如图所示。
其中的详细信息如下:
- 表现层:(本次学习的重点)
- 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示
- 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端
- 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)
- 业务层:
- 我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关
- web 层依赖业务层,但是业务层不依赖 web 层。
- 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。
- 事务应该放到业务层来控制
- 持久层
- dao 层
- 负责数据持久化,包括数据层即数据库和数据访问层
- 数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口
- 业务层需要通过数据访问层将数据持久化到数据库中
- 持久层就是和数据库交互,对数据库表进行曾删改查的
1.2 表现层的处理逻辑
其中有一个中央处理器(前端控制器)——Dispatcher Servlet,这是最基础的也是最关键的一个核心,其配置位于web.xml中
spring mvc中每部分的角色的分工非常明确,其中的主角有如下几个:
| 角色 | 位置 | 备注 |
|---|---|---|
| 前端控制器(DispatcherServlet) |
web.xml | 示例 |
| 处理器映射器(HandlerMapping)(springmvc三大组件之一) | 配置方式有两种:1. 通过注解配置,在于各个类中;2. 写在springmvc.xml中 | 通过 |
| 处理器适配器(HandlerAdapter)(springmvc三大组件之一) | 通过 |
|
| 视图解析器(ViewResolver)(springmvc三大组件之一) | springmvc.xml | 示例 |
| 处理器或页面控制器(Controller) | ||
| 命令对象(Command 请求参数绑定到的对象就叫命令对象) | ||
| 表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。 | ||
| 验证器( Validator) |
实现流程
- 启动服务器, 加载一些配置文件
- DispatcherServlet对象创建
- springmvc.xml被加载
- HelloController被加载进来
- 发送请求,后台处理请求
1.3 前后端的数据传输
前端测试代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>测试数据绑定--前后端数据传输</title></head><body><h1>测试数据绑定--前后端数据传输</h1><h2>测试数据绑定--简单初级版</h2><a href="/params/testParamController">测试是否创建成功controller</a><br><a href="/params/testParamSimpleSingleParam?username=张三">测试接收前端数据----初级版单参数</a><br><a href="/params/testParamSimpleMultiParam?username=张三&password=888888">测试接收前端数据----初级版多参数</a><br><h2>测试数据绑定--简单中级版--javabean</h2><form action="/params/testParamSimpleJavaBeanParam" method="post"><label>姓名:</label><input type="text" name="username"/><br><label>密码:</label><input type="password" name="password"/><br><label>金额:</label><input type="text" name="money"/><br><label>英文名:</label><input type="text" name="user.ename"/><br><label>年龄:</label><input type="text" name="user.age"/><br><input type="submit" value="提交"/></form></body></html>
1.3.1 入门操作—创建controller
/*** 请求参数的绑定*/@Controller@RequestMapping("/params")public class ParamController {/*** 测试是否创建成功controller* @return*/@RequestMapping("/testParamController")public String testParamController(){System.out.println("测试是否创建成功...");return "success";}}
1.3.2 简单初级版单参数
/*** 测试接收前端数据----简单初级版单参数* @param username* @return*/@RequestMapping("/testParamSimpleSingleParam")public String testParamSimpleSingleParam(String username){System.out.println("测试接收前端数据--初级版单参数...");System.out.println("名字:"+username);return "success";}
1.3.3 简单初级版多参数
/*** 测试接收前端数据----简单初级版多参数* @param username* @return*/@RequestMapping("/testParamSimpleMultiParam")public String testParamSimpleMultiParam(String username, String password){System.out.println("测试接收前端数据--初级版多参数...");System.out.println("名字:"+username);System.out.println("密码:"+password);return "success";}
1.3.4 简单中级版——使用javabean
package com.tipsyspirit.vo;import java.io.Serializable;/*** 参数中存在的引用类型**/public class User implements Serializable {private String ename;private Integer age;public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"ename='" + ename + '\'' +", age=" + age +'}';}}
package com.tipsyspirit.vo;import java.io.Serializable;/*** 封装的javabean对象**/public class Account implements Serializable {private String username;private String password;private Double money;private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"username='" + username + '\'' +", password='" + password + '\'' +", money=" + money +", user=" + user +'}';}}
/*** 测试接收前端数据----简单中级版----使用javabean* @param username* @return*/@RequestMapping("/testParamSimpleJavaBeanParam")public String testParamSimpleJavaBeanParam(Account account){System.out.println("测试接收前端数据----简单中级版----使用javabean...");System.out.println("名字:"+account.getUsername());System.out.println("密码:"+account.getPassword());System.out.println("金钱:"+account.getMoney());System.out.println(account.toString());return "success";}
1.3.5 简单中级版——存在复杂类型的JavaBean
package com.tipsyspirit.vo;/*** 封装的javabean对象**/import java.io.Serializable;import java.util.List;import java.util.Map;public class Account implements Serializable {private String username;private String password;private Double money;private User user;private List<User> list;@Overridepublic String toString() {return "Account{" +"username='" + username + '\'' +", password='" + password + '\'' +", money=" + money +", user=" + user +", list=" + list +", map=" + map +'}';}public List<User> getList() {return list;}public void setList(List<User> list) {this.list = list;}public Map<String, User> getMap() {return map;}public void setMap(Map<String, User> map) {this.map = map;}private Map<String, User> map;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}}
/*** jsp页面展示的内容,主要是参数绑定部分**/<br><label>英文名:</label><input type="text" name="user.ename"/><br><label>年龄:</label><input type="text" name="user.age"/><br><br><label>英文名1:</label><input type="text" name="list[0].ename"/><br><label>年龄1:</label><input type="text" name="list[0].age"/><br><br><label>英文名2:</label><input type="text" name="list[1].ename"/><br><label>年龄2:</label><input type="text" name="list[1].age"/><br><br><label>英文名11:</label><input type="text" name="map['one'].ename"/><br><label>年龄11:</label><input type="text" name="map['one'].age"/><br><br><label>英文名22:</label><input type="text" name="map['two'].ename"/><br><label>年龄22:</label><input type="text" name="map['two'].age"/><br>
