一:Struts2框架的标签库可以分为以下三类:
1.用户界面标签(UI标签):主要用来生成HTML元素的标签。
(1)表单标签:主要用于生成HTML页面的FORM元素,以及普通表单元素的标签。
(2)非表单标签:主要用于生成页面上的tree,Tab页等。
2.非用户界面标签(非UI标签):主要用于数据访问,逻辑控制。
(1)数据访问标签:主要包含用于输出值栈(ValueStack)中的值,完成国际化等功能的标签。
(2)流程控制标签:主要包含用于实现分支,循环等流程控制的标签。
3.AJAX标签:用于支持Ajax效果
二:Struts2标签的使用
1.在struts2-core-2.3.16.jar压缩文件的META-INF目录下找到Struts-tags.tld文件,这个文件里定义了Struts2的标签。如图:
2.要在jsp中使用Struts2的标签,先要指明标签的引入。通过jsp的代码的顶部加入以下的代码:
< %@taglib prefix="s" uri="/Struts-tags" %>
具体使用案例观看我写的“在线考试系统”博客
三:Struts2标签语法
Struts2标签的属性按照下列的三个规则进行计算。
(1)所有的字符串属性类型都会解析“%{…}”这样的语法。
(2)所有的非字符属性类型都不会被解析,而是直接被看作一个OGNL表达式进行求值
(3)对于第二个规则的例外情况是,如果非字符串属性使用了“%{…}”语法,那么%{…}将被忽略,花括号中的内容将作为表达式计算。
四:Struts2通用标签
Struts2中通用标签可以分为二类:控制标签和数据标签。
我在此先写一个User类
package model;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
创建MessageAction类
package action;
import model.User;
import com.opensymphony.xwork2.ActionSupport;
public class MessageAction extends ActionSupport {
private String message;
private User user;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
user = new User();
user.setName("csdn");
user.setAge(22);
message = "Hello!";
return SUCCESS;
}
public String login() {
boolean b = true;
if (user.getName() == null || user.getName().trim().equals("")) {
addFieldError("name", "用户名不得为空");
b = false;
}
if (user.getAge() <= 0) {
addFieldError("age", "年龄不合法");
b = false;
}
if (b) {
return SUCCESS;
}
return INPUT;
}
}
配置struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="User" namespace="/user" extends="struts-default">
<action name="message" class="action.MessageAction" >
<result name="success">
/index.jsp
</result>
</action>
<action name="login" class="action.MessageAction" method="login" >
<result name="success">
/index.jsp
</result>
<result name="input">
/lodin.jsp
</result>
</action>
</package>
</struts>
配置web文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>message</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
创建页面index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
</body>
</html>
数据标签
1.property标签:
标签用于输出值栈中的对象的属性(property)值,使用value属性来指定要输出的对象属性,如果没有指定value属性,那么默认输出栈顶对象
property标签属性
1<s:property value="message" />
<br />
2<s:property value="'message'" />
<br />
3<s:property value="%{message}" />
<br />
4<s:property value="%{csdn}" default="csdn"/>
<br />
输出结果:
输出结果看
第一种和第三种方法取出MessageAction.java类中的赋给message的hello值(即栈值),
第三种方法取的是message的name值,
但是如果第四种方法不给出缺省的值。不会输出任何的值
set标签的使用
Set标签将一个值赋给指定范围内变量。Set标签在某些情况下是比较有用的,例如在页面中多次引用一个复杂的表达式,我们可以将这个表达式赋给一个变量,然后直接引用变量。带来的好处就是:
1.提升了性能(表达式的计算只有一次)
2.提高了代码的可读性。
<s:set name="xxx" value="user.name" />
1<s:property value="#session.xxx" /><br/>
2<s:property value="#request.xxx" /><br/>
3<s:property value="xxx" /><br/>
4<s:property value="#xxx" />
</s:set>
输出结果:
bean标签和param标签
¨bean标签用于实例化一个JavaBean对象(必须遵照JavaBean规范),bean标签的标签体内可以包含多个param标签,用于设置Bean的属性(必须有相应的setter方法)。如果指定了id属性(Struts2.2.1.1已经不建议使用,使用var属性替代),则创建的Bean实例将被放入到OgnlContext中。
注意:
id属性是可选的,无论是否指定id属性,bean标签创建的JavaBean实例都会被压入到值栈的顶部,在bean标签内部可以直接访问创建的对象,无须使用”#”标记,当bean标签结束的时候,bean标签创建的实例将从值栈中删除。
如果指定了id属性,那么bean标签创建的JavaBean实例还将被放到OgnlContext中,这样在bean标签的外部,也可以访问创建的对象了,不过此时就要使用”#”标记了。
param标签被用作其他标签的子标签,用于为其他标签提供参数
<s:bean name="model.User">
<s:param name="name" value="'csdn'"/>
<s:param name="age" value="'22'"/>
<s:property value="name"/>
<s:property value="age"/></s:bean>
输出结果:
include标签
include标签类似于JSP的<jsp:include>标签,用于包含一个Servlet或JSP页面。include标签的标签体内可以包含多个param标签,用于向被包含的页面传递请求参数
<s:include value="include.jsp">
<s:param name="name" value="csdn"/>
<s:param name="age" value="22"/>
</s:include>
控制标签
用于在呈现结果页面时控制程序的执行流程,根据程序执行的状态输出不同的结果
控制标签包括下列标签:
1.if:用于控制选择输出。
2.elseif:同if标签结合使用,用来控制选择输出。
3.else:同if标签结合使用,用来控制选择输出。
4.append:用来将多个集合拼接为一个新的集合。
5.generator:为一个字符串解析器,用来将一个字符串解析为一个集合。
6.iterator:迭代器,用来迭代输出集合数据。
7.merge:用来将多个集合拼接为一个新的集合,同append有所区别。
8.sort:用来对集合排序。
9.subset:用来截取集合的部分集合,开成新的集合子集合。
if/elseif标签属性test:为必填属性,是一个Boolean类型值,决定是否显示if标签内容。该标签标准格式如下:
<s:if test=“表达式”>
……..
</s:if>
<s:elseif test=“表达式”>
……..
</s:elseif>
<s:else>
………..
</s:else>
案例:
<s:set name="age" value="'61'"/>
<s:if test="#age>60"> 老人 </s:if>
<s:elseif test="#age>40"> 中年人 </s:elseif>
<s:elseif test="#age>20"> 青年人 </s:elseif>
<s:else> 少年 </s:else>
iterator(迭代标签)
用于遍历集合(java.util.Collection)List,Map,数组或枚举值(java.util.iterator)
案例:
<s:iterator value="{'java','jsp','hibernate','struts2','html'}" id="skill" status="status">
<s:property value="#status.odd"/><br/>
<s:if test="#status.odd">
<s:property value="skill"/><br/>
</s:if>
<!--下标 -->
<s:property value="#status.index"/>
<!-- 页面显示序号 -->
<s:property value="#status.count"/>
</s:iterator>