Servlet中常用的接口、类、方法
Sun 公司提供了一系列的接口和类用于 Servlet 技术的开发,其中最重要的接口是 javax.servlet.Servlet。
1.Servlet接口
接口声明: public abstract interface Servlet
方法声明 |
功能描述 |
void init(ServletConfig config) |
容器在创建好 Servlet 对象后,就会调用此方法。该方法接收一个 ServletConfig 类型的参数,Servlet 容器通过该参数向 Servlet 传递初始化配置信息 |
ServletConfig getServletConfig () |
用于获取 Servlet 对象的配置信息,返回 Servlet 的 ServletConfig 对象 |
String getServletInfo() |
返回一个字符串,其中包含关于 Servlet 的信息,如作者、版本和版权等信息 |
void service (ServletRequest request,ServletResponse response)
扫描二维码关注公众号,回复:
12882362 查看本文章
![]() |
负责响应用户的请求,当容器接收到客户端访问 Servlet 对象的请求时,就会调用此方法。 |
void destroy() |
负责释放 Servlet 对象占用的资源。当服务器关闭或者 Servlet 对象被移除时,Servlet 对象会被销毁,容器会调用此方法 |
针对 Servlet 的接口,Sun 公司提供了两个默认的接口实现类:GenericServlet 和 HttpServlet。其中,GenericServlet 是一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理。
public abstract class GenericServlet implements javax.servlet.Servlet, javax.servlet.ServletConfig, java.io.Serializable {
HttpServlet 是 GenericServlet 的子类,它继承了 GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等类型提供了具体的操作方法。通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用的也是 HttpServlet 对象。
public abstract class HttpServlet extends GenericServlet {
HttpServlet 类中包含两个常用方法
方法声明 |
功能描述 |
protected void doGet (HttpServletRequest req, HttpServletResponse resp) |
用于处理 GET 类型的 HTTP 请求的方法 |
protected void doPost(HttpServletRequest req, HttpServletResponse resp) |
用于处理 POST 类型的 HTTP 请求的方法 |
例如:
package com.wangxing.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 TestServlet implements Servlet{
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet初始化");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("得到ServletConfig对象");
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("处理HTTP请求");
}
@Override
public String getServletInfo() {
System.out.println("得到servlet信息");
return null;
}
@Override
public void destroy() {
System.out.println("销毁servlet");
}
}
配置web.xml
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.wangxing.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
2.ServletConfig接口
public abstract interface ServletConfig
在运行 Servlet 程序时,可能需要一些辅助信息,例如,文件使用的编码、使用 Servlet 程序的共享信息等,这些信息可以在 web.xml 文件中使用一个或多个 <init-param> 元素进行配置。当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息封装到 ServletConfig 对象中,此时可以通过调用 init(ServletConfig config)方法将 ServletConfig 对象传递给 Servlet。
ServletConfig就是封装Servlet运行时的辅助信息的接口。
ServletConfig 接口中定义了一系列获取配置信息的方法。
方法说明 |
功能描述 |
String getInitParameter(String name) |
根据初始化参数名返回对应的初始化参数值 |
ServletContext getServletContext() |
返回一个代表当前 Web 应用的 ServletContext 对象 |
String getServletName() |
返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值 |
ServletConfig接口对象我们不需要自己手动获取,servlet接口的init方法已经传递有了。
例如:通过ServletConfig接口对象得到web.xml文件中配置的初始化参数值,和配置的
<servlet>
<servlet-name>config</servlet-name>
<servlet-class>com.wangxing.servlet.ConfigServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>test1</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>test2</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>config</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 测试ServletConfig接口 ServletConfig就是封装Servlet运行时的辅助信息的接口。 ServletConfig
* 接口中定义了一系列获取配置信息的方法
*
* @author 14336
*
*/
public class ConfigServlet extends HttpServlet {
private transient ServletConfig config;
/*
* 在运行 Servlet 程序时,可能需要一些辅助信息, 例如,文件使用的编码、使用 Servlet 程序的共享信息等, 这些信息可以在
* web.xml 文件中使用一个或多个 <init-param> 元素进行配置。 当 Tomcat 初始化一个 Servlet 时,会将该
* Servlet 的配置信息封装到 ServletConfig 对象中, 此时可以通过调用 init(ServletConfig
* config)方法将 ServletConfig 对象传递给 Servlet。
*/
// String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
// ServletContext getServletContext() 返回一个代表当前 Web 应用的 ServletContext 对象
// String getServletName() 返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值
// ServletConfig接口对象我们不需要自己手动获取,servlet接口的init方法已经传递有了。
// 或者我们可以通过HttpServlet接口的父类GenericServlet抽象类中的getServletConfig()方法获得
//public ServletConfig getServletConfig() { return config; }
// 1.要测试我们首先需要配置web.xml文件
/*
* <servlet> <init-param> <param-name>标签名</param-name>
* <param-value>通过标签名可以得到的数据值</param-value> </init-param> <servlet>
* 若是param-name名相同则只会获得第一个的value
* 初始化的辅助信息需要放在与之相关的servlet实例对象配置的<servlet></servlet>中
*/
// 2.第二步我们需要得到ServletConfig对象
// 方法一:可以通过重写init方法获得ServletConfig对象
// init()方法是接口Servlet中的方法,它的实现类是抽象类GenericServlet,
// GenericServlet类继承并重写了init()方法将ServletConfig作为参数传递给了init()方法,并在重写后的init方法中调用了继承的init方法
@Override
public void init(ServletConfig config) throws ServletException {
String Parameterval = config.getInitParameter("config");
String Parameterval2 = config.getInitParameter("config");
String Parameterval3 = config.getInitParameter("username");
String servletname = config.getServletName();
System.out.println("Parameterval=" + Parameterval);
System.out.println("Parameterval2=" + Parameterval2);
System.out.println("Parameterval3=" + Parameterval3);
System.out.println("servletname=" + servletname);
this.config = config;
System.out.println("将config对象保存");
}
//方法二:使用HttpServlet接口的父类GenericServlet的getServletConfig()方法获得ServletConfig对象
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
System.out.println("提交方式位GET");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ServletConfig config = this.getServletConfig();
ServletConfig config = this.config;
String username = config.getInitParameter("username");
String username2 = config.getInitParameter("username");
String servletname = config.getServletName();
System.out.println("username=" + username);
System.out.println("username2=" + username2);
System.out.println("servletname=" + servletname);
//因为Servlet容器会先调用init()方法,在源程序中GenericServlet的init()方法将获得的ServletConfig对象传递给了
//暂时的config变量,然后我们使用getServletConfig()返回这个变量
//而在这个程序中由于我们重写了init方法程序会调用我们写的init()方法,所以在后来使用getInitParameter获得ServletConfig对象时会空指针
//所以我们这里使用自己定义的变量
}
}
3.ServletContext接口
当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取 Web 应用程序的Servlet版本,初始化信息、读取资源文件等。
ServletConfig接口 ServletContext getServletContext() |
返回一个代表当前 Web 应用的 ServletContext 对象 |
方法说明 |
功能描述 |
int getMajorVersion() |
得到servlet规范的主版本号 |
int getMinorVersion() |
得到servlet规范的次版本号 |
String getInitParameter(String) |
得到指定的初始化信息<context-param> |
Enumeration<String> getInitParameterNames() |
得到包含所有初始化信息名的Enumeration对象
|
配置web.xml
<context-param>
<param-name>contextvalue</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>contextid</param-name>
<param-value>1</param-value>
</context-param>
<servlet>
<servlet-name>mycontext</servlet-name>
<servlet-class>com.wangxing.servlet.ContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mycontext</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
读取 Web 应用下的资源文件
在实际开发中,有时会需要读取 Web 应用中的一些资源文件,如配置文件和日志文件等。为此,在 ServletContext 接口中定义了一些读取 Web 资源的方法,这些方法是依靠 Servlet 容器实现的。Servlet 容器根据资源文件相对于 Web 应用的路径,返回关联资源文件的 I/O 流或资源文件在系统的绝对路径等。
ServletContext 接口中用于获取资源路径的相关方法。
方法说明 |
功能描述 |
InputStream getResourceAsStream(String path) |
返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致 |
1.在项目的 src 目录中创建一个名称为xxxxx.properties 的文件
userid = 1
username = zhangsan
useraddress = 西安
2.编写读取xxxxx.properties 的文件的Servlet处理类。
package com.wangxing.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 測試ServletConfig接口中的getServletContext()方法的返回值ServletContext接口
* @author 14336
*
*/
public class ContextServlet extends HttpServlet{
/*
* 当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用
* ,该对象封装了当前 Web 应用的所有信息。
* 可以利用该对象获取 Web 应用程序的Servlet版本,初始化信息、读取资源文件等。
* */
//ServletContext接口中的方法
//1.int getMajorVersion() 得到servlet规范的主版本号
//2.int getMinorVersion() 得到servlet规范的次版本号
//3.String getInitParameter(String) 得到指定的初始化信息<context-param>
//4.Enumeration<String> getInitParameterNames() 得到包含所有初始化信息名的Enumeration对象
//5.//InputStream getResourceAsStream(String path) 返回映射到某个资源文件的 InputStream 输入流对象。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletContext---对象封装了当前 Web 应用的所有信息
//得到ServletContext
ServletContext context = this.getServletContext();
//ServletContext context2=this.getServletConfig().getServletContext();
//得到Servlet版本
//int getMajorVersion() 得到servlet规范的主版本号
//int getMinorVersion() 得到servlet规范的次版本号
int majorVersion = context.getMajorVersion();
int minorVersion = context.getMinorVersion();
System.out.println("主版本号:"+majorVersion+" 次版本号:"+minorVersion);
//String getInitParameter(String) 得到指定的初始化信息<context-param>
String info = context.getInitParameter("contextid");
String info2 = context.getInitParameter("contextvalue");
System.out.println("contextid="+info+" contextvalue="+info2);
// 得到包含所有初始化信息名的Enumeration对象
Enumeration<String> paramNames = context.getInitParameterNames();
while(paramNames.hasMoreElements()){
String paramname = paramNames.nextElement();
String value = context.getInitParameter(paramname);
System.out.println("name="+paramname+" value="+value);
}
//读取 Web 应用下的资源文件
//InputStream getResourceAsStream(String path) 返回映射到某个资源文件的 InputStream 输入流对象。
/*
InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/test.properties");
BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(inputStream,"unicode"));
String msg = null;
while((msg = bufferedReader.readLine())!= null){
String msg2 = msg.getBytes("unicode").toString();
System.out.println(msg2);
}
bufferedReader.close();
inputStream.close();
*/
InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/test.properties");
Properties properties= new Properties();
properties.load(new InputStreamReader(inputStream,"utf-8"));
String userid = properties.getProperty("userid");
String username = properties.getProperty("username");
String useraddress = properties.getProperty("useraddress");
System.out.println("userid="+userid+" username="+username+" useraddress="+useraddress);
//设置test.properties文件的编码格式以"utf-8"保存可以显示中文
inputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}