Struts2自定义标签——示例

自定义Button功能描述:

<tangs:button  items="apple,orange,banana"/>

解析后为:

<input  type="button"  name="apple"  value="apple" />

<input  type="button"  name="orange"  value="orange" />

<input  type="button"  name="banana"  value="banana" />


文件配置:


tangs.tld

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib><tlib-version>2.2.3</tlib-version><jsp-version>1.2</jsp-version><short-name>tangs</short-name><uri>/tangs</uri><display-name>"Tangs Tags"</display-name><tag><name>button</name><tag-class>com.gq.tag.button.ButtonTag</tag-class><body-content>empty</body-content><attribute><name>items</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>
</taglib>
这里要注意的是:<rtexpvalue>true</rtexpvalue> 时候,可以使用 JSP 表达式

rtexprvalue的全称是 Run-time Expression Value, 它用于表示是否可以使用JSP表达式.

当在<attribute>标签里指定<rtexprvalue>true</rtexprvalue>时
, 表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定,  example as follow:

<sql:query var="result" >
    select * from mytable order by nameid
</sql:query>
<%request.setAttribute("nameid", "2"); %>
<myTag:cupSize cupSize="1" cupSizes="${result}"></myTag:cupSize>
<myTag:cupSize cupSize="${nameid}" cupSizes="${result}"></myTag:cupSize>


当在<attribute>标签里指定<rtexprvalue>false</rtexprvalue>时, 表示该自定义标签的某属性的值只能直接指定,  example as follow:
<myTag:cupSize cupSize="1" cupSizes="${result}"></myTag:cupSize>

_________________________________________________________________________

ButtonTag.java

/**
*创建日期	:2011-11-16
*创建用户	:GongQiang
*变更情况	:
*文档位置 	$Archive:test_struct2/com.gq.tag.button/ButtonTag.java$
*最后变更	$Author:  $
*变更日期	$Date: $
*当前版本 	$Revision: $
*
*Copyright (c) 2004 Sino-Japanese Engineering Corp, Inc. All Rights Reserved.
*/
package com.gq.tag.button;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;import com.opensymphony.xwork2.util.ValueStack;public class ButtonTag extends ComponentTagSupport {private static final long serialVersionUID = 1L;private String items;public String getItems() {return items;}public void setItems(String items) {this.items = items;}/*** getBean 在类ComponentTagSupport中为抽象,子类必须实现*/@Overridepublic Component getBean(ValueStack valueStack, HttpServletRequest request, HttpServletResponse response) {return new ButtonService( valueStack );}@Overrideprotected void populateParams() {super.populateParams();ButtonService buttonService = (ButtonService) getComponent();buttonService.setItems( getItems() );}
}

_________________________________________________________________________

ButtonService.java

/**
*创建日期	:2011-11-16
*创建用户	:GongQiang
*变更情况	:
*文档位置 	$Archive:test_struct2/com.gq.tag.button/ButtonService.java$
*最后变更	$Author:  $
*变更日期	$Date: $
*当前版本 	$Revision: $
*
*Copyright (c) 2004 Sino-Japanese Engineering Corp, Inc. All Rights Reserved.
*/
package com.gq.tag.button;import java.io.IOException;
import java.io.Writer;import org.apache.struts2.components.Component;import com.opensymphony.xwork2.util.ValueStack;public class ButtonService extends Component {private String items;public String getItems() {return items;}public void setItems(String items) {this.items = items;}/*** Component 没有默认构造器,子类必须指明构造器* * @param valueStack*/public ButtonService(ValueStack valueStack) {super(valueStack);}@Overridepublic boolean start(Writer writer) {String[] itemValues = getItemValues();//如下操作,仅仅显示出itemValues 的buttonStringBuilder sb = new StringBuilder();for( String value : itemValues ){sb.append( "<input type=\"button\" name=\"" + value + "\" value=\"" + value + "\">" );}try {writer.write( sb.toString() );} catch (IOException e) {throw new RuntimeException( "Construct <tangs:button /> error" );}return super.start(writer);}private String[] getItemValues( ){if( items == null || items.trim().equals( "" ) ){return new String[]{};}// 直接给属性items 赋值, <tangs:button items="apple,orange,banana"/>if( items.contains( "," ) ){ //假设必须是多个return items.split( "," );}// 通过JSP运行获取值,<tangs:button items="fruits"/>else{return (String[])this.getStack().findValue( items ); //这样写,只支持struts2 的ongl语法}}}

通过如上三个文件,tangs.tld、ButtonTag.java 和 ButtonService.java 的定义 <tangs:button />自定义标签已经完成,下面演示使用:

struts.xml 配置文件中添加 ButtonTag:

	<!-- 演示标签 --><package name="tag" extends="struts-default" namespace="/tag"><action name="Tag" class="com.gq.action.TagTestAction"><result name="success">/tagTest/tags.jsp</result><interceptor-ref name="defaultStack"/></action><action name="ButtonTag" class="com.gq.tag.button.ButtonActionTest"><result name="success">/tagTest/buttonTag.jsp</result><interceptor-ref name="defaultStack"/></action></package>


ButtonActionTest.java

/**
*创建日期	:2011-11-16
*创建用户	:GongQiang
*变更情况	:
*文档位置 	$Archive:test_struct2/com.gq.tag.button/ButtonActionTest.java$
*最后变更	$Author:  $
*变更日期	$Date: $
*当前版本 	$Revision: $
*
*Copyright (c) 2004 Sino-Japanese Engineering Corp, Inc. All Rights Reserved.
*/
package com.gq.tag.button;import com.opensymphony.xwork2.ActionSupport;public class ButtonActionTest extends ActionSupport {private static final long serialVersionUID = 1L;public String[] getFruits(){return new String[]{ "apple", "apple", "apple"};}@Overridepublic String execute() throws Exception {return SUCCESS;}
}

JSP 页面 buttonTag.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="tangs" uri="/tangs" %>
<%
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>My JSP 'buttonTag.jsp' starting page</title></head><body>页面直接给定属性<br/><tangs:button items="apple,orange,banana"/><br/><br/>运行时获取值<br/><tangs:button items="fruits"/></body>
</html>

访问页面效果:





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习的核心:掌握训练数据的方法

来源&#xff1a;云栖社区 概要&#xff1a;今天我们将讨论深度学习中最核心的问题之一&#xff1a;训练数据。 Hello World&#xff01; 今天我们将讨论深度学习中最核心的问题之一&#xff1a;训练数据。深度学习已经在现实世界得到了广泛运用&#xff0c;例如&#xff1a;无…

python停止运行tensorflow_Tensorflow 开启训练后卡死

毕设做深度学习的课题&#xff0c;使用到了TensorFlow&#xff0c;但训练时出现了问题&#xff1a;跑脚本开启训练之后&#xff0c;跑完不到100次就会卡死&#xff0c;然后显示python已停止工作这是我的训练的代码# 导入数据集import load_record# 导入TensorFlow并创建Session…

Struts2自定义标签(template)——示例

来源&#xff1a;http://www.blogjava.net/natlive/archive/2009/05/21/271890.html Struts2 的UITag原理&#xff1a; Struts2 UITag分三部份组成&#xff0c;一部份用于定义Tag的内容与逻辑的UIBean&#xff0c;一部份用于定义JSP Tag&#xff0c;也就是平时我们定义的那种&…

详解5G的六大关键技术

来源&#xff1a;电子产品世界 概要&#xff1a;在5G研发刚起步的情况下&#xff0c;如何建立一套全面的5G关键技术评估指标体系和评估方法&#xff0c;实现客观有效的第三方评估&#xff0c;服务技术与资源管理的发展需要&#xff0c;同样是当前5G技术发展所面临的重要问题。 …

为什么说特斯拉研发自动驾驶AI芯片应该引起注意?

来源&#xff1a;36Kr 概要&#xff1a;对于特斯拉而言&#xff0c;研发这款芯片配套算法本质上还是对率先将自动驾驶汽车商业化节点的争夺。 特斯拉Model 3的量产问题仍未彻底解决&#xff0c;CEO Elon Musk又抛出了自研自动驾驶芯片的重磅新闻。 Elon Musk和特斯拉Autopilo…

stm32usb做虚拟串口和键盘_关于stm32f103的USB虚拟串口程序移植

手边有个项目要用到USB传数据到主机&#xff0c;虽然有很多种方式&#xff0c;但最后还是选择了USB虚拟串口模式&#xff0c;将数据上传至pc端&#xff1b;然而这就涉及到了移植问题&#xff0c;在keil下官方已经给出了一个完整的USB TO VCOM的demo&#xff0c;但在我的主机上装…

4篇Nature同时揭示DNA自组装技术,离人造生命又近了一步

来源&#xff1a;刘盼科学网博客 概要&#xff1a; 科学家一直渴望利用自组装来构建人造物体&#xff0c;以达到细胞或细胞器的尺寸和复杂性&#xff0c;以便为研究&#xff0c;工程和医学应用构建合成的细胞机器。 iNature&#xff1a;自组装过程以各种形式存在于自然界中&…

均方距离计算公式_均值、方差、均方值、均方差计算

1、均值 均值表示信号中直流分量的大小,用E(x)表示。对于高斯白噪声信号而言,它的均值为0,所以它只有交流分量。 2、均值的平方 均值的平方,用{E(x)}^2表示,它表示的是信号中直流分量的功率。 3、均方值 均方值表示信号平方后的均值,用E(x^2)表示。均方值表示信号的平均功…

推动大数据和AI应用场景的落地,加速实现与产业融合。

来源&#xff1a;猎云网 概要&#xff1a;在新时代下&#xff0c;如何利用大数据与人工智能技术&#xff0c;大幅提升数据效率与业务决策&#xff0c;化数据新技术力为业务新能力&#xff0c;化业务新能力为商业新物种&#xff0c;成为各行各业在未来生存下去的关键。 今日&am…

web.config 指定的默认页失效

web.config 指定的默认页失效 解决方法&#xff1a; IIS 配置如下&#xff1a;

CCF大数据专家委:2018年大数据发展趋势预测

来源&#xff1a;大潘点点 概要&#xff1a;2018年大数据发展趋势预测 1、机器学习继续成为大数据智能分析的核心技术 2、人工智能和脑科学相结合&#xff0c;成为大数据分析领域的热点 3、数据科学带动多学科融合 4、数据学科虽然兴起&#xff0c;但是学科突破进展缓慢 5、推动…

connectionstring mysql_Entity Framework 6 自定义连接字符串ConnectionString连接MySQL

在开始介绍之前&#xff0c;首先来看看官方对Entity Framework的解释&#xff1a;Entity Framework (EF) is an object-relational mapper that enables .NET developers to work with relational data using domain-specific objects. It eliminates the need for most of the…

学界 | OpenAI 发布稀疏计算内核,更宽更深的网络,一样的计算开销

作者&#xff1a;杨晓凡 概要&#xff1a;OpenAI 的研究人员们近日发布了一个高度优化的 GPU 计算内核&#xff0c;它可以支持一种几乎没被人们探索过的神经网络架构&#xff1a;带有稀疏块权重的网络。 OpenAI 的研究人员们近日发布了一个高度优化的 GPU 计算内核&#xff0…

Java 实现sha_加密算法 MD5 和 SHA 的 JAVA 实现

首先先简单的介绍一下MD5 和 SHA 算法然后看一下在 java.security.MessageDigest (信息摘要包下) 如何分别实现 md5 加密 和 sha 加密最后在看一下 使用httpclient包 依赖下的 commons-codec-org. 包 下的apache.commons.codec.digest.DigestUtils 这个工具类 是如何快速…

java loadonstartup_java的web配置文件的“load-on-startup0/load-on-startup”一个问题

展开全部load-on-startup标记容器是否32313133353236313431303231363533e78988e69d8331333365643662在启动的时候实例化并调用其init()方法的优先级。它的值表示 servlet应该被载入的顺序。当值为0或者大于0时&#xff0c;表示容器在应用启动时就加载并初始化这个servlet。.如…

java隋唐演义游戏下载_JAVA多线程

第一节 多线程背景知识介绍多线程作用&#xff1a;可以帮助简化模型&#xff0c;还能编写强大的代码。进程与线程的基础概念&#xff1a;Eclipse QQ都属于进程。进程是程序(任务)的执行过程&#xff0c;它持有资源(共享内存、共享文件)和线程。它包含两点&#xff1a;1.动态性&…

packageinfo.java_package-info.java文件详解

package-info.java文件详解一、pacakge-info.java介绍pacakge-info.java是一个Java文件&#xff0c;可以添加到任何的Java源码包中。pacakge-info.java的目标是提供一个包级的文档说明或者是包级的注释。pacakge-info.java文件中&#xff0c;唯一要求包含的内容是包的声明语句&…

java classpath设置_Java CLASSPATH设置

Java CLASSPATH设置CLASSPATH: CLASSPATH是一个环境变量&#xff0c;Application ClassLoader使用它来定位和加载.class文件。 CLASSPATH定义路径&#xff0c;以查找不是扩展或Java平台一部分的第三方和用户定义的类。设置CLASSPATH时&#xff0c;请包括所有包含.class文件和JA…

寒武纪芯片创始人:要让AI芯片计算效率提高一万倍

来源&#xff1a; 传感器技术 概要&#xff1a;随着利好政策的不断出台以及行业的持续发展&#xff0c;芯片相关产业站上风口。 随着利好政策的不断出台以及行业的持续发展&#xff0c;芯片相关产业站上风口。而AI芯片独角兽公司寒武纪&#xff0c;也即将入驻雄安新区。e公司记…