Servlet技术
Servlet是用Java语言编写应用到Web服务器端的扩展技术。它先于JSP产生,可以方便的对Web应用中的HTTP请求进行处理。在Java Web程序开发中,Servlet主要用于处理业务逻辑,它比JSP更具有业务逻辑层的意思。而且Servlet的安全性、扩展性以及性能方面十分优秀。在Java Web程序开发及MVC模式的应用方面起到了十分重要的作用。
Servlet基础
1.Servlet结构体系
如图所示,Servlet、ServletConfig与Serializable都是接口。其中Serializable是java.io包中的序列化接口,Servlet和ServletConfig是javax.servlet包中的接口。GenericServlet是一个抽象类,它分别实现了上述的三个接口。GenericServlet为Servlet和ServletConfig提供了部分实现,但是它没有对HTTP请求中的GET,POST等类型提供具体的操作方法。一般情况下,我们所编写的Servlet对象都继承自HttpServlet,在开发中所使用的具体Servlet对象就是HttpServlet对象,因为HttpServlet是Servlet的实现类,并提供了HTTP请求的处理方法。
2.Servlet技术的特点
功能强大
Servlet采用Java编写,它可以调用Java API中的对象及方法。此外,Servlet对Web应用进行了封装,提供了Servlet对Web应用的编程接口,还可以对HTTP请求进行相应的处理。
可移植性强
Java语言是可以跨平台的,由于Servlet是用Java编写,因此Servlet继承了Java的优点。
性能高效
Servlet对象在Servlet容器启动时被初始化,当第一次请求时,Servlet容器将其实例化,此时它贮存于内存中。如果存在多个请求,Servlet不会再被实例化,仍然由此Servlet对其进行处理。每个请求都是一个线程,而不是进程,因为Servlet十分高效
安全性高
Servlet使用了Java的安全框架,同时Servlet容器还可以为Servlet提供额外的功能,因此安全性很高。
可扩展性
Java语言是面向对象的语言, Servlet是由Java编写,它继承了Java的面向对象的特点,在业务逻辑处理中,可以通过封装,继承等来扩展实际的业务需求,扩展性很强。
3.Servlet与JSP的区别
角色不同
JSP可以存在Java代码和HTML代码并存的情况。Servlet需要承担客户请求与业务处理的中间角色,只有调用固定的方法才能将动态的内容输出为静态的HTML代码。所以,JSP更具有显示层的角色。
编程方法不同
Servlet与JSP在编程方法上区别很大。使用Servlet开发Web需要遵循Java的标准,而JSP需要遵循一定的脚本语言规范。在Servlet代码中,需要调用Servlet提供的相关API接口方法,才可以对HTTP请求及业务进行处理,对于处理业务逻辑方面的处理能力更加强大些。在JSP页面中,通过HTML代码与JSP内置对象实现对HTTP请求及页面的处理,其显示界面的功能更加强大些。
Servlet需要编译后运行
Servlet需要在Java编译器编译后才可以运行,如果Servlet编写完成或修改完成后,没有被重新编译,则不能运行在Web容器中。JSP则与之相反,JSP由JSP Container对其进行管理,他的编译过程也是由JSP Container对其进行编译,所以,无论JSP文件被创建或是修改,都不需要对其编译即可执行。
速度不同
由于JSP页面由JSP Container对其进行管理,在每次执行不同内容的动态JSP页面时,JSP Container都要对其进行编译,所以,他的效率低于Servlet的效率。而Servlet在编译完后将不再需要进行编译,可以直接获取及输出动态内容。在JSP页面中的内容没有变化的情况下,JSP编译完成后,JSP Container不会再次对其进行编译。
4.Servlet代码结构
在Java中,通常所说的Servlet指的是HttpServlet对象。在声明一个对象为Servlet时,需要继承HttpServlet类。HttpServlet类是Servlet接口的一个实现类,继承该类后,可以重写HttpServlet类中的
方法对HTTP请求进行处理。其代码结构如下:
范例:
创建一个名为TestServlet的Servlet。
package com.zgy.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
// 初始化方法
public void init() throws ServletException {
}
// 处理HTTP Get请求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
// 处理HTTP Post请求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
//处理HTTP Put请求
public void doPut(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
}
//处理HTTP Delete请求
public void doDelete(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
}
//销毁方法
public void destroy(){
super.destroy();
}
}
以上代码显示了一个Servlet对象的代码结构。TestServlet类通过继承HttpServlet类被声明为一个Servlet对象。该类中包含了6个方法,其中,init()方法和destroy()方法为Servlet初始化与生命周期结束所调用的方法。其余4个方法为Servlet针对不同的HTTP请求类型所提供的方法。
Servlet API编程常用接口和类
1.Servlet接口
在Servlet开发中,任何一个Servlet对象都要直接或间接地实现javax.servlet.Servlet接口。在该接口中包含了5个方法,其功能分别如下:
方法 |
说明 |
public void init(ServletConfig config) |
Servlet实例化后,Servlet容器调用该方法来完成初始化工作 |
public void service(ServletRequest request,ServletResponse response) |
处理客户端请求 |
public void destroy() |
当Servlet对象从Servlet容器中移除时,容器调用该方法以释放资源 |
public ServletConfig getConfig() |
用于获取Servlet对象的配置信息,反悔ServletConfig对象 |
public String getServletInfo() |
返回有关Servlet的信息,他是纯文本格式的字符串 |
范例:
创建一个Servlet,实现向客户端输出字符串
package com.zgy.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class StringServlet implements Servlet {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter pw = response.getWriter();
pw.write("hello world");
pw.close();
}
}
在Servlet中,主要的方法是service()方法,当客户端请求来到时,Servlet容器将调用Service()方法对请求进行处理。本例中,在service()方法中,首先通过ServletResponse类的getWriter()方法得到一个PrintWriter()类型的输出流,然后使用该输出流向客户端输出字符串。
2.ServletConfig接口
ServletConfig接口位于javax.servlet包中,他封装了Servlet的配置信息,在Servlet初始化期间传递。每一个Servlet都有且仅有ServletConfig对象。该对象定义的4个方法如下:
方法 |
说明 |
public String getInitParameter(String name) |
返回String类型的名称为name的初始化参数的值 |
pubic Enumeration getInitParameterNames() |
获取所有初始化参数的枚举集合 |
public ServletContext getServletContext() |
用于获取Servlet上下文 |
public String getServletName() |
返回Servlet对象的实例名 |
3.HttpServletRequest接口
HttpServletRequest接口位于javax.servlet.http包中,继承了javax.servlet.ServletRequest接口,是Servlet中的重要对象。在开发过程中较为常见。其方法说明如下:
方法 |
说明 |
public String getContextPath() |
返回请求的上下文路径,次路径以“/”开头 |
public Cookies[] getCookies() |
返回请求中发送的所有cookie对象,返回值为cookie数组 |
public String getMethod() |
返回请求所使用的HTTP类型 |
public String getQueryString() |
返回请求中参数的字符串形式,如请求MyServlet?username=mr,则返回username=mr |
public String getRequestURI() |
返回主机名到请求参数之间的字符串形式 |
public StringBuffer getRequestURL() |
返回请求URL,此请求参数不包含请求参数 |
public String getServletPath() |
返回请求URI中的Servlet路径的字符串,不包含请求中参数信息 |
public HttpSession getSession() |
返回与请求关联的HttpSession对象 |
4.HttpServletResponse接口
HttpServletResponse接口位于javax.servlet.http包中,他继承了javax.servlet.ServletResponse接口,同样是一个非常重要的方法。方法说明如下:
方法 |
说明 |
public void addCookie(Cookie cookie) |
向客户端写入cookie信息 |
public void setError(int sc) |
发送一个错误码为sc的错误响应到客户端 |
public void setError(int sc,String msg) |
发送一个包含错误码及错误信息的响应到客户端,参数sc为错误码,参数msg为错误信息 |
public void sendRedirect(String location) |
使用客户端重定向到新的URL,参数location为新的地址 |
5.GenericServlet类
在创建一个Servlet对象时,必须实现javax.servlet.Servlet接口,此接口中包含5个方法,也就是说,创建一个Servlet对象要实现这5个方法,这样的操作实在不便,javax.servlet.GenericServlet类简化了此操作,实现了Servlet接口。
public abstract class GenericServlet extends Object implements Servlet,ServletConfig,Serializable
该类实现了出service()之外的所有方法,在创建Servlet对象时,可以通过继承GenericServlet类来简化程序中的代码,但要实现service()方法。
6.HttpServlet类
虽然GenericServlet为程序开发提供了方便,但是在实际开发中,大多数应用的是Servlet处理HTTP请求,并对请求做出相应。所以在开发中使用GenericServlet类仍然还是不方便。javax.servlet.http.HttpServlet类对GenericServlet类进行了扩展,为HTTP请求的处理提供了灵活的方法
Public abstract class HttpServlet extends GenericServlet implements Serializable
HttpServlet仍然是一个抽象类,实现了service()方法,并针对HTTP1.1中定义的7中请求类型提供了响应的方法。分别为:doGet()方法,doPost()方法,doPut()方法,doDelete()方法,doHead()方法,doTrace()方法,doOptions()方法。在这7个方法中,只对doTrace()和doOption()方法进行了实现,其他方法都没有实现,需要开发人员在使用中根据实际需要对其进行重写。