Servlet简介
它符合特定规范的Java程序,基于Java技术的Web组件,运行在服务器端,主要用于生成HTML内容和处理客户端请求并给出响应。
为什么使用Servlet
在有JSP之前,想要生成HTML动态页面就只能在服务器运行Java程序,并生成HTML内容,那么只有Servlet是运行在服务器的Java程序,需要在Java中编写HTML内容。
这样在Java中编写HTML内容呢麻烦,效率低,所以就有了JSP,JSP是为了简化Servlet的开发所产生的,这样避免了复杂的编写方法,适用于开发页面内容的表示层。
但是使用JSP开发WEB应用时,HTML与Java代码都写入JSP,这样导致页面代码繁琐,维护性差。
所以就将Java代码写入Servlet,HTML代码写入JSP文件。
使用Java编写HTML代码:
response.setContentType(“text/html;charset=UTF-8”);
JspWriter out = pageContext.getOut();
out.write(“<html>”);
out.write(“<body>”);
out.write(“<html>”);
// 这样编写很麻烦,也很消耗时间
Servlet和JSP的关系?
JSP运行时会被Web容器翻译成Servlet,动态响应式通过运行这个Servlet类产生。
Servlet是JavaWeb动态交互关键的组件,容器运行JSP时,需要先将内容翻译成Servlet语法,在按照Servlet的方式进行运行。
Servlet工作过程:
客户端请求–>服务器–>运行Servlet程序–>生成HTML代码–>响应客户端。
Servlet API
Servlet API在两个包中:
javax.servlet包中的类和接口是通用的不依赖HTTP协议的。
javax.servlet.http包中的类和接口是用于支持HTTP协议的。
Servlet接口
Servlet接口常用方法 | 描述 |
---|---|
abstract void init (ServletConfig config) | Servlet对象处理请求前的初始化 |
abstract void service (ServletRequest req,ServletResponse res) | 处理客户端的请求 |
abstract void destroy() | 释放Servlet对象使用的资源 |
abstract ServletConfig getServletConfig () | 返回ServletConfig对象,包含该对象的初始化参数,传递给init方法的对象。 |
abstract String getServletInfo() | 返回Servlet的纯文本信息,如版本等。 |
GenericServlet抽象类
GenericServlet实现了Servlet接口和ServletConfig接口,定义了不依赖HTTP协议的Servlet。
GenericServlet抽象类常用方法 | 描述 |
---|---|
void init (ServletConfig config) | 将ServletConfig实例保存可以再子类中重写 |
String getInitParameter (String str) | 获取Web.xml文件中设置以name命名的初始值 |
ServletContext getServletContext () | 返回ServletContext对象的引用 |
重写带参数的init()方法需要包含super.init(config)代码,通常重写不带参数的init()方法。
如果写通用的Servlet只需要继承GenericServlet类,实现service()方法即可。
HTTPServlet抽象类
HttpServlet抽象类继承于GenericServlet类,支持对HTTP协议的post,get的请求进行差异化处理,如果需要编写Servlet,主要继承HttpServlet抽象类。
HttpServlet抽象类常用方法 | 描述 |
---|---|
public void service (ServletRequest req , ServletResponse res) | GenericServlet中的service()方法的实现,将请求分给service(HttpServletRequest req,…)方法 |
protected void service (HttpServletRequest req,HttpServletResponse res) | 接收HTTP请求,发送到此类中的doPost()/doGet()方法。 |
protected void doXxx(…) | 根据不同的请求定义处理的方法:doPost(),doGet() |
ServletConfig接口
Servlet容器使用ServletConfig接口的实例在Servlet初始化期间传递的配置信息。
ServletConfig接口常用方法 | 描述 |
---|---|
String getInitParameter(String name) | 获取Web.xml文件中以name命名的初始值 |
ServletContext getServletContext() | 返回Servlet的上下文对象引用。 |
ServletContext接口
ServletContext接口的实例表示Web应用的上下文,此接口定义的方法是与Servlet容器进行的通信,application就是ServletContext实例,容器在加载时创建ServletContext。它被Servlet容器中所有Servlet共享。
ServletContext接口常用方法 | 描述 |
---|---|
String getInitParameter (String name) | 获取Web.xml文件中以name命名的初始值,在部署描述符中用< context-param>定义 |
void setAttribute(String str,Object ob) | 设置名称为str的属性,ob参数是值 |
Object getAttribute(String str) | 获取名称是str的属性,取值 |
String getRealPath(String path) | 返回参数所代表目录的真实路径 |
void log(String message) | 记录日志信息 |
ServletRequest接口
客户发送请求时,Servlet容器会创建ServletRequest对象来封装客户的请求信息,被容器作为service()方法的参数之一传递给Servlet获取请求的数据。
ServletRequest接口常用方法 | 描述 |
---|---|
abstract String getParameter(String name) | 获取表单指定的单个name属性值 |
String[] getParameterValues(String name) | 获取表单指定的一组name属性值 |
getRequestDispatcher(String path) | 返回指定路径的请求转发对象 |
void serCharacterEncoding(String charset) | 设置请求的字符编码 |
String getCharacterEncoding() | 返回请求时用的字符编码 |
void serAttribute(String name,Object ob) | 在请求中保存为name的属性,存放值 |
Object getAttribute(String name) | 获取值名为name的属性值 |
void removeAttribute(String name) | 删除名为name的属性 |
HttpServletRequest接口
继承自ServletRequest接口,该接口也可获取请求的参数,此接口增加了读取请求信息的方法。
HttpServletRequest接口常用方法 | 描述 |
---|---|
String getContextPath() | 返回URI中表示请求上下文路径 |
Cookie[] getCookies() | 返回客户端请求中发送的所有cookie对象 |
HttpSession getSession() | HttpSession getSession() 返回和此次请求关联的session,没有分配session,则创建一个session |
String getMethod() | 返回请求所用的HTTP方法的名称如post. |
String getHeader(String name) | 获取指定的请求头信息 |
ServletResponse接口
容器接收请求时,创建了ServletRequest对象,还创建了ServletResponse对象用于封装响应数据,同时将两个对象作为参数传递给Servlet。
ServletResponse也有设置和返回字符编码方法和ServletRequest相同。
ServletResponse接口常用方法 | 描述 |
---|---|
PrintWriter getWriter() | 返回PrintWriter对象,向客户端发文本 |
void setContentType(String type) | 设置发送到客户端响应的内容类型,此时响应状态未提交 |
HttpServletResponse接口
用于对客户端的请求执行响应。
HttpServletResponse接口常用方法 | 描述 |
---|---|
addCookie(Cookie cookie) | 添加cookie到响应,可多次调用设置多个 |
addHeader(String name,String val) | 将名为name,值为val的响应报头添加到响应中 |
sendRedirect(String location) | 发送一个临时的重定向到客户端 |
encodeURL(String url) | 用sessionID对用重定向的URL进行编码 |
Servlet生命周期
1.加载和实例化
Servlet不能单独运行,需要部署到容器中,由容器实例化调用相应方法,容器启动或接收请求时,容器会找内存中是否存在该Servlet的实例,如果不存在,就创建一个实例,如果存在直接取出该实例响应请求。执行一次。
2、初始化
容器完成实例化后,容器将调用Servlet的init()方法进行初始化,目的是让Servlet对象处理请求前完成一些资源预加载,如连接数据库参数,jdbc连接等。执行一次。
3、服务
初始化后,就是就绪状态。当容器接受请求时,调用service()方法,根据请求类型在调用doGet()/doPost()方法。执行多次。
4、销毁
实例是容器创建,那么销毁也是容器来完成。容器会判断Servlet是否应该被回收资源,容器会调用destroy()方法指明哪些资源可被回收。