一、国际化的概念及相关类
用的很少,因为开发效率会降低,但是必须知道国际化
国际化又称为 i18n:internationalizaion
国际化针对的是菜单,导航条,程序的国际化,而不是数据国际化
国际化的内容:(区域敏感信息)文字,日期,数字(货币),批量格式化
Locale:代表区域
1,文字需要国际化
ResourceBundle
主文件名_语言_国家.properties
中国资源文件:info_zh_ZN.properties
美国资源文件:info_en_US.properties
默认资源文件:info.properties
一组资源包:有相同的主文件名称和扩展名,只是区域信息不同而已
注意配置的key用.分隔,要起名有意义,以后便于查找
一个资源包中的每个资源文件都必须拥有共同的
基名
public class ResourceBundlerDemo {
public static void main(String[] args) {
//设置用于表示国家/地区的有用常量
Locale locale = Locale.US;
//一个资源包中的每个资源文件都必须拥有共同的基名,会自动去查资源包
//基名:com.itheima.resources.info(包名.info)
ResourceBundle rb = ResourceBundle.getBundle("com.itheima.resources.info", locale);
String value = rb.getString("hello");
System.out.println(value);
}//打印US配置文件中hello对应的value值
} |
建立login.jsp。原理和上面一样,都是读取配置文件对应的value
<%
Locale locale = request.getLocale();
ResourceBundle rb = ResourceBundle.getBundle("com.itheima.resources.info", locale);
%> |
<form action="" method="post">
<%=rb.getString("jsp.login.username") %>:<input type="text"/><br/>
<%=rb.getString("jsp.login.password") %>:<input type="password"/><br/>
<input type="submit" value="<%=rb.getString("jsp.login.button") %>"/>
</form> |
其实是请求消息头Accept-language里面,告诉服务器,自己是什么语言,
在JDK的bin文件夹内,有一个native2ascii.exe,这个工具,可以进行中文的编码转换
2,日期(格式不同)。
DateFormat
日期格式: pattern 中国:yyyy-MM-dd (SimpleDateFomat里面有定义)
用户输入填充模型:
用户输入的都是:java.lang.String---->java.util.Date:我们需要解析Date parse(String str)
显示数据时:
java.util.Date--->java.lang.String:格式化输出 String format(Date date)
DateFormat是抽象方法,提供了九个获取自身对象的静态方法。
//时间日期的转换
public class DateFormatDemo {
public static void main(String[] args) throws ParseException {
//设置为中国
Locale locale = Locale.CHINA;
Date now = new Date();//注意是Util包
//把日期格式化为String,参数分别为 :日期最长格式,时间最长格式,指向的地区属性
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);
//打印结果为2013年9月20日 星期五 下午10时47分16秒 CST
System.out.println(df.format(now));
Date d = df.parse("2013年9月20日 星期五 下午10时47分16秒 CST");
//打印结果为Fri Sep 20 22:47:16 CST 2013
System.out.println(d);
}
} |
3,数字(货币)。
¥--这是日元???
NumberFormat
DecimalFormat是其实现类,里面有很多格式
用户输入填充模型:
用户输入的都是:java.lang.String---->java.lang.Number:解析Number parse(String str)
显示数据时:
java.lang.Number--->java.lang.String:格式化输出 String format(Number num
public class NumberFormatDemo {
public static void main(String[] args) throws ParseException {
Locale locale = Locale.US;
int money = 1000000000;
//获取一个数字格式的类,参考US的常用格式
NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
//打印$1,000,000,000.00
System.out.println(nf.format(money));
//注意,这里获取的是Long类型
Long l = (Long) nf.parse("$1,000,000,000.00");
System.out.println(l.intValue());//转成int型并打印
}
} |
4,批量格式化。
MessageFormat
建立MessageFormatDemo类
在字符串中的区域敏感信息,使用占位符{0},从0开始
占位符需要看MessageFormat文档。J2SE5.0 的API
默认是中文的,通过对Locale进行设置,可以该改为英文
public class MessageFormatDemo {
public static void main(String[] args) {
Locale locale = Locale.US;
//使用占位参数,占位参数从0开始
String pattern = "At {0,time,short} on {1,date,short}, a hurricance destroyed {2} houses and caused {3,number,currency} of damage";
Date d = new Date();
int num = 99;
int money = 1000000;
//设置批量国际化格式
MessageFormat mf = new MessageFormat(pattern, locale);
//使用占位符进行批量国际化
String s = mf.format(new Object[]{d,d,num,money});
System.out.println(s);
}
} |
二、简单介绍JSTL中的fmt(Format)国际化标签库
使用fmt.dlt
注意,有的标签只能在标签体内使用,有的只能在标签体外
request.setencoding txet/html,charset=UTF-8 仅限post请求
<html>
<head>
<fmt:setLocale value="${pageContext.request.locale}"/>
<fmt:setBundle basename="com.itheima.resources.info" var="msg"/>
<title>
<fmt:message key="jsp.login.title" bundle="${msg}"></fmt:message>
</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<form action="" method="post">
<fmt:message key="jsp.login.username" bundle="${msg}"></fmt:message>:<input type="text"/><br/>
<fmt:message key="jsp.login.password" bundle="${msg}"></fmt:message>:<input type="password"/><br/>
<input type="submit" value="<fmt:message key="jsp.login.button" bundle="${msg}"></fmt:message>"/>
</form>
<%
pageContext.setAttribute("now", new Date());
pageContext.setAttribute("money", 1234567.89);
%>
<fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/><br/>
<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日 HH:mm:ss"/><br/>
<fmt:formatNumber value="${money}" groupingUsed="true" type="currency"></fmt:formatNumber>
</body>
</html>
|
三、过滤器概述
管理所有的web资源,不管出和进都要经过他。
过滤器就是一个保安,能对请求和响应进行拦截。
过滤器生命周期
过滤器的执行顺序按照web.xml的标签顺序来执行
过滤器的初始化是在加载应用的时候,而不是用户第一次访问的时候。
过滤器的销毁是随服务器的关闭而销毁
过滤器,是一种职责链设计模式
四、过滤器编写步骤
先写一个servlet类
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("ServletDemo1");
response.getWriter().write("haha");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
} |
过滤器编写步骤:
1,建立类实现接口
//注意所有的包都是javax.servlet.*的
public class FilterDemo1 implements Filter {
private FilterConfig filterConfig;
public FilterDemo1() {
}
public void destroy() {
}
//对于在拦截范围内的资源(web.xml配置),每次访问,该方法都会执行拦截
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String value = filterConfig.getInitParameter("aaa");
System.out.println(value);
System.out.println("FilterDemo1 start");
//放行,放行后的代码在目标资源执行完成后,再执行
chain.doFilter(request, response);
System.out.println("FilterDemo1 end");
}
public void init(FilterConfig filterConfig) throws ServletException {
//在Tomcat启动的时候,就会运行初始化方法
this.filterConfig=filterConfig;
}
} |
2,配置web.xml文件
<filter><!-- 按配置文件标签的顺序进行过滤 -->
<filter-name>FilterDemo1</filter-name>
<filter-class>com.itheima.filter.FilterDemo1</filter-class>
<init-param>
<param-name>aaa</param-name>
<param-value>bbb</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern><!-- 拦截所有的web资源 -->
</filter-mapping> |
五、过滤器简单案例:4个
(以后提交方式为post)
案例一:统一全站字符编码的过滤器
先写一个1.jsp页面,在body主体内容中
<form action="${pageContext.request.contextPath}/servlet/ServletDemo1" method="post">
<input type="text" name="name"/>
<input type="submit" value="go"/>
</form> |
public class CharacterEncodingFilter implements Filter {
private FilterConfig filterConfig;
public CharacterEncodingFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//得到配置的参数,配置的参数在web.xml中去配
String encoding = filterConfig.getInitParameter("encoding");
if(encoding==null){
//防止一些SB不会去配
encoding = "UTF-8";
}
//中文请求参数乱码的解决方法(post方式提交)
request.setCharacterEncoding(encoding);
//解决输出到页面的中文乱码
response.setContentType("text/html;charset="+encoding);
//不要忘记放行
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
} |
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.itheima.servlet.ServletDemo1</servlet-class>
</servlet>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.itheima.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servlet/ServletDemo1</url-pattern>
</servlet-mapping>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> |
案例二:禁止浏览器缓存所有动态页面的过滤器
验证码和动态资源不要缓存,缓存与否,跟浏览器有关
写不要缓存的3个头
public class NoCacheFilter implements Filter {
public NoCacheFilter() {
}
public void destroy() {
}
//不要缓存文件,只要设置3个头就可以了,然后在web.xml里面进行配置即可
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
response.setHeader("Expires", "-1");//只要比当前时间小就行,一般设置为-1
response.setHeader("Cache-Control", "no-cache");//1.1
response.setHeader("Pragma", "no-cache");//1.0
chain.doFilter(request, response);//别忘了放行
}
public void init(FilterConfig filterConfig) throws ServletException {
}
} |
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.itheima.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
|
案例三:控制浏览器缓存页面中的静态资源的过滤器:
<filter>
<filter-name>NeedCacheFilter</filter-name>
<filter-class>com.itheima.filter.NeedCacheFilter</filter-class>
<init-param>
<param-name>html</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>css</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>js</param-name>
<param-value>4</param-value>
</init-param>
</filter> |
public class NeedCacheFilter implements Filter {
FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public NeedCacheFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest args0, ServletResponse args1,
//浏览器每一次请求会得到一个文件,每个文件是单独下载的
//所以过滤器会对每个文件过滤一次。
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) args0;
HttpServletResponse response = (HttpServletResponse) args1;
//根据不同的资源,设置缓存时间
String htmlTime = filterConfig.getInitParameter("html");
String cssTime = filterConfig.getInitParameter("css");
String jsTime = filterConfig.getInitParameter("js");
long time = 0;
//根据访问的资源设定时间
//得到/my_exercise_day15_2/1.html
String uri = request.getRequestURI();
//得到文件后缀.方法是从指定的索引开始,到结束
String extendFileName = uri.substring(uri.lastIndexOf(".")+1);
if("html".equals(extendFileName));{
time = Long.parseLong(htmlTime)*60*60*1000;
}
if("css".equals(extendFileName));{
time = Long.parseLong(cssTime)*60*60*1000;
}
if("js".equals(extendFileName));{
time = Long.parseLong(jsTime)*60*60*1000;
}//设置头,时间头
response.setDateHeader("Expires", System.currentTimeMillis()+time);
chain.doFilter(request, response);
}
} |
案例四 实现用户自动登录的过滤器
建立index.jsp
建立login.jsp
建立User.java
建立UserDB.java
建立LoginServlet.java
建立util包。
建立Md5Util
建立LogoutServlet
开始写过滤器,完成需求
建立AutoLoginFilter.java
配置web.xml文件
七、过滤器高级配置
八、巩固包装设计模式
注意类型要看等号的左边,然后打印出来看看是什么类
九、过滤器高级案例:4个(有一个很难)