我們按照用例,在后臺中寫入測試代碼。
# 加入action后綴
struts.xml
```
<struts>
<!--設置訪問的后綴為json,或無后綴-->
<constant name="struts.action.extension" value="json,," />
```
# 加入路由信息
我們每增加一個action,就需要寫一個路由,顯然這樣有一些麻煩。struts支持匹配的路由規則。為了將/User_login正確的匹配到UserAction下的login方法, 我們建立以下路由:
```
<package name="json" namespace="/" extends="json-default">
<!-- 使用通配符配置路由 -->
<action name="*_*" class="com.mengyunzhi.javaee.action.{1}Action"
method="{2}">
<!-- 返回類型設置為json -->
<result name="success" type="json">
<!-- 數據返回時,是否包括父類的get方法 -->
<param name="ignoreHierarchy">false</param>
</result>
<!-- 配置攔截器,使傳入的json數據能夠成功的通過setXXX()方法來傳值 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name="json">
<param name="enableSMD">true</param>
</interceptor-ref>
</action>
</package>
```
上面的配置中,我們使用`*_*`做為通配符,并在后面,使用`{1}`來表示匹配到的第一個參數,使用`{2}`來表示匹配到的第二個參數.
例如:
1. `User_login.json`對應匹配后,第一個參數為`User`第二個參數為`login`,所以將對應執行`com.mengyunzhi.javaee.action.UserAction`中的`login`方法。
2. `Hello_world.json`對應匹配后,第一個參數為`Hello`第二個參數為`world`,所以將對應執行`com.mengyunzhi.javaee.action.HelloAction`中的`world`方法。
3. 'Hello.json' 對應匹配后,第一個參數為`Hello`第二個參數為空``,所以將對應執行`com.mengyunzhi.javaee.action.HelloAction`中的默認方法。默認方法,即:execute()方法。
# 寫入測試代碼
定制完路由后,讓我們寫入測試代碼,并進行測試.
```
package com.mengyunzhi.javaee.action;
public class UserAction extends Action{
// 繼承ActionSupport后,必須生明serialVersionUID,該值為于對類及對象進行序列化與反序列化
private static final long serialVersionUID = 1L;
private String username = ""; // 用戶名
private String password = ""; // 密碼
private int code = 200; // 狀態碼.200正常
private boolean isPassed = false; // 用戶名密碼是否正確
public int getCode() {
return code;
}
public boolean getIsPassed() {
return this.isPassed;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
/**
* 登陸,當用戶名等于zhangsan ,密碼為:123456時。返回用戶名密碼通過驗證
* @return
*/
public String login() {
if (this.username.equals("zhangsan") && this.password.equals("123456")) {
this.isPassed = true;
}
return SUCCESS;
}
}
```
測試:
[http://127.0.0.1:8080/javaee/User_login.json](http://127.0.0.1:8080/javaee/User_login.json)
<hr />
# 統一返回code
我們在前臺中,對返回的CODE值是否為200,進行了統一的驗證。但進行教師列表的數據請求時,沒有返回CODE值。這將使得,在進行教師列表的請求時,控制臺報:未獲取到CODE值 的錯誤。
為了使所有的請求,都能夠得到code值,我們對后臺中的Action類進行重寫:
```
package com.mengyunzhi.javaee.action;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.ActionSupport;
public abstract class Action extends ActionSupport implements ServletResponseAware{
/**
*
*/
private static final long serialVersionUID = 1L;
protected int code = 200; // 狀態碼.200正常
// 響應信息
protected HttpServletResponse response;
@Override
public void setServletResponse(HttpServletResponse response) {
// 設置發送文件頭:允許跨域的地址
response.setHeader("Access-Control-Allow-Origin", "*");
// 允許前端帶cookie訪問(cookie跨域)
response.setHeader("Access-Control-Allow-Credentials", "true");
// 設置請允許的請求方法
response.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
// 設置服務器允許的頭類型
response.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
// 告訴瀏覽器我已經記得你了,一天之內不要再發送OPTIONS請求了
response.setHeader("Access-Control-Max-Age", Integer.toString(3600 * 24));
this.response = response;
}
public int getCode() {
return this.code;
}
}
```
并去除原UserAction中的冗余代碼:
```
package com.mengyunzhi.javaee.action;
public class UserAction extends Action{
// 繼承ActionSupport后,必須生明serialVersionUID,該值為于對類及對象進行序列化與反序列化
private static final long serialVersionUID = 1L;
private String username = ""; // 用戶名
private String password = ""; // 密碼
private boolean isPassed = false; // 用戶名密碼是否正確
public boolean getIsPassed() {
return this.isPassed;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
/**
* 登陸,當用戶名等于zhangsan ,密碼為:123456時。返回用戶名密碼通過驗證
* @return
*/
public String login() {
if (this.username.equals("zhangsan") && this.password.equals("123456")) {
this.isPassed = true;
}
return SUCCESS;
}
}
```
> git checkout -f step11.3
- 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
- 第十四章:重構服務層