Servlet

浏览器行为的三要素

开发人员负责控制浏览器请求行为[三要素]

1.请求地址控制<a></a> <form> </form>

2.请求方式控制: POST/GET

3.请求参数控制: <a></a> /login?usename=xiaoqiu&pwd=123

表单域标签[input ,select,textarea]

浏览器向服务器发起请求的方式

<form actiom="/地址" method="get(post)"></form>

<a href=""></a> a标签默认的请求方式是get

 

post和get两种请求方式的区别

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 编码的方式不一样

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 req.setCharacterEncoding("UTF-8");

web项目的部署

Myweb(项目名)

-css

-html

-js

-WEB-INF

--classes

--lib

--web.xml

 

继承HtppServlet类

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet类主要针对浏览器发送Get启动的做处理");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet类主要针对浏览器发送Post启动的做处理");
    }
}

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

Servlet对象的生命周期

1.网站中所有的Servlet接口实现类的实例对象,只能由ttp服务器负责额创建。

开发人员不能手动创建servlet接口实现类的实例对象

2.在默认的情况下,Http服 务器接收到对于当前servlet接口实现类第一次请求时自动创建这个servlet接口实现类的实例对象

在手动配置情况下,要求Http服务器在启动时自动创建某个servlet接口实现类的实例对象

下面是启动时自动创建Servlet对象的方法

<servlet>

<servlet-name></servlet- name> <!--声明-一个变量存储servlet接口实现类类

<servlet- class>类名</ servlet-class>

<load-on-startup>30<load-on-startup><!--填写-一个大于0的整数即可-->

</servlet>

3.在Http服务器运行期间,一个servlet接口实现类只能被创建出一个实例对象

4.在http服务器关闭时刻,自动将网站中所有的servlet对象进行销毁

 

每一个Servlet只能有一个实例对象,在被访问时创建且只创建一次,服务器关闭时销毁

<load-on-startup>30<load-on-startup><!--填写-一个大于0的整数即可-->

在web.xml文件添加该标签,则在打开时自动创建

 

关于HttpServletResponse

Http响应包

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_15,color_FFFFFF,t_70,g_se,x_16

 

通常通过response的getWriter方法来获得输出流对象

通过输出流对象的print方法来将内容输出到浏览器上

PrintWriter writer = response.getWriter();

响应对象响应头的ContentType类型进行更改

response.setContentType("text/html;charset=UTF-8");设置浏览器的解析方式,还有使用的字符集

        response.sendRedirect("http://www.baidu.com");//给响应头的location赋值,当访问时,响应头中有location的属性则跳转至其位置(重定向)

 

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
测试response的一些方法
response.setContentType("text/html;charset=UTF-8");设置字符集解析方式
  response.sendRedirect("http://www.baidu.com");给响应头的location赋值,当访问时,响应头中有location的属性则跳转至其位置
 */
@WebServlet(name = "ThreeServlet")
public class ThreeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用html文本编译器
        //response.setContentType("text/html;charset=UTF-8");
        response.sendRedirect("http://www.baidu.com");//给响应头的location赋值,当访问时,响应头中有location的属性则跳转至其位置
        PrintWriter writer = response.getWriter();
        writer.print("java<br/>Html<br/>Css");

    }
}

 

对于响应的应用(JDBC连接数据库)

将数据库中的数据输出到浏览器上


import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class ListEmpServlet implements Servlet {
    public static void main(String[] args) {

    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        Connection connection=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/xiaoqiu?useSSL=false","root","");
            String sql="select ename,sal from emp where sal>?";
            ps=connection.prepareStatement(sql);
            ps.setString(1,"300");
            rs=ps.executeQuery();
            PrintWriter writer = servletResponse.getWriter();
            writer.print("<html>");
            writer.print("</body>");
            writer.print("<table border=\"1px\" width=\"50%\">");
            writer.print("<tr>");
            writer.print("<th>"+"ename");
            writer.print("</th>");
            writer.print("<th>"+"sal");
            writer.print("</th>");
            writer.print("</tr>");
            while (rs.next()) {
                writer.print("<tr>");
                writer.print("<td>"+rs.getString(1)+"</td>");
                writer.print("<td>"+rs.getString(2)+"</td>");
                writer.print("</tr>");
            }
            writer.print("</table>");
            writer.print("<body>");
            writer.print("</html>");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

 

关于HttpServletRequest

请求协议包:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/*

 */
public class ThreeServlet extends HttpServlet {

    @Override
     /*
        读取请求头中的参数值
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Enumeration paramsNames = request.getParameterNames();//获取获一组参数名,返回的是枚举集合
        while (paramsNames.hasMoreElements()){//遍历这个集合
            String paramName = (String)paramsNames.nextElement();//调用集合对象得nextElement方法得到下一个,默认是指得是-1的位置
            String value = request.getParameter(paramName);//request对象通过参数名获得参数值(有点像Map集合键值对)
            System.out.println(paramName+":"+value);
        }
    }

    @Override
    /*
        读取请求体中的参数值
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Enumeration paramsNames = req.getParameterNames();//
        while (paramsNames.hasMoreElements()){
            String paramName = (String)paramsNames.nextElement();
            String value = req.getParameter(paramName);
            System.out.println(paramName+":"+value);
        }
    }
}

读取结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 学员管理系统

注:

1.在像一个具有主键约束或者唯一约束的字段的时候,要先判断该字段是否已在数据中出现,然后在进行插入操作

2.在前后端交互的过程中,必须要设置编码格式为UTF-8,如果数据库或者是前端提交的时候可能会出现乱码

用户查询:

package com.ning;

import com.ning.Util.JDBCUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

/*
* 显示数据库中的所有数据
 */
public class User_find extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        PrintWriter writer = response.getWriter();
        try {
            conn = JDBCUtil.getConnection();;
            String sql ="select * from t_user";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            writer.print("<table border=\"1\" align=\"center \">");
            writer.print("<tr>");
            writer.print("<th>"+"usename"+"</th>");
            writer.print("<th>"+"password"+"</th>");
            writer.print("<th>"+"sex"+"</th>");
            writer.print("<th>"+"email"+"</th>");
            writer.print("<th>"+"operate"+"</th>");
            writer.print("</tr>");
            while(rs.next()){
                writer.print("<tr>");
                for (int i=2;i<=5;i++){
                    writer.print("<td>"+rs.getString(i)+"</td>");
                }
                String usename=rs.getString("usename");
                writer.print("<td><a href='/myweb/user/delete?usename="+usename+"'"+">delete</a></td>");
                writer.print("</tr>");
//                userid = rs.getString("userId");
//                usename = rs.getString("usename");
//                password = rs.getString("password");
//                sex = rs.getString("sex");
//                email = rs.getString("email");
            }
            response.setContentType("text/html;charset=utf-8");
            writer.print("</table>");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.Close(conn,ps,rs);
            writer.close();
        }
    }
}

 

用户删除:

package com.ning;

import com.ning.Util.JDBCUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class User_delete extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        System.out.println(writer);
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn= JDBCUtil.getConnection();
            String sql = "delete from t_user where usename=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,request.getParameter("usename"));
            int count = ps.executeUpdate();
            System.out.println(count);
            if (count==1){
                writer.print("<h2>删除成功</h2>");
            }else {
                writer.print("<h2>删除失败</h2>");
            }
            response.setContentType("text/html;charset=utf-8");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.Close(conn,ps,rs);
            writer.close();
        }
    }
}

用户注册:

package com.ning;

import com.ning.Util.JDBCUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class User_add extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        //usename=xiaoqiu&password=12131&email=1213&sex=%E7%94%B7
        String usename = request.getParameter("usename");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        String sex = request.getParameter("sex");
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs=null;
        PrintWriter writer = response.getWriter();
        try {
            /*
            为了避免设置了用户名唯一报错,应该先查询数据库中有没有usename=?的用户,有的话则像前端返回该用户已存在
            数据库中没有这条数据则进行插入操作
             */
            conn = JDBCUtil.getConnection();
            String sql = "select * from t_user where usename = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,usename);
            rs = ps.executeQuery();
            if (rs.next()){
                writer.print("<h2>用户已存在</h2>");
            }else {
                ps=null;
                String sql1 = "insert into t_user(usename,password,email,sex) values(?,?,?,?)";
                ps = conn.prepareStatement(sql1);
                ps.setString(1,usename);
                ps.setString(2,password);
                ps.setString(3,email);
                ps.setString(4,sex);
                int count = ps.executeUpdate();
                if (count == 0){
                    writer.print("<h2>注册失败</h2>");
                }else{
                    writer.print("<h2>注册成功</h2>");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.Close(conn,ps,rs);
        }
    }


}

用户登录:

package com.ning;

import com.ning.Util.JDBCUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class User_login extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        String usename = request.getParameter("usename");
        String password = request.getParameter("password");
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtil.getConnection();
            String sql = "select * from t_user where usename=? and password=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,usename);
            ps.setString(2,password);
            rs = ps.executeQuery();
            if (rs.next()){
                response.getWriter().print("<h2>登录成功</h2>");
            }else{
                response.getWriter().print("<h2>登录失败,请重新输入或者注册账号</h2>");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

JDBC工具类:

package com.ning.Util;

import java.sql.*;

public class JDBCUtil {
    private JDBCUtil() {
    }
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ning?serverTimezone=UTC","root","");
    }
    public static void Close(Connection conn, Statement ps, ResultSet rs) {
        if (rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (ps!=null) {
            try {
                ps.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

关于Http不同的状态码

组成100---599; 分为5个大类

 1XX :

最有特征100;通知浏览器本次返回的资源文件

并不是一一个独立的资源文件,需要浏览器在接收

响应包之后,继续向Ettp服务器所要依赖的其他资源文件

2xx:

最有特征200,通知浏览器本次返回的资源文件是一个

完整独立资源文件,浏览器在接收到之.后不需要所要

其他关联文件

3xx:

最有特征302,通知浏览器本次返回的不是一个资源文件内容

而是一一个资源文件地址,需要浏览器根据这个地址自动发起

请求来索要这个资源文件

response. sendRedirect ("资源文件地址")写入到响应头中location

而这个行为导致Tomcat将302状态码写入到状态行

4xx:

404:通知浏览器,由于在服务端没有定位到被访间的资源文件

因此无法提供帮助

405:通知浏览器,在服务端已经定位到被访问的资源文件(serviet)

但是这个servlet对于浏览器采用的请求方式不能处理

5xx:

500:

通知浏览器,在服务端已经定位到被访问的资源文件( servlet )

这个servlet可以接收浏览器采用请求方式,但是servlet在处理

请求期间,由于Java异 常导致处理失败

 

多个Servlet之间的调用规则

如果要访问多个Servlet,不可能用户每次都去操作,可以采用重定向,以及请求转发这两种方案

重定向解决方案:

1.工作原理:用户第一次通过[手动方式]通知浏览器访问oneservlet.Oneservlet.工作完毕后,将Twoservlet地址写 入到响应头location属性中,

导致Tomcat将302状态码写入到状态行。在浏览器接收到响应包之后,会读取到302状态。

此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务

2.实现命令;

String address="http://www.baidu.com";

response.sendRedirect(address);

将地址写入到响应包中响应头中location属性

3.特征:

1)请求地址:

既可以把当前网站内部的资源文件地址发送给浏览器(I/网站名/资源文件名)

也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)

2)请求方式:get

3)次数:至少需要两个Http请求协议包

4.缺点:

重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间

消耗在往返次数上,增加用户等待服务时间

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

请求转发方案:

1.工作原理:

用户第一次通过[手动方式]通知浏览器访问oneservlet.Oneservlet.工作完毕后,请求转发转到另一个资源文件

2.实现命令:

request.getRequestDispatcher("/two").forward(request,response);

3.特征:

1)请求次数

在请求转发过程中,浏览器只发送一 次请求

2)请求地址

只能向Tomcat服务器申请调用当前网站下资源文件地址

request . getRequestDispathcer("/资源文件名")

****不要 写网站名****

3)请求方式

在请求转发过程中,浏览器只发送一一个了个Http请求协议包.

参与本次请求的所有servlet共享同一个请求协议包,因此

这些servlet接收的请求方式与浏览器发送的请求方式保持一致

4)优缺点

优点:减少了服务器与浏览器交互的次数效率提高

缺点:增加了服务器的压力

 

多个Servlet实现数据共享

多个Servlet实现数据共享的方式: 

一、ServletContext(全局作用域对象)类似留言板(键值对模式)

工作原理:

每一个网站都存在-一个全局作用域对象。这个全局作用域对象[相当于] -一个Map.在这个网站中oneservlet可以将一-个数据存入到全局作用域对象,当前网站中其他servlet此时都可以从全局作用域对象得到这个数据进行使用

全局作用域对象生命周期:

1)在Http服务器启动过程中,自动为当前网站在内存中创建

一个全局作用域对象

2)在Http服务器运行期间时,--个网站只有一一个全局作用域对象

3)在Http服务器运行期间,全局作用域对象一直处于存活状态

4)在ettp服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理

**全局作用域对象生命周期贯穿网站整个运行期间**

3.实现命令

//首先向Tomcat拿到这个全局作用域对象,通过调用serAttribute方法以键值对的形式向里面存放数据

ServletContext application = request.getServletContext();

application.setAttribute("key1","你是一个小傻瓜");

//同样先拿到全局作用域对象,然后调用getAttribute方法通过key来得到value

ServletContext application = request.getServletContext();

Object value = application.getAttribute("key1");

 

二、Cookie

实现命令:

//新建Cookie对象,key-value且都一定要为字符串

          Cookie card1 = new Cookie("usename",usename);

          Cookie card2 = new Cookie("money",money);

//把新建的Cookie对象添加到响应体中

          response.addCookie(card1);

          response.addCookie(card2);

 

//其他类访问Cookie(第一次访问时,注册会员并且把会员卡返回给用户(浏览器),过了一段时间再次访问时,发起请求时,请求体内携带Cookie数据)

Cookie []cookieArrays = request.getCookies();

//遍历Cookie数组得到每个Cookie的名字和值

 for (Cookie card : cookieArrays){

            String name = card.getName();

            String value = card.getValue();

}

 

Cookie的生命周期

默认情况下Cookie存储在浏览器的缓存中,浏览器关闭,Cookie自动清楚,也可以将Cookie存储在硬盘中

实现命令

        cookie.setMaxAge(60);(设置该Cookie对象的存活时间,参数的单位是秒)

缺点:

一个Cookie对象只能存储一个共享数据,而且数据类型单一(String)

三、HttpSession接口(会话域作用对象)

实现命令

OneServlet{

    HttpSession session = request.getSession();

    session.setAttribute("goodsname",goodsname);//插入共享数据

}

TwoServlet{

HttpSession session = request.getSession();

String value = (String) session.getAttribute("goodsname");//获得共享数据

}

四、HtppServletRequert接口

请求转发的两个Servlet之间可以通过

OneServlet {
           request.setAttribute("goodsname",goodsname);插入数据

request.getRequestDispatcher("/two").forward(request,response); //请求转发

}

TwoServlet{

String value = (String) request.getAttribute("goodsname");

 }

 

监听器

监听器:

功能:主要是监听作用域对象何时创建,何时销毁以及共享数据的变化

作用域对象分为:

全局作用域对象

会话作用域对象

请求作用域对象

实现方法

1.new 一个类 实现监听器接口

2.重写接口实现类的方法

3.将这个类注册到Htpp服务器中

在Tomcat中在一个web工程的web.xml文件中配置如下属性即可

<--!

将类注册到Htpp服务器中

-->

<listener>

        <listener-class>com.xiaoqiu.listener.OneListener</listener-class>

</listener>

全局作用域对象的监听器
	new 一个类实现 ServletContextListener接口
	 @Override
	    public void contextInitialized(ServletContextEvent sce) {//全局作用域被创建时会自动调用该方法输出hello
	        System.out.println("hello");
	    }
	
	    @Override
	    public void contextDestroyed(ServletContextEvent sce) {//全局作用域被销毁时会自动调用该方法输出bye
	        System.out.println("bye");
	    }
	new 一个类实现ServletContextAttributeListener接口
	  public void attributeAdded(ServletContextAttributeEvent scae) {//增加新元素时
	        System.out.println("添加----");
	    }
	
	    @Override
	    public void attributeRemoved(ServletContextAttributeEvent scae) {//移除一个元素时
	        System.out.println("移除----");
	    }
	
	    @Override
	    public void attributeReplaced(ServletContextAttributeEvent scae) {//更新一个元素时
	        System.out.println("更新---");
	    }

通过监听器提升程序的运行速度

一般连接数据库的时候创建connection对象和销毁connection对象比较消耗时候

采用在全局域监听器,在网站启动的时候创建多个Connection对象,用Map来存储,Map(该对象的存储位置,true/false)是否为可用状态

 

过滤器

Filter(过滤器)接口

作用:

1)拦截Http服务器,帮助8ttp服务器检测当前请求合法性

2)拦截Ettp服务器,对当前请求进行增强操作

Filter接口实现类开发步骤:三步

1)创建-一个Java类实现rilter接口

2)重写Filter接口中doFilter方法

3)web.xml将过滤器接口实现类注册到http服务器

web.xml

 <filter>

        <filter-name>OneFilter</filter-name>

        <filter-class>com.xiaoqiu.OneFilter</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>OneFilter</filter-name>

        <url-pattern>/mm.png</url-pattern>

    </filter-mapping>

 

Filter接口的实现类:

	package com.ning;
	
	import javax.servlet.FilterChain;
	import javax.servlet.ServletException;
	import javax.servlet.ServletRequest;
	import javax.servlet.ServletResponse;
	import java.io.IOException;
	import java.io.PrintWriter;
	
	public class OneFilter implements javax.servlet.Filter {
	    @Override
	    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
	        String age = servletRequest.getParameter("age");
	        if (Integer.parseInt(age)<70){
	            filterChain.doFilter(servletRequest,servletResponse);//放行
	        }else {
	//进行拦截
	            servletResponse.setContentType("text/html;charset=utf-8");
	            PrintWriter writer = servletResponse.getWriter();
            writer.print("<h1>你不行</h1>");
        }
    }
}

 

过滤器的地址栏 

<url-pattern></url-pattern>

3)要求Tomcat在调用某-一个具体文件之.前, 来调用oneFilter拦截

<url-pattern>/ img/ mm. jpg</url -pattern>

4)要求Tomcat在调用某一一个 文件夹下所有的资源文件之前,来调用oneFilter拦截

<url -pattern>/ img/* </url -pattern>

5)要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截

<url-pattern>* . jpg</url -pattern>

6)要求Tomcat在调用网站中任意文件时,来调用oneFilter拦截

<url -pattern>/*</url -pattern>

 

防止恶意登录

恶意登录指的是用户绕过登录界面直接进入其他页面如(index.html)

在登录界面的时候登录成功

HttpSession session = request.getSession();(创建一个柜子)

再进行其他操作时HttpSession session = request.getSession(false);看柜子是否是空的null如果是空的则不进行服务

(这个方法不能对静态文件进行保护,而且开发难度大每一个动态文件都需要先确认是否合法)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

通过过滤器进行防止恶意登录

登录成功时HttpSession session = request.getSession();(创建一个柜子)这样会出现一个问题谁都无法正常访问了

需要对地址栏的url进行一个分开处理,如果是与login相关的请求则调用dofilter方法放行(欢迎资源文件的时候也需要,默认是login.html)

否则拒绝访问

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XUN~MLF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值