1.什么是Servlet
Servlet是 Java web的三大组件之一,它属于动态资源。 Servlet的作用是处理请求,服务器会把接收到的请求交给 Servlet来处理,在 Servlet中通常需要:
- 接收请求;
- 处理请求;
- 完成响应。
例如:客户端发出登录请求,或者注册请求,这些请求都应该由 Servlet来完成处理!
2.实现 Servlet的方式
实现 Servlet有三种方式:
- 实现 javax. servlet. Servlet接口;
- 继承 javax. servlet. GenericServlet类;
- 继承javax.servlet. Httpservlet类;
通常我们会去继承 Httpservlet 类来完成我们的 Servlet
2.1 实现Servlet接口
Servlet对象由服务器创建,并且由服务器来调用相应的方法!
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
/**
* 生命周期方法 servlet对象创建后马上执行,并仅执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
/**
* 生命周期方法 每次处理请求都是调用这个方法
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
/**
* 生命周期方法 servlet对象被销毁之前调用
*/
@Override
public void destroy() {
}
/**
* 获取servlet配置信息
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 获取servlet的信息
*/
@Override
public String getServletInfo() {
return null;
}
}
2.2客户端访问Servlet
项目web.xml文件 (在 ${CATALINA_HOME}\conf\web.xml中配置的的内容,相当于写到了每个项目的 web,xml中。)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>haha</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>haha</servlet-name>
<url-pattern>/visitPath</url-pattern>
</servlet-mapping>
</web-app>
- 客户端访问:http://ip:port/projectName/visitPath 时,在<servlet-mapping>标签中进行映射
- 匹配 <url-pattern> 中设置的指定访问路径,得到<servlet-name>设置的值
<url-pattern> 标签注意事项:
(1) 它设置的值必须是以"/"开头! (*.do可以,表示的是:/xxx/aaa/.do)
(2) 可以在< servlet-mapping>中给出多个 url-pattern,即可多个路径访问同一个servlet
(3) 在 pattern中使用通配符:“*”,星号可以匹配任何URL前缀或后綴。不能在中间 - 根据设置的name值,在 <servlet>标签中获取将要访问的<servlet-class>
2.3 servlet相关类
I ServletConfig
服务器加载解析web.xml文件,web.xml中的<servlet>标签,生成ServletConfig的对象;每个ServletConfig对象,对应一段web.xml中Servlet的配置信息。
- String getServletName();获取的是< servlet-name>中的内容:
- ServletContext getServletContext();获取servletContext上下文对象!
- String getInitParameter(String name);通过<init-param>标签name名称获取指定初始化参数的值
- Enumeration getlnitParameterNames();获取所有<init-param>标签的初始化参数的名称
2.4 继承GenericServlet类
源码(有删减)
package javax.servlet;
import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.ResourceBundle;
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
private transient ServletConfig config;
public GenericServlet() {
}
public void destroy() {
}
public String getInitParameter(String name) {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getInitParameter(name);
}
}
public Enumeration getInitParameterNames() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getInitParameterNames();
}
}
public ServletConfig getServletConfig() {
return this.config;
}
public ServletContext getServletContext() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getServletContext();
}
}
public String getServletInfo() {
return "";
}
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
public String getServletName() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getServletName();
}
}
}
从源码上看非常简单,GenericServlet 抽象类实现了Servlet接口和ServletConfig接口,并进行了进一步的优化,具体体现在:
- 添加了全局的servletConfig变量,tomcat服务器执行init方法后进行赋值
- 添加了servletConfig的方法
- 添加了init()方法,提供了其子类可以从写该方法,可以实现初始化参数的需求
2.5 继承Httpservlet类
Httpservlet 实现的逻辑:
Httservlet extends Genderservlet{
// 生命周期方法
void service(ServletRequest, ServletResponse)
- 强转两个参数为http协议相关的类型,
- 调用本类的service(HttpServletRequest,HttpServletReSponse)方法
// 参数已经是Http议相关的,使用起来就更加方便
void service(HttpServletReSponse,HttpServletReSponse)
- 它会通过 request得到当前请求的请求方式,例如:GET或PosT
- 根据请求方式再调用 doGet()或 dopost()方法
void doGet() —>重写
void doPost() —>重写
}
- 一个类型的servlet只创建一个实例对象,线程不安全
- 默认情况下,服务器会在某个 Servlet.第一次收到请求时创建它。也可以在 web. xml中对 Servlet中进行配置,使服务器启动时就创建Servlet
<load-on-startup>非负数 </load-on-startup>(数字越小越优先创建)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>haha</servlet-name>
<servlet-class>MyServlet</servlet-class>
<load-on-startup>1 </load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>haha</servlet-name>
<url-pattern>/visitPath</url-pattern>
</servlet-mapping>
</web-app>
2.6 Servletcontext
一个项目只有一个 Servletcontext对象!我们可以在N多个 Servlet.中来获取这个唯一的对象,使用它可以给多个 Servlet传递数据!这个对象在 Tomcat启动时就创建,在 Tomcat关闭时才会销毁!
- 域对象功能 (域对象就是用来在多个Servlet中传递数据!)
四大域对象:PageContext、ServletRequest、HttpSession、ServletContext
所有域对象都有存取数据的功能,城对象内部有一个Map,用来存储数据
void setAttribute(String name,obiect value);存储(key ,value)数据
Object getAttribute(String name);根据key获取对象value
void removeAttribute(String name);根据key移除对象
Enumeration getAttributeNames();获取所有域属性的名称;
- 获取应用初始化参数
可以配置公共的始化参数,为所有Servlet而用!使用 Servletcontext来获取在 web,xm文件中配置的应用初始化参数!(注:<init-param>标签初始化参数是为Servlert配置的)
<context-param>
<param-name>globalParam</param-name>
<param-value>ServletContextValue</param-value>
</context-param>
项目中使用:getInitParameter(String name)方法获取配置的值。
- 获取资源路径/流
String getRealPath(String fileName); 获取文件的资源路径(含盘符,E:/xxx/…)
InputStream getResourceAsStream(String fileName);获取文件流对象
Set getResourcePaths(String path);获取当前路径下所有资源路径