ServletDemo

1、 Servlet 接口

 

继承 Servlet 接口,实现Servlet 接口的 所有抽象方法!

实现类代码

package xw.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletInterfaceDemo implements  Servlet {
    //继承 Servlet 接口,实现接口中所有的抽象方法 总共五个, 如果不实现,那么该类就要定义为抽象类 

    
    public void destroy() {
        System.out.println("destory()...");
    }
    /*
     * 可以用来获取Servlet的配置信息
     */
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig()...");
        return null;
    }
    /*
     * 获取Servlet的信息
     */
    public String getServletInfo() {
        System.out.println("getServletInfo()...");
        return "我是一个快乐的Servlet";
    }
    /*
     * 它是生命周期方法
     * 它会在Servlet对象创建之后马上执行,并只执行一次!(出生之后)
     * 
     */
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init()...");        
        /*
         * 获取初始化参数
         */
        System.out.println(servletConfig.getInitParameter("p1"));
        System.out.println(servletConfig.getInitParameter("p2"));        
        /*
         * 获取所有初始化参数的名称
         */
        Enumeration e = servletConfig.getInitParameterNames();
        while(e.hasMoreElements()) {
            System.out.println(e.nextElement());
        }
    }
    /*
     * 它是生命周期方法
     * 它会被调用多次!!!
     * 每次处理请求都是在调用这个方法!
     */
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {
        System.out.println("service()...");
    }
}

 

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">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>servletInterfaceDemo</servlet-name>
    <servlet-class>xw.servlet.ServletInterfaceDemo</servlet-class>    
        <init-param>
            <param-name>p1</param-name>
            <param-value>v1</param-value>
        </init-param>
        <init-param>
            <param-name>p2</param-name>
            <param-value>v2</param-value>
        </init-param>    
  </servlet>
  <servlet-mapping>
    <servlet-name>servletInterfaceDemo</servlet-name>
    <url-pattern>/servlet/ServletInterfaceDemo</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
web.xml

 

访问路径:http://localhost:8080/JavaWebTest/servlet/ServletInterfaceDemo

显示效果:

 

2、GenericServlet 抽象类

模拟 GenericServlet

通过两个servlet 类,模拟  GenericServlet 实现原理

 

package xw.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * 模拟GenericServlet,理解 GenericServlet 类的内部实现原理
 *
 */
public class AGenericServlet implements Servlet {
    //GenericServlet类内部定义 一个ServletConfig 类型的 config 属性
    //类继承了GenericServlet 类之后,可以直接使用 ServletConfig类的config 对象
    private ServletConfig config;
        
    /*
     * 需要就写,不需要就不写
     */
    public void destroy() {
        System.out.println("啊~我要死了!");
    }

    /*
     * 请放心,这个方法一定会在init()方法之后被调用!
     * init()被调用后,本类的成员this.config已经有值了!
     */
    public ServletConfig getServletConfig() {
        return this.config;
    }

    /*
     * 没有用的东西,爱实现不实现
     */
    public String getServletInfo() {
        return "我是一个快乐的Servlet";
    }

    /*
     * 由Tomcat来调用,并且只调用一次
     * 它是这些方法中第一个被调用的,它会在构造器之后马上被调用!
     */
    public void init(ServletConfig config) throws ServletException {
        // 把tomcat传递的Servletconfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他方法中使用!
        this.config = config;
        init();
    }
    
    /*
     * 这个方法是本类自己定义的!不是Servlet接口中的方法
     */
    public void init() {
    }

    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        /*
         * 这里是否可以使用ServletConfig的成员呢?
         */
        System.out.println("每次处理请求都会被调用!");
    }
    
    public ServletContext getServletContext() {
        return config.getServletContext();
    }
    
    public String getServletName() {
        return config.getServletName();
    }
    
    public String getInitParameter(String name) {
        return config.getInitParameter(name);
    }

}

实现类 ,继承 模拟的GenericServlet

package xw.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class BGenericServlet extends AGenericServlet {
    public void init() {
        System.out.println("哇~~~~,很高兴啊~~~");
    }    
    
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        String value = getInitParameter("p1");
        System.out.println("重写父类service 方法!");
    }
}
   <servlet>
    <servlet-name>BGenericServlet</servlet-name>
    <servlet-class>xw.servlet.BGenericServlet</servlet-class>      
  </servlet>
  <servlet-mapping>
    <servlet-name>BGenericServlet</servlet-name>
    <url-pattern>/servlet/BGenericServlet</url-pattern>
  </servlet-mapping>
Web.xml

访问地址:

显示效果:

 

继承 GenericServlet

package xw.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CGenericServlet extends GenericServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("哈哈哈~我来也!");
    }
    
    /*
     * 查看帮助文档 GenericServlet 类为抽象类,类中唯一的抽象方法为 service,必须重写。
     * */
    @Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        System.out.println("hello world");
    }

    @Override
    public void destroy() {
        System.out.println("destory()");
    }
}

显示效果如下:

 

2、HttpServlet 抽象类

package xw.servlet;


import java.io.IOException;

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


public class DHttpServlet extends HttpServlet {
    /*
     *HttpServlet 是抽象类,类中没有抽象方法,extends 自  GenericServlet
     *抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
                如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过
     */
    
    //httpServlet 是高效的,线程不安全的,每次请求服务器都会开启一个线程。
    //但是如果,该类中,只有get读方法,没有set写方法,也不会出现 ,线程安全问题。 高手的写法。 但是,最好还是都写出局部变量
    private User user = new User(); 
    @Override
    public void init() throws ServletException { 
        System.out.println("hello --> world!");
    }
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doGet()...");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doPost()...");
    }

}

 

 

访问页面 login.html:

<!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>
    <form action="/JavaWebTest/servlet/DHttpServlet" method="post">
     <input type="submit" value="提交"/>
    </form>
</body>
</html>

 

显示效果:

posted on 2015-10-29 18:22  weiqinshian  阅读(298)  评论(0编辑  收藏  举报