欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Struts2 常用标签

程序员文章站 2022-07-20 10:26:32
Struts中的标签可分为2类: 通用|普通标签 包括流程控制标签、数据访问标签 UI标签 包括表单标签、非表单标签 Struts2中的标签均带有前缀s。 常用的流程控制标签 1、if-elseif-else标签 条件判断 test指定条件,满足条件时,显示标签体的内容。 2、iterator标签 ......

 

struts中的标签可分为2类:

  • 通用|普通标签     包括流程控制标签、数据访问标签
  • ui标签    包括表单标签、非表单标签

 

struts2中的标签均带有前缀s。

 

 

 


 

 

 

常用的流程控制标签

1、if-elseif-else标签     条件判断

<s:set var="score" value="95" scope="request" />

<s:if test="#request.score>=80">优秀</s:if>
<s:elseif test="#request.score>=60">及格</s:elseif>
<s:else>不及格</s:else>

test指定条件,满足条件时,显示标签体的内容。

 

 

2、iterator标签   迭代array、list、map

<%
    list<user> list=new arraylist<>();
    list.add(new user("刘备", 28));
    list.add(new user("关羽", 25));
    list.add(new user("张飞", 18));
    request.setattribute("list",list);
%>

<table>
    <s:iterator var="user" value="#request.list">
        <tr>
            <td><s:property value="#user.name" /></td>
            <td><s:property value="#user.age" /></td>
        </tr>
    </s:iterator>
</table>

var指定临时变量,代表一项,value指定array | list | map 。

 

在标签体中可直接使用临时变量。但不能这样访问:

<td>user.name</td>
<td>#user.name</td>
<td>%{#user.name}</td>

 

 

 


 

 

 

常用的数据访问标签

<s:debug />

<s:set var="group" value="vip" scope="session" />

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

<s:include value="xxx.jsp" />

 

<s:debug>会在页面上生成一个调试链接,可查看valuestack中的数据。

<s:set>用于向某个域中存入数据,相当于setattribute(),var指定参数的name,value指定参数的value。

<s:property>用于输出valuesatck中的数据,value指定要输出的数据,只能使用ognl表达式,不能使用常量,比如value="ok‘"是无效的。

<s:include>用于包含其他的jsp页面。

 

 

 


 

 

 

常用的表单标签

<s:form action="" method="">
    
    <s:textfield name="user" value="" label="用户名" />
    <s:password name="pwd" value="" label="密码" />
    <s:textarea name="comment" rows="10" cols="40" label="评论" value="" />

    <s:radio name="gender" list="#{'male':'男','female':'女'}" label="gender" />

    <s:checkboxlist name="hobby" list="#{'basketball':'篮球','running':'跑步','swimming':'游泳'}" label="爱好" />

    <s:checkbox name="hobby" value="basketball" label="篮球" />
    <s:checkbox name="hobby" value="running" label="跑步" />
    <s:checkbox name="hobby" value="swimming" label="游泳" />

    <s:select name="" list="#{'zk':'专科','bk':'本科','ss':'硕士','bs':'博士','qt':'其它'}" label="学历" />
    <s:select name="" list="#{'zk':'专科','bk':'本科','ss':'硕士','bs':'博士','qt':'其它'}" label="学历" headerkey="" headervalue="--请选择--" />

    <s:file name="" />

    <s:hidden name="" value="" />

    <s:submit value="提交" />
    <s:reset value="重置" />

</s:form>

 

<s:textarea>的默认值是写在value中的,这点与html的文本域不同。

 

list属性可以写成list,也可以写成map。写成list时,value属性值、选项文字都是list的元素;写成map时,value属性值是map的key,选项文字是map的value。

 

可以用<s:checkboxlist>组合一组复选框,以数组形式提交。

也可以逐个写<s:checkbox>,各自提交。


 <s:select name="" list="#{'zk':'专科','bk':'本科','ss':'硕士','bs':'博士','qt':'其它'}" label="学历" headerkey="" headervalue="--请选择--" />

header即下拉列表中显示的选项(第一项),headerkey指定第一项的value,headervalue指定第一项的显示文字。

 

struts2只提供了常用的表单标签,没有提供日期选择器、颜色选择器等标签。

 

 

 

 

命名空间

如果struts.xml中设置命名空间:

    <package name="action" namespace="/action" extends="struts-default">
        <action name="loginaction" class="action.loginaction">
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>

    </package>

可以这样写action:

<s:form action="loginaction" namespace="/action" >
    
</s:form>

 

 

不提倡这样写:

<s:form action="action/loginaction">
    
</s:form>

第一次提交,地址栏是action/loginaction;

如果填写有问题,转回此页面重新填写,点击提交,地址栏变为action/action/loginaction!

如果填写还有问题,再次转回此页面重新填写,点击提交,地址栏变为action/action/action/loginaction!

......

如果只提交一次,没有问题;如果重复提交多次,会有一点小问题。

只是地址栏变了,其实仍是action/loginaction处理的。前一种更让人放心。

 

 

 

 

可以给表单设置主题样式:

<s:form action="" theme="xhtml">

</s:form>

主题默认为xhtml,每个表单元素都显示为块级,前后自动换行。

尽量用xhtml,其他自带的主题不好控制效果。在xhtml主题的基础上,可以使用cssclass、cssstyle,通过css样式来改变界面。

 

其实struts2标签不常用,因为不好控制样式,一般都是用html标签。

 

 

 

 

表单元素常设置的属性:

<s:textfield 
        title="ok"
        readonly="true" 
        disabled="true"
        required="true"
        cssclass="red"
        cssstyle="color: red;font-size: 18px;"
     onclick=""
/>

title指定提示文字,鼠标移上去时会显示提示文字。

readonly、disabled、required的设置方式和html的不同。required为true,提交时会检查是否已填写此字段,未填写会提示。

cssclass指定要引用的类选择器,可以引用struts2内置的样式,也可以引用自定义的css样式。

cssstyle写行内样式。

可以使用事件属性。

 

 

 

 

数据回显

<action name="loginaction" class="action.loginaction">
      <result name="success">/index.jsp</result>
      <result name="error">/login.jsp</result>
</action>

提交的表单通不过检查时,通常会转发给表单页面重新填写。

html标签会丢失所有的表单数据,需要重新填一遍。struts2标签仍保留表单数据,会自动填写上次提交的表单。

 

数据回显的原理:action处理完业务,调用表单页面,此时valuestack还没被销毁,会自动调用getter方法取出valuestack中的表单数据,填写表单。

需要给表单字段对应的属性设置getter方法,否则不能回显。

 

<s:password>密码字段默认不会回显,如需回显,需要设置showpassword属性为true:

<s:password name="pwd" showpassword="true"/>

 

 

 

 

防止重复提交表单

刷新页面可能会重新提交表单,造成表单的重复提交。struts2可以防止表单的重复提交。

 

在表单中增加<s:token />元素:

<s:form action="loginaction">
    
    
    <s:token />
    <s:submit value="提交" />
</s:form>

 

 在处理此表单的action的配置中使用token拦截器:

<action name="loginaction" class="action.loginaction">
            <interceptor-ref name="defaultstack"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
</action>

在struts.xml中,如果此action没配置拦截器,默认会使用struts-default.xml中配置的默认拦截器栈。

默认拦截器栈是对请求进行常规的预处理操作,一般都需要。

如果我们在struts.xml中给此action配置了拦截器,就不会再使用默认的拦截器栈,所以我们需要显式引用默认的拦截器栈。

 

 

原理:

<s:token />本质是在表单中添加一个name="struts.token"的隐藏域,设置一个唯一标识此次表单提交的value,

token拦截器取出这个隐藏域的参数,和session中的struts.token比较,value相同就是重复提交,直接pass调本次请求,不再调用action来处理;

value值不同,说明不是重复提交,会将这个srtuts.token值放到session中,覆盖原有的值,并调用action来处理请求。

 

如果使用了token拦截器,但一次都没有使用<s:token />标签,提交表单后,token拦截器获取的value为null,session中的value也是null,相同,便不会调用action来处理,相当于提交不了表单。

没有使用<s:token />标签,就不要使用token拦截器。