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可以解析成不同的结果
主题有点像抽象工厂,当我们选择一种时就换一种皮肤
我们可以配置自己的主题,也可以在配置文件中换成其他主题
Struct标签的更多相关文章
- golang中的struct标签tag
这个以前用beego时涉及过,时间久了,就忘了. 现在k8s里的controller,一样用了这个语法, 再拾起来吧. http://www.01happy.com/golang-struct-tag ...
- 使用Xcode HeaderDoc和Doxygen文档化你的Objective-C和Swift代码
在一个应用的整个开发过程中涉及到了无数的步骤.其中一些是应用的说明,图片的创作,应用的实现,和实现过后的测试阶段.写代码可能组成了这个过程的绝大部分,因为正是它给了应用生命,但是这样还不够,与它同等重 ...
- Go学习笔记 - 使用jsonrpc进行远程访问
Go学习笔记 - 使用jsonrpc进行远程访问 JSON-RPC JSON-RPC是一个轻量级的远程调用协议,简单易用. 请求数据体: { "method": "get ...
- Struct2笔记②--完善登陆代码
上节课的代码 写完整 登陆成功在页面上显示用户名和密码: username:${requestScope.username }<br> password:${requestScope. ...
- typedef可以成为你的朋友
typedef static char int8;这个声明正确吗? A:err 所以上面那个声明是错误的. typedef为一种类型引入新的名字,而不是为变量分配空间,它并没有引入新的类型,而是为现有 ...
- Effective C++ 条款47
本节条款的题目:请使用trait classes来表示类型信息 本节条款主要讲述的技术是怎样在编译期间实现对迭代器类型的推断,依据推断的类型进行最优处理. 我们先来看一下迭代器的种类: 1.input ...
- java深入探究12-框架之Structs
注意每次修改配置文件后必须项目重启 Structs2=structs1+xwork Struct2框架预先实现了一些功能: 1.请求数据的封装:2.文件上传的功能3.对国际化功能的简化4.文件效验功能 ...
- JavaWeb_(Struts2框架)Ognl小案例查询帖子
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- Golang核心编程
源码地址: https://github.com/mikeygithub/GoCode 第1章 1Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2Golang 的应用领域 ...
随机推荐
- javascript tab onclick
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org ...
- 使用WebBrowser的记录
第一:新建一个类,用了获取WebBrowser元素的类 //需要引用 Interop.SHDocVw 和 Microsoft.mshtmlpublic class Element { //根据Name ...
- Uniqueidentifier数据类型
一.Uniqueidentifier数据类型 可存储16字节的二进制值 Uniqueidentifier用来存储一个全局唯一标识符,即GUID.GUID是唯一的二进制数:世界上的任何两台计算机都不会生 ...
- Python 函数式编程学习
描述:通过将函数作为参数,使得功能类似的函数实现可以整合到同一个函数. Before def getAdd(lst): result = 0 for item in lst: result += it ...
- DES原理与实现
一 DES综述 DES是对称密码的一种,它使用56位秘钥对64位长分组进行加密.DES对每个分组的内容都会进行16轮迭代,每轮的操作相同但是对应不同的子秘钥.所有的子秘钥都是由主密钥推导而来. 64位 ...
- iOS之手势滑动返回功能-b
iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...
- 第 3 章 单例模式【Singleton Pattern】
以下内容出自:24种设计模式介绍与6大设计原则 这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除 ...
- Waterfall———瀑布流布局插件, 类似于 Pinterest、花瓣、发现啦。
瀑布流布局插件, 类似于 Pinterest.花瓣.发现啦. En 中文 文档 下载 下载waterfall插件最新版本. 使用 html: <div id="container&qu ...
- bzoj 3165: [Heoi2013]Segment 动态凸壳
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 202 Solved: 89[Submit][Stat ...
- WebApp触屏版网站开发要点
所谓的触屏版网站其实也是WebApp的一种展示形式,主要是依赖HTML+CSS+Javascript这三个关键因素来实现,相比较原生客户端程序来说优点就是开发周期短.升级简单.维护成本低,因为从根本上 ...