servlet基础及过滤器简介

  1. Servlet是运行在web服务器的Java应用程序,可以生成动态的web页面,属于客户与服务器响应的中间层。Jsp在底层就是一个servlet。
  2. 编写servlet

servlet中的方法有以下几种:


  1. init()方法。
    一个servlet在服务器上最多只会驻留一个实例。所以第一次调用servlet时,将会创建一个实例,在实例化过程中,HttpServlet中的init()方法会被调用,因此可以将一些初始化代码放在该函数内。

  2. doGet()/doPost()/service()方法

    • doGet()方法在以get方式请求servlet时运行。常见get请求方式有链接、get方式的表单提交、直接访问servlet。
    • doPost()方法是在以post方式请求servlet时运行的。常见的post请求为post方式表单提交。
    • 事实上,客户端对servlet发送一个请求过来,服务器端将会开启一个线程,该线程调用service方法,service方法根据收到的客户端的请求类型来决定是调用doGet()方法还是doPost方法,但是一般不用覆盖service()方法,使用doGet()与doPost()方法同样可以达到处理的目的。
    • destory()方法,destory()方法在servlet实例消亡的时候自动调用。在web服务器运行servlet实例的时候,因为一些原因servlet对象会消亡,但是在servlet消亡之前还必须进行某些操作,例如:释放数据库连接以节省资源等,这个时候就需要重写destory()方法。

//让创建的类继承HttpServlet,重写其中的方法。
package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *@author xpengfei
 *@creat  5:17:08 PM   May 16, 2017
 */
public class DealWithServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
//      super.doGet(req, resp);
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
//      super.doPost(req, resp);
        String studentName=req.getParameter("studentName");
        System.out.println("学生姓名:"+studentName);

    }
}
  1. web.xml中servlet的配置,为防止中文乱码问题的出现,可以使用过滤器进行过滤。
    web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>servletLearning</display-name>
  <!-- 设置全局参数,相当于全局变量,所有的servlet都可以访问 -->
  <context-param>
    <!-- 变量名 -->
    <param-name>name</param-name>
    <!-- 变量值 -->
    <param-value>xpf</param-value>
  </context-param>


  <!--      欢迎界面的配置      -->
  <welcome-file-list>
    <!-- 所要设置的欢迎界面  -->
    <welcome-file>validate.jsp</welcome-file>
    <welcome-file>welcome.jsp</welcome-file>
    <welcome-file>Filter.jsp</welcome-file>
  </welcome-file-list>

  <!--          servlet的配置       -->
  <servlet>
    <!--        给servlet取得名字         -->
    <servlet-name>WelcomeToServlet</servlet-name>
    <!--        servlet对应的包名及类名  -->
    <servlet-class>servlet.WelcomeServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <!--        给servlet取的名字     -->
    <servlet-name>WelcomeToServlet</servlet-name>
    <!--    servlet类所在的目录    -->
    <url-pattern>/servlet/WelcomeServlet</url-pattern>
  </servlet-mapping>


  <!-- 配置InitServlet类的servlet -->
  <servlet>
    <servlet-name>Initservlet</servlet-name>
    <servlet-class>servlet.InitServlet</servlet-class>
    <!-- 给该servlet设置局部参数 -->
    <init-param>
        <param-name>nickname</param-name>
        <param-value>fei</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Initservlet</servlet-name>
    <url-pattern>/servlet/InitServlet</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>DealWithServlet</servlet-name>
    <servlet-class>servlet.DealWithServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DealWithServlet</servlet-name>
    <url-pattern>/servlet/DealWithServlet</url-pattern>
  </servlet-mapping>

  <!-- 配置过滤器(过程和配置servlet是一样的,,过滤器也是一种servlet) -->
  <filter>
    <!--  设置过滤器的名字 -->
    <filter-name>EncodingFilter</filter-name>
    <!-- 设置类路径 -->
    <filter-class>servlet.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <!-- 用于指定过滤模式
        1.  *符号代表所有文件
        2. 写出某个servlet或jsp的路径的时候,是过滤那个指定的servlet或者jsp
        3. 写出一个 目录/* 是对指定目录下的所有文件、资源进行过滤
        说明:<url-pattern> 内部如果以/开头,这个/表示的是虚拟目录根目录;
    -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

过滤器代码

package servlet;

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;

/**
 *@author xpengfei
 *@creat  5:28:28 PM   May 16, 2017
 */
public class EncodingFilter implements Filter{
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("utf-8");
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}

过滤器的配置有以下几个步骤


  1. 用元素定义过滤器,该标签下有两个必要元素

    • 元素,用来设定过滤器的名字。
    • 元素,用来设定过滤器的类路径
  2. 用配置过滤器的映射
    在元素中,用来设定过滤器的名字,另外,配置过滤器的映射主要的是元素,用于指定过滤模式。常见的过滤模式有以下三种:

    • 过滤所有文件
 <filter-mapping>
     <filter-name>FilterName</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>
  • 过滤一个或者多个servlet(jsp)
 <filter-mapping>
     <filter-name>FilterName</filter-name>
     <url-pattern>要过滤的servlet或jsp的路径</url-pattern>
 </filter-mapping>

<filter-mapping>
     <filter-name>FilterName</filter-name>
     <url-pattern>要过滤的servlet或jsp的路径</url-pattern>
 </filter-mapping>
  • 过滤一个或者多个文件目录
<filter-mapping>
     <filter-name>FilterName</filter-name>
     <url-pattern>要过滤的文件路径</url-pattern>
 </filter-mapping>
//下面的代码是过滤path目录下的所有资源
<filter-mapping>
     <filter-name>FilterName</filter-name>
     <url-pattern>/path/*</url-pattern>
 </filter-mapping>

原文地址:https://www.cnblogs.com/xpfei/p/7450804.html