/klass.Save通过我们设置的动态路由,将执行com.mengyunzhi.javaee.action.klass.SaveAction中的execute方法。
> 思索:为什么我们不直接触发KlassAction中的save方法呢?明显的,为每一个action单独的写一个类,会增加代码编写的工作量。
# 新建触发器
```
package com.mengyunzhi.javaee.action.klass;
import com.mengyunzhi.javaee.action.Action;
import com.mengyunzhi.javaee.entity.Teacher;
import com.mengyunzhi.javaee.server.TeacherServer;
public class SaveAction extends Action{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private Teacher teacher;
private Long teacherId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setTeacherId(Long teacherId) {
this.teacherId = teacherId;
this.setTeacher(TeacherServer.getTeacherById(this.teacherId));
}
public String execute() {
return SUCCESS;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
```
## 测试
![https://box.kancloud.cn/b48dbf35cedea8fcab11ec8bf8e3d37c_950x904.png](https://box.kancloud.cn/b48dbf35cedea8fcab11ec8bf8e3d37c_950x904.png)
## 加入注解完成验证
```
@RequiredStringValidator(message = "名称不能为空")
@StringLengthFieldValidator(minLength = "2", maxLength = "8", trim = true, message = "名称必须介于2-8之间")
public void setName(String name) {
this.name = name;
}
```
## 再测试
![https://box.kancloud.cn/47bc497ffd835932df4565875d91f50a_1856x862.png](https://box.kancloud.cn/47bc497ffd835932df4565875d91f50a_1856x862.png)
如果你对这个错误比较熟悉的话,说明前面我们学的足够扎实。如果你还不认识这个错误,那么你可能有必要去复习一下前面章节的内容。这个错误说,我们在配置文件中,没有为这个类的input结果进行定义。
按提示修改struts.xml
```
<!-- 返回类型设置为json -->
<result name="success" type="json">
<!-- 数据返回时,是否包括父类的get方法 -->
<param name="ignoreHierarchy">false</param>
</result>
<result name="input" type="json">
<!-- 数据返回时,是否包括父类的get方法 -->
<param name="ignoreHierarchy">false</param>
</result>
```
重启tomcat
![https://box.kancloud.cn/28f537a0c158cd8a0665fda42ad2ad48_880x1128.png](https://box.kancloud.cn/28f537a0c158cd8a0665fda42ad2ad48_880x1128.png)
错误消失,并且我们获取了验证信息报错的信息。
<hr />
以前,我们一直在返回正确的信息,即返回值为"SUCCESS", struts接收到"success"后,会按配置文件中的result进行处理。本次,我们需要对字段进行验证,加入了验证的注解,如果验证不通过,注解将自动返回一个"INPUT", 然后struts按照配置文件的result中的input进行处理。
是的,有了注解验证后,程序被提前返回了。
<hr />
## 增加对teacherId的判断
```
public void setTeacherId(Long teacherId) {
// 如果值为200,则增加一个错误信息
if(teacherId == 200) {
this.addFieldError("teacherId", "传入的teacherId无效");
}
this.teacherId = teacherId;
// 获取教师实体
this.setTeacher(TeacherServer.getTeacherById(this.teacherId));
}
```
> 在实际的开发中,我们将teacherId是否合法的判断放在Server中来处理,然后在C层中统一接收产生的异常。
## 测试
两个字段全部不符合条件
![https://box.kancloud.cn/868c387b5e03a1a63c6ed8eccb2cd329_1036x1076.png](https://box.kancloud.cn/868c387b5e03a1a63c6ed8eccb2cd329_1036x1076.png)
只有teacherId不符合条件
![https://box.kancloud.cn/5738c7498bed7b137f609c8b2318b207_1098x1126.png](https://box.kancloud.cn/5738c7498bed7b137f609c8b2318b207_1098x1126.png)
全部符合条件
![https://box.kancloud.cn/dd13ea951fadd6441c388185ad241914_1172x1306.png](https://box.kancloud.cn/dd13ea951fadd6441c388185ad241914_1172x1306.png)
至此,我们后台为前台准备好了测试用例。后台人员可以安心的切换到自己的开发分支,却完成最终正确的代码开发了。
<hr />
如果你的postman没有返回你想要的信息,并且确确认代码无误的话,那么,请尝试使用'x-www-form-urlencoded'方法。
![https://box.kancloud.cn/ed7025b3a95fe5c2cd40cf3c6e3fde97_828x206.png](https://box.kancloud.cn/ed7025b3a95fe5c2cd40cf3c6e3fde97_828x206.png)
<hr />
而前台人员呢,由于有了前期的后台支撑。在进行资源请求时,也不需要自己去写一些返回示例了。当前台和后台人员在开发中,都能够充分的站在对方的角度上去思考问题,能够多想想自己前期什么什么工作能够更多的配合对方的时候,团队精神就被我们诠释了。
> git checkout -f step12.3.2
- 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
- 第十四章:重构服务层