web.xml里的Servlet和Filter示例

来源:互联网 发布:蒙泰端口设置 编辑:程序博客网 时间:2024/05/21 05:05

项目结构:

src--com.xx(package)    --FilterDemo    --ServletDemoWebRoot--index.jsp--login.jsp--fail.jsp--WEB-INF    --web.xml

首先配置web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <display-name></display-name>   <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list><!--配置Servlet-->  <servlet>  <!--给你的servlet起名字,任意的(不知道为什么我用servlet01一直在报错)-->    <servlet-name>hi</servlet-name>    <!--指明servlet的路径,包名+类名 注意类名后不能加上java-->    <servlet-class>com.xx.Servlet01</servlet-class>  </servlet>  <servlet-mapping>  <!--mapping  自然就是映射了  于是乎 这个同上,一致-->    <servlet-name>hi</servlet-name>    <!--这是浏览器中输入的访问该servlet的url 任意的-->    <url-pattern>/sb</url-pattern>  </servlet-mapping>  //总的也就是说一个叫hi的servlet,出生在servlet-class这里,浏览器想找他玩,只能在url-pattern这里 <!--配置Filter筛选器-->   <filter>   <!--用于为过滤器指定一个名字,该元素的内容不能为空-->    <filter-name>filterDemo</filter-name>    <!--此元素用于指定过滤器的完整的限定类名-->    <filter-class>com.xx.FilterDemo</filter-class>  </filter>  <filter-mapping><!--映射过滤器-->    <filter-name>filterDemo</filter-name>    <!--“/*”表示拦截所有的请求 -->    <!--这里拦截的是:.../项目名/index.jsp,    如果拦截到会转入com.xx.FilterDemo的service()方法执行相应操作 -->    <url-pattern>/index.jsp</url-pattern>    <!--指定过滤器所拦截的资源被 Servlet 容器调用的方式,    可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。    用户可以设置多个<dispatcher> 子元素用来指定 Filter    对资源的多种调用方式进行拦截。-->    <dispatcher>REQUEST</dispatcher>  </filter-mapping></web-app>

子元素可以设置的值及其意义:
1. REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。\
2. INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
3. FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
4. ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

servlet就存在一个web容器里,是一个java对象,但容器里有多个servlet,每个servlet对http请求的处理方式都不同,所以要在web.xml里告诉Tomcat本web Project需要用到的是哪个servlet。

Servlet01.java

package com.xx;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** * 开发servlet有三种方法,一种是实现servlet接口,一种是继承GernericServlet  还有一种是继承HttpServlet。 *  *///这是我的第一个Servlet 使用实现Servlet接口的方式来开发public class Servlet01 implements Servlet{    // 销毁servlet实例(释放内存)    // 1 reload 该servlet(webApp)    // 2 关闭Tomcat 或者说 关机之后 都会调用这个函数    public void destroy() {        System.out.println("distory servlet...");    }    // 用于得到servlet配置文件 与生命周期无关    public ServletConfig getServletConfig() {        return null;    }    public String getServletInfo() {        return "servlet info.";    }    // 该函数用于初始化该servlet, 类似于我们的类的构造函数    // 该函数只是会被调用一次, 当用户第一次访问该servlet的时候被调用    public void init(ServletConfig arg0) throws ServletException {        System.out.println("init servlet...");    }    // service 函数用于处理业务逻辑    // 程序员应当把业务逻辑代码写在这里    // 该函数在用户每次访问servlet的时候都会被调用    // ServletRequest 对象用于获得客户端信息,ServletResponse 对象用于向客户端返回信息(客户端可以理解为浏览器)    // servelt jsp b/s    public void service(ServletRequest request, ServletResponse response)            throws ServletException, IOException {        System.out.println("service servlet...");        PrintWriter pw = response.getWriter();        pw.println("I am ServletDAD!");    }}

FilterDemo

package com.xx;import java.io.IOException;import java.lang.ProcessBuilder.Redirect;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 FilterDemo implements Filter {    public void destroy() {        System.out.println("distory filter...");    }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("Filter excute before");        /*         * 重定向到fail.jsp,但要配合web配置里的dispatcher一起;         * 因为直接访问index.jsp还是会跳转到login.jsp(index里转发),拦截不到         */        request.getRequestDispatcher("fail.jsp").forward(request, response);        chain.doFilter(request, response);        System.out.println("Filter excute after");    }    public void init(FilterConfig arg0) throws ServletException {        System.out.println("init filter...");    }}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="This is my page">    <!--    <link rel="stylesheet" type="text/css" href="styles.css">    -->  </head>  <body>    This is my JSP page. <br>  </body>  <jsp:forward page="login.jsp"></jsp:forward></html>

fail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>    <font color="red">Sorry</font>,没有${username }这个用户!    <br />    <a href="login.jsp">重试一下!</a></body></html>

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>登录界面</title>  </head>  <body>    <form method="post">        <table>            <tr>                <td colspan="2" class="title"><span>Login Test Page</span></td>        </tr>        <tr>            <td class="left">username:</td>            <td><input type="text" name="username" />        </tr>        <tr>            <td class="left">password:</td>            <td><input type="text" name="password" /></td>        </tr>        <tr class="center">            <td colspan="2"><input type="submit" value="登录" />&nbsp;&nbsp;&nbsp;        </tr>        </table>    </form>  </body></html>
原创粉丝点击