1.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) | 负责响应用户的请求,当容器接收到客户端访问 Servlet 对象的请求时,就会调用此方法。 |
void destroy() | 负责释放 Servlet 对象占用的资源。当服务器关闭或者 Servlet 对象被移除时,Servlet 对象会被销毁,容器会调用此方法 |
针对 Servlet 的接口,Sun 公司提供了两个默认的接口实现类:GenericServlet 和 HttpServlet。其中,GenericServlet 是
一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理。
HttpServlet 是 GenericServlet 的子类,它继承了 GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等
类型提供了具体的操作方法。
通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用的也是 HttpServlet 对象。
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 arg0) throws ServletException {
System.out.println("Servlet初始化方法");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("得到ServeletConfig对象");
return null;
}
@Override
public String getServletInfo() {
System.out.println("得到包含Servlet信息的字符串");
return null;
}
// 这个执行
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("处理请求作出响应的方法");
}
@Override
public void destroy() {
System.out.println("销毁Servlet对象的方法");
}
}
配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>cost</servlet-name>
<servlet-class>com.wangxing.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cost</servlet-name>
<url-pattern>/wan</url-pattern>
</servlet-mapping>
</web-app>
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-name的值。
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;
public class ConfigServlet extends HttpServlet {
/*
@Override
public void init(ServletConfig config) throws ServletException {
//String getInitParameter(String name)根据初始化参数名返回对应的初始化参数值
//参数就是web.xml中param-name标记的值
String name=config.getInitParameter("name");
String pass=config.getInitParameter("pass");
System.out.println(name+" "+pass);
}
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//getServletConfig()是Servlet接口中的方法
//HttpServlet类是Servlet接口的子类
//没有init()方法时。想要得到初始化参数值。就要通过上面的方法得到ServletConfig
ServletConfig config=this.getServletConfig();
//String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
//参数就是web.xml中param-name标记的值
//配置方法
//<init-param>
//<param-name>name</param-name>
//<param-value>zhangsan</param-value>
//</init-param>
String name=config.getInitParameter("name");
String pass=config.getInitParameter("pass");
System.out.println(name+" "+pass);
//String getServletName() 返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值
String servletname=config.getServletName();
System.out.println("servletname=="+servletname);
}
}
配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>config</servlet-name>
<servlet-class>com.wangxing.servlet.ConfigServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>pass</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>config</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
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 应用下的资源文件
在实际开发中,有时会需要读取 Web 应用中的一些资源文件,如配置文件和日志文件等。为此,在 ServletContext
接口中定义了一些读取 Web 资源的方法,这些方法是依靠 Servlet 容器实现的。Servlet 容器根据资源文件相对于
Web 应用的路径,返回关联资源文件的 I/O 流或资源文件在系统的绝对路径等。
ServletContext 接口中用于获取资源路径的相关方法。
方法说明 | 功能描述 |
InputStream getResourceAsStream(String path) | 返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致 |
1.在项目的 src 目录中创建一个名称为xxxxx.properties 的文件
//在src下创建的以.properties结尾的资源文件转义后会进入/WEB-INF/classes/test.properties
//先得到字节输入流,再将输入流通过load()方法放入Properties对象中
//用Properties访问getProperty("属性名称")可以得到想要的资源文件中的内容
testname=lisi
testage=32
testaddress=\u5317\u4EAC
2.配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<context-param>
<param-name>info</param-name>
<param-value>context-param的数据</param-value>
</context-param>
<context-param>
<param-name>hobby</param-name>
<param-value>sleep</param-value>
</context-param>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>com.wangxing.servlet.ContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
</web-app>
3.源码
package com.wangxing.servlet;
import java.io.IOException;
import java.io.InputStream;
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;
public class ContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ServletContext---对象封装了当前 Web 应用的所有信息
// 得到ServletContext
// 初始化的时候init(ServletConfig config)方法将 ServletConfig 对象传递给 Servlet。
// 而HttpServlet是Servlet的子类。本类又继承了HttpServlet。所以可以用this直接调用
ServletContext contex1 = this.getServletContext();
//ServletContext contex2 = this.getServletConfig().getServletContext();
// 得到Servlet版本
// int getMajorVersion() 得到servlet规范的主版本号
// int getMinorVersion() 得到servlet规范的次版本号
int major=contex1.getMajorVersion();
int minor=contex1.getMinorVersion();
System.out.println("servlet规范的主版本号:"+major);
System.out.println("servlet规范的次版本号:"+minor);
//String getInitParameter(String) 得到指定的初始化信息<context-param>
//配置方法
//<context-param>
//<param-name>hobby</param-name>
//<param-value>sleep</param-value>
//</context-param>
String info=contex1.getInitParameter("info");
String hobby=contex1.getInitParameter("hobby");
System.out.println(info+" "+hobby);
//读取 Web 应用下的资源文件
//InputStream getResourceAsStream(String path) 返回映射到某个资源文件的 InputStream 输入流对象。
/*
InputStream in=contex1.getResourceAsStream("/WEB-INF/classes/test.properties");
//因为资源文件中的内容是一行一行的。所以用字符输入流读取
InputStreamReader reader=new InputStreamReader(in);
BufferedReader buffer=new BufferedReader(reader);
String msg=null;
while((msg=buffer.readLine())!=null){
System.out.println(msg);
}
buffer.close();
reader.close();
in.close();
*/
//在src下创建的以.properties结尾的资源文件转义后会进入/WEB-INF/classes/test.properties
//先得到字节输入流,再将输入流通过load()方法放入Properties对象中
InputStream in=contex1.getResourceAsStream("/WEB-INF/classes/test.properties");
Properties properties=new Properties();
properties.load(in);
//用Properties访问getProperty("属性名称")可以得到想要的资源文件中的内容
String name=properties.getProperty("testname");
String age=properties.getProperty("testage");
String address=properties.getProperty("testaddress");
System.out.println(name+" "+age+" "+address);
in.close();
}
}