# 建立路由
struts.xml
```
<!-- 编辑数据 -->
<action name="edit" class="teacher.Edit">
<result name="success">/jsp/teacher/edit.jsp</result>
<result name="error">/jsp/error.jsp</result>
</action>
```
# C层
新建 teacher.Edit
```
package teacher;
import entity.Teacher;
public class Edit {
private int id; // 关健字
private Teacher teacher; // 教师实体
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
// teacher会被V层读取,但并可能由V层传入,所以,只需要get函数.
public Teacher getTeacher() {
return teacher;
}
// 该execute方法将被自动调用, 方法的返回类型必须为String
public String execute() {
return "success";
}
}
```
# V层
> 所有的V层文件均建立在WebContent文件夹中
/jsp/teacher/edit.jsp
```
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教师管理--编辑</title>
</head>
<body>
<form action="update" method="post">
姓名:<input type="text" name="name" /> <br />
用户名:<input type="text" name="username"> <br /> 性别:<select
name="sex">
<option value="0">男</option>
<option value="1">女</option>
</select> <br /> 邮箱:<input type="text" name="email" /><br /> 密码:<input
type="password" name="password" /><br />
<button type="submit">submit</button>
</form>
</body>
</html>
```
## 测试
使用如下URL进行测试:
[http://localhost:8080/javaee/teacher/edit?id=1](http://localhost:8080/javaee/teacher/edit?id=1)
或:
[http://localhost:8080/javaee/teacher/edit?id=1](http://localhost:8080/javaee/teacher/edit?id=1)
# M层
我们要编辑一个用户的前提,要是获取这个用户的原始信息.我们在M层中,新建`getTeacherById(int id)`方法。
我们仍然将这个方法写在entity.Teacher这个实体类中
```
/**
* 通过ID获取Teacher实体
* @param id
* @return
*/
static public Teacher getTeacherById(int id) {
// 实例化Teacher
Teacher teacher = new Teacher();
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = MysqlJavaee.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
Transaction transaction = session.beginTransaction();
// 在这里,必须使用try catch finally语句。来确定会话正常关闭.
// 否则,当操作数据库产生错误时,你可能需要重启mysql服务
try {
// 使用Teacher.class来获取到Teacher的类名(包括包名)
teacher = (Teacher) session.get(Teacher.class, id);
// 提交事务
transaction.commit();
// 捕获异常
} catch (HibernateException e) {
// 如果事务执行异常,则回滚事务
if (null != transaction) {
transaction.rollback();
}
// 打印异常
e.printStackTrace();
} finally {
// 如果session处于开启状态,则关闭session
if (session.isOpen()) {
// 关闭会话
session.close();
}
}
return teacher;
}
```
## 测试
M层中的每个方法,都对应一个测试的信息
以后我们进行测试时,进行如下规定:
> 每个M层中的方法,都需要在test目录下建立同名包,同名类,同名方法。
比如,我们上面将`getTeacherById(int id)`写在了src目录中的entity.Teacher中。那么,我们在test目录中,也需要建立entity.Teacher同名类,及`getTeacherById()`同名方法。
```
package entity;
import org.junit.Test;
public class TestTeacher {
// 用注解的方法,来说明此方法是一个可以用来做单元测试的方法
@Test
public void testInit() {
// 初例化
entity.Teacher teacher = new entity.Teacher(1, "张三", "zhangsan",
"zhangsan@yunzhiclub.com", false, "123321");
// 打印对象信息
System.out.println(teacher.toString());
}
@Test
public void getTeacherById() {
int id = 1;
Teacher teacher = Teacher.getTeacherById(id);
System.out.println(teacher.toString());
// 打印Teacher类的 类名(包括包名)
System.out.println(Teacher.class);
}
}
```
结果:
```
Teacher [id=1, name=张三, username=zhangsan, email=zhangsan@yunzhiclub.com, sex=true, password=123]
class entity.Teacher
```
## C与M对接
```
// 该execute方法将被自动调用, 方法的返回类型必须为String
public String execute() {
// 获取要编辑的教师
teacher = Teacher.getTeacherById(id);
System.out.println(teacher.toString());
return "success";
}
```
## V与C对接
1. 引入struts标签
2. 显示数据
```
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教师管理--编辑</title>
</head>
<body>
<form action="update" method="post">
<input type="hidden" name="id" value="<s:property value="teacher.id" />" />
姓名:<input type="text" name="name" value="<s:property value="teacher.name" />"/> <br />
用户名:<input type="text" name="username" value="<s:property value="teacher.username" />"> <br /> 性别:<select
name="sex">
<option value="0">男</option>
<option value="1">女</option>
</select> <br /> 邮箱:<input type="text" name="email" value="<s:property value="teacher.email" />" /><br /> 密码:<input
type="password" name="password" /><br />
<button type="submit">submit</button>
</form>
</body>
</html>
```
## 测试
[http://localhost:8080/javaee/teacher/edit?id=1](http://localhost:8080/javaee/teacher/edit?id=1)
![编辑](./image/4.4.1.png)
## 判断性别
我们使用在前面应用到的<s:if>标签来进行性别的判断,并选中.
```
<select
name="sex">
<option value="0">男</option>
<option value="1" <s:if test="teacher.sex">selected</s:if>>女</option>
</select>
```
此时,再刷新网页,如果在数据库中,我们存的性别值为1,则"女"会自动选中。
> 本节参考官方文档:hibernate:[#objectstate-loading) , struts:[if](https://struts.apache.org/docs/if.html)
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层