一、知识体系搭建
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;
}
@Override
public 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;
}
@Override
public 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;
@Override
public 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>