传智播客---自定义标签与软件国际化

     无论是从教学环境与教学质量上来说,我觉得别的地方都是不可比的,我也与通行业在别的学校培训的朋友一块聊天唠嗑,在聊天中我明显的感觉到,他的技术远不及我,真不是在吹,有很多技术我只要跟他说,要么就是不了解,要么就是根本没学过,差距很大的,而且在别的学校,学费很贵的,真是花了钱他都没学到东西啊,而我在咱们传智播客花的钱只是他的一半,但是学到的东西确实他的好几倍,这不是我特殊,而是我们班每个人都是一样的,这是传智播客的能力的证明,想学软件的就来传智播客吧,来了传智播客你的一生就会改变!!!!

讲讲今天老师给我们讲的知识吧,真正的知识

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 > 系统默认区域和语言 > 资源包默认的

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值