servlet、过滤器、生命周期

servlet是在jsp技术出来之前用来动态生成web页面的,它与jsp的区别在于 jsp是html嵌套java代码,而servlet是java代码嵌套html。所以一般重定向到验证登陆等,都推荐用servlet。不建议用jsp。
servlet是server以及applet两个单词的合成,所以它是一种服务器端的java应用程序。但并不是所有服务器端的java的应用程序都是servlet。只有当服务器端配置使用Servlet API时,才能算是一个Servlet。
名称说明    所在包
Servlet接口Java Servlet的基础接口,定义了Servlet必须实现的方法javax.servlet
GenericServlet类继承自Servlet接口,属于通用的,不依赖于协议的Servletjavax.servlet
HttpServlet类继承自GenericServlet类,是在其基础上扩展了HTTP协议的Servletjavax.servlet.http
HttpServletRequest接口继承自ServletRequest接口,用于获取请求数据javax.servlet.http
HttpServletResponse接口继承自ServletResponse接口,用于返回相应数据javax.servlet.http
那么下面就开始创建servlet,在myeclipse和idea里面可以直接创建servlet,不必要冲动去当前web下面的xml里手动创建

那么运行servlet有两个步骤,第一创建servlet并写入判断方法,第二在对应目录下web.xml里面写入配置

第一步,创建servlet    
idea创建页面

必须实现doPost和doGet的方法,从字面意思来理解, post就是form表单中method的提交方式doPost就是获取提交方式为Post的值。一般来说我们都是直接在 d oGet的方法不写任何东西,直接调用doPost的方法,如:
index.html页面:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action=" /servlet/loginServlet" method="get">  <!-- 这里跳转的servlet的地址,xml里面的地址。若myeclipse则需要的地址为 /项目名/servlet/LoginServlet 项目名前面的"/"不能去掉,否则报错。idea则不需要添加项目名 -->
    <p>用户名:<input type="text" name="user"></p>
    <p>密码:<input type="password" name="pwd"></p>
    <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

loginServlet页面:
public class loginServlet extends HttpServlet { <!-- 我创建一个叫MyServlet的Servlet-->
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String name=request.getParameter("user");
    String pwd=request.getParameter("pwd");
    User user=new User(name,pwd);
    UserDao ud=new UserDao(); <!--实例化这个对象,里面有一个返回布尔值的方法,用来判断该用户的用户名和密码-->
    if(ud.panDuan(user)){  <!--该方法是若用户是admin且密码为123456那么返回true,否则false-->
            response.sendRedirect(" /servlet/goodsServlet");  <!-- 跳转到该servlet里xml的地址-->
     }else{
        response.sendRedirect("../index.html");        
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
    }
}
GoodsServlet的页面:
public class GoodsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        GoodsDao gd=new GoodsDao();<!--该对象的方法存储有多条数据-->
        List<Goods> lg= gd.catchList();  <!--把多条数据存入集合-->
        request.getSession().setAttribute("goodsl",lg);  <!-- request.getSession就等于当前的Session对象,再通过其存放数据-->
        response.sendRedirect("../bb.jsp"); <!--重定向到显示页面-->
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
由于表单中若不设置method属性,会默认采用get提交。而且这样就可以直接写一次代码,两个提交方式都能使用了。
第二步,web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!-- 绿色底色的是一个完整的servlet,每次新建完项目后,必须在这里添加对应的servlet-->
<!-- 若myeclipse则会自动生成下面代码,idea不会,若修改和删除Servlet文件,那么xml的文件是不会自动修改的,需要自己手动修改-->
 <servlet>      <!--这是第一个Servlet的配置,每个Servlet的配置都不同,这是loginServlet的配置--> 
        <!-- servlet的内部名称,自定义。尽量有意义 -->
        <servlet-name>loginServlet</servlet-name>
        <!-- servlet的类全名: 包名+简单类名 -->
        <servlet-class>com.bdqn.servlet.loginServlet</servlet-class>
    </servlet>
    <!-- servlet的映射配置 -->
    <servlet-mapping>
        <!-- servlet的内部名称,一定要和上面的内部名称保持一致!-->
        <servlet-name>loginServlet</servlet-name>
        <!-- servlet的映射路径(访问servlet的名称) -->
        <url-pattern> /servlet/loginServlet </url-pattern>
    </servlet-mapping>

<servlet>    <!--这是第二个Servlet的配置,每个Servlet的配置都不同,这是goodsServlet的配置 -->  
        <!-- servlet的内部名称,自定义。尽量有意义 -->
        <servlet-name>goodsServlet</servlet-name>
        <!-- servlet的类全名: 包名+简单类名 -->
        <servlet-class>com.bdqn.servlet.GoodsServlet</servlet-class>
    </servlet>
    <!-- servlet的映射配置 -->
    <servlet-mapping>
        <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
        <servlet-name>goodsServlet</servlet-name>
        <!-- servlet的映射路径(访问servlet的名称) -->
        <url-pattern>/servlet/goodsServlet</url-pattern>
    </servlet-mapping>

    </web-app>

bb.jsp的页面
<%--
  Created by IntelliJ IDEA.
  User: 78241
  Date: 2018/7/6
  Time: 14:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p>登陆成功</p>
    <c:forEach var="dd" items="${goodsl}" varStatus="num">  <!--使用JSTL和EL表达式混合遍历显示传过来的集合-->
        编号:${dd.goodsNum} 商品名称:${dd.goodsName} 商品价格:${dd.price} <br>
    </c:forEach>
</body>
</html>

过滤器filter

过滤器的工作原理:
1.用户访问web资源时,发送的请求会先经过过滤器
2.由过滤器怼请求数进行过过滤处理
3.经过过滤的请求数据被发送至目标资源进行处理
4.目标资源处理后的响应被发送到过滤器
5.经过过滤器的过滤后,将相应返回给客户端

过滤器可以存在多个,若有多个,顺序是从上往下依次执行,谁在xml文件里靠上的,谁就先运行。
过滤器的创建步骤 :
1.为了规范在项目里面新建对应的filter包,里面创建一个java文件。该文件实现Filter(位于javax.servlet包)
import javax.servlet.*;
import java.io.IOException;
public class Myfilter implements Filter {   <--!实现Filter-->
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {  <!--过滤器的初始化-->
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { <!--过滤器的执行过滤,下面的代码是处理中文乱码问题的方法之一-->
        servletRequest.setCharacterEncoding("UTF-8");  
        servletResponse.setCharacterEncoding("UTF-8");
        System.out.print("经过过滤器了");
        filterChain.doFilter(servletRequest,servletResponse);  <!--这句话必须要有,其原因是这代码就是过滤器过滤的操作, 通过该方法设置了编码格式之后再用doFilter方法把request和response传进去,让程序继续往下执行-->
    }
    @Override
    public void destroy() {  <!--过滤器的销毁-->
    }
}
2.与servlet一样,也必须在xml里面进行配置,在web-app标签的范围内写入下面的代码
<filter>
        <!-- Filter的名字 -->
        <filter-name> myfilter</filter-name>  <!-- 自己起过滤器的名字-->
        <!-- Filter的实现类 -->
        <filter-class>com.bdqn.filter.Myfilter</filter-class>  <!-- 过滤器的位置-->
    </filter>
    <!-- 定义Filter拦截的URL地址 -->
    <filter-mapping>
        <!-- Filter的名字 -->
        <filter-name> myfilter</filter-name> <!-- 与上面自己其的过滤器名字必须一致-->
        <!-- Filter负责拦截的URL -->
        <url-pattern>/*</url-pattern>  <!--现在使用过的是全部匹配,即所有web资源都会被过滤器过滤-->
                                                            <!--精准匹配 里面的"/*"修改成对应的web名称-->
                                                            <!--目录匹配,例:/admin/* 这代表着admin目录下的所有web项目都被过滤--> 
                                                            <!--扩展名匹配  *.XX扩展名--> 

    </filter-mapping>
完成了上面步骤之后,系统就会自动给调用相应的过滤器执行过滤功能。

生命周期:

当我们的web项目首次被访问时是不会创建servlet的。当需要调用该servlet时,该servlet才会被创建。之后该servlet的生命周期是从被创建到服务器关闭。
这个servlet与filter(监听器)的生命周期如下:
init() →这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。
service() →判断表单提交的方式是get还是post,并且创建doget() 和dopost()
destroy()→当程序死亡时运行,意思时销毁该程序,结束生命周期
注意:init与destroy只执行一次。例如servlet容器会查找对应servlet,若没有则创建,若有则直接引用。destroy同理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值