/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;
}
}
```
## 測試

## 加入注解完成驗證
```
@RequiredStringValidator(message = "名稱不能為空")
@StringLengthFieldValidator(minLength = "2", maxLength = "8", trim = true, message = "名稱必須介于2-8之間")
public void setName(String name) {
this.name = name;
}
```
## 再測試

如果你對這個錯誤比較熟悉的話,說明前面我們學的足夠扎實。如果你還不認識這個錯誤,那么你可能有必要去復習一下前面章節的內容。這個錯誤說,我們在配置文件中,沒有為這個類的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

錯誤消失,并且我們獲取了驗證信息報錯的信息。
<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層中統一接收產生的異常。
## 測試
兩個字段全部不符合條件

只有teacherId不符合條件

全部符合條件

至此,我們后臺為前臺準備好了測試用例。后臺人員可以安心的切換到自己的開發分支,卻完成最終正確的代碼開發了。
<hr />
如果你的postman沒有返回你想要的信息,并且確確認代碼無誤的話,那么,請嘗試使用'x-www-form-urlencoded'方法。

<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
- 第十四章:重構服務層