JavaWeb学习(8)

Posted by Csming on 2016-10-24

简介

  • 继承了Servlet、ServletConfig接口的抽象类
  • **其中的service方法时抽象方法
  • 如果新建的Servlet程序直接集成GenericServlet会使开发更简洁

具体实现

  • 在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化
  • 利用ServletConfig成员变量的方法实现了ServletConfig接口的方法
  • 还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接复写覆盖init()在其中实现对Servlet的初始化
  • 不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(ServletConfig),而还是利用了ServletConfig方法会出现空指针现象
  • 新建的init(){}并非Servlet的生命周期方法,而init(ServletConfig)是生命周期方法

GenericServlet源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package javax.servlet;  

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

//抽象类GenericServlet实现了Servlet接口的同时,也实现了ServletConfig接口和Serializable这两个接口
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable
{
//私有变量,保存 init()传入的ServletConfig对象的引用
private transient ServletConfig config;

//无参的构造方法
public GenericServlet() { }


/*
------------------------------------
以下方法实现了servlet接口中的5个方法
实现Servlet接口方法开始
------------------------------------
*/


/*
实现接口Servlet中的带参数的init(ServletConfig Config)方法,将传递的ServletConfig对象的引用保存到私有成员变量中,
使得GenericServlet对象和一个ServletConfig对象关联.
同时它也调用了自身的不带参数的init()方法
**/

public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init(); //调用了无参的 init()方法
}

//无参的init()方法
public void init() throws ServletException {

}


//空实现了destroy方法
public void destroy() { }


//实现了接口中的getServletConfig方法,返回ServletConfig对象
public ServletConfig getServletConfig()
{
return config;
}

//该方法实现接口<Servlet>中的ServletInfo,默认返回空字符串
public String getServletInfo() {
return "";
}


//唯一没有实现的抽象方法service(),仅仅在此声明。交由子类去实现具体的应用
//在后来的HttpServlet抽象类中,针对当前基于Http协议的Web开发,HttpServlet抽象类具体实现了这个方法
//若有其他的协议,直接继承本类后实现相关协议即可,具有很强的扩展性

public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;

/*
------------------------------------
实现Servlet接口方法结束
------------------------------------
*/







/*
---------------------------------------------
*以下四个方法实现了接口ServletConfig中的方法
实现ServletConfig接口开始
---------------------------------------------
*/

//该方法实现了接口<ServletConfig>中的getServletContext方法,用于返回servleConfig对象中所包含的servletContext方法
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}

//获取初始化参数
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}

//实现了接口<ServletConfig>中的方法,用于返回在web.xml文件中为servlet所配置的全部的初始化参数的值
public Enumeration getInitParameterNames() {
return getServletConfig().getInitParameterNames();

//获取在web.xml文件中注册的当前的这个servlet名称。没有在web.xml 中注册的servlet,该方法直接放回该servlet的类名。
//法实现了接口<ServleConfig>中的getServletName方法
public String getServletName() {
return config.getServletName();
}

/*
---------------------------------------------
实现ServletConfig接口结束
---------------------------------------------
*/


public void log(String msg) {
getServletContext().log(getServletName() + ": "+ msg);
}


public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
}

方法

Num 方法 描述
1 void,destroy() Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.
2 java.lang.String,getInitParameter(java.lang.String name) Returns a String containing the value of the named initialization parameter, or null if the parameter does not exist.
3 java.util.Enumeration,getInitParameterNames() Returns the names of the servlet’s initialization parameters as an Enumeration of String objects, or an empty Enumeration if the servlet has no initialization parameters.
4 ServletConfig,getServletConfig() Returns this servlet’s ServletConfig object.
5 ServletContext,getServletContext() Returns a reference to the ServletContext in which this servlet is running.
6 java.lang.String,getServletInfo() Returns information about the servlet, such as author, version, and copyright.
7 java.lang.String,getServletName() Returns the name of this servlet instance.
8 void,init() A convenience method which can be overridden so that there’s no need to call super.init(config).
9 void,init(ServletConfig config) Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
10 void,log(java.lang.String msg) Writes the specified message to a servlet log file, prepended by the servlet’s name.
11 void,log(java.lang.String message, java.lang.Throwable t) Writes an explanatory message and a stack trace for a given Throwable exception to the servlet log file, prepended by the servlet’s name.
12 void,service(ServletRequest req, ServletResponse res) Called by the servlet container to allow the servlet to respond to a request.