无论是从教学环境与教学质量上来说,我觉得别的地方都是不可比的,我也与通行业在别的学校培训的朋友一块聊天唠嗑,在聊天中我明显的感觉到,他的技术远不及我,真不是在吹,有很多技术我只要跟他说,要么就是不了解,要么就是根本没学过,差距很大的,而且在别的学校,学费很贵的,真是花了钱他都没学到东西啊,而我在咱们传智播客花的钱只是他的一半,但是学到的东西确实他的好几倍,这不是我特殊,而是我们班每个人都是一样的,这是传智播客的能力的证明,想学软件的就来传智播客吧,来了传智播客你的一生就会改变!!!!
讲讲今天老师给我们讲的知识吧,真正的知识
1、为什么要自定义标签 ?
在规范的JavaEE 企业级开发不建议在JSP中编写 Java代码 ,所以通过标签解析执行 ---- 调用一段java代码的执行
例如:<jsp:useBean> <jsp:setProperty> 、JSTL c:out c:if c:forEach 都是通过封装java代码实现开发的
因为企业业务需求是多种多样的,所以常见开源框架只能提供通用java代码功能,如果实现既定业务逻辑功能,所以需要自定义标签,
通过自定义标签 ---- 简化复杂的业务开发
2、如何进行自定义标签
步骤 :
1) 编写class 实现Tag 接口
2) 在tld标签库定义文件中 对编写标签类 进行描述
描述标签,需要通过tld标签描述文件 (注意:tld文件必须在WEB_INF目录下创建)
<tag>
<!-- 需要为标签起一个名字 -->
<name>showip</name>
<!-- 标签类 实现了Tag接口的子类,需要包名加类名-->
<tag-class>cn.itcast.mytag.IPTag</tag-class>
<!-- 配置tld时,每个标签必须配置 <bodyContent> 标签,用来描述标签体,有四种取值
JSP 从JSP1.1被使用,可以在标签体嵌入任何JSP代码
empty 标签体必须为空,不能含有任何内容
tagdepentend (不会常用) 标签体内容供服务器内部使用,而不是给页面显示
例如:
<sql:execute>
select * from user 这里标签体内容给服务器内部使用,而不是给用户显示
</sql:execute>
scriptless 从JSP2.0 主要用于,在标签体内不能含有 <%%>代码 >-->
<body-content>JSP</body-content>
</tag>
3) 在JSP页面内通过标签名称空间 URI,去引用一个标签库描述文件 (使用自定义标签)
分析标签类执行过程:
IPTag方法,标签对象创建... ----- 构造函数(只执行一次)
setPageContext 获得pageContext对象
setParent 获得父标签
doStartTag 标签执行开始
doEndTag 标签执行结束
release ------ 在服务器关闭时调用 用来释放资源
标签分为两种标签:
常用标签的四个功能:
1、控制JSP中一部分内容是否执行 ---- 效果类似 c:if
2、控制标签后 JSP剩余页面是否执行
3、控制内容重复执行 ------ 效果类似 c:forEach
4、控制内容转换输出 ------ 效果类型 c:out 转义HTML、将内容转换为大写/小写输出
(1)传统标签:
JSP从1.1开始支持自定义标签,并提供Tag接口,通过实现该接口完成标签自定义 (实现Tag接口标签 被称为传统标签)
如果编写传统标签,存在三个接口 Tag 、IterationTag 、BodyTag , 一般不去实现这三个接口而去继承它的实现子类
TagSupport BodyTagSupport
传统标签的开发
功能一 :控制页面内部一部分代码是否执行
在doStartTag 方法中 返回
EVAL_BODY_INCLUDE 执行标签内容
SKIP_BODY 跳过标签内容
功能二 :控制标签后页面是否继续执行
在doEndTag 方法返回
EVAL_PAGE 继续执行剩余页面
SKIP_PAGE 不继续执行
功能三:控制页面部分内容重复执行
在IterationTag 中提供 EVAL_BODY_AGAIN (再次执行标签体)
在新提供doAfterBody返回
EVAL_BODY_AGAIN 重复执行标签体
SKIP_BODY 跳过标签体
功能四:标签体内容修改输出 (HTML转义、大写、小写)
在BodyTag 接口中 提供 EVAL_BODY_BUFFERED (用于将标签体内容输出到缓存中 )
功能五:自定义带有属性的标签
例如:<mytag:demo5 times="10"></mytag:demo5> 将标签体循环 times次数
额外的两个步骤
1、在标签类 开发属性对应setter方法
<mytag:demo5 times="10" >
Hello Kitty!
</mytag:demo5>
需要在标签类中提供 setTimes 方法
2、在tld描述文件中 描述该属性
<tag>
<name>demo5</name>
<tag-class>cn.itcast.mytag.Demo5Tag</tag-class>
<body-content>JSP</body-content>
<!-- 描述属性 -->
<attribute>
<name>times</name>
<!-- 规定属性是否必须 -->
<required>true</required>
<!-- 规定属性是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
<!-- 属性类型 -->
<type>int</type>
</attribute>
</tag>
(2)简单标签:
JSP从2.0之后,为了简化标签的开发,提供JspTag 接口,并且让Tag接口继承 JspTag, 同时提供另一组接口 SimpleTag
实现了SimpleTag的标签 被称为简单标签
简单标签库开发常用功能 ,实现SimpleTag接口标签类 (SimpleTag JSP2.0之后为了简化标签开发提供的 )
** 编写简单标签类 只需要继承 SimpleTagSupport 类
setJspContext 传入pageContext对象
setParent 传入父标签对象
setJspBody 传入标签体缓存对象 (封装了标签体内容)
doTag (执行标签,在该方法中编写标签代码逻辑)
在setJspBody方法中传入对象 JspFragment ,该对象封装了 标签体内容,控制标签体内容输出
***** 最重要方法 invoke(Writer out) 意义将标签体内容输出到指定字符输出流中
注意:在 简单标签库中 <bodyContent> 不能写JSP,而必须写scriptless
使用简单标签开发和传统标签一样的四个常见功能
功能一:控制页面部分代码是否执行 ----- jspFragment.invoke(传入out对象);
什么都不写,页面上不会执行标签体
如果希望执行:
getJspBody().invoke(getJspContext().getOut()); // 将内容输出到页面
简化为
getJspBody().invoke(null); 如果输出流为null,采用默认输出流 out对象
功能二:控制标签后JSP页面是否继续执行
什么都不写就会继续执行
如果不想继续执行 throw new SkipPageException();
功能三:重复执行标签体
for (int i = 0; i < 5; i++) {
getJspBody().invoke(null);
}
功能四:修改标签体内容输出 转换为大写
// 获得缓存中标签体内容
StringWriter stringWriter = new StringWriter();
getJspBody().invoke(stringWriter);// 将标签体内容写入stringwriter
String content = stringWriter.toString();
// 转换为大写
content = content.toUpperCase();
// 输出到页面 需要out对象
this.getJspContext().getOut().print(content);
软件国际化:同一套软件,提供多种语言展示界面,根据来访者国家和地区显示不同语言界面
国家化全称 internationalization 简化成为 i18n
设置操作系统国家和语言 --- 在控制面板设置 区域和语言选项
软件国际化:固定文本信息国际化、货币(数字)、日期
一、固定文本信息国际化
将软件中使用文本信息,保存properties属性文件中(key=value)
为不同国家编写不同properties属性文件,许多国家properties文件 组成一个资源包
ResourceBundle 会根据来访者国家不同,而自动读取不同properties文件
资源包中所有properties文件必须具有相同基名basename, 在basename后可以通过_拼接国家和语言信息 例如:basename_语言_国家.properties
myproperties_zh.properties 中文的配置文件 这里zh就是语言
myproperties_en.properties 英文的配置文件 这里en就是语言
myproperties_zh_CN.properties 中国中文配置文件 这里zh语言 CN国家
myproperties.properties 没有国家和语言信息,默认资源文件,如果来访者的国家和语言的资源文件没有找到,就会读取默认资源文件
创建资源包,必须位于src目录下,在src下创建中国资源文件、美国资源文件,默认资源文件
properties文件默认无法直接保存中文,需要jdk/bin/native2ascii.exe 进行编码转换 ,将中文转换 unicode编码 '\uxxxx'
*** 批量转换 C:\>native2ascii a.properties b.properties
使用ResourceBundle 读取资源文件
1、加载src下properties文件
ResourceBundle bundle = ResourceBundle.getBundle(basename);
2、读取properties文件中内容
String value = bundle.getString(key);
* 也可以在ResourceBundle.getBundle时 传入一个代表国家和地区Locale对象
* ResourceBundle bundle = ResourceBundle.getBundle("info", Locale.CHINA); 指定读取中国配置文件
优先级:指定Locale > 系统默认区域和语言 > 资源包默认的