Struts2学习---简单的数据校验、访问Web元素
1.简单的数据校验
在action里面我们已经给出了一个数据校验:
public String execute() { if(user.getUsername().equals("username")&&user.getPassword().equals("password")) { return SUCCESS; } return ERROR; }
这里是action的传送门
上面代码大概就是如果用户名为“username”,并且密码为“password”的将返回success指定的页面(由action里面的result的属性name指定),否则返回error指定的页面。这是我们人为的指定错误页面。struts也提供给我们它处理错误的方式:
public String add() { if(name == null || !name.equals("admin")) { this.addFieldError("name", "name is error"); return ERROR; } return SUCCESS; }
addFieldError这个方法是ActionSupport里面定义的方法,下面是它的源码:
public void addFieldError(String fieldName, String errorMessage) { validationAware.addFieldError(fieldName, errorMessage); }
同样如果调用这个方法,那么我们添加的这个错误将被添加到值栈(valueStack)中。
我们可以用下面的这段页面代码将我们设置的错误取出来(这里用到的是struts标签):
<s:fielderror fieldName="name" theme="simple"/> <br /> <s:property value="errors.name[0]"/> <s:debug></s:debug>
访问Web元素:
一共四种方法:
①ActionContext
关于ActionContext的源码分析,由于本人才疏学浅仅仅能自己读个大概,所以这里就贴一下我转发的别人的一篇关于ActionContext的介绍:
http://blog.csdn.net/qq_39266910/article/details/78504728
<!--这个是获取页面 ,在这个页面里面我们既可以使用传统的request.getAttribute,也可以使用struts为我们提供的标签<s:property value="#封装的Web元素.Mapkey"/> 里面还封装了一个attr,可以泛指所有的属性。--> <body> <s:property value="#request.req"/>||<%=request.getAttribute("req")%><br> <s:property value="#request.req"/>||<%=session.getAttribute("sess")%><br> <s:property value="#request.req"/>||<%=application.getAttribute("app")%><br> </body>
//这个是Action类 public class userAction extends ActionSupport { Map request; Map session; Map application; public userAction() { request=(Map)ActionContext.getContext().get("request"); session=(Map)ActionContext.getContext().getSession(); application=(Map)ActionContext.getContext().getApplication(); } public String execute() { request.put("req", "req1"); session.put("sess", "sess1"); application.put("app", "app1"); return SUCCESS; } }
struts帮我们以Map的形式封装了httpServletRequset,HttpSession,application,等一些我们无法再Action里面直接用到的这些Web参数。
②下面我们来看看另一种:
public class userAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware { private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; public String execute() { request.put("req", "req1"); session.put("sess", "sess1"); application.put("app", "app1"); return SUCCESS; } @Override public void setRequest(Map<String, Object> request) { this.request = request; } @Override public void setSession(Map<String, Object> session) { this.session = session; } @Override public void setApplication(Map<String, Object> application) { this.application = application; } }
这种方法实现 了几个接口:RequestAware,SessionAware, ApplicationAware,struts容器在运行的时候会判断当前的Action实例是否实现这些接口,如果实现了这些接口,那么那么容器接着调用set方法方法,然后将request/session/application这些web元素赋值给我们自定义的request,最后我们在execute方法中进行赋值。
还有其他两种方法但是不常用,我们只把代码贴出来仅供参考:
③
public class LoginAction3 extends ActionSupport { private HttpServletRequest request; private HttpSession session; private ServletContext application; public LoginAction3() { request = ServletActionContext.getRequest(); session = request.getSession(); application = session.getServletContext(); } public String execute() { request.put("req", "req1"); session.put("sess", "sess1"); application.put("app", "app1"); return SUCCESS; } }
④
public class LoginAction4 extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; private HttpSession session; private ServletContext application; public String execute() { request.put("req", "req1"); session.put("sess", "sess1"); application.put("app", "app1"); return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; this.session = request.getSession(); this.application = session.getServletContext(); } }
上面的四种方法第二种是最常用的,也是最重要的。
版权声明:本文为博主原创文章,如需转载请表明出处。 https://blog.csdn.net/qq_39266910/article/details/78504717