我们按照用例,在后台中写入测试代码。
# 加入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
- 第十四章:重构服务层