首页 > 代码库 > Struts2学习第三天——保存登陆信息及数据校验

Struts2学习第三天——保存登陆信息及数据校验

   在JSP中服务器端保存数据的作用域通常有request、session、application,它们对应的Servlet API分别是HttpServletRquerst、HttpSession、ServletContext。同样在Struts2的控制器中也需要访问这些作用域。

  Struts2提供了一个ActionContext类,该类被称为Action上下文或者Action环境,Action可以通过该类访问最常用的ServletAPI。

 ServletAPI有多种访问方式:

   1. Servlet API解耦的访问方式,使用ActionContext访问ServletAPI

      常用方法有:

        getContext():静态方法,获取当前ActionContext实例。

        getSession():返回一个Map对象,该对象模拟了session作用域。

        getApplication():返回一个Map对象,该对象模拟了application作用域。

        get(String key):对该方法传入“request”参数,既可返回一个Object对象,该对象模拟了request作用域。

        getParamenters();返回一个Map对象,该对象中保存了浏览器上传的参数。代码如下:

 1         //获得上下文
 2         ActionContext context=ActionContext.getContext();
 3         //关联request范围的数据
 4         Map requestMap=(Map)context.get("request");
 5         requestMap.put("req_user",users);
 6         //保存在session范围
 7         Map sessionMap=context.getSession();
 8         sessionMap.put("session_user", users);
 9         //保存在全局范围
10         Map appMap=context.getApplication();
11         appMap.put("app_user", users);        

 

    2. 以IoC的方式访问Servlet API

       在上面的代码中,request,session,application这些作用域对象都是由Action类自己来获取的,这个做法的特点是获取对象和使用对象的代码放在了一个类中,还    有一种做法是:Action类中只保留使用这些对象的代码,而获取对象的代码由Struts2来实现,Struts2获取这些对象后再把这些对象注入到Action类中,Action类即可使    用这些对象。这种实现思想就是著名的IoC。它能够分离获取对象和使用对象的代码,使系统进一步“解耦和”。

    代码如下:

 1 public class UserAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
 2 
 3     private Map<String, Object>request;
 4     private Map<String, Object>session;
 5     private Map<String, Object>application;
 6 
 7     @Override
 8     public void setApplication(Map<String, Object>application) {
 9         // TODO Auto-generated method stub
10         this.application=application;
11     }
12     @Override
13     public void setSession(Map<String, Object> session) {
14         // TODO Auto-generated method stub
15         this.session=session;
16     }
17     @Override
18     public void setRequest(Map<String, Object> request) {
19         // TODO Auto-generated method stub
20         this.request=request;
21     }
22 }

    在上面的代码中,Action实现了RequestAware,SessionAware,ApplicationAware接口,这样Struts2就可以为该Action注入request、session、application对象    了。以session为例,Struts2取得session对象,当UserAction对象被创建后,Struts2会判断UserAction是否实现了SessionAware接口,若已实现,就会调用Useraction

   的setSession()方法,并把session作为参数传入该方法,该方法的“this.seesion=session”代码会把session保存为一个成员变量,这样就实现了session对象的注入。

  3.Servlet API耦合的访问方式

    通过ServletActionContext类获取ServletAPI对象

      Strutes2提供了ServletActionContext用来获取原始的Servlet API

      ServletActionContext  getServletContext();

 

      HttpServletResponse  getResponse();

 

      HttpServletRequest   getRequest();    

      通过request.getSession()获取session对象

 

      通过xxx.setAttribute()设置值

代码如下:

1         HttpServletRequest request=ServletActionContext.getRequest();
2         HttpServletResponse response=ServletActionContext.getResponse();
3         HttpSession session=request.getSession();
4         ServletContext application=ServletActionContext.getServletContext();
5         request.setAttribute("req_user", users);
6         session.setAttribute("session_user", users);
7         application.setAttribute("app_user",users);

  

Struts2的数据校验

继承ActionSupport类来完成Action开发

ActionSupport类不仅对Action接口进行简单实现,同时增加了验证、本地化等支持

如果出错会查找result input页面如果没有会报404

        <action name="UserAction" class="com.house.action.UserAction" method="reg">
            <result name="show" type="dispatcher">/ch01/show.jsp</result>
            <result name="input">/ch01/reg.jsp</result>
        </action>
public class HouserUserAction extends ActionSupport{
//...省略代码
        public void validate(){
            if(uname==null||uname.equals("")){
            super.addFieldError("uname_err","用户名必须填写");
            }
            if(upwd==null||upwd.equals("")){
                super.addFieldError("upwd_err","密码必须填写");
            }
        }
}

HTML显示导入struts2标签  <%@ taglib uri="/struts-tags" prefix="s" %>

<s:fielderror fieldName="uname_err"/>显示错误信息,如果name属性不做设置会把错误信息全部输出且因为struts标签没经过fiter过滤器,jsp页面不识别,必须在web.Xml里进行配置  /* 过滤所有

Struts 标签会自带样式可以自行设置,或者在struts中设置   struts.ui.them 取消样式

 

 

  

Struts2学习第三天——保存登陆信息及数据校验