Day12
一、EL表达式语言
1.1.EL表达式简介
package cn.itcast.domain; import java.util.Date; public class Person { private String name = "aaa"; private boolean sex; private int age; private Date birthday; private Address address; public Person() { super(); // TODO Auto-generated constructor stub } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSex() { //getSex() return sex; } public void setSex(boolean sex) { this.sex = sex; } }
package cn.itcast.domain; public class Address { private String city; public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
<%@ 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/>-----------------el表达式可以很方便获取各个域中的属性----------------------<br/> <% request.setAttribute("data","xxx"); %> ${data } <!-- pageContext.findAttribute("data") --> <br/>-----------------el表达式可以很方便获取bean中的数据----------------------<br/> <% Person p = new Person(); p.setName("aaaaaaaaaaaaaaaaaa"); request.setAttribute("person",p); %> ${person.name } <br/>-----------------el表达式可以很方便获取bean中bean中。。。。。。。。中的属性----------------------<br/> <% Person p1 = new Person(); p1.setName("aaaaaaaaaaaaaaaaaa"); Address address = new Address(); address.setCity("北京"); p1.setAddress(address); request.setAttribute("person",p1); %> ${person.address.city } <br/>-----------------el表达式可以很方便获取Collection类型集合中的数据----------------------<br/> <% List list = new ArrayList(); list.add(new Person("aaa",12)); list.add(new Person("bbb",13)); list.add(new Person("ccc",14)); request.setAttribute("list",list); %> ${list["1"].name } ${list["1"].age } <br/>-----------------el表达式可以很方便获取map类型集合中的数据----------------------<br/> <% Map map = new HashMap(); map.put("aa",new Person("aaa",12)); map.put("bb",new Person("bbb",12)); map.put("11",new Person("ccc",12)); request.setAttribute("map",map); %> ${map.bb.name } ${map["11"].name } ${map[11].name } </body> </html>
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
EL表达式支持三种运算,简单的数字运算,逻辑运算,关系运算,除此之外还支持empty运算符,二元表达式以及[]和.运算符
语法:${运算表达式},EL表达式支持如下运算符:
(2.1)逻辑运算符

(2.2)关系运算符

(2.4)二元表达式:${user!=null?user.name : “”} ,很好用!!!
(2.5)[ ] 和 . 号运算符(用于取数据用的,一般用.,只有在.号运算符不行的时候用[],比如User.name,list["1"].name)
package cn.itcast.domain; public class User { private String username; private String gender; private String likes[]; public String[] getLikes() { return likes; } public void setLikes(String[] likes) { this.likes = likes; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="cn.itcast.domain.User"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>el表达式执行运算</title> </head> <body> <!-- EL表达式中支持三种运算,简单的数字运算,逻辑运算,关系运算 --> ${1+1 } ${10*365*24*60 } ${user==null } ${username=="aaa" && password=="123" } <br/>-----------------empty运算符可以检测集合、数组是否为空或null--------------------------<br/> <% List list = new ArrayList(); request.setAttribute("list",list); List list1 = null; request.setAttribute("list1",list1); %> ${empty(list) } ${empty(list1) } <br/>-----------------二元运算符--------------------------<br/> <% User user = new User(); user.setUsername("aaa"); session.setAttribute("user",user); %> ${user==null?'请先登陆 ':user.username } <!-- EL表达式不能嵌套 --> <br/>-----------------二元运算符用作数据回显--------------------------<br/> <!-- 从数据库中取出原有数据显示在页面上的过程叫做数据回显 --> <% user = new User(); user.setGender("female"); user.setUsername("aaa"); request.setAttribute("user",user); %> <input type="radio" name="gender" value="male" ${user.gender=='male'?'checked':'' }>男 <input type="radio" name="gender" value="female" ${user.gender=='female'?'checked':'' }>女 <br/>-----------------二元运算符用作数据回显--------------------------<br/> <!-- 从数据库中取出原有数据显示在页面上的过程叫做数据回显 --> <% user = new User(); user.setLikes(new String[]{"唱歌","足球"}); request.setAttribute("user",user); %> <input type="checkbox" name="like" value="唱歌" checked>唱歌 <!-- 此处需要EL函数配合二元运算才能解决,学完EL函数之后就在解决这个问题 --> <input type="checkbox" name="like" value="跳舞">跳舞 <input type="checkbox" name="like" value="蓝球">蓝球 <input type="checkbox" name="like" value="足球" checked>足球 </body> </html>
(3)获取web开发常用对象


<%@ 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> ${pageContext.request.contextPath } <!--在EL表达式执行的时候首先判断这个标示符是不是11个隐式对象中的一个,如果是的话就将这个隐式对象传递给你--> <!-- ${request.contextPath } 这种写法是拿到的就不是pageContext中的request --> ${user } <!-- pageContext.findAttribute("user") --> <!-- 以前经常这么说是有道理的 --> ${pageContext} <!-- 这里pageContext传递给你就表示将JSP种的8大隐式对象传递给你 --> <br/>----------------------<br/> <% pageContext.setAttribute("aa","bb"); //map("aa","bb") pageContext中保存数据实际都存在pageScope的map中 %> ${pageScope.aa } <!-- pageScope代表page域中用于保存属性的Map对象 ,这个是从指定的page域中去找aa的值--> ${aa } <!-- 这个是从四个域中去找aa的值 --> ${sessionScope.user!=null } <!-- sessionScope代表session域中用于保存属性的Map对象,检测session域中的user就更加严谨了,从而避免其它域中的user干扰,这里可以用于判断用户是否登录 --> <!-- requestScope 代表request域中用于保存属性的Map对象 applicationScope 代表application域中用于保存属性的Map对象,application域代表sevletContext --> <br/>----------param隐式对象,用于获取请求参数(数据回显)------------<br/> <!-- ${param} 用于保存请求参数的map集合,就是地址栏中的数据 ,这个超级好用,以前在注册表单失败了要做数据回显要用到javabean来存储表单数据,现在可以直接在这个隐式对象中取数据了,方便多了--> //http://localhost:8080/day12/3.jsp?name=aaa&name=bbb ${param.name } <!-- paramValues表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] 这个隐式对象保存了多个请求参数 --> ${paramValues.name[0] } ${paramValues.name[1] } <br/>----------用于获取请求头的el隐式对象------------<br/> <!-- header表示一个保存了所有http请求头字段的Map对象,请求头也保存在request--> ${header.Accept} <!-- 获取Accept请求头 --> ${header["Accept-Language"] } <!-- 获取Accept-Language请求头时由于有的特殊符号-,说以要用[]获取 --> <!-- headerValues,表示获取多个请求消息头,保存到数组中 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] --> <br/>----------用于获取cookie的el隐式对象------------<br/> <!-- cookie表示一个保存了所有cookie的Map对象 --> ${cookie} <!-- 这是一个map --> ${cookie.JSESSIONID.name } ${cookie.JSESSIONID.value } <!-- 获取cookie中的JSESSIONID名称和值 --> <br/>----------用于获取web应用初始化参数的el隐式对象------------<br/> ${initParam.xxx } <!-- initParam用于保存sevletcontext里面用来保存初始化参数的 map集合 ,也就是保存web.xml文件中的数据--> </body> </html>
(4)调用Java方法
package cn.itcast.web.el; import java.util.List; public class ElUtils { 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()); } public static String join(String s1,String s2){ return s1+s2; } public static double[] a(String s1,List list,int arr[],int j,Integer k){ System.out.println("haha"); return null; } }
package cn.itcast.web.el; import java.util.List; public class ElUtils { 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()); } public static String join(String s1,String s2){ return s1+s2; } public static double[] a(String s1,List list,int arr[],int j,Integer k){ System.out.println("haha"); return null; } }
<?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"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>/itcast</uri> <function> <name>filter</name> <function-class>cn.itcast.web.el.ElUtils</function-class> <!-- 方法签名 --> <function-signature>java.lang.String filter( java.lang.String )</function-signature> </function> <function> <name>join</name> <function-class>cn.itcast.web.el.ElUtils</function-class> <!-- 方法签名 --> <function-signature>java.lang.String join( java.lang.String,java.lang.String )</function-signature> </function> <function> <name>a</name> <function-class>cn.itcast.web.el.ElUtils</function-class> <!-- 方法签名 --><!--EL函数比较复制的时候该如何去描述 --> <function-signature>double[] a(java.lang.String,java.util.List,int[],int,java.lang.Integer)</function-signature> </function> </taglib>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="cn.itcast.domain.User"%> <%@taglib uri="/itcast" prefix="itcast" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>el函数</title> </head> <body> ${itcast:filter('<a href=""></a>') } <br/> <% User user = new User(); user.setUsername("小王"); //session.setAttribute("user",user); %> ${user==null?'请先登陆':itcast:join('欢迎您:',user.username) } <br/> <%--EL函数比较复制的时候该如何去描述 --%> ${itcast:a("11",null,null,0,9) } <%-- EL函数也可以移除JSP页面中的java代码, 就相当于将java代码写在java中,用EL函数调用就可以 但是EL函数只能移除与web开发无关的代码,比如System.out.println("haha"); 但像request.getParameter("haha")这种与web开发有关的代码就不能移除,这种标签可以移动到自定义标签里面去 因为服务器在调用自定义标签时会将pageContext传递进去 --%> </body> </html>
(1)升级成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>

<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="cn.itcast.domain.User"%> <%@taglib uri="/itcast" prefix="itcast" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>el函数</title> </head> <body> ${itcast:filter('<a href=""></a>') } <br/> <% User user = new User(); user.setUsername("小王"); //session.setAttribute("user",user); %> ${user==null?'请先登陆':itcast:join('欢迎您:',user.username) } <br/> <%--EL函数比较复制的时候该如何去描述 --%> ${itcast:a("11",null,null,0,9) } <%-- EL函数也可以移除JSP页面中的java代码, 就相当于将java代码写在java中,用EL函数调用就可以 但是EL函数只能移除与web开发无关的代码,比如System.out.println("haha"); 但像request.getParameter("haha")这种与web开发有关的代码就不能移除,这种标签可以移动到自定义标签里面去 因为服务器在调用自定义标签时会将pageContext传递进去 --%> </body> </html>
三、JSTL标签库


(2)<c:set>标签

(3)<c:remove>标签
其语法格式如下:
<c:remove var="varName" [scope="{page|request|session|application}"] />
(4)<c:catch>标签




(7)<c:param>标签
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面

(9)<c:redirect>标签

(11)fortokens也是用来迭代的,主要迭代字符串
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="cn.itcast.domain.User"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>jstl标签库</title> </head> <body> <br/>------------------c:out标签-------------------<br/> <c:out value="<a href=''></a>" escapeXml="true"/> <!-- 转移HTML标签,将HTML标签源码输出 --> <c:out value="${user.username}" escapeXml="true" default="数据找不到"/> <!-- 如果找不到用户名则会提示数据找不到 --> <br/>------------------c:set标签操作域-------------------<br/> <c:set var="data" value="xxxx" scope="application"></c:set> ${data } <br/>------------------c:set标签操作map-------------------<br/> <% Map map = new HashMap(); request.setAttribute("map",map); %> <c:set property="data" value="yyyy" target="${map}"></c:set> ${map.data } <br/>------------------c:set标签操作 bean-------------------<br/> <% User user = new User(); request.setAttribute("user",user); %> <c:set property="username" value="uuuu" target="${user}"></c:set> ${requestScope.user.username } <br/>------------------c:if-------------------<br/> <c:if var="xx" test="${user11==null}" scope="page"> </c:if> ${xx } <!-- 结果为true,表示将test的值以xx名字存到page域中 --> <br/>------------------c:foreach 在页面产生数字,用于做分页-------------------<br/> <c:forEach var="i" begin="1" end="20"> <!-- 在JSTL中只要看见var属性,就表示将某个值存到域中,如果没有指定域则默认域就是pageContext域中 --> ${i } </c:forEach> <br/>------------------c:foreach 生成间色表格-------------------<br/> <% map = new HashMap(); map.put("aa","111"); map.put("bb","222"); map.put("cc","333"); map.put("dd","444"); map.put("ee","555"); request.setAttribute("map",map); %> <style> .even{background-color:#FFCCFF } .odd{background-color:#FFCC66 } tr:hover{background-color:#FF6666} <%-- 这个标签只有在xhtml的申明下才会有用,在html的申明下是无用的,xhtml的声明可以在TomCat的首页中的源码中找到--%> </style> <table border="1" width="200px"> <c:forEach var="entry" items="${map}" varStatus="status"> <%--forEach在迭代数据的时候会把当前迭代的信息保存到对象中去,以关键字status存储到pageContext域中 --%> <tr class="${status.count%2==0?'even':'odd' }"> <%--status得到用于保存迭代信息的对象,然后它有一个属性count表示当前保存的是第几次迭代 --%> <%--上面这句代码的意思就是如果迭代的是偶数则给tr标签给一个class='even',如果迭代的是奇数的话九个tr标签给一个class='odd',这样就可以控制间色的问题了 --%> <td>${entry.key }</td> <td>${entry.value }</td> </tr> </c:forEach> </table> <br/>------------------c:url 重要!!!-------------------<br/> <c:url var="url" value="/servlet"> <c:param name="name" value="中国"/> <!-- 会自定编码,将汉字转化 --> <c:param name="password" value="123"/> <!-- 为url附加参数 --> </c:url> <a href="${url }">点点</a> <br/>------------------fortokens标签也是用于迭代的,主要用于迭代字符串 -------------------<br/> <% String s = "a,b,c,d,e"; request.setAttribute("s",s); %> <c:forTokens var="ch" items="${s}" delims=","> ${ch } </c:forTokens> </body> </html>
四、JavaWEB开发-国际化
固定文本元素的国际化
属性文件是不能保存中文的

native2asicii工具

mypreoperties_zh.properties
file=\u4E2D\u56FD username=\u7528\u6237\u540D password=\u5BC6\u7801 submit=\u63D0\u4EA4 currenttime=\u5F53\u524D\u65F6\u95F4 message=\u5728{0}\uFF0C\u4E00\u573A\u5267\u98CE\u6467\u6BC1\u4E86{1}\u6240\u623F\u5B50\uFF0C\u5BFC\u81F4\u4E86{2}\u7684\u635F\u5931\uFF01\uFF01
mypreoperties_en.properties
file=file username=username password=password submit=submit currenttime=Current Time message=At {0, time, short} on {0, date}, a destroyed {1} houses and caused {2, number, currency} of damage.
mypreoperties.properties
file=file username=username password=password submit=submit currenttime=Current Time message=At {0, time, short} on {0, date}, a destroyed {1} houses and caused {2, number, currency} of damage.
package cn.itcast.i18n; import java.util.Locale; import java.util.ResourceBundle; public class Demo1 { public static void main(String[] args) { ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.resource.mypreoperties",Locale.ENGLISH); String value = bundle.getString("file"); System.out.println(value); } }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="java.text.DateFormat"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <% String language = request.getParameter("language"); if(language==null){ language = "zh"; } Locale locale = new Locale(language); ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.resource.mypreoperties",locale); %> <a href="login.jsp?language=zh">中文(网页)</a> <a href="login.jsp?language=en">english(pages)</a> <%=bundle.getString("currenttime") %>: <% Date date = new Date(); DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM,locale); String result = df.format(date); out.write(result); %> <br/><br/><br/> <form action=""> <%=bundle.getString("username") %><input type="text" name="username"><br/> <%=bundle.getString("password") %><input type="text" name="password"><br/> <input type="submit" value="<%=bundle.getString("submit") %>"><br/> </form> </body> </html>
动态数据的国际化

当然也可以用Local中的常量来构建一个local
DateFormat类(国际化日期)
实例化DateFormat类
package cn.itcast.i18n; import java.text.DateFormat; import java.util.Date; import java.util.Locale; public class Demo2 { /** * @param args */ public static void main(String[] args) { Date date = new Date(); //输出date的日期部分 DateFormat format = DateFormat.getDateInstance(DateFormat.FULL, Locale.KOREA); String result = format.format(date); System.out.println(result); //输出date的时间部分 format = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.PRC); System.out.println(format.format(date)); format = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, Locale.CANADA); System.out.println(format.format(date)); } }
package cn.itcast.i18n; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; import java.util.Locale; public class Demo3 { /**把字符串解析成date对象 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { String s = "Wednesday, January 26, 2011 3:17 PM"; DateFormat format = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, Locale.CANADA);//注意,这里字符串中的日期时间是什么格式就必须用相应的格式,不然要报错 Date date = format.parse(s); System.out.println(date); } }
数字国际化:NumberFormat类
package cn.itcast.i18n; import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; public class Demo4 { /** * 货币国际化 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { int price = 98; NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CHINA); String result = format.format(price); System.out.println(result); String str = "¥98.00"; int num = format.parse(str).intValue(); System.out.println(num+1); double d = 0.5; format = NumberFormat.getPercentInstance(); result = format.format(d); System.out.println(result); } }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="java.text.DateFormat"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <% String language = request.getParameter("language"); if(language==null){ language = "zh"; } Locale locale = new Locale(language); ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.resource.mypreoperties",locale); %> <a href="login.jsp?language=zh">中文(网页)</a> <a href="login.jsp?language=en">english(pages)</a> <%=bundle.getString("currenttime") %>: <% Date date = new Date(); DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM,locale); String result = df.format(date); out.write(result); %> <br/><br/><br/> <form action=""> <%=bundle.getString("username") %><input type="text" name="username"><br/> <%=bundle.getString("password") %><input type="text" name="password"><br/> <input type="submit" value="<%=bundle.getString("submit") %>"><br/> </form> </body> </html>
动态文本国际化: MessageFormat(动态文本)
At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage
At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage

package cn.itcast.i18n; import java.text.MessageFormat; import java.util.Date; import java.util.Locale; public class Demo5 { public static void main(String[] args) { String pattern = "On {0}, a hurricance destroyed {1} houses and caused {2} of damage."; MessageFormat format = new MessageFormat(pattern,Locale.CHINA); Object params[] = {new Date(),99,1000000}; String result = format.format(params); System.out.println(result); } }

package cn.itcast.i18n; import java.text.MessageFormat; import java.util.Date; import java.util.Locale; public class Demo6 { public static void main(String[] args) { String pattern = "At {0, time, short} on {0, date}, a destroyed {1} houses and caused {2, number, currency} of damage."; MessageFormat format = new MessageFormat(pattern,Locale.US); Object arg[] = {new Date(),99,100000000}; String result = format.format(arg); System.out.println(result); } }
package cn.itcast.i18n; import java.text.MessageFormat; import java.util.Date; import java.util.Locale; import java.util.ResourceBundle; public class Demo7 { /** * @param args */ public static void main(String[] args) { ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.resource.mypreoperties",Locale.US); String message = bundle.getString("message"); MessageFormat mf = new MessageFormat(message,Locale.US); Object params[] = {new Date(),99,10000000}; String result = mf.format(params); System.out.println(result); } }












<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <% String language = request.getParameter("language"); if(language==null){ language = "zh"; } Locale locale = new Locale(language); ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.resource.mypreoperties",locale); request.setAttribute("locale",locale); %> <a href="login.jsp?language=zh">中文(网页)</a> <a href="login.jsp?language=en">english(pages)</a> <fmt:setBundle basename="cn.itcast.resource.mypreoperties" var="bundle"/> <fmt:message key="currenttime" bundle="${bundle}"/>: <fmt:setLocale value="${locale}"/> <fmt:formatDate value="<%=new Date() %>" dateStyle="long" timeStyle="short"/> <br/><br/><br/> <form action=""> <fmt:message key="username" bundle="${bundle}"/><input type="text" name="username"><br/> <fmt:message key="password" bundle="${bundle}"/><input type="text" name="password"><br/> <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>"><br/> </form> </body> </html>
(11)<fmt:parseDate>标签

(12)<fmt:formatNumber>标签

(13)<fmt:parseNumber>标签

1、在工程中导入log4j开发包,在classpath下添加log4j的配置文件:log4j.properties,获得日志记录器,输出程序信息。

log4j.appender.appenderName = 目的地的完整类名
#设置级别和目的地 log4j.rootLogger=debug,appender1 #输出到控制台 log4j.appender.appender1=org.apache.log4j.ConsoleAppender #设置输出样式 log4j.appender.appender1.layout=org.apache.log4j.PatternLayout #自定义样式 log4j.appender.appender1.layout.ConversionPattern=%r [%t] [%p] - %c -%l -%m%n
#设置记录级别:debug log4j.rootLogger=info,appender1 #输出到控制台 log4j.appender.appender1=org.apache.log4j.ConsoleAppender #样式为TTCCLayout log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
#设置日志记录器的输出级别、输出目的地 log4j.rootLogger=debug,appender1 #输出到文件(这里默认为追加方式) log4j.appender.appender1=org.apache.log4j.FileAppender #设置文件输出路径 log4j.appender.appender1.File=c:/Log4J.log #设置输出样式 log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
#设置级别和目的地 log4j.rootLogger=debug,appender1 #输出到控制台 log4j.appender.appender1=org.apache.log4j.ConsoleAppender #设置输出样式 log4j.appender.appender1.layout=org.apache.log4j.PatternLayout #自定义样式 log4j.appender.appender1.layout.ConversionPattern=%r [%t] [%p] - %c -%l -%m%n
#设置级别和目的地 log4j.rootLogger=debug,appender1,appender2 #输出到控制台 log4j.appender.appender1=org.apache.log4j.ConsoleAppender #设置控制台输出样式 log4j.appender.appender1.layout=org.apache.log4j.PatternLayout #自定义控制台输出样式 log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n #输出到文件(这里默认为追加方式) log4j.appender.appender2=org.apache.log4j.FileAppender #设置文件输出路径 log4j.appender.appender2.File=c:/Log4JDemo06.log #设置文件输出样式 log4j.appender.appender2.layout=org.apache.log4j.PatternLayout log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n
一.参数说明 输出级别的种类 ERROR、WARN、INFO、DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息 配置日志信息输出目的地 log4j.appender.appenderName = fully.qualified.name.of.appender.class 1.org.apache.log4j.ConsoleAppender(控制台) 2.org.apache.log4j.FileAppender(文件) 3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) 4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 配置日志信息的格式 log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 1.org.apache.log4j.HTMLLayout(以HTML表格形式布局), 2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), 4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 控制台选项 Threshold=DEBUG:指定日志消息的输出最低层次。 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 Target=System.err:默认情况下是:System.out,指定输出控制台 FileAppender 选项 Threshold=DEBUF:指定日志消息的输出最低层次。 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 File=mylog.txt:指定消息输出到mylog.txt文件。 Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 RollingFileAppender 选项 Threshold=DEBUG:指定日志消息的输出最低层次。 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 File=mylog.txt:指定消息输出到mylog.txt文件。 Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。 MaxBackupIndex=2:指定可以产生的滚动文件的最大数。 日志信息格式中几个符号所代表的含义: log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n -X号: X信息输出时左对齐; %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %r: 输出自应用启动到输出该log信息耗费的毫秒数 %c: 输出日志信息所属的类目,通常就是所在类的全名 %t: 输出产生该日志事件的线程名 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10) %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 %%: 输出一个"%"字符 %F: 输出日志消息产生时所在的文件名称 %L: 输出代码中的行号 %m: 输出代码中指定的消息,产生的日志具体信息 %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。 3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。 二.文件配置 示例1 log4j.rootLogger=DEBUG,A1,R #log4j.rootLogger=INFO,A1,R # ConsoleAppender 输出 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n # File 输出 一天一个文件,输出路径可以定制,一般在根路径下 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=blog_log.txt log4j.appender.R.MaxFileSize=500KB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 示例2 下面给出的Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。 log4j.rootLogger=DEBUG,CONSOLE,A1,im #DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE log4j.addivity.org.apache=true ################### # Console Appender ################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n ##################### # File Appender ##################### log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis ######################## # Rolling File ######################## log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #################### # Socket Appender #################### log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n ######################## # Log Factor 5 Appender ######################## log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 ######################## # SMTP Appender ####################### log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=chenyl@yeqiangwei.com log4j.appender.MAIL.SMTPHost=mail.hollycrm.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=chenyl@yeqiangwei.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ######################## # JDBC Appender ####################### log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password= log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=SampleMessages.log4j log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout ################### #自定义Appender ################### log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender log4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = corlin@yeqiangwei.com log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

浙公网安备 33010602011771号