多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
/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