杂记(一):Listener、Filter和工具

来源:互联网 发布:武汉专业淘宝摄影 编辑:程序博客网 时间:2024/06/04 14:21

绪论

杂七杂八,瞎记一下。

一、Listener、Filter和Servlet

虽然Listener、Filter、Servlet都可以在web.xml中进行配置,但是它们加载有先后顺序(Listener –> Filter –> Servlet)。

  • Listener:简单来说就是监听,当。。。开始执行之前先执行它。
  • Filter:基本上用来处理用户的请求,比如:判断当前用户有没有登录、访问路径有没有权限、对访问路径进行修改等。
  • Servlet:主要是对请求进行处理,并且返回处理结果,也就是控制层。

二、ServletContextListener接口

由于该监听事件在项目一起动时就执行,可用来处理初始化数据库、系统配置等等。

web.xml配置访问文件

<listener>    <listener-class>com.zDemo.WebContextListener</listener-class></listener>

ServletContextListener接口的实现类

package com.zDemo;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class WebContextListener implements ServletContextListener{    /**     * 销毁方法     */    @Override    public void contextDestroyed(ServletContextEvent arg0) {        System.out.println("销毁方法");    }    /**     * 初始化方法     */    @Override    public void contextInitialized(ServletContextEvent arg0) {        System.out.println("初始化方法");    }}

运行结果:

这里写图片描述

三、Filter接口

web.xml配置访问文件

<!-- 配置过滤器 --><filter>    <filter-name>LoginFilter</filter-name>    <filter-class>com.zDemo.LoginFilter</filter-class>    <init-param>        <param-name>logonStrings</param-name><!-- 对登录页面不进行过滤 -->        <param-value>login.jsp;login.do</param-value>    </init-param>    <init-param>        <param-name>includeStrings</param-name><!-- 只对指定过滤参数后缀进行过滤 -->        <param-value>.do;.jsp</param-value>    </init-param>    <init-param>        <param-name>redirectPath</param-name><!-- 未通过跳转到登录界面 -->        <param-value>/index.jsp</param-value>    </init-param>    <init-param>        <param-name>disabletestfilter</param-name><!-- Y:过滤无效 -->        <param-value>N</param-value>    </init-param></filter><filter-mapping>    <filter-name>LoginFilter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>

Filter接口的实现类

package com.zDemo;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class LoginFilter implements Filter{    @Override    public void destroy() {        System.out.println("Filter销毁");    }    @Override    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)            throws IOException, ServletException {              HttpServletRequest servletRequest = (HttpServletRequest) request;        HttpServletResponse servletResponse = (HttpServletResponse) response;        // 获取访问地址        String path = servletRequest.getRequestURI();        System.out.println(path);        filterChain.doFilter(servletRequest, servletResponse);    }    @Override    public void init(FilterConfig arg0) throws ServletException {        System.out.println("Filter开始");    }}

运行结果:
这里写图片描述

四、区分PC端或者是移动端登录

LoginFilter文件内容

package com.zDemo;import java.io.IOException;import java.util.Date;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginFilter implements Filter{    private FilterConfig config;    @Override    public void destroy() {        System.out.println("Filter销毁");        this.config = null;    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)            throws IOException, ServletException {        // 获取session        HttpServletRequest servletRequest = (HttpServletRequest) request;        HttpServletResponse servletResponse = (HttpServletResponse) response;        // 记录日志        /*ServletContext context = this.config.getServletContext();             // 获取访问地址        String path = servletRequest.getRequestURI();        context.log("请求地址:" + path + "    ||    时间:" + UtilsClass.dateString(new Date()));        System.out.println(path);*/        UtilsClass.check(servletRequest, servletResponse);        filterChain.doFilter(servletRequest, servletResponse);    }    @Override    public void init(FilterConfig config) throws ServletException {        System.out.println("Filter开始");        this.config = config;    }}

UtilsClass工具类内容,判断登录设备

package com.zDemo;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class UtilsClass {    // \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔),        // 字符串在编译时会被转码一次,所以是 "\\b"        // \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔)        static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i"                +"|windows (phone|ce)|blackberry"                +"|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp"                +"|laystation portable)|nokia|fennec|htc[-_]"                +"|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";        static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser"                +"|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";        //移动设备正则匹配:手机端、平板      static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);        static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);    /**      * 检测是否是移动设备访问      * @param request     * @param response     */      public static void check(HttpServletRequest request, HttpServletResponse response){        boolean isMobile = false;        // userAgent 浏览器标识        String userAgent = request.getHeader("USER-AGENT").toLowerCase();        if (null == userAgent) {            userAgent = "";        }        // 匹配            Matcher matcherPhone = phonePat.matcher(userAgent);            Matcher matcherTable = tablePat.matcher(userAgent);        if(matcherPhone.find() || matcherTable.find()){                isMobile = true;            }        // 获取访问地址        String path = request.getRequestURI();        if(isMobile){            System.out.println("移动端访问      访问方法:" + path + "    时间:"+ dateString(new Date()));        }else{            System.out.println("电脑端访问      访问方法:" + path + "    时间:"+ dateString(new Date()));        }    }    /**     * 数据库日期毫秒数格式化     */    public static String dateString(Date date){        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String str = format.format(date);        return str;    }}

运行结果:
这里写图片描述

五、谷歌坐标和百度坐标相互转换

static final double x_pi = 3.14159265358979324 * 3000.0 / 180.0;/** * 谷歌坐标转换成百度地图坐标 */public static double[] googleToBaiDu(double x, double y){    double[] d = new double[2];    double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);         double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);    d[0] = z * Math.cos(theta) + 0.0065;    d[1] = z * Math.sin(theta) + 0.006;    return d;}/** * 谷歌坐标转换成百度地图坐标 */public static double[] baiDuToGoogle(double x, double y){    x = x - 0.0065;    y = y - 0.006;    double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);     double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);            double[] d = new double[2];    d[0] = z * Math.cos(theta);    d[1] = z * Math.sin(theta);    return d;}

运行结果:
这里写图片描述

这里写图片描述

马马虎虎可以用,好像百度地图上已经有谷歌地图坐标转百度地图坐标的方法,建议使用。

(若有什么错误,请留言指正,3Q)

原创粉丝点击