HTMLFilter位于 包cn.itcast.fn
package cn.itcast.fn;
public class HTMLFilter {
/*想要成为EL函数,需完成以下两个步骤
* 1,写个类,方法必须是静态的!
* 2,在WEB-INF下建一个tld文件中描一把(抄头抄屁股)(方法签名)
* 3,在jsp页面中用taglib指令导入uri*/
public static String filter(String message) {
if (message == null)
return (null);
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuffer result = new StringBuffer(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
}
}
MyEL位于 包cn.itcast.fn
package cn.itcast.fn;
public class MyEL {
/*自定义EL函数,虽无法代替有关web有关的java代码
* 1,静态方法
* 2,tld文件描一把
* 3,jsp中taglib导入*/
public static String add(String s1,String s2){
return s1+s2;
}
}
mypro.properties位于 包cn.itcast.resource
username=\u7528\u6237\u540D
password=\u5BC6\u7801
submit=\u63D0\u4EA4
context=\u60A8\u4E8E{0,date,full}\u7684{0,time,long},\u6210\u529F\u8D2D\u4E70\u4E86\u4E00\u672C\u7EA2\u697C\u68A6(\u7EA2\u7814\u6240\u6821\u6CE8\u672C\u7B2C\u4E8C\u7248-\u4EBA\u6C11\u6587\u5B66\u51FA\u7248\u793E2005),\u4EF7\u683C\u662F{1,number,currency}
mypro_en.properties位于 包 cn.itcast.resource
username=username
password=password
submit=submit
context={0,date,full}{0,time,long},price is {1,number,currency}
mypro_zh.properties位于 包cn.itcast.resource
username=\u7528\u6237\u540D
password=\u5BC6\u7801
submit=\u63D0\u4EA4
context=\u60A8\u4E8E{0,date,full}\u7684{0,time,long},\u6210\u529F\u8D2D\u4E70\u4E86\u4E00\u672C\u7EA2\u697C\u68A6(\u7EA2\u7814\u6240\u6821\u6CE8\u672C\u7B2C\u4E8C\u7248-\u4EBA\u6C11\u6587\u5B66\u51FA\u7248\u793E2005),\u4EF7\u683C\u662F{1,number,currency}
igg.tld位于WebRoot/WEB-INF
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/expressionlanguagefunction</uri>
<function>
<name>filter</name>
<function-class>cn.itcast.fn.HTMLFilter</function-class>
<function-signature>java.lang.String filter( java.lang.String )</function-signature>
</function>
<function>
<name>add</name>
<function-class>cn.itcast.fn.MyEL</function-class>
<function-signature>java.lang.String add( java.lang.String , java.lang.String)</function-signature>
</function>
</taglib>
EL表达式1~4
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="cn.itcast.domain.Person" %>
<%@ page import="cn.itcast.domain.Address" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>el表达式获取数据</title>
</head>
<body>
<br/>--------获取域中存的数据-----------------<br/>
<%
String data = "勇晴雯病补雀金裘";
request.setAttribute("data",data);
%>
${data} <%--pageContext.findAttribute("data")--%>
<%
Object obj=pageContext.findAttribute("data");
out.write(obj.toString());
%>
<br/>--------获取域中存的javabean的数据-----------------<br/>
<%
Person p = new Person();
p.setName("小强");
request.setAttribute("p",p);
%>
${p.name }
<br/>--------获取域中存的javabean中的javabean的数据-----------------<br/>
<%
Person p1 = new Person();
Address a = new Address();
a.setCity("广州");
p1.setAddress(a);
request.setAttribute("p1",p1);
%>
${p1.address.city }
<br/>--------获取域中存的list集合中的数据-----------------<br/>
<%
List list = new ArrayList();
list.add(new Person("林黛玉"));
list.add(new Person("史湘云"));
list.add(new Person("薛宝钗"));
request.setAttribute("list",list);
%>
${list['0'].name }
${list["1"].name }
${list['2'].name }
<br/>--------获取域中map集合中的数据-----------------<br/>
<%
Map map = new HashMap();
map.put("1",new Person("林黛玉"));
map.put("2",new Person("史湘云"));
map.put("3",new Person("薛宝钗"));
map.put("4",new Person("妙玉"));
map.put("5",new Person("探春"));
request.setAttribute("map",map);
%>
${map['1'].name }
${map['2'].name }
${map["3"].name }
<br/>--------其它几个常用的el表达式-----------------<br/>
${pageContext.request.contextPath }
<a href="${pageContext.request.contextPath }/index.jsp">点点</a>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>el运算符示例</title>
</head>
<body>
<%
request.setAttribute("username","黛玉");
request.setAttribute("password","12345");
%>
${username=='黛玉' && password=='123' }
${username=='黛玉' && password=='12345' }
<br/>--------empty运算符-------------<br/>
<%
request.setAttribute("list1",null);
request.setAttribute("list2",new ArrayList());
%>
${empty(list1) }
${empty(list2) }
<br/>--------二元运算符-------------<br/>
${user!=null ? user.username : "游客甲" }
${user!=null ? user.username : '游客乙' }
<br/>--------二元运算符(数据回显)-------------<br/>
<%
request.setAttribute("sex","girl");
%>
<input type="radio" name="sex" value="boy" ${sex=='boy'?'checked':'' }>男
<input type="radio" name="sex" vlaue="girl" ${sex=='girl'?'checked':'' }>女
<br/>--------对应于jsp页面pageContext对象-------------<br/>
${pageContext}
<br/>---------使用el隐式对象访问指定的域-----------<br/>
<%
pageContext.setAttribute("name","林黛玉");
%>
(会先判断name是不是11个隐式对象之一,如果不是再以它为关键字依次到四个域里去找)
四个域里面找:${name }
指定域里面找:${pageScope.name }
${sessionScope.user!=null }
${sessionScope.user==null }
<br/>---------获取保存了所有请求参数的Map对象-----------<br/>
如果在地址栏后面加上?name=林黛玉
这个是隐式对象中的重点,做数据回显时经常用!
${param.name }
${paramValues.name[0] }
${paramValues.name[1] }
<br/>---------获取请求头-----------<br/>
${header['Accept-Language'] }
<br/>--------获取保存所有cookie的Map集合中关键字为JSESSIONID的cookie的名称和值-----------<br/>
${cookie.JSESSIONID.name }<br/>
${cookie.JSESSIONID.value }
${initParam.p_name }
${initParam['p_name'] }
${initParam["p_name"] }
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/igg.tld" prefix="igg" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>el函数示例</title>
</head>
<body>
/*想要成为EL函数,需完成以下两个步骤
* 1,写个类,方法必须是静态的!
* 2,在WEB-INF下建一个tld文件中描一把(抄头抄屁股)(方法签名)
* 3,在jsp页面中用taglib指令导入uri*/
<br/>---------使用el函数只能移除与web对象无关的代码-----------<br/>
${igg:filter("<a href='http://www.baidu.com'>百度</a>") }
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="cn.itcast.domain.User" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/WEB-INF/igg.tld" prefix="igg" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>el函数示例</title>
</head>
<body>
aa<br/>---------使用el函数只能移除与web对象无关的代码-----------<br/>
${fn:toLowerCase("ABCDE") }
<br/>---------sun公司el函数-----------<br/>
${fn:toLowerCase("DA XIE TO XIAO XIE") }
${fn:toUpperCase("xiao xie 2 da xie") }
---${fn:trim(" ab c") }---
${fn:length(null) }
${fn:length("") }
${fn:length("0123456789") }
<br/>
<%
List list=new ArrayList();
list.add("埋香冢飞燕泣残红");
list.add("憨湘云醉眠芍药");
list.add("凸碧堂品笛感凄清");
list.add("凹晶馆联诗悲寂寞");
list.add("贾迎春误嫁中山狼");
request.setAttribute("list",list);
%>
${fn:length(list) }
<c:forEach var="i" begin="0" end="${fn:length(list)-1}" >
${i } : ${list[i] }
</c:forEach>
${fn:split("林黛玉|薛宝钗|史湘云","|")[0] }
${fn:split("林黛玉|薛宝钗|史湘云","|")[1] }
${fn:split("林黛玉|薛宝钗|史湘云","|")[2] }
<%
String[] arr={"www","baidu","com"};
request.setAttribute("arr",arr);
%>
${fn:join(arr,".") }
综合一下:
${fn:join(fn:split("林黛玉|薛宝钗|史湘云","|"),"...") }
${fn:indexOf("0123456789","5") }
${fn:indexOf("0123456789","z") }
${fn:indexOf("0123456789","") }
fn:contains大小写敏感
${fn:contains("www.baidu.com","baidu") }
${fn:contains("www.baidu.com","B") }
${fn:contains("www.baidu.com","") }
${fn:contains("www.baidu.com","baidu") }
等价于
${fn:indexOf("www.baidu.com","baidu")!=-1 }
${fn:containsIgnoreCase("www.baidu.com","B") }
<br/>---------应用: el函数回显数据-----------<br/>
<%
String[] likes={"sing","dance","table-tennis"};
// String[] likes=new String[]{"sing","dance","table-tennis"};
request.setAttribute("likes",likes);
%>
${fn:join(likes,',') }
${fn:contains(fn:join(likes,','),"sing") }
${fn:contains(fn:join(likes,','),"sing")?'checked':' ' }
<input type="checkbox" name="likes" value="sing" ${fn:contains(fn:join(likes,','),"sing")?'checked':' ' }>唱歌
<input type="checkbox" name="likes" value="dance" ${fn:contains(fn:join(likes,','),"dance")?'checked':' ' }>跳舞
<input type="checkbox" name="likes" value="table-tennis" ${fn:contains(fn:join(likes,','),"table-tennis")?'checked':' ' }>乒乓球
<input type="checkbox" name="likes" value="basketball" ${fn:contains(fn:join(likes,','),"basketball")?'checked':' ' }>篮球
<input type="checkbox" name="likes" value="football" ${fn:contains(fn:join(likes,','),"football")?'checked':' ' }>足球
<br/>---------应用: el函数回显数据-----------<br/>
${fn:startsWith("a字符串","a") }
${fn:startsWith("字符串","") }
${fn:endsWith("字符串z","z") }
${fn:replace("old_Stirng","old","new") }
注意fn:substring全是小写,前开后装闭
${fn:substring("2 is head 4 is end ",2,4) }
${fn:substringAfter("abcde","c") }
${fn:substringBefore("abcde","c") }
${fn:escapeXml("<a href='http://www.baidu.com'>百度</a>") }
<%
request.setAttribute("user",new User("张三"));
%>
${igg:add("welcome :","aaa") }
${user!=null?user.name:' ' }
</body>
</html>
i18n 国际化 ( internationalization )
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>i18n国际化</title>
</head>
<body>
<%
//ResourceBundle rb=ResourceBundle.getBundle("cn.itcast.resource.mypro",Locale.CHINESE);
ResourceBundle rb=ResourceBundle.getBundle("cn.itcast.resource.mypro",request.getLocale());
%>
<form action="">
<%=rb.getString("username") %><input type="text" name="username"/>
<%=rb.getString("password") %><input type="text" name="password"/>
<input type="submit" value="<%=rb.getString("submit") %>"/>
<%=rb.getString("context") %>
</form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.text.DateFormat"%>
<%@page import="java.text.NumberFormat"%>
<%@page import="java.text.MessageFormat"%>
<%
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>
<title>i18n国际化</title>
</head>
<body>
<%
//ResourceBundle rb=ResourceBundle.getBundle("cn.itcast.resource.mypro",Locale.CHINESE);
//ResourceBundle rb=ResourceBundle.getBundle("cn.itcast.resource.mypro",request.getLocale());
%>
<a href="${pageContext.request.contextPath }/login_i18n.jsp?language=zh">中文</a>
<a href="${pageContext.request.contextPath }/login_i18n.jsp?language=en">english</a>
<%
String language=request.getParameter("language");
if(language==null || "".equals(language)){
//第一次访问时,默认给中文页面
language="zh";
}
Locale loc=new Locale(language);
ResourceBundle rb=ResourceBundle.getBundle("cn.itcast.resource.mypro",loc);
%>
<form action="${pageContext.request.contextPath }/login_i18n.jsp">
<%=rb.getString("username") %><input type="text" name="username"/>
<%=rb.getString("password") %><input type="text" name="password"/>
<input type="submit" value="<%=rb.getString("submit") %>"/>
</form>
<br/>--------------下面是静态数据国际化------------------<br/>
<%
Date date=new Date();
DateFormat df=DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA);
out.write("date_SHORT_"+df.format(date)+"<br/>");
df=DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA);
out.write("date_MEDIUM_"+df.format(date)+"<br/>");
df=DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA);
out.write("date_LONG_"+df.format(date)+"<br/>");
df=DateFormat.getDateInstance(DateFormat.FULL,Locale.CHINA);
out.write("date_FULL_"+df.format(date)+"<br/>");
//date_SHORT_13-12-9
//date_MEDIUM_2013-12-9
//date_LONG_2013年12月9日
//date_FULL_2013年12月9日 星期一
df=DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA);
out.write("time_SHORT_"+df.format(date)+"<br/>");
df=DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA);
out.write("time_MEDIUM_"+df.format(date)+"<br/>");
df=DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA);
out.write("time_LONG_"+df.format(date)+"<br/>");
df=DateFormat.getTimeInstance(DateFormat.FULL,Locale.CHINA);
out.write("time_FULL_"+df.format(date)+"<br/>");
//time_SHORT_上午1:50
//time_MEDIUM_1:50:26
//time_LONG_上午01时50分26秒
//time_FULL_上午01时50分26秒 CST
%>
字符串解析成对象,注意要对应!DateFormat不是线程安全的!
每条线程都应该有自己的DateFormat实例对象!
<%
String str="2013年12月9日 星期一 上午01时50分26秒";
DateFormat df_1=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.LONG,Locale.CHINA);
Date date_1=df_1.parse(str);
out.write(date_1.toLocaleString());
%>
<%
int price=67;
NumberFormat nf=NumberFormat.getCurrencyInstance(Locale.CHINA);
out.write(nf.format(price));
//反向解析----字符串解析成对象
String str_1="¥18.67";
Number number=nf.parse(str_1);
out.write(number.doubleValue()+"");
//百分比解析(小数点第3位将四舍五入)
double d=0.1553;
nf=NumberFormat.getPercentInstance(Locale.CHINA);
out.write(nf.format(d));
%>
<%
//动态文本:占位符+参数数组
String pattern="时间是{0},日期是{1}";
MessageFormat mf=new MessageFormat(pattern,Locale.CHINA);
Object[] obj={"上午01时50分26秒","2013年12月9日 星期一"};
String result=mf.format(obj);
out.write(result);
//动态文本2:占位符的3种书写格式
String pattern__1="<br/>您于{0,date,full}的{0,time,long},成功购买了一本红楼梦(红研所校注本第二版-人民文学出版社2005),价格是{1,number,currency}";
MessageFormat mf__1=new MessageFormat(pattern__1,Locale.CHINA);
String str__1="2013年12月9日 星期一 上午09时50分26秒";
Date date__1=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.LONG,Locale.CHINA).parse(str__1);
Object[] obj__1={date__1,new Double(59.70)};
String result__1=mf__1.format(obj__1);
out.write(result__1+"<hr/>");
//动态文本3:模式字符串有时候是在框架的properties文件当中
//前面两步是这样。。。后面完全一致!
ResourceBundle rb__2=ResourceBundle.getBundle("cn.itcast.resource.mypro",Locale.CHINA);
String pattern__2=rb__2.getString("context");
MessageFormat mf__2=new MessageFormat(pattern__2,Locale.CHINA);
String str__2="2013年12月9日 星期一 上午09时50分26秒";
Date date__2=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.LONG,Locale.CHINA).parse(str__2);
Object[] obj__2={date__2,new Double(59.70)};
String result__2=mf__2.format(obj__2);
out.write(result__2);
%>
</body>
</html>