Servlet笔记 (八) i18nFilter国际化

一、国际化的概念及相关类
用的很少,因为开发效率会降低,但是必须知道国际化
国际化又称为 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个(有一个很难)
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值