你的位置:首页 > Java教程

[Java教程]ognl和struts2标签_个人学习日志


2016-08-31

一、struts2中ognl原理

       Struts2默认的表达式语言 ognl: Object Graph Navigation Language 对象图导航语言

       1>Struts2 中数据移入、移出时,需要进行类型转换,此时用ognl进行处理

      

       2>ognl原始上可看做一个 map 键值对,其中一个键值对为root对象,在struts2中改造为值栈(value Stack),

       对于非root对象,称为StackContext。

      

       3>在struts2中,vlue Stack 可以存放多个对象,相当于一个栈空间(先入后出),查找从最后放入的顶部开始向下进行

       查找,找到则返回;直到底部没找到则返回null;

      

       4>struts2 为 Java内部的数据类型提供了类型转换器

      

       ·ognl访问值栈

        Action的实例都放在值栈中 ,所以ognl可以直接访问 *必须要有setter/getter方法

           ex:<s:property value="user.name"/>

       ·ognl访问其他StackContext

        request、session、application、page存放在StackContext中,访问时要加上#

        ex: <s:property value="#request.MSG"/>

   

    二、ognl类型转换错误提示

         1> 启动StrutsConversionErrorInterceptor拦截器

              拦截器已经包含在defaultStack拦截器栈中

        2> Action要继承ActionSupport类

              其实是要实现ValidationAware接口

        3> 配置input结果映射

              **一旦发生内部错误,都会返回 INPUT

        4> 页面使用Struts 2表单标签或<s:fielderror filedName="xxx" />标签

              Struts 2表单标签内嵌了输出错误信息功能

              普通HTML标签需使用<s:fielderror>标签输出转换错误

        5> 显示中文

              1) 在 struts.

              <constant name="struts.custom.i18n.resources" value="msg"/>

              2) 在 src 下创建 msg.properties 文件

              xwork.default.invalid.fieldvalue=字段“{0}”的值无效

 

       ***针对每个字段不同的提示信息

       1) 对每个 Action 写一个专有的资源文件,文件名与 Action 同名,且在同一目录下:

              DoSubmitAction.properties

       2) invalid.fieldValue.user.birthday=提示信息

     

    三、实现自定义的类型转换器

       1> 继承 org.apache.struts2.util.StrutsTypeConverter 抽象类重写

           public Object convertFromString(Map arg0, String[] values, Class clz);

           public String convertToString(Map arg0, Object loc);

       2> 配置

           在src目录创建xwork-conversion.properties

           添加:转换类全名=类型转换器类全名

    四、struts2标签 (举出个人认为一些常用的实例用法)

       ·struts标签一般结合ognl使用 ,常用标签:通用标签(数据标签、控制标签)、UI标签、Ajax标签

           首先在jsp页面上使用Strtuts标签是要加入:<%@taglib prefix="s" uri="/struts-tags"%>

         --数据标签

           <s:set name="fruits" value="{'苹果', '香蕉', ''}"></s:set>

           <s:set name="countrys" value="#{'cn' : 'China', 'us' : 'America', 'uk' : 'British'}"></s:set>

           可用来建立list、map

          

           <s:property value="#fruits[1]" /><br />

           <s:property value="#countrys.cn" />

           访问建立的list、map

          

           <s:property value="@java.lang.Math@floor(3.1)" />调用静态方法

           **需在struts."struts.ognl.allowStaticMethodAccess" value="true" />

          

           <s:url value="http://www.sohu.com" var="sohu"  >

              <s:param name="age" >18</s:param>

              <s:param name="uname" >z3</s:param>      

           </s:url>

           设置url地址并传参 <s:a href="%{#sohu}">搜狐新闻</s:a>

           

            <s:include value=""></s:include>

                     把其他页面包含进来,相当于<jsp:include>

           

            <s:date name="被格式化的值必须填写" format="yyyy-MM-dd"/>指定格式日期输出

            <s:property value="'<hr />'" escapeHtml="true" /> 是否转义

            <s:debug /> 用来观察值栈和StackContext的内容

           

          --控制标签

            <s:if test=""></s:if><s:elseif test=""></s:elseif><s:else></s:else>

            等于if(){}else if(){} else{}

            

           <s:iterator value="" status="">

              <s:property/>

           </s:iterator>  迭代器

          

          

         --UI标签 (struts2内建主题:simple、xhtml、css_xhtml、ajax)

           <s:textfield name="" value="" maxlength="最大长度" readonly=""></s:textfield> 单行文本框

           <s:textarea name="" value="" cols="列数" rows="行数" readonly="" ></s:textarea>  多行文本框

           <s:submit></s:submit> 提交按钮

             

           <s:select list=""></s:select> 下拉菜单

          

           <s:form name="f">**需声明表单别名

           <s:doubleselect formName="f" list="" doubleList="" doubleName=""></s:doubleselect> 二级级联下拉框

           </s:form>

          

           ***注意:在填写value值时,如果在可能引起歧义的情况下(如name,name不知是String "name" 还是 变量 name时) struts2优先将内容识别为String,想让他识别为变量要加%:%变量名。但在 <s:property value="name" />中除外,优先识别为变量名如果想让他识别为字符串:<s:property value="'name'" />

 

    以上只是萌新入坑自学的一点总结***