Struts2(十)OGNL标签二与Struts2标签
一、Struts2标签的优势
标签库简化了用户对标签的使用
结合OGNL使用,对于集合、对象的访问功能非常强大
提供可扩展的主题、模板支持、极大简化了视图页面的编写
不依赖任何表现层技术
Struts2标签的分类:
通用标签(Generir Tags)
- 数据标签(Data Tags)
- 控制标签(Control Tags)
UI标签(UI Tags)
Ajax标签(Ajax Tags)
二、数据标签


web.xml
<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>
三个实体类
package com.pb.entity;
/*
* 地区类
*/
public class District { private int districtId; //地区编号
private String districtName; //地区名称 public District() {
super();
// TODO Auto-generated constructor stub
}
public District(int districtId, String districtName) {
super();
this.districtId = districtId;
this.districtName = districtName;
}
public int getDistrictId() {
return districtId;
}
public String getDistrictName() {
return districtName;
}
public void setDistrictId(int districtId) {
this.districtId = districtId;
}
public void setDistrictName(String districtName) {
this.districtName = districtName;
} } package com.pb.entity;
/*
* 街道
*/
public class Street { private int streetId; //街道ID
private String streetName; //街道名称
private District district; //街道所在地区
public Street() {
super();
// TODO Auto-generated constructor stub
}
public Street(int streetId, String streetName, District district) {
super();
this.streetId = streetId;
this.streetName = streetName;
this.district = district;
}
public District getDistrict() {
return district;
}
public int getStreetId() {
return streetId;
}
public String getStreetName() {
return streetName;
}
public void setDistrict(District district) {
this.district = district;
}
public void setStreetId(int streetId) {
this.streetId = streetId;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
} } package com.pb.entity; import java.util.Date;
/*
* 房屋
*/
public class House { private int houseId; //房屋ID
private String title; //房屋标题
private Street street;//房屋所在街道
private Date addDate;//房屋发布日期
private String desc; //房屋描述
public House() {
super();
// TODO Auto-generated constructor stub
}
public House(int houseId, String title, String desc, Date addDate,
Street street) {
super();
this.houseId = houseId;
this.title = title;
this.desc = desc;
this.addDate = addDate;
this.street = street;
}
public Date getAddDate() {
return addDate;
}
public String getDesc() {
return desc;
}
public int getHouseId() {
return houseId;
}
public Street getStreet() {
return street;
}
public String getTitle() {
return title;
}
public void setAddDate(Date addDate) {
this.addDate = addDate;
}
public void setDesc(String desc) {
this.desc = desc;
}
public void setHouseId(int houseId) {
this.houseId = houseId;
}
public void setStreet(Street street) {
this.street = street;
}
public void setTitle(String title) {
this.title = title;
} }
houseaction
package com.pb.web.action; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.District;
import com.pb.entity.House;
import com.pb.entity.Street; public class HouseAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<House> houses;
@Override
public String execute() throws Exception {
//声明地区
District dt1=new District(75501,"宝安区");
District dt2=new District(75502,"南山区");
//声明街道
Street street1=new Street(74,"布心一村",dt1);
Street street2=new Street(25,"商业街",dt1);
Street street3=new Street(87,"科技园",dt2);
Street street4=new Street(99,"南头古城",dt2);
//房屋
House house1=new House(11,"一房一厅","靠近公园",new Date(),street1);
House house2=new House(12,"二房一厅","环中线",new Date(),street2);
House house3=new House(13,"单间","高新公寓",new Date(),street3);
House house4=new House(14,"一房一厅","靠近中山公园",new Date(),street4);
houses=new ArrayList<House>();
//添加
houses.add(house1);
houses.add(house2);
houses.add(house3);
houses.add(house4);
return SUCCESS;
} public List<House> getHouses() {
return houses;
} public void setHouses(List<House> houses) {
this.houses = houses;
} }
struts.xml
<package name="default" namespace="/" extends="struts-default">
<action name="house" class="com.pb.web.action.HouseAction">
<result name="success">
/houseList.jsp
</result>
</action>
</package>
页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
//绝对路径
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 引入绝对路径 -->
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>房屋列表信息</title>
</head>
<body>
<!--房屋列表中第一个房屋的信息标题 -->
房屋列表中第一个房屋的信息标题 :<s:property value="houses[0].title"/><br/>
房屋列表中第一个房屋的信息ID :<s:property value="houses[0].houseId"/><br/>
<!--房屋列表中第一个房屋的信息标题 -->
房屋列表中第一个房屋的信息标题 :<s:property value="" default="默认信息"/><br/>
<!--是否转义HTML,将OGNL转化为字符要加单引号 -->
是否转义HTML:<s:property value="'<hr/>'" /><br/>
<!--是否转义HTML 将OGNL转化为字符要加单引号 escapeXml默认为true -->
是否转义HTML:<s:property value="'<hr/>'" escapeHtml="false" /><br/>
<!--s:date标签格式化日期 -->
房屋列表中第一个房屋的发布日期 未格式:<s:property value="houses[0].addDate"/><br/>
房屋列表中第一个房屋的发布日期 格式化后:<s:date name="houses[0].addDate" format="yyyy-MM-dd HH:mm:ss"/><br/>
<s:property value="'<hr/>'" escapeHtml="false"/><br/>
<!--s:set标签 -->
房屋列表中第一个房屋的街道名称:<s:set var="s" value="houses[0].Street" />
<s:property value="#s.streetName"/><br/>
房屋列表中第一个房屋的街道ID:<s:property value="#s.streetId"/><br/>
房屋列表中第一个房屋的地区名称:
<s:property value="houses[0].Street.District.districtId"/><br/>
房屋列表中第一个房屋的地区名称:<s:set var="d" value="#s.District" />
<s:property value="#d.districtName"/><br/>
<br/> 房屋列表中第一个房屋的地区ID:<s:property value="#d.districtId"/><br/><br/>
<s:property value="'<hr/>'" escapeHtml="false"/><br/>
<!--scope指定s:set var的取值 -->
房屋列表中第一个房屋的街道名称:<s:set var="s" value="houses[0].Street" scope="request" />
<s:property value="#request.s.streetName"/><br/>
房屋列表中第一个房屋的街道ID:<s:property value="#request.s.streetId"/><br/>
<s:property value="'<hr/>'" escapeHtml="false"/><br/> 房屋列表中第一个房屋的地区名称:<s:set var="d" value="houses[0].Street.District" scope="session"/>
<s:property value="#session.d.districtName"/><br/>
房屋列表中第一个房屋的地区ID:<s:property value="#session.d.districtId"/><br/>
<s:debug/><br/> </body>
</html>
地址栏输入:http://localhost:8080/OGNLDemo2/house.action发生跳转
三、s:a与s:url

<s:url var="house" value="house.action">
<!-- 传递参数 name为参数名称 vaule为要传的值 -->
<s:param name="str" value="'struts2'"/>
</s:url>
<!-- 使用%{}来获取值-->
<s:a href="%{#house}">跳转列表页面</s:a>
<!--动态包含 -->
<s:include value="include.jsp"></s:include>

四、控制标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
//绝对路径
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 引入绝对路径 -->
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>房屋列表信息</title>
<style type="text/css">
.header{
text-align: center;
background-color: #999999;
font-weight: bold;
font-size: 18px;
}
.even {
text-align: center;
background-color: #FFCCFF;
} .odd {
text-align: center;
background-color: #CCCCFF;
}
</style>
</head>
<body>
<table border="1" width="100%">
<tr class="header">
<td>房屋编号</td>
<td>房屋标题</td>
<td>房屋描述</td>
<td>房屋发布日期</td>
<td>房屋街道ID</td>
<td>房屋街道</td>
<td>房屋街道地区ID</td>
<td>房屋街道地区名称</td>
</tr>
<s:iterator var="hou" value="houses" status="status">
<s:if test="#status.even">
<tr class="even">
</s:if>
<s:if test="#status.odd">
<tr class="odd">
</s:if>
<!-- 定义街道 -->
<s:set var="strtmp" value="#hou.Street" />
<!--定义地区 -->
<s:set var="distmp" value="#strtmp.District" />
<td><s:property value="#hou.houseId" /></td>
<td><s:property value="#hou.title" /></td>
<td><s:property value="#hou.desc" /></td>
<td><s:date name="#hou.addDate" format="yyyy-MM-dd HH:mm:ss" /></td>
<td><s:property value="#strtmp.streetId" /></td>
<td><s:property value="#strtmp.streetName" /></td>
<td><s:property value="#distmp.districtId" /></td>
<td><s:property value="#distmp.districtName" /></td>
</tr>
</s:iterator>
</table>
<s:debug />
</body>
</html>
struts.xml
<action name="house2" class="com.pb.web.action.HouseAction">
<result name="success">
/houseList2.jsp
</result>
</action>
地址栏中输入:http://localhost:8080/OGNLDemo2/house2.action访问
Struts2(十)OGNL标签二与Struts2标签的更多相关文章
- struts2学习笔记(二)—— struts2的架构【转】
一.系统架构 Struts2的官方文档附带了Struts2的架构图. 从这张图能够非常好的去理解Struts2 关于图中的Key: Servlet Filters:过滤器链,client的全部请求 ...
- Struts2的OGNL标签详解
一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...
- HTML 5的革新——语义化标签(二)
HTML 5的革新之一:语义化标签二文本元素标签.分组元素标签. HTML 5的革新——语义化标签(一)中介绍了一些HTML5新加的一些节元素,一张页面中结构元素构成网页大体,但是也需要其他内容来填充 ...
- struts2官方 中文教程 系列十二:控制标签
介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项 ...
- 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...
- struts2之OGNL和struts2标签库和ValueStack对象
OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. struts2框架默认就支持Ognl表达式语言(所以 ...
- Struts2(十一)OGNL标签三与Struts2标签
一.UI标签 二.简单例子 <h1>添加信息</h1> <!--通过指定theme的属性改变主题 --> <s:form action="" ...
- Struts2(九)OGNL标签一与Struts2标签
一.什么是OGNL Object Graph Navigation Language对象图导航语言. 是Struts2默认的表达式语言,开源,功能更强大.和EL表达式有点相似 存取对象的属性,调用对 ...
- Struts2之数据标签(二)
Struts2之数据标签(一):http://blog.csdn.net/u012561176/article/details/46848817 1.action标签:使用此标签能够同意在JSP页面中 ...
随机推荐
- C++的Trigraph
??=include <stdio.h> class HelloWolrd ??< public: void Trigraph() ??< printf("Hello ...
- ArcGIS如何将表连接到空间数据上
当我们有一些空间数据和一些业务数据(表),希望把业务数据和空间数据连接起来时,可以采用ArcGIS Desktop进行操作.本文将介绍如何在ArcGIS Destop中将表和空间数据关联起来. Arc ...
- label标签跳出循环
出场: 首先我们来说说为什么需要label标签,虽然我们已经知道有break,continue跳出循环,但如果是多重循环那么它们就显的无能为力了,所以就出现了label这个标签来为我们服务. 我们先来 ...
- hdu 2014鞍山赛区 5073 Galaxy
题意:就是给你 n 个数,代表n个星球的位置,每一个星球的重量都为 1 ! 开始的时候每一个星球都绕着质心转动,那么质心的位置就是所有的星球的位置之和 / 星球的个数 现在让你移动 k 个星球到任意位 ...
- Android开发总结
出来工作半年多了,没啥好交代的,就说说自己半年来的Android开发经历. 1.IDE 这半年来,从Eclipse到Android Studio,经历了两个IDE,在这里做一下简单的评价. ...
- 使用WinDbg调试SQL Server——入门
这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题 ...
- Hyperion Business Modeling for Microsoft Windows (32-bit)
介质包搜索 常见问题 说明 复查 许可证列表 以确定需要下载的产品程序包. 请选择产品程序包和平台,然后单击“查找”. 如果只有一项结果,则可以看到下载页.如果有多个结果,请选择一个,然后单 ...
- 可拖动FPS显示框(UGUI)
简介 本来是想往上找一个可拖动FPS显示框的(我记得以前有人写过),然而搜了一个多小时都没搜到,索性自己写了一个,花费不到20分钟,看来还是自己动手丰衣足食啊 o(╯□╰)o 效果 上下的Toast不 ...
- document.documentElement.clientWidth
document.documentElement.clientWidth 摘自:http://blog.sina.com.cn/s/blog_6f1f9ead0100n1f6.html 关于获取各种浏 ...
- x3dom 1.6 发布
X3DOM 库的1.6版本发布了,以下是最重要的一些变化: 完整的新的文档频道 - http://doc.x3dom.org x3dom实例频道 - http://examples.x3dom.or ...