struts一些知识点总结

来源:互联网 发布:java saas 开源框架 编辑:程序博客网 时间:2024/05/17 01:00

最近学习struts做的一些知识点的总结

Struts总结

 

Struts2是基于mvc设计模式的框架,层次结构明晰,利于开发和维护;

Struts的action解除了和servlet API的耦合,测试方便,也可以访问servlet;

Struts2有功能强大的拦截器,集成了许多常用的功能,大大简化了开发;

 

参数传递

参数传递有三种方式

1.    直接把想要传值的属性放到action中,setter方法和getter方法

2.    把想要传值的属性放到一个实体类中,把这个类放在action中,settert和getter方法。页面要用<input  name=”user.name”>

3.    ModelDriven 通过实现modelDriven接口,重写getModel()方法。返回这个实体类。这个实体类一定要实例化。页面不需要再加上user,使用ModelDriven拦截器,这个拦截器的作用是当有类实现了ModelDriven接口时,把getModel()的内容放入ValueStack中

 

参数传递到后台时全部是String,当八种基本类型和时间类型时可以自动转化,仅限yyyy-MM-dd类型。如果要其它格式,需要自己写转换器。

转换器

    分为局部转换器、全局转换器

局部转换器:

    1.写一个转换器类继承StrutsTypeConverter类,重写ConvertFromString()、ConvertToString()。

ConvertFromString(Map context ,String[] values ,Class toClass)

     Context当前上下文环境

     Values传入的值

    toClass 要转换为的类类型

    2.在需要用到的action的同一包下新建一个

ActionClassName—conversion.properties

    3.内容:user.brith = 转换器类全路径

全局转换器

    1.写一个转换器类

    2.放在src下,叫做xwork—conversion.properties

    3.内容:java.until.Date = 转换器类全路径

 

 

校验

使用struts2的校验功能需要继承ActionSupport类,重写validate()方法,此方法可以对action中所有的方法进行校验,可以使用@SkipValidate注解给不需要校验的方法。也可以对单个方法进行校验,方法是写一个叫validateXxxx()的方法。

验证失败返回“input”视图,页面用<s:fieldError></s:fieldError>来接收错误信息,“fieldname”可以指定显示某个字段的信息。

使用xml校验的方式是:ActionClassName—validation.xml,

或ActionClassName—ActionName—validation.xml需要与被校验的action在同一目录下,内容<validators>

                 <field name=””>

                      <field—validator  type=”requiredString”>

                          <message>用户名不能为空</message>

校验用到的拦截器是validation

 

 

文件上传

    页面:<input  type=”file” name=”myFile”>类型要是file

    后台:在action中定义字段File类型 myFile(名字一定要对应前台页面名字)

                              Sring   myFileFileName

                              String  myFileContentType

          Setter/getter方法

          excute():

//获取要上传的地址路径

String path = ServletActionContext.getServletContext.getRealPath(“/upload”);

//创建目标对象

File destFile = new Flie(path,myFileFileName);

//把上传的文件拷贝到目标文件中去

FileUntils.copyFile(myfile,destFile);

使用了FileUpLoad拦截器

如果要上传指定类型的文件,可以给拦截器注入参数

   <interceptor—ref  name=”defaultStack”>

      <param name=”fileUpLoad,allowedExtensions” >jpg,txt</param>

   </interceptor—ref >

修改文件上传的最大大小:

   <constant name=”struts.multipart.maxSize” value=”30*1024*1024”/>

 

 

国际化

1.    写资源文件 xxx.properties/xxx_en_english.properties

2.    在xml中注册资源文件<constant name=”struts.auston.i18n.resources” value=”资源文件全名”>

3.    页面:<s:text name=””/> name为配置文件中的key

也可以直接在页面中引用<s:i18n name=”资源文件全名”>

                          <s:text name=””>

                            不推荐

 

 

防止表单重复提交

    原理是,给页面生成一个id,给action也生成一个id,当验证两个id相等时,允许访问并删除Id,所以二次访问时无法访问。

页面:<s:token></s:token>

后台:需要在xml中加入拦截器token

   <interceptor—ref  name=”defaultStack”>

      <interceptor—ref  name=”token”>

          <param name=”includeMethods”>save</param>

      <interceptor—rer>

    出错时返回“invalid.token”视图

异常处理

    使用exception拦截器

    后台:this.addFieldError(“username”,”用户名不能为空”);

    页面:<s:fieldError></>

 

 

拦截器

    Struts2一共有32个拦截器,defaultStack中有18个拦截器

      Params 传递参数用

      Exception 异常处理

      Validation 校验

      Chexbox

      Chain

      modelDriven 模型驱动

      FileUpload 文件上传

拦截器在启动的时候创建,调用init()方法。

自定义拦截器:

1.    实现Interceptor接口,重写init(),intercept(),destroy()方法

2.    继承AbstractInterceptor类,此类对init().destory()方法已经有了空实现,只需要重写intercep()方法

   intercept(ActionInvocationinvocation){

       ActionContext ac =invocation.getInvocationContext();

       ActionProxy ap =invocation.getProxy();

       String methodName =ap.getMethod();

       根据methodName判断,如果是需要拦截的方法,刚对此方法进行操作,通过ac.getContentMap()把处理的结果放到域中。如果通过拦截器刚invocation.invoke()执行action,不通过则return某个视图。

}

在xml中注册自己写的拦截器

<interceptors>

  <interceptor name=”loginStack” class=””/>

  <interceptor---stack name=”myStack”>

              <interceptor---ref  name=”defaultStack”>

       <interceptor---ref name=”loginStack”>

  </interceptor---stack>

</interceptors>

执行

<default---interceptor---ref  name=”myStack”/>所有action执行此拦截器

如果给单个action使用,定义在<action>标签下

  <interceptor---ref  name=”myStack”/>

     

 

 

把参数保存到域中

    Struts2解除了和servlet API的耦合,不过仍然有方法可以访问。

1.    直接访问servlet API:

      HttpServletRequest request =ServletActionContext.getRequest();

      HttpSession session =request.getSession();

      ServletContext application =ServletActionContext.getServletContext();

2.    通过struts2封装的方式访问

   ActionContext  ac = ActionContext.getContext();

   Map<String,Object> request= ac.getContextMap();

   Map<String,Object>session = ac.getSession();

Map<String,Object> application = ac.getApplication();

3.    通过实现接口的方式,

实现ServletRequestAware,ServletResponseAware,ServletContextAware

或实现RequestAware,SessionAware,ApplicationAware

 

 

 

 

OGNL

    有一个上下文的概念,就是map结构,实现了map的接口,OGNL的核心是ognlContext。

ValueStack:

struts2数据存储的核心,是数据流转的中转站。值栈的生命周期穿了整个action的生命周期,每个Action类都有一个vs其中保存当前action对象,当有用户访问时,创建一个vs,一个action对象,一个actionContext对象,action对象保存在vs当中,vs保存在request域中,所以生命周期同request生命周期相同.用户可以通过actionContext访问到vs 和action.

  获取vs

1.     ValueStack vs1 = request.getAttribute(“struts.valueStack”);

2.     ActionContext ac = ActionContext.getContext();

ValueStack vs2 = ac.getValueStack();

vs1 == vs2;

  valueStack中分为两部分,根节点和ognlContext

    根节点(list栈):action对象,

                     Map对象(vs.set())

                       Push()进入的对象

                       其它代理对象

   ognlContext(map栈):root引用

                          key                    value

                         request              key -----------value

                         session             

                         application

                         params

                         attr

可以通过<s:debug></s:debug>查看值栈中的数据

放在根节点中的数据可以直接不加#取出   #user.name

非根节点的数据必须加#   #request.user.name

$是用在xml中取值

%{}提供了ognl表达式的环境   %{#user.name}

 

 

数据回显

在后台通过将数据压入值栈,可以在页面直接取到值

  Vs.pop();

  Vs.push(对象);

页面:<s:textfield name=”username” ></>这个标签会自动查找根元素数据,省略了value,直接从name找值


2 0