Struct标签

  • 通用标签:

 1. property

               2. set

i.          默认为action scope,会将值放入request和ActionContext中

ii.          page、request、session、application

3.  bean

4.  include       (对中文文件支持有问题,不建议使用,如需包含,改用jsp包含)

5.  param

              6.  debug

  • 控制标签

              1.  if elseif else

              2.  iterator

i.          collections map enumeration iterator array

  3.  subset

  • UI标签

              1.  theme

i.         simple xhtml(默认) css_xhtml ajax

  • AJAX标签

基本不用,直接用Ajax框架

  • $ # %的区别

1.  $用于i18n和struts配置文件

2.  #取得ActionContext的值

3.  %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用

i.     参考<s:property 和 <s:include>

说明一点,每一个标签的属性,有的是字符串,有的是Ognl表达式

比如标签property:

    如果这个属性是Object类型,就会把属性value里的字符串解析成Ognl表达式

 property

实例:

<action name="tags" class="com.bjsxt.struts2.tags.TagsAction">
            <result>/tags.jsp</result>
 </action>

TagsAction:

public class TagsAction extends ActionSupport {

    private String password;

    private String username;

    public TagsAction() {
    }

    public String execute() {
        this.addFieldError("fielderror.test", "wrong!");
        return SUCCESS;
    }

    public String getPassword() {
        return password;
    }

    public String getUsername() {
        return username;
    }

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

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

}

tags.jsp

 <li>property: <s:property value="username"/> </li> <li>property 取值为字符串: <s:property value="‘username‘"/> </li>
 <li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
 <li>property 设定HTML: <s:property value="‘<hr/>‘" escape="false"/> </li>
  •     对于第一行,因为property的value值是ognl表达式,所以直接去值栈中取
  •     如果想表达的是一个普通字符串,那么就用双引号里面加上单引号
  •     值栈里面没有叫做admin的变量,所以为他设定默认值,他才有用 

set

什么时候会用到set标签

只是做jsp开发的时候很少能用到,但是有时候可以为一个特别长或者特别难写的变量设置别名等,可能会用到

可见id和name都不用设置了,只需要var就行

  •    scope范围,不设置的话默认是action,指的是这个变量会放在request 和 ActionContext
  •     如果设置的话,就放在设置的范围里面
      默认范围:        <li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li>

        <li>set 从request取值: <s:property value="#request.adminName" /></li>
        <li>set 从ActionContext取值: <s:property value="#adminName" /></li>

        设定范围
        <li>    范围为page:   <s:set name="adminPassword" value="password" scope="page"/></li>
        <li>    从相应范围取值: <%=pageContext.getAttribute("adminPassword") %>
        --%>
        <li>   范围为session: <s:set var="adminPassword" value="password" scope="session"/></li>
        <li>    从相应范围取值: <s:property value="#session.adminPassword"/> </li>
        

bean

bean的作用就是生成一个类的对象

      <li>bean 定义bean,并使用param来设定新的属性值:
            <s:bean name="com.bjsxt.struts2.tags.Dog" >
                <s:param name="name" value="‘pp‘"></s:param>   //这个name的属性值,就是Dog类的成员,表示为哪一个成员赋值
                <s:property value="name"/>
            </s:bean>
        </li>

Dog:

package com.bjsxt.struts2.tags;

public class Dog {

    private String name;

    public Dog() {

    }

    public Dog(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "dog: " + name;
    }
}

当使用bean的时候,就会生出一个对象,并且压到栈顶,在bean标签的内部可以使用这个对象,但是一旦bean标签结束,这个对象就会从栈顶抛出,所以在bean标签外部是访问不到的。(可以用debug标签做测试,在内部可以看到在外部看不到)

但是如果在外部想访问怎么办?

       这时候就要使用val属性,把这个对象放在valueContext里面

        <li>bean 查看debug情况:
            <s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
                <s:param name="name" value="‘oudy‘"></s:param>
            </s:bean>
            拿出值:
            <s:property value="#myDog.name"/>
        </li>

Include

尽量少用这个标签,处理中文特别麻烦。

Jsp里面有两个包含文件的方式,<%   <? ,用这两种就好,不要用这个标签

        <li>include _include1.html 包含静态英文文件
            <s:include value="/_include1.html"></s:include>
        </li>

        <li>include _include2.html 包含静态中文文件
            <s:include value="/_include2.html"></s:include>
        </li>

        <li>include _include1.html 包含静态英文文件,说明%用法
            <s:set var="incPage" value="‘/_include1.html‘" />
            <s:include value="%{#incPage}"></s:include>
        </li>

include的value值就是一个普通字符串,而不是ognl表达式

在第3个例子中,如果想把incPage从字符串变成ognl表达式

使用%{}

if

        <li>if else:
            age = <s:property value="#parameters.age[0]" /> <br />
            <s:if test="#parameters.age[0] < 0">wrong age!</s:if>             <s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>            <s:else>yeah!</s:else><br /> 

            <s:if test="#parameters.aaa == null">null</s:if> 

       </li>

注意,每一个参数都有可能是数组,不管传过来几个值,如果想取第一个值,都要加[0]

valueContext里的parameters指的是点击链接带过来的参数

<a href="<%=contextPath %>/tags.action?username=u&password=p">tags</a>

每次都写#parameters.age[0]太麻烦,这时候就看出来set标签的好处了

        <s:set var="age" value="#parameters.age[0]" />
        <s:if test="#age < 0">wrong age!</s:if>

iterator

就是遍历,理论上可以遍历以下几种集合

collections map enumeration iterator array

ognl表达式里面大括号就是一个集合,默认会转化成list

        <li>遍历集合:<br />
        <s:iterator value="{1, 2, 3}" >
            <s:property/> |
        </s:iterator>
        </li>
        <li>自定义变量:<br />
        <s:iterator value="{‘aaa‘, ‘bbb‘, ‘ccc‘}" var="x">
            <s:property value="#x.toUpperCase()"/> |
        </s:iterator>
        </li>
        <li>使用status:<br />
        <s:iterator value="{‘aaa‘, ‘bbb‘, ‘ccc‘}" 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>

结果是

Map:

<li>
        <s:iterator value="#{1:‘a‘, 2:‘b‘, 3:‘c‘}" >
            <s:property value="key"/> | <s:property value="value"/> <br />
        </s:iterator>
        </li>

        <li>
        <s:iterator value="#{1:‘a‘, 2:‘b‘, 3:‘c‘}" var="x">
            <s:property value="#x.key"/> | <s:property value="#x.value"/> <br />
        </s:iterator>
        </li>

UI

UI标签用的并不多

主要说一个 theme(主题)

有四种形式

simple     xhtml(默认)      css_xhtml       ajax

主题就像页面皮肤

当我们在视图上写html源码时,在客户端展现出来的是经过处理的,并不是原封不动的源码,不同的theme可以解析成不同的结果

主题有点像抽象工厂,当我们选择一种时就换一种皮肤

我们可以配置自己的主题,也可以在配置文件中换成其他主题

时间: 2024-10-10 10:10:24

Struct标签的相关文章

golang中的struct标签tag

这个以前用beego时涉及过,时间久了,就忘了. 现在k8s里的controller,一样用了这个语法, 再拾起来吧. http://www.01happy.com/golang-struct-tag-desc-and-get/ 但这个帖子中,bson的tag没有测试成功,再议吧. package main import ( "encoding/json" "fmt" "reflect" ) func main() { type User str

使用Xcode HeaderDoc和Doxygen文档化你的Objective-C和Swift代码

在一个应用的整个开发过程中涉及到了无数的步骤.其中一些是应用的说明,图片的创作,应用的实现,和实现过后的测试阶段.写代码可能组成了这个过程的绝大部分,因为正是它给了应用生命,但是这样还不够,与它同等重要的还有代码的注释和文档编写.不管代码写的有多好,如果缺少了对应的好的注释文档,很有可能在将来带来麻烦.不幸的是,许多开发者都忽视或忽略了代码文档的重要性,而这非常糟糕,因为好的程序不仅仅是好的代码.它需要更多的东西. 谈到编写注释文档,显然我不是说仅仅简单的在实现文档里添加几行注释.肯定是更多的东

Effective C++ 条款47

本节条款的题目:请使用trait classes来表示类型信息 本节条款主要讲述的技术是如何在编译期间实现对迭代器类型的判断,根据判断的类型进行最优处理. 我们先来看一下迭代器的种类: 1.input_iterator:只读,只能逐个前移 2.output_iterator:只写,只能逐个前移 3.forward_iterator:可读可写,只能逐个前移 4.bidirectional_iterator:可读可写,支持逐个前移和后移 5.random_access_iterator:可读可写,支

Go反射实践

package main import ( "fmt" "reflect" ) //定义了一个Monster结构体 type Monster struct { Name string `json:"name"` Age int `json:"monster_age"` Score float32 `json:"成绩"` Sex string } //方法,返回两个数的和 func (s Monster) G

go语言系列-反射

目录 反射 引出反射 使用反射机制,编写函数的适配器,桥连接 反射的应用场景 反射重要的函数和概念 反射的快速入门 反射的注意事项和细节 反射练习 反射最佳实践 反射 反射可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind) 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段.方法) 通过反射,可以修改变量的值,可以调用关联的方法 使用反射,需要import("reflect") 引出反射 import ( "encoding/jso

golang中struct成员变量的标签(Tag)说明和获取方式

在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如: type User struct { UserId int `json:"user_id" bson:"user_id"` UserName string `json:"user_name" bson:"user_name"` } 这个小米点里的内容是用来干什么的呢? struct成员变量标签(Tag)说明 要比较详

struct和typedef struct

struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是struct Student的别名.Stu==struct Student 另外这里也可以不写Student(于是也不能struct

enum,struct,union类型使用和长度

VC,C++ Builder和lcc三个编译器 间枚举类型enum长度的情况. 各种C编译器默认的字节对齐数不一致,要写通用的代码,经常就是使用 #pragma pack(1) ... #pragma pack() 来使编译器以单字节对齐. 今天在bcb5中调用vc6的dll时出现错误,但在VC中调用dll却很正常,说明很有可能是编译器之间的差异造成.仔细debug后发现bcb和vc的枚举类型长度不一样,即便使用了#pragma pack(1)编译开关. 如以下程序: /*-----------

struct和typedef struct彻底明白了

struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是struct Student的别名.Stu==struct Student 另外这里也可以不写Student(于是也不能struct