概述
- Struts2主要使用了Struts2标签库和OGNL (Object Ghaph Native Language,对象图导航语言)表达式语言二项技术来简化表现层方面的开发。
- 使用标签可以避免在JSP页面中嵌套大量的Java脚本,极大的提高视图页面的可维护性。
- struts2标签库使用OGNL表达式作为基础,极大的提高了对集合、对象的访问能力
- struts2标签库支持模板和主题,极大的简化了视图页面的编写
- Struts2提供了一个标签库:struts-tags标签库,几乎所有struts2标签都整合到其中。
- 在JSP中使用struts2标签时,需要使用以下代码引入标签库:
<%@ taglib prefix="s" uri="/struts-tags" %>
Ajax 标签:
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
OGNL表达式语言
OGNL是一种可以方便操作对象属性的开源表达式语言,是struts2的默认表达式语言。
优点:
- 可以方便地访问OGNL上下文和ActionContext
- 可以方便地操作对象、数组及集合
使用OGNL访问对象的属性的基本格式:
- propertyName
- #Object.propertyName
OGNL的操作涉及三个要素:
- OGNL表达式:指定OGNL操作要"做什么"。是一个"链式"对象访问路径。
- 根(Root)对象:指定OGNL操作对"谁操作"。可以以任意一个对象为根,通过OGNL可以访问与这个对象关联的其他对象。
- 上下文(Context)对象:指定OGNL操作"在哪里进行"。Root对象所在环境就是OGNL的上下文环境。在表达式中访问Context中的对象,需要使用"#"号加上对象名称。
使用OGNL操作集合:
- 创建集合:
1)List集合:{‘book1’,‘book2’,‘book3’}
2)Map集合:#{‘bookl’:23,‘book2’:36} - 使用in、not in元素符判断某个元素是否在指定集合中:
<s:if test="‘book1’ in {‘book1’,‘book2’}"> - 使用选择操作符获取集合的子集:
1)?: 获取所有符合条件的子集
2)^:获取符合条件的第一个子集
3) $:获取符合条件的最后一个子集
例如:person.relative.{?#this.gender==“m”}
OGNL的"#"操作符的作用
- 访问OGNL上下文和Action上下文,此时"#"相当于ActionContext.getContext()
Action上下文Map对象说明:
ValueStack(值栈):为OGNL 上下文的根对象,当前的Action实例总是放到ValueStack,不需要使用"#“操作符,可直接访问该对象,其余Map对象访问时必须使用”#".
-植栈作用:是OGNL表达式存取数据的地方。植栈封装了
一次请求所需要的所有数据,在页面中与Action之间进行
数据交换。在Action中采用属性驱动和模型驱动与页面交
换数据时,Struts2会将数据自动存储到植栈中
-植栈的生命周期:植栈与Action的生命周期一致,
Struts2会为每次请求创建一个新的植栈。
例如:
parameters :包含当前HTTP请求参数的Map ,#parameters.id相当于request.getParameter("id")
request:包含当前HttpServletRequest的属性的Map,#request.name相当request.getAttribute("name")
session: 包含当前HttpSession的属性的Map,#session.name相当session.getAttribute("name")
application:包含当前应用ServletContext的属性的Map,#application.name相当于application.getAttribute("name")
attr: 用于按page>request > session > application顺序访问其属性,#attr.name相当于按顺序在以上四个范围(scope)内读取name属性,直到找到为止
- 和?操作符结合来选择和投影集合
- 选择(子集):
books.{?#this.price<100}
- 投影:
books.{?#this.price<100}.{bookName}
- 用于构造Map
#{'bookl':'23','book2':'36'}
OGNL的"%"操作符的作用
使用%和"{“和”}“计算OGNL表达式的值作为标签的属性值,如:label=”%{username}"、label="%{#session.username}"
OGNL的"$"操作符的作用
"$"有两个主要的用途:
用于在国际化资源文件中,引用动作属性值及配置项中定义的属性值,如:
m
i
n
、
{min}、
min、{max}
在Struts2配置文件中,引用动作属性值,如:
<result>/admin.jsp?type=${type}</result>
struts2标签类型
-UI标签:
表单标签:主要用于生成HTML表单
非表单标签:主要用于在页面中生成一些非表单的可视化元素,如显示信息的标签:actionerror、actionmessage
-非UI标签:
逻辑控制标签:用于条件、循环等流程控制,如if、elseif、iterator
数据标签:用于数据存储和处理,如property、text
-Ajax标签:
主要用于支持Ajax,如显示日期的datetimepicker
struts2表单及其元素标签
表单标签
s:form
action:指定处理表单所提交信息的动作
method:定义表单信息提交的方法,默认为post
namespace:指定动作所在的命名空间
按钮标签
提交按钮:s:submit,用于提交表单数据
重置按钮:s:reset,用于返回表单的默认值
输入框标签
文本框标记:s:textfield,用于输入单行文本
密码框标记:s:password,用于输入密码
文本域标记:s:textarea,用于输入多行文本
name:定义输入框的名字,动作类通过该名字取得输入框的值
label:定义输入框的描述字符串,默认显示在输入框的左边
readonly:定义输入框的只读属性,true表示输入框不能编辑
rows:定义文本域的行数
cols:定义文本域的列数
选择框标签
单选框标签:s:radio,用于在一组选项中互斥选择,即同组中一次只能选择一项。
复选框集合标签:s:checkboxlist,设置同一组选项中可作多项选择的选择项,可一次设置多个复选框。
列表框标签
作用:用于创建列表框
Struts2数据标签
s:action
用于在JSP页面直接调用一个Action
<s:action name="LoginAction" executeResult="true"/>
s:property
用于输出指定属性的值到浏览器
<s:property value="name"/>
s:label
只读标签,用于输出指定属性的信息到浏览器
<s:label label="爱好的运动" name="sports"/>
s:date
用于格式化并输出一个日期
<s:bean var="now" name="java.util.Date"/>
<s:date name="#now"/>(yyyy-MM-dd hh:mm:ss)
<s:date name="#now" format="dd/MM/yyyy"/>
s:url
用于生成一个URL地址,经常使用s:param标签来提供参数
<s:url action="check" var="url"/>
<s:url value="http://localhost:8080/
struts2/aa.jsp"/>
s:text
用于显示资源文件中的指定key的属性值
<s:text name="helloWorld"/>
s:param
用于为其他标签提供参数,经常与s:url等标签一起使用
<s:url var="url" action="loginAction">
<s:param name="username" value="'nch'"/>
<!--<s:param name="username">nch</param>-->
</s:url>
Struts2逻辑标签
s:if
用于进行条件判断,如果条件为真,则执行该标签体内的代码
s:else
如果s:if不满足条件,则执行s:else后面的语句
s:elseif
与s:if结合使用,用于进行条件判断,如果条件为真,则执行该标签体内的代码。具有s:if同样的属性
s:iterator
用于循环遍历集合或数组中的所有元素
一般配合<s:property>标签来输出所遍历到的元素
<s:iterator value="strs" var="str">
<s:property value="str"/>
</s:iterator>
非表单UI标签
s:fielderror
用于显示字段级别错误信息
<s:fielderror/>
<s:fielderror fieldName="username"/>
s:actionerror
用于输出动作类级别的错误信息
例如:
<s:actionerror/>
s:actionmessage
用于输出动作类级别的信息
例如:
<s:actionmessage/>
使用主题模板
Struts2的UI标签都是基于主题和模板的,模板是一个UI标签的外在表现形式,一系列样式和视觉效果相似的模板就形成了一个主题。
Struts2提供了以下三种主题:
-simple
-xhtml
-css_xhtml
Struts2的默认主题是xhtml,可通过theme属性修改该默认主题,如:
<s:form theme="simple"/>
示例:
https://download.csdn.net/download/weixin_43906969/13205094
pom.xml导入的依赖:
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm-commons -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-commons</artifactId>
<version>7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm-tree -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-tree</artifactId>
<version>7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ognl/ognl -->
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.1.26</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>