Servlet--继承HttpServlet写自己的Servlet

原创 2015年07月07日 21:29:48
前面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——简单用户登录实例+http协议解析

本文写了一个简单的用户登录,并且介绍了http协议,主要介绍了http消息头和响应头。最后介绍了几个使用http响应头的例子。...
  • ggGavin
  • ggGavin
  • 2016年04月22日 13:54
  • 6214

Servlet--HttpServlet实现doGet和doPost请求的原理

Servlet--HttpServlet实现doGet和doPost请求的原理 一、HttpServlet简介 1、HttpServlet是GenericServlet的子类,又是在G...
  • m0_38039437
  • m0_38039437
  • 2017年07月17日 19:06
  • 2912

Servlet--HttpServlet类

HttpServlet类 定义 public class HttpServlet extends GenericServlet implements Serializable 这是一个抽象类...
  • u011794238
  • u011794238
  • 2015年06月15日 14:36
  • 815

HttpServlet 详解(基础)

HttpServlet详解大家都知道Servlet,但是不一定很清楚servlet框架,这个框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在javax...
  • FANGAOHUA200
  • FANGAOHUA200
  • 2016年11月04日 12:26
  • 574

HTTP Servlet 重要的几个方法

HTTP Servlet继承了GencenServlet类    GencenServlet实现了两个接口··一个用于ServletConfig设置接口,一个为Servlet接口只要是(1) init...
  • besttaling
  • besttaling
  • 2009年10月27日 16:10
  • 12327

GenericServlet 、Servlet和httpServler他们之间的关系

1、GenericServlet类是所有Servlet类的祖先类。       2、HttpServlet类继承了GenericServlet类。       3、Servlet有两个非常重要的的对象...
  • u010108195
  • u010108195
  • 2016年03月31日 19:39
  • 2050

HttpServletRequest应用_李晖晖的个人总结(第五次课)

深入体验JavaWeb开发内幕——关于HttpServletRequestRequest对象 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP...
  • redarmy_chen
  • redarmy_chen
  • 2012年11月07日 13:07
  • 39200

给HttpServlet导入jar包

参考文章:http://www.cfanz.cn/index.php?a=read&c=article&id=52285 --------------------------------------...
  • friendan
  • friendan
  • 2013年06月11日 23:54
  • 56676

httpServlet,GenericServlet,Servlet源码分析

httpServlet源码: /* * Licensed to the Apache Software Foundation (ASF) under one or more * cont...
  • kyi_zhu123
  • kyi_zhu123
  • 2016年09月28日 21:59
  • 1265

servlet 、GenericServlet 、HttpServlet 详解

今天突然想研究下servlet,总结下新的,希望对大家有帮助:首先,看看怎样才能实现一个servlet,方法有3种:1、实现servlet接口2、继承GenericServlet(实现service ...
  • woshiwu
  • woshiwu
  • 2011年05月15日 00:49
  • 5673
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Servlet--继承HttpServlet写自己的Servlet
举报原因:
原因补充:

(最多只允许输入30个字)