JavaWeb之自定义标签&JSTL&国际化(九)

自定义标签

简介

自定义标签由于没练习,所以掌握的不是很深,但是对于我而言足够可以应付用户登录注册案例和购物车案例,有时间还是多了解的好

1. 自定义标签简介

1、作用:替换JSP页面中的java脚本(<%%>)。(官方推荐:JSP2.0开始)

2. 开发步骤

1. 自定义一个类继承SimpleTagSupport实现doTag方法
2. WEB-INF,建立tld文件,定义标签地址/定义标签内容
3. jsp页面使用taglib指令引入uri地址,prefix定义标签名,直接在页面调用这个标签

tld文件配置-->Tomcat服务器中搜索jsp2-example-taglib.tld
body-content:的取值内容
JSP:不要考虑。(给传统标签处理类用的)
empty:传统和简单标签都能用的。开始标签和结束标签没有主体内容时用。
scriptless:给简单标签用的。开始标签和结束标签有主体内容时用。但是内容不能有<%
tagdependent:给简单标签用的。告诉标签处理类,主体内容是普通的文本

3. 自定义标签执行原理

SimpleTag接口中的方法:
void doTag():由服务器调用。在JSP中遇到标签时调用。
JspTag getParent():由程序员调用。获取该标签的父标签对象。没有返回null

以下三个方法的共同特点:由服务器调用,在调用doTag之前就调完了
void setJspBody(JspFragment jspBody):由服务器调用。传入标签的内容
void setJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象
void setParent(JspTag parent):由服务器调用

4. 实现if else功能的标签(嵌套标签案例)

1.首先定义choose标签类,因为choose没有主体内容,所以可以直接输出getJspBody().invoke(null);
2. 定义一个变量flag记住otherwis是否执行
3. 定义when标签类,执行完后设置父标签为false
4. 获取父标签的变量如为true值执行标签体内容

tld文件配置
<tag>
	<name>choose</name>
	<tag-class>com.itheima.web.mytag.app1.MyChooseDemo2</tag-class>
	<body-content>scriptless</body-content>
</tag>
<tag>
<name>when</name>
<tag-class>com.itheima.web.mytag.app1.MyWhenDemo2</tag-class>
<body-content>tagdependent</body-content>
 	<attribute>
	<!-- 参数名 -->
		<name>test</name>
		<!-- 是必须的 -->
		<required>true</required>
		<!-- 支持表达式  rt:runtime   expr:expression  value  el   -->
		<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>
 <tag>
<name>otherwise</name>
<tag-class>com.itheima.web.mytag.app1.MyOtherWiseDemo2</tag-class>
<body-content>tagdependent</body-content>
</tag> 

5. 实现for功能的标签(重复执行主体内容)

private Object items;//用于接收集合
private Collection collection = new ArrayList();  //子接口List Set    Map不是它的子类  map.entrySet()可以将Map转成Set
private  String     var;//非常妙啊
public void setItems(Object items) {
	//要处理页面上传过来的集合
	if(items instanceof List){
		collection = (List)items;
	}else if(items instanceof Map){
		collection = ((Map)items).entrySet();
	}else if(items instanceof Set){
		collection = (Set)items;
	}else if(items.getClass().isArray()){
		//只要是数组就行,8个基本类型的数组,及Object[]
		int length = Array.getLength(items);//得到数组长度
		for (int i = 0; i < length; i++) {
			//取数组中的每个元素
			Object obj = Array.get(items, i);// 取第i个元素
			collection.add(obj);//将数组中的元素加入到集合中
		}
	}
	this.items = items;
}
public void setVar(String var) {
	this.var = var;
}
public void doTag() throws JspException, IOException {
	//遍历集合
	for(Object obj :collection){
		//遍历一个
		//2.因为页面上直接取值时,是从pageContext域中取值,那么现在就要让集合中的数据放入到pageContext
		PageContext pc = (PageContext) getJspContext();
		pc.setAttribute(var, obj);
		//3.执行主体内容
		getJspBody().invoke(null);
	}
}

tld标签配置
<tag>
    <name>forEach2</name>
	<tag-class>com.itheima.web.mytag.app1.MyForEach2Demo3</tag-class>
	<!-- 设置主体内容  empty不能放入主体内容  -->
	<body-content>scriptless</body-content>
	 <attribute>
	    <!-- 参数名 -->
            <name>items</name>
            <!-- 是必须的 -->
            <required>true</required>
            <!-- 支持表达式  rt:runtime   expr:expression  value  el   -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
	 <attribute>
	    <!-- 参数名 -->
            <name>var</name>
            <!-- 是必须的 -->
            <required>true</required>
            <!-- 支持表达式  rt:runtime   expr:expression  value  el   -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
</tag>

JSTL

1. 什么是JSTL

JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言
导入标签库需要使用taglib指令
<%@ taglib prefix="c" uri=" http://java.sun.com/jsp/jstl/core" %>

2. JSTL核心库

1. out和set(重点)
	1). out
	<c:out value=”${aaa}”/>	<==>	与${aaa}相同
	<c:out value="${a }" default="xxx" escapeXml="false" />
	当${a}不存在时,输出xxx字符串,当escapeXml为false,不会转换“<”、“>”
	2). set
	<jsp:useBean id="user" class="cn.itcast.domain.User"/>
	<c:set target="${user }" property="username" value="qdmmy6"/>
	<c:set target="${user }" property="password" value="123456"/>
	<c:out value="${user }" />
	给user的username属性赋值qdmmy6,给user的password属性赋值123456

2. remove
	<c:remove var="a" scope=”page”/>
	删除pageContext中name为a的数据

3. url
	<c:url value="/" var="a" scope="request"/>
	输出上下文路径:/day08_01/,把本该输出的结果赋给变量a,范围为request

4. if和choose(重点)
	if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行
	choose标签对应Java中的if/else if/else结构when标签的test为true时,会执行这个when的内容。当所有when标签的test都为false时,才会执行otherwise标签的内容

5. forEach(重点)
	forEach当前就是循环标签,var记住遍历的变量,items遍历的对象

	forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
?		count:int类型,当前以遍历元素的个数;
?		index:int类型,当前元素的下标;
?		first:boolean类型,是否为第一个元素;
?		last:boolean类型,是否为最后一个元素;
?		current:Object类型,表示当前项目

国际化

1. i18n和l10n全称

Internationalization :i18n国际化--------------> Localization :l10n(本地化)

2. 本地化

<%
	Locale locale = request.getLocale();
	////用什么资源文件取决于客户端的语言环境
	ResourceBundle rb = ResourceBundle.getBundle("com.itheima.day11i18n.message",locale);
	out.write(rb.getString("hello"));
%>
<!-- EL表达式取request,获取客户端语言环境 -->
<fmt:setLocale value="${pageContext.request.locale}"/>
<!-- 绑定资源文件 -->
<fmt:setBundle basename="com.itheima.day11i18n.message" var="mybundle"/>
<fmt:message bundle="${mybundle}" key="hello"></fmt:message>

3. 时间格式化

Date now = new Date();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL,Locale.US);
String s = df.format(now);
System.out.println(s);
System.out.println("--------------------");
String s1 = "Monday, January 6, 2014 4:44:48 PM CST";
Date d = df.parse(s1);
System.out.println(d);

标签进行日期国际化
<%
pageContext.setAttribute("now", new Date());
%>
<fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/><br/>
<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日"/><br/>

4. 数字格式化

int money = 10000;
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);
String s = nf.format(money);
System.out.println(s);

String s1 = "$10,000.00";
Long m = (Long)nf.parse(s1);
System.out.println(m);

<%
	pageContext.setAttribute("num", 10000);
%>
<fmt:formatNumber value="${num}" groupingUsed="true" type="currency"></fmt:formatNumber>
时间: 2024-10-25 02:01:27

JavaWeb之自定义标签&JSTL&国际化(九)的相关文章

利用数据库管理国际化资源配置以及自定义标签实现国际化效果

利用数据库管理国际化资源配置以及自定义标签实现国际化效果 对于国际化资源的管理一般采用.properties进行配置,对于资源信息的修改或新增国际化资源文件均需要重启服务才能生效,将包括国际化资源在内的系统信息存储在数据库中,并在启动服务的同时读取并纳入缓存,即可以实现系统配置信息的即时生效. 对于国际化资源的存储表结构如下: 基于国际化资源表建立国际化资源管理的增删改查模块,一经修改即更新缓存,同时利用自定义标签更新国际化效果.后端的国际化即是从缓存中读取资源,然后对应替换.以下自定义标签的国

12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service(ServletRequest,ServletResponse) destory() 1.2回话技术 cookie:浏览器端 (服务器需要浏览器保存少量的数据) 服务器创建对象:new Cookie(name,value) cookie.setMaxage(秒);  有效时间 cookie.setMaxage(0)  删除cookie cookie.setP

javaEE(6)_自定义标签&amp;JSTL标签(JSP Standard Tag Library)

一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现Tag接口的Java类(标签处理器类). •编写标签库描述符(tld)文件,在tld文件中对标签处理器类进行描述. 3.快速入门:使用标签输出客户机IP //java类 public class ViewPortTag extends TagSupport{ @Override public int

JavaWeb学习——自定义标签

自定义标签 一.自定义标签概述 使用标准JSP访问.操作JavaBean,是实现展现(HTML)与业务实现(Java代码)分离的第一步.然而,标准方法功能不够强大,以至于开发者无法仅仅使用它们开发应用,还要在JSP页面中使用Java代码. 介于JavaBean中解决展现与业务实现分离的方法的不完善,就产生了JSP1.1中的自定义标签.自定义标签提供了在JavaBean中所不能实现的便利.其中就包括,自定义标签允许访问JSP隐藏的对象及它们的属性. 尽管自定义标签能编写无脚本的JSP页面,但是JS

深入分析JavaWeb Item25 -- 自定义标签开发案例和打包自定义标签库

一.开发标签库案例 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java package me.gacl.web.simpletag; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import jav

javaweb框架--自定义标签与freemaker结合

http://blog.csdn.net/myfmyfmyfmyf/article/details/8960299 很有用但是不不知道怎么说,写个例子,总之方便多了,并且容易管理,重复利用强 1.自定一个类,实现 javax.servlet.jsp.tagext.Tag;(PageTag.java) 2.建立一个tld文件(myfTag.tld) 3.建立一个freemaker文件*.ftl(page.ftl) 4.建立jsp页面,导入标签(<%@taglib prefix="myf&qu

javaweb学习总结(二十三)——jsp自定义标签开发入门

一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 package me.gacl.web.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.jsp.JspException; 7 import

Javaweb自定义标签

项目中用到自定义的标签文件,但是却在web.xml中没有看到相关的标签配置,原来如果web应用使用servelet2.4以上的版本就不需要在web.xml中定义了,servelet会自动加载tld文件,有两种方式使用自动加载 1.打成jar包时,将tld文件放在META-INF文件夹下(参考standard,jar) 2.直接将自定义tld文件放在WEB-INF下(也可以放在WEB-INF子目录下). java web开发中,如何查看JSP和Servlet版本? 打开tomcat的lib 目录下

javaweb基础(23)_jsp自定义标签

一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 package me.gacl.web.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.jsp.JspException; 7 import