zoukankan      html  css  js  c++  java
  • 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标签):

        User Add Error!
    	<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();
    	}
    	
    }
    

    上面的四种方法第二种是最常用的,也是最重要的。

  • 相关阅读:
    安卓自动化测试添加用例执行回放
    【十二省2019】异或粽子
    【BZOJ4260】Codechef REBXOR
    【JSOI2015】字符串树
    【HAOI2017】供给侧改革
    【NOI2018】你的名字
    【十二省2019】字符串问题
    【LOJ#6041】事情的相似度
    【SP8093】JZPGYZ
    【BZOJ1396】识别子串
  • 原文地址:https://www.cnblogs.com/MindMrWang/p/8143951.html
Copyright © 2011-2022 走看看