Strut2开发经验总结
1、如何在html静态页面中使用struts
tomcat目录/conf/web.xml 文件中,找到
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping> <servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping> 在其下面加入: <servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping> 这样tomcat就会把后缀名为html的文件当成jsp来解析。 2、Struts2通用标签
Struts2框架为我们提供了很多标签,这些标签总体上可以分为两类:通用标签和UI标签。而较常使用的又是通用标签,所以文章的内容也是围绕通用标签展开的。通用标签分为两类:数据标签和控制标签。数据标签用于访问值栈中数据,控制标签用于控制呈现页面时数据执行流程。如果需要使用Struts 2框架的标签库,需要在页面的首部引入以下代码:<%@ taglib uri="/struts-tags" prefix="s"%>下面将分别对这两种标签进行说明。
数据标签
数据标签主要用于访问ActionContext和值栈中数据,数据标签包括:
- property
- set
- push
- param
- bean
- action
- include
- url
- a
- i18n
- text
- date
- debug
1、property标签
property标签用于输出值栈中对象的属性值,value属性就是要输出的值。如果没有执行value属性,那么默认就会输出栈顶对象
property标签的属性包括:
| 名称 | 是否必需 | 说明 |
|---|---|---|
| default | 否 | 如果value属性是null,则输出default的值 |
| value | 否 | 进行求值的表达式 |
2、set标签
set标签是将一个值赋给指定范围的变量。如下前面的OGNL表达式文章中就多次使用了set标签。set标签的属性包括:
| 名称 | 是否必需 | 说明 |
|---|---|---|
| name | 是 | 变量的名字 |
| value | 否 | 指定一个表达式,将计算的结果赋给变量。如果没有执行value属性,默认将栈顶对象赋给变量 |
| scope | 否 | 变量的范围,有application、session、request、page和action(默认值) |
注意的是,在使用默认scope的值,即action范围的时候,value属性值会保存在request和OgnlContext(OGNL上下文)中。比如下面的例子:
action:
package com.rhwayfun.struts2.action;
import com.rhwayfun.struts2.bean.User;
public class SetTagAction {
private User user;
public String execute(){
user = new User();
user.setName("刘备");
return "success";
}
public User getUser() {
return user;
}
}
package com.rhwayfun.struts2.action; import com.rhwayfun.struts2.bean.User; public class SetTagAction { private User user;
public String execute(){
user = new User();
user.setName("刘备");
return "success";
} public User getUser() {
return user;
}
}
jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>set标签测试</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<p>action范围中获取值</p>
<p>
<s:set name="name" value="user.name"></s:set>
<s:property value="#name"/>
</p>
<p>request范围中获取</p>
<p>
<s:property value="#request.name"/>
</p>
<p>session范围中获取</p>
<p>
<s:set name="name" value="user.name" scope="session"></s:set>
<s:property value="#session.name"/>
</p>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>set标签测试</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head> <body>
<p>action范围中获取值</p>
<p>
<s:set name="name" value="user.name"></s:set>
<s:property value="#name"/>
</p>
<p>request范围中获取</p>
<p>
<s:property value="#request.name"/>
</p>
<p>session范围中获取</p>
<p>
<s:set name="name" value="user.name" scope="session"></s:set>
<s:property value="#session.name"/>
</p>
</body>
</html>
最后的测试结果:
3、push标签
push标签的作用是将一个对象放入值栈中,所以push对象位于栈顶,但是push标签结束之后,栈顶的元素将会被删除,因此需要访问push的对象需要在push标签的内部访问。push标签只有属性value,这也是一个必需提供的属性。那么具体在开发中push标签有什么作用呢?答案是简化对属性的访问。比如需要访问一个User对象的name属性和age属性,正常在jsp页面使用Struts 2标签库进行访问的方式是#request.user.name和#request.user.age(假设是request范围),而使用push标签,访问name属性的方式是:
<s:push value="#request.user">
姓名:<s:property value="name"/>
年龄:<s:property value="age"/>
</s:push>
<s:push value="#request.user">
姓名:<s:property value="name"/>
年龄:<s:property value="age"/>
</s:push>
4、param标签
param标签通常是作为其他标签的子标签,用于为其他标签提供参数。param标签有两个非必需属性name和value。其中的name属性是要设置参数的名字,value则是该参数的值。使用param标签有两种方式:<param name="username" value="zhangsan"/>和<param name="username">zhangsan</param>。在第一种方式中,value属性并不会作为name属性的值,而是表达式对待,因此如果zhangsan属性是空的话,将得到null ,所以需要把value改成%{'zhangsan'}。第二种访问方式是没有什么问题的。所以这种方式也是推荐的写法。
5、bean标签
bean标签相当于jsp中的useBean标签,bean标签通常用于实例化一个JavaBean对象,一个bean标签内部可以有多个param标签,用于为bean实例设置属性值(要求有set方法)。bean标签有两个属性:name和id。其中的name属性是要实例化的bean的完整类名,id用于指定一个名字,用于引用放入OgnlContext中的JavaBean对象。这里需要注意的是,出了bean标签,放入栈顶的实例(用bean标签创建的JavaBean对象会放入栈顶)会被移除。但是如果指定了id属性,在bean标签的外部就可以访问了。此时需要使用#符号。因此如果需要创建在bean实例可以在bean标签的外部也可以访问到,就需要指定id属性。
6、action标签
通过指定action的名字和可选的命名空间,action标签允许在jsp页面直接访问action。如果将action标签的executeResult属性设置为true,那么action对应的输出结果也会包含在本页面中。由于这种方式并不常用,而且在实际开发中使用的场合比较少,这里就不详细说明了。
7、include标签
该标签类似于jsp中<jsp:include></jsp:include>标签。在标签的内部可以包含多个param标签,用于向被包含的页面传递参数。include标签只有一个value属性,用于指定被包含的jsp或者Servlet。比如下面的代码:
includeTag.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>include标签测试</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<p>使用include标签包含另一个页面,并传递参数</p>
<p>
<s:include value="includeJsp.jsp">
<s:param name="username">刘备</s:param>
<s:param name="age">52</s:param>
</s:include>
</p>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>include标签测试</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head> <body>
<p>使用include标签包含另一个页面,并传递参数</p>
<p>
<s:include value="includeJsp.jsp">
<s:param name="username">刘备</s:param>
<s:param name="age">52</s:param>
</s:include>
</p>
</body>
</html>
includeJsp.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>includeJsp.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
姓名:${param.username }<br>
年龄:${param.age }
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>includeJsp.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head> <body>
姓名:${param.username }<br>
年龄:${param.age }
</body>
</html>
最后的访问includeTag.jsp,可以看到如下的结果:
8、其他标签
其中的url标签用于创建一个url,在标签内部可以提供url附加的参数信息。i18n标签和text标签主要用于国际化的支持。i18n标签把一个资源包放入值栈中,text标签用于从资源包中获取消息。date标签主要用于格式化日期的输出。
控制标签
控制标签用于在呈现页面的时候控制程序的执行流程。常用的控制标签包括:
- if/elseif/else
- iterator
- generator
1、if/elseif/else 标签
下面是这个标签使用的一个例子:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>if/elseif/else标签</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<s:set name="score" value="75"></s:set>
成绩等级:
<s:if test="#score < 60">不及格</s:if>
<s:elseif test="#score < 80">良好</s:elseif>
<s:else>优秀</s:else>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>if/elseif/else标签</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head> <body>
<s:set name="score" value="75"></s:set>
成绩等级:
<s:if test="#score < 60">不及格</s:if>
<s:elseif test="#score < 80">良好</s:elseif>
<s:else>优秀</s:else>
</body>
</html>
2、iterator标签
iterator标签用于迭代一个集合的元素,在迭代的过程中,会暂时把迭代的对象压入栈顶,这样在标签的内部可以访问对象的属性值了。访问结束之后,会把栈顶的迭代对象移除,并把下一次迭代的对象压入栈顶。这样一直到所有的对象迭代完毕。iterator标签有三个属性:id、value和status。id属性几乎不使用,value属性用于指定迭代的集合,status属性可以获取迭代中的一个状态信息(比如索引值、是否是奇数、偶数等),其所有的方法如下:
- public int getCount():得到迭代元素的总数
- public int getIndex():得到当前迭代元素的索引
- public boolean isEven():判断当前迭代的元素的顺序是否是偶数
- public boolean isOdd():判断当前迭代的元素的顺序是否是奇数
- public boolean isFirst():判断当前迭代的元素是否是第一个元素
- public boolean isLast():判断当前迭代的元素是否是最后一个元素
比如下面的例子:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>iterator标签测试</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<s:iterator value="{'刘备','张飞','关羽'}" status="s">
<p>当前元素:<s:property /></p>
<p>当前元素总数:<s:property value="#s.count"/></p>
<p>当前元素索引:<s:property value="#s.index"/></p>
<p>当前元素是否为偶数:<s:property value="#s.even"/></p>
<p>当前元素是否是奇数:<s:property value="#s.odd"/></p>
<p>当前元素是否是第一个数:<s:property value="#s.first"/></p>
<p>当前元素是否是最后一个数:<s:property value="#s.last"/></p>
<hr>
</s:iterator>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>iterator标签测试</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"> </head> <body>
<s:iterator value="{'刘备','张飞','关羽'}" status="s">
<p>当前元素:<s:property /></p>
<p>当前元素总数:<s:property value="#s.count"/></p>
<p>当前元素索引:<s:property value="#s.index"/></p>
<p>当前元素是否为偶数:<s:property value="#s.even"/></p>
<p>当前元素是否是奇数:<s:property value="#s.odd"/></p>
<p>当前元素是否是第一个数:<s:property value="#s.first"/></p>
<p>当前元素是否是最后一个数:<s:property value="#s.last"/></p>
<hr>
</s:iterator>
</body>
</html>
3、generator标签
generator标签主要是根绝分隔符对元素进行处理,该标签一般和iterator标签使用,在generator标签的内部可以使用iterator标签对处理之后的元素进行迭代,下面是一个例子:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>generator标签</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
</head>
<body>
<s:generator separator="," val="'刘备,张飞,关羽'">
<s:iterator>
<s:property/>
</s:iterator>
</s:generator>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>generator标签</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
</head> <body>
<s:generator separator="," val="'刘备,张飞,关羽'">
<s:iterator>
<s:property/>
</s:iterator>
</s:generator>
</body>
</html>
generator标签中上述的separator属性和val属性是必需的,如果指定了id属性,那么将以id属性的值作为key,将生成的迭代器保存在pageContext对象中。
<------------------------------持续更新中---------------------------------->
Strut2开发经验总结的更多相关文章
- [转]Linux 的多线程编程的高效开发经验
Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...
- 谈谈springMVC和Strut2的理解
关于struts2框架原理 执行流程 struts2框架的核心是一个过滤器,我们编写的action类都继承ActionSupport的接口(顶层是一个过滤器filter),用户发送请求,经过核心过滤器 ...
- Delphi xe5 手机开发经验(新手级别)
Delphi xe5 手机开发经验(新手级别) http://diybbs.zol.com.cn/1/34037_699.html http://www.delphitop.com/html/jiqi ...
- [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- AngularJS开发经验(转)
AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也可以觉得是小花招)来让 ...
- 利用strut2标签自动生成form前端验证代码
利用strut2标签自动生成form前端验证代码,使用到的技术有1.struts2标签,如<s:form> <s:textfieled>2.struts2读取*Validati ...
- Linux 的多线程编程的高效开发经验(转)
http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多 ...
- Storm0.9.4安装 - OPEN 开发经验库
Storm0.9.4安装 - OPEN 开发经验库 bin/zkServer.sh start /home/guym/down/kafka_2.8.0-0.8.0/config/zookeeper.p ...
- Winform开发几个常用的开发经验及知识积累(一)
本人做Winform开发多年,孜孜不倦,略有小成,其中收集或者自己开发一些常用的东西,基本上在各个项目都能用到的一些开发经验及知识积累,现逐步介绍一些,以飨读者,共同进步. 1.窗口[×]关闭按钮变为 ...
随机推荐
- day 65 crm(2) admin源码解析,以及简单的仿造admin组件
前情提要: crm中的admin组件重写. 一:admin的autodiscover 作用:实现扫面该项目中的所有的admin 1:执行顺序-> 按照注册的顺序执行 二:单例模式 1:普通案例的 ...
- 云链接 接口不允许 情况 解决方法 mysql Host is not allowed to connect to this MySQL server解决方法
在装有MySQL的机器上登录MySQL mysql -u root -p密码 执行use mysql; 执行update user set host = '%' where user = 'root' ...
- js 保留字符串中的关键字前后两个字符其他内容用省略号显示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [Noi2014]购票 斜率优化DP+可持久化凸包
貌似网上大部分题解都是CDQ分治+点分治然后再斜率优化DP,我貌似并没有用这个方法. 这一题跟这题有点像,只不过多了一个l的限制 如果说直接跑斜率优化DP,存储整个序列的话,显然是不行的,如图所示(图 ...
- 给easyui datebox时间框控件扩展一个清空的实例
给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...
- Centos6.7安装Pycharm及升级JDK
首先到pycharm官网下载pycharm压缩包 wget https://www.jetbrains.com/pycharm/download/download-thanks.html?platfo ...
- (转)Mysql备份还原数据库之mysqldump实例及参数详细说明
http://www.xuejiehome.com/blfl-2.html http://www.cnblogs.com/xuejie/archive/2013/01/11/2856911.html ...
- 数据输入——生成你需要的echart图(堆积柱状图、扇形图、嵌套环形图)
最近论文需要一些比较直观的图表, 发现echart做出来的图还是比较美观的,这里介绍如何修改数据生成你需要的echart图. 1.堆积柱状图: http://echarts.baidu.com/exa ...
- 15-hadoop-eclipse插件的安装
好久没更新了, 也好久没学了, 今天换了个eclipse版本, 安装插件坑了一会, 果然好记性不如烂笔头, 记下来吧 编译安装或者直接安装都可以, 先说下编译安装吧 1, 编译安装, 是使用的ant, ...
- 面试题26:合并k个排好序的单链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. c ...