ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
我们按照用例,在后台中写入测试代码。 # 加入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