前面2篇关注的都是Servlet接口,在实际编码中一般不直接实现这个接口,而是继承HttpServlet类。因为j2e的包里面写好了GenericServlet和HttpServlet类来让我们简化编码了,具体的使用了模板模式。





以下代码贴出一个比较简单的自己的Servlet,以后的内容直接不在赘述Servlet接口,直接针对HttpServlet这个类来说。

package linkin;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LinkinServlet extends HttpServlet
{ /**
*
*/
private static final long serialVersionUID = 1L; @Override
public void init() throws ServletException
{
System.out.println("init...");
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter(); out.write("梦似烟花心似水,同学少年不言情。。。");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
this.doGet(req, resp);
} }
<?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>
<servlet-name>LinkinServlet</servlet-name>
<servlet-class>linkin.LinkinServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>LinkinServlet</servlet-name>
<url-pattern>/LinkinServlet</url-pattern>
</servlet-mapping> </web-app>

关联前面写的针对Servlet接口的2篇,这里有几点说明:

1,在前面我们自己写Servlet的时候,处理请求的时候实现Service()就好。这里并没有去重写Service()方法,而是重写doGet和doPost2个方法,在HttpServlet抽象类中,已经实现了Service方法了,在有请求进来Servlet的时候首先从请求中获取到请求提交的方式,比如说get方式或者post方式,在调用相关的doXXX方法。所以我们直接重写doGet和doPost方法就好。通常来说在doGet和doPost中实现一个就够了,然后在另外一个方法中this打点调一下实现的那个就OK。

以下贴出HttpServlet的Service源码。

//这里使用try,catch来处理强转问题。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
try
{
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
}
catch (ClassCastException e)
{
throw new ServletException("non-HTTP request or response");
}
service(request, response);
} protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
String method = req.getMethod(); if (method.equals("GET"))
{
doGet(req, resp);
}
else if (method.equals("POST"))
{
doPost(req, resp);
}
....method...
else
{
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(501, errMsg);
}
}

那么问题来了:假如,我说假如在自己的类中重写了service()方法,然后又重写了doGet()和doPost()方法,那么到底调用那个呢?

其实这个问题并不是j2e领域的知识,这是java面向对象的问题,答案很明显,如果出现上面那种情况,doGet()和doPost()2个方法肯定就不起作用了,而是直接使用service()方法来处理请求了。因为在HttpServlet类中已经将service实现了,这个方法的主要功能就是区分不同的请求类型的,然后根据不同的请求类型来调用相应的doXXX方法,世界上Servlet程序本身就是java模板设计模式的应用。



2,在前面一篇博客,我们通过ServletConfig接口和ServletContent接口来获得Servlet的初始化信息,当时直接在init()方法中就可以拿到config那个对象。那么现在我自己写的类不是事先Servlet接口而是继承HttpServlet的话,应该如何办呢?首先我们不改init(ServletConfig config)方法来看看发生了什么。

方法如下:

@Override
public void init(ServletConfig config) throws ServletException
{
System.out.println(config.getInitParameter("name"));
}

OK,没有问题,但是我们知道我们在继承HttpServlet后一般都不是来重写这个方法了,因为GenericServlet中已经实现了一个getServletConfig()方法了,OK,那我现在想要在doGet中取下初始化信息,看看有没有问题:

代码如下:

@Override
public void init(ServletConfig config) throws ServletException
{
System.out.println(config.getInitParameter("name"));
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
this.getServletConfig().getInitParameter("name");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter(); out.write("梦似烟花心似水,同学少年不言情。。。");
}

访问页面报错500,后台报空指针异常,怎么回事呢?因为在GenericServlet中init(ServletConfig config)这里初始化ServletConfig对象,并且Config是该类的私有成员变量。我们要是自己也重写这个方法,自然会覆盖GenericServlet类中的这个方法,config对象得不到初始化,后面调getInitParameter方法自然报空指针。

那么如何解决呢?

1,以后不用重写init(ServletConfig config)这个方法,要是真的需要自己初始化,直接重写init()方法就好了

2,如果非要重写init(ServletConfig config)这个方法的话,那么请在方法里面的第一行加上一句话:super.init(config);这样子就初始化了GenericServlet类中的config。

Servlet--继承HttpServlet写自己的Servlet的更多相关文章

  1. 最简单的Servlet继承HttpServlet查询数据库登录验证

    <%-- Created by IntelliJ IDEA. User: yunqing Date: 2017-12-06 Time: 9:11 To change this template ...

  2. servlet(1) - 手写第一个servlet程序 - 小易Java笔记

    声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...

  3. Servlet简介与Servlet和HttpServlet运行的流程

    1.Servlet      [1] Servlet简介         > Server + let         > 意为:运行在服务器端的小程序.         > Ser ...

  4. Servlet基础知识(一)——Servlet的本质

    什么是Servlet: Servlet是运行在web服务器端(web容器,如tomcat)的程序,它与Applet相对,Applet是运行在客户端的程序. Servlet的主要作用是处理客户端的请求, ...

  5. BaseServlet 继承 httpServlet

    BaseServlet   核心 package cn.core; import java.io.IOException; import java.lang.reflect.Method; impor ...

  6. java一个类 继承HttpServlet 和实现Servlet区别

    java一个类 继承HttpServlet 和实现Servlet区别 servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法 而HttpServlet实现了servlet接 ...

  7. Servlet课程0424(三) 通过继承HttpServlet来开发Servlet

    //这是第三种开发servlet的方法,通过继承httpservlet package com.tsinghua; import javax.servlet.http.*; import java.i ...

  8. servlet三种实现方式之三通过继承HttpServlet开发servlet

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第三种: import java.io.*; i ...

  9. Servlet-通过继承HttpServlet类实现Servlet程序

    通过继承HttpServlet类实现Servlet程序(开发一般用) 一般在实际项目开发中,都是使用继承 HttpServlet类的方式实现Servlet程序 1,编写一个类去继承 HttpServl ...

随机推荐

  1. 一句话理解字符编码(Unicode ,UTF8,UTF16)

    Unicode和ASCII码属于同一级别的,都是字符集,字符集规定从1到这个字符集的最大范围每个序号都各表示什么意思.比如ASCII字符集中序号65表示"A". 那接下来的UTF8 ...

  2. 【最大流ISAP】洛谷P3376模板题

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  3. 【矩阵快速幂】bzoj1297 [SCOI2009]迷路

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1407  Solved: 1007[Submit][Status ...

  4. 分布式文件系统FastDFS如何做到高可用

    FastDFS是用C语言编写的一款开源的轻量级分布式文件系统.它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的 ...

  5. centos perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql.so: undefined symbol: mysql_init

    之前在安装天兔数据库监控工具lepus的时候,运行时一直报perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql. ...

  6. VirtualBoX虚拟机里安装linux系统,在虚拟系统里安装增强功能报错解决方法

    http://www.cnblogs.com/MoShin/archive/2012/04/25/2469156.html 当我们在虚拟机里安装lixunx系统,避免不了的要安装增强功能,无论是视觉效 ...

  7. 发布到ASP.NET CORE项目到 Windows server 2012

    原文: https://github.com/zeusro/MarkdownBlog/blob/master/2018/2018-01-17-01.md 发布到ASP.NET CORE项目到 Wind ...

  8. Yii2基本概念之——属性(property)

    学习任何一门学问,往往都是从起基本的概念学起.万丈高楼平地起,这些基本概念就是高楼的基石,必须做详尽的分析.我们知道,Yii2是一款脉络清晰的框架,理顺了基础的概念和基本功能,学习更高级和复杂的功能就 ...

  9. faster-rcnn系列笔记(一)

    目录: 1. 序言 2.正文 2.1  关于ROI 2.2  关于RPN 2.3 关于anchor 3. 关于数据集合制作 4. 关于参数设置 5. 参考 1.序言 叽歪一下目标检测这个模型吧,这篇笔 ...

  10. 初识maven及其安装步骤!!

    maven(01)--安装及其介绍   1:下载maven windows下载 2:将下载文件夹解压,然后放在一个安装目录(可任意选择),例如就放在D盘的根目录 然后在设置环境变量,新建一个环境变量, ...