SSH实战OA 05:Struts2标签

Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。本文仅给出常用的struts标签的用法,这些标签的分类有:通用标签,控制流程标签、ajax标签、UI标签等。

在搭建好的Struts2工程下新建TagsAction.java,代码如下:

import com.opensymphony.xwork2.ActionSupport;

public class TagsAction extends ActionSupport {

    private String password;

    private String username;

    private String id;

    public TagsAction() {
    }

    @Override
    public String execute() throws Exception {
        this.addFieldError("fielderror.test", "用户名或密码出错!");

        return this.SUCCESS;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

这个action的逻辑很简单,复写了父类的execute()方法的代码逻辑向前端返回了一句错误信息和一个SUCCESS的视图。这个action有3个属性,分别是:username,password,id,并生成相应的getter/setter方法,除此之外该action还有一个空的构造方法。

struts.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <!--
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    -->
    <!--
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
    -->

    <constant name="struts.devMode" value="true" />
    <constant name="struts.ui.theme" value="simple" />

    <package name="tags" extends="struts-default">
        <action name="tagsAction" class="com.shizongger.tags.TagsAction">
            <result>/tags.jsp</result>
        </action>
    </package>    
</struts>

本文的重点放在struts的标签,所以struts.xml做了最简单的配置,只配置了一个action,并且定义了一个前端的返回视图tags.jsp。

tags.jsp的最开始状态如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Struts-Tags学习案例</title>
</head>
<body>
    <ol>
        <li>property:<s:property value="username" /></li>
    </ol>
</body>
</html>

使用struts2的标签,引入struts2的taglib是第一步。上诉的jsp代码是最简单的使用property的用法。
在浏览器中输入下列链接:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p

服务器将会向前端浏览器输出

property:u

property用法

property的常用法还有以下几种:

<li>property:<s:property value="username" /></li>
<li>property取值为字符串:<s:property value="'username'"/></li>
<li>property设置默认值:<s:property value="id" default="没有id" /></li>
<li>property设定html:<s:property value="'<hr />'" escape="false" /></li>
<hr />

第一行的li是我们常用的OGNL表达式取出了username的值,value值是OGNL表达式。第二行的用法是将’username’作为字符串输出来,而不是希望struts标签将我们的字符串解析。第三行多了一个default属性值,当没有id作为参数传递进来的时候就显示defalut里面的内容,当有id值传递进来的时候就显示id的值。如下面的两个案例输出:

url:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p&id=1

输出:

property设置默认值:1

url:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p

property设置默认值:没有id

第四个li里面的property用法,当escape为true时value的值当作是普通字符输出,而当时escape为false时浏览器将作为html标签来解析,比如上诉的escape为false,此时浏览器当作标签< hr />来输出,既多出了一横。

set标签用法

<li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li>
<li>s标签从request中取出adminName:<s:property value="#request.adminName" /></li>
<li>s标签从ActionContext中取出adminName:<s:property value="adminName" /></li>
<li>s标签从ActionContext中取出adminName:<s:property value="#adminName" /></li>
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="reqeust" /></li>
<li>使用#取出adminPassword:<s:property value="#adminPassword" /></li>
<li>从session取出:<s:property value="#session.adminPassword" /></li>
<li>从request取出:<s:property value="#request.adminPassword" /></li>
<hr />

set标签主要作用是在jsp页面中定义变量,本案例中我们将参数传递进来的username值赋给变量adminName,之后用property方法从作用域中取出值。第一个li是set赋值的用法,第2到4是将set取出来的用法。需要注意的后面带有指定作用域的scope的用法,当我们指定了变量的作用域时,取出时需要指定我们的作用域。

bean、param标签使用

        <li>bean 定义bean,并使用param来设定新的属性值:
            <s:bean name="com.shizongger.tags.Dog">
                <s:param name="name" value="大黄" />
                <s:property value="name" />
            </s:bean>
        </li>
        <li>bean 查看debug情况:
            <s:bean name="com.shizongger.tags.Dog" var="myDog">
                <s:param name="name" value="'Sam'" />
            </s:bean>
            取出值:<s:property value="#myDog.name" />
        </li>
        <hr />

这里用到了我们的javaBean Dog,Dog的代码如下:

public class Dog {
    private String name;

    public Dog() {
        System.out.println("Dog无参构造方法");
    }

    public Dog(String name) {
        System.out.println("Dog有参构造方法,name = " + name);

        this.name = name;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("name = " + name);

        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog [name=" + name + "]";
    }

}

Dog类只有一个name属性,一个空的构造方法一个带参数的构造方法,还覆盖toString方法。当然本类的输出语句是为了更好的看参数输出情况,你也可以去除输出语句。

jsp的bean标签的name指定了Dog类的全路径,param标签对其属性进行赋值。由于我给dog的name属性赋予了”大黄”的值,用debug标签可以看到:
这里写图片描述

同时页面输出:

bean 定义bean,并使用param来设定新的属性值:
bean 查看debug情况: 取出值:Sam

include标签

        <li>include mydemo1.html 包含静态英文页面
            <s:include value="/myDemo1.html"></s:include>
        </li>
        <li>include mydemo2.html 包含静态中文页面
            <s:include value="/myDemo2.html"></s:include>
        </li>
        <li>include _include1.html 包含静态英文文件,说明%用法
        <s:set var="incPage" value="%{'/myDemo1.html'}" />
        <s:include value="%{#incPage}"></s:include>
        </li>
        <hr />

struts的inlcude标签用法与jsp的include差不多。上诉的两个静态html文件如下:
myDemo1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>_include1.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=GB18030">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>

  <body>
    <h3>This is the head</h3>
    <p>This is a Paragram.</p>
  </body>
</html>

myDemo2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>_include1.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=GB18030">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>

  <body>
    <h3>This is the head</h3>
    <p>中文字符的段落.</p>
  </body>
</html>

可能由于版本bug问题,英文静态html能够正常加载进来,而中文静态html没有正常加载进来,建议用jsp自带的include语句。

if elseif else标签的用法

        <li>if elseif else的用法:
            sex参数的值是=<s:property value="#parameters.sex[0]"/><br />
            将parameters.sex[0]的值赋到age变量中去<s:set name="sex" value="#parameters.sex[0]"></s:set><br />
            用户性别=<s:if test="#sex == 1"></s:if>
                   <s:elseif test="#sex == 2"></s:elseif>
                   <s:else>未知</s:else>
        </li>
        <li>username是否为空:
            <s:if test="#parameters.username == null"></s:if>
            <s:else></s:else>
        </li>
        <hr />

这里用到的parameters是什么鬼?就是我们url传递的参数,在HttpServletRequest有一个方法getParamters(String str)就是从这个parameters里面获取jsp向Servlet传递参数的。
本代码片段逻辑是先从url获取parameters.sex[0]参数,赋值为sex变量,然后利用struts判断标签判断sex的值,如果sex等于1则为男,sex等于2则为女,其他是输出未知。
在本案例中我输入的url如下:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p&sex=1

浏览器输出如下:

  • if elseif else的用法: sex参数的值是=1
    将parameters.sex[0]的值赋到age变量中去
    用户性别=男
  • username是否为空: 否

遍历集合

        <li>遍历集合:<br />
        <s:iterator value="{'hello','to','struts','tags'}">
            <s:property/>
        </s:iterator>
        </li>       
        <li>自定义变量:<br />
            <s:iterator value="{'this','is','the','self','define','struts','tags'}" var="word">
                <s:property value="#word.toUpperCase()"/>
            </s:iterator>!
        </li>
        <li>使用status:<br />
            <s:iterator value="{'this','is','the','self','define','struts','tags'}" status="status">
                <s:property/>->
                已经遍历了元素的个数:<s:property value="#status.count" /> . 
                元素的索引:<s:property value="#status.index" /> . 
                当前是偶数?:<s:property value="#status.even" /> . 
                当前是奇数? :<s:property value="#status.odd" /> .
                是否是集合第一个元素?:<s:property value="#status.first" /> . 
                是否是集合最后一个元素? :<s:property value="#status.last" />
                <br />
            </s:iterator>
        </li>
        <li>
            <s:iterator value="#{001:'root', 002:'admin', 003:'shizongger'}">
                key = <s:property value="key"/> ,value = <s:property value="value" /><br />
            </s:iterator>
        </li>
        <li>
            <s:iterator value="#{001:'Sam', 002:'Big Huang',003:'Perk'}" var="dog">
                key = <s:property value="#dog.key" /> ,value = <s:property value="#dog.value" /><br />
            </s:iterator>
        </li>
        <hr />

集合的遍历在项目开发中经常用到,第一个li给出了最简单的集合遍历方法。第二个li的标签中将集合的每个元素赋值给变量word,再将其输出。第三个li的status用法能够显示出当前的元素的状态出来。
第4和第5个li下面的标签展示了map的用法,在迭代标签s:iterator中嵌套property标签,可以依次取出key值,再取出value,依次的将map的key-value取出来。
最后浏览器输出如图:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhang5476499/article/details/70942859
今日推荐