1.Filter过滤器

  1)为是么有过滤器

    开发项目中经常遇到直接登录主页面要判断用户是否合法,这类代码比较重复,可以通过过滤器来解决

  2)过滤器原理生命周期

    服务器创建过滤器对象-》一个执行init()方法-》用户请求-》执行第一个过滤器-》执行第二个过滤器-》到达目标地址-》浏览器关闭过滤器销毁

  3)过滤器语法

    Filter接口:三个主要方法

      init(FilterConfig):初始化方法,service()服务启动时执行 

      doFilter(request,response,FilterChain chain);过滤器拦截的业务处理方法

      destroy();  销毁过滤器实例时调用

      

      其中:filterConfig:获取初始化参数信息;getInitParameter("");getInitParameterName()

         chain:过滤器参数,一个个过滤器形成一个执行链

            作用:执行下一个过滤器或放行

  4)部署过滤器

    1.创建类继承Filter接口

       实现3个方法

public class HelloFilter implements Filter{

    @Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("helloFilter销毁了!");
} @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("HelloFilter正在过滤");
} @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("过滤器初始化开始");
String name=arg0.getInitParameter("name");
System.out.println("name的值:"+name);
Enumeration<String> names=arg0.getInitParameterNames();
while(names.hasMoreElements()){
System.out.println("初始化参数"+names.nextElement());
}
}

    2.配置xml

      <filter></filter>子成员配置可以靠Myeclipse提示

 <filter>
<filter-name>HelloFilter</filter-name>
<filter-class>filter.HelloFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>小平</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value></param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

  5)案例:过滤器编码统一处理

package filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; /**
* 编码过滤对登录中的处理
* @author Administrator
*
*/
public class EncodingFilter implements Filter{ @Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("EncodingFilter销毁了");
} @Override
public void doFilter(final ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
chain.doFilter(request, response); //这里出现一个情况,post时不会乱码,但get请求时会乱码
//原因:get请求post请求发送信息方式不一样,get信息是在url中的可见都是乱码因为这里ISO编码格式
//解决方式:在request.getParameter()时,加个判断当时Get请求时另作处理;
//这里的情况就是想要requeset接口的特定方法进行功能扩展用到”代理“
HttpServletRequest proxy=(HttpServletRequest) Proxy.newProxyInstance(
request.getClass().getClassLoader(),
new Class[]{HttpServletRequest.class} ,
new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//定义一个放回值
Object returnValue=null;
//获取方法名
String methodName=method.getName();
//判断当方法微微GET时要处理些
if("getParameter".equals(methodName)){
// 获取请求数据值【 <input type="text" name="userName">】
String value = request.getParameter(args[].toString()); // 调用目标对象的方法 // 获取提交方式
String methodSubmit = ((HttpServletRequest) request).getMethod(); // 直接调用目标对象的方法 // 判断如果是GET提交,需要对数据进行处理 (POST提交已经处理过了)
if ("GET".equals(methodSubmit)) {
if (value != null && !"".equals(value.trim())){
// 处理GET中文
value = new String(value.getBytes("ISO8859-1"),"UTF-8");
}
} }else{
// 执行request对象的其他方法
returnValue = method.invoke(request, args);
}
return returnValue;
}
});
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub } }

2.Listener监听器

  1)定义

    监听特定对象的创建销毁属性变化

  2)Servlet中哪些对象需要监听

    request,session,ServletContext三对象(这些有系统自己创建添加监听器时需要配置xml);自己的对象就不需要配置

  3)主要API

    1.监听对象创建/销毁的监听接口

      ServletRequestListener  监听request对象的创建销毁

      HttpSessionListener    监听session

      ServletContextListener  监听servletCOntext对象的创建或销毁

    2.监听对象属性的变化

      ServletRequestAttrbuteListener

      HttpSessionAttributeListener

      ServletContextAttributeListener

    3.session相关监听器

      HttpSessionBindingListener:监听对象绑定到session上的事件

      HttpSessionActivationListener:监听session序列及反序列

      例子:这个不需要配置web.xml

package cn.itcast.c_session;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; /**
* 监听此对象绑定到session上的过程,需要实现session特定接口
* @author Jie.Yuan
*
*/
public class Admin implements HttpSessionBindingListener { private int id;
private String name; public Admin() {
super();
}
public Admin(int id, String name) {
super();
this.id = id;
this.name = name;
} // 构造函数
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} // 对象放入session public void valueBound(HttpSessionBindingEvent event) {
System.out.println("Admin对象已经放入session");
}
// 对象从session中移除 public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("Admin对象从session中移除!");
} }

  4)部署步骤

    写一个普通类继承相关接口-》系统创建对象配置xml 

  5)例子:

    1.MyRequestListener

/**
* 监听request对象的创建或销毁
* @author Jie.Yuan
*
*/
public class MyRequestListener implements ServletRequestListener{ // 对象销毁 public void requestDestroyed(ServletRequestEvent sre) {
// 获取request中存放的数据
Object obj = sre.getServletRequest().getAttribute("cn");
System.out.println(obj);
System.out.println("MyRequestListener.requestDestroyed()");
} // 对象创建 public void requestInitialized(ServletRequestEvent sre) {
System.out.println("MyRequestListener.requestInitialized()");
}
}

    2.配置:简简单单配置就好了

<listener>
<listener-class>cn.listen.MyListener</listener-class>
</listener>

3.国际化:i18n:internationlization

  1)不同国家显示不同的语言国际化软件

  2)实现方式:

    1.软件中存储特定的字符串;2.软件识别当前哪种语言(Locale)

  3)分为静态国际化,动态国际化

静态国际化

//国际化-静态数据
@Test
public void testI18N(){
//中文语言环境
Locale local=Locale.US;
//创建工具对象ResourceBundle
ResourceBundle bundle=ResourceBundle.getBundle("local.msg",local);
//根据key获取配置文件中的值
System.out.println(bundle.getString("hello"));
System.out.println(bundle.getString("username"));
}

动态国际化

    //日期
@Test
public void testI18N4(){
// 日期格式
int dateStyle = DateFormat.SHORT;
// 时间格式
int timeStyle = DateFormat.SHORT;
//
DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.CHINA);
//获得数据
String date=df.format(new Date());
System.out.println(date); }
//讲09-11-28 上午10时25分39秒 CST,反向解析成一个date对象
@Test
public void testI18N5() throws Exception{
String str="09-11-28 上午10时25分39秒 CST"; DateFormat df=DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.FULL , Locale.CHINA);
Date d=df.parse(str);
System.out.println(d);
}

  4)Jsp页面国际化-使用jstl标签

    JSTL标签有:核心标签库,国际化和格式化标签库,数据库标签(没用),函数库

    <fmt:setLocale value=""/> 设置本地化对象

    <fmt:setBundle basename=""/>设置工具类(RourseBunlde)

    <fmt:message></fmt:message> 显示国际化文本

    格式化数值

    <fmt:formatNumber pattern="#,##" value="10.99"></fmt:formatNumbr>

    格式化日期

    <fmt:formatDate pattern="yyyy-MM-dd" value=${date}>

    例子:

.设置本地化对象
<fmt:setLocale value="${pageContext.request.locale}"/>
.设置工具类:
<fmt:setBundle basename="cn.itcast.f_i18n.msg" var="bundle"/>
.shezhi wenben guojihua
<fmt:message key="title" bundle="${bundle}"></fmt:message>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入jstl国际化与格式化标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<!-- 一、设置本地化对象 -->
<fmt:setLocale value="${pageContext.request.locale}"/>
<!-- 二、设置工具类 -->
<fmt:setBundle basename="cn.itcast.f_i18n.msg" var="bundle"/> <title><fmt:message key="title" bundle="${bundle}"></fmt:message></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
</head> <body>
<form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">
<table align="center" border="">
<tr>
<td><fmt:message key="username" bundle="${bundle}"></fmt:message></td>
<td>
<input type="text" name="userName">
</td>
</tr>
<tr>
<td><fmt:message key="pwd" bundle="${bundle}"></fmt:message></td>
<td>
<input type="password" name="pwd">
</td>
</tr>
<tr>
<td>
<input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>">
</td>
</tr>
</table>
</form>
</body>
</html>

java深入探究09-Filter,Listener,国际化的更多相关文章

  1. SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式

    在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...

  2. ServletContextInitializer添加 servlet filter listener

    ServletContextInitializer添加 servlet filter listener https://www.cnblogs.com/pomer-huang/p/9639322.ht ...

  3. servlet filter listener interceptor 知识点

    这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下:   概念 生命周期 使命 servlet ...

  4. Java IO: ByteArray和Filter

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中字节数组与过滤器的输入输出流,主要涉及以下4个类型的流:ByteArr ...

  5. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference

  7. JAVA自学笔记09

    JAVA自学笔记09 1.子类的方法会把父类的同名方法覆盖(重写) 2.final: 1)可修饰类.方法.变量 2)修饰类时:此时该类变为最终类,它将无法成为父类而被继承 3)修饰方法时:该方法将无法 ...

  8. servelt filter listener 的生命周期

    1. servlet    当第一次请求一个servlet资源时,servlet容器创建这个servlet实例,并调用他的 init(ServletConfig config)做一些初始化的工作,然后 ...

  9. javaEE中错误提示 Exception starting filter BackServletFilter java.lang.ClassNotFoundException: tmall.filter.BackServletFilter提示这个错误啊

    最近在学习javaEE的部署,不借助eclipse中的部署方式,而是通过修改server.xml文件的方式部署 添加Context路径 <Context path="/tm" ...

随机推荐

  1. codevs 必做:堆:1245、2879 并查集:1069、1074、1073

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  2. shell脚本中格式化日期

    date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] ...

  3. 在前端眼中pc端和移动的开发区别

    按照昨天所说,本包子今天将总结在前端开发中,pc端和移动端的区别,整理完这些区别,本包子将开始整理pc端的布局,会写实际的代码了,还是那句话,希望文章中有什么不足的地方,大家能多多指正,大家一起进步, ...

  4. 巨蟒python全栈开发flask1

    1.整体把握 (1)路飞学城 - RestAPI 前后端分离开发 Django Vue.js - DRF DjangoRestFromwork - 线上商城的经验 (2)智能玩具 - RestAPI ...

  5. ASIHttprequest 报错

    (void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders { if ([self error] || ...

  6. fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory

    stdint.h是c99标准的头文件,vc不支持,所以肯定会提示“No such file or directory”的. stdint.h是C99的标准,主要用于统一跨平台数据定义. MSVC中不带 ...

  7. PAT 1069. 微博转发抽奖(20)

    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...

  8. 设置请求timeout超时

    import requests r = requests.get("http://www.cnblogs.com/yoyoketang/", timeout=1) # 设置超时 p ...

  9. Python的模块与函数以及与自动化的结合

    3 模块与函数 3.1程序结构 python的程序由package,module,function组成,分别是包,模块,函数.模块是函数和类的集合,包,模块,函数之间的关系如下: 3.2模块 pyth ...

  10. 简单springmvc在Eclipse的Tomcat上部署404error,直接在Tomcat上部署可以访问

    在Eclipse工程下的.setting文件夹的org.eclipse.wst.common.component这个文件,如下则可以访问: <?xml version="1.0&quo ...