首页 > 代码库 > JSP详细篇——Servlet(一)

JSP详细篇——Servlet(一)

Servlet技术

Servlet是用Java语言编写应用到Web服务器端的扩展技术。它先于JSP产生,可以方便的对Web应用中的HTTP请求进行处理。在Java Web程序开发中,Servlet主要用于处理业务逻辑,它比JSP更具有业务逻辑层的意思。而且Servlet的安全性、扩展性以及性能方面十分优秀。在Java Web程序开发及MVC模式的应用方面起到了十分重要的作用。

Servlet基础

1.Servlet结构体系

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如图所示,ServletServletConfigSerializable都是接口。其中Serializablejava.io包中的序列化接口,ServletServletConfigjavax.servlet包中的接口。GenericServlet是一个抽象类,它分别实现了上述的三个接口。GenericServletServletServletConfig提供了部分实现,但是它没有对HTTP请求中的GETPOST等类型提供具体的操作方法。一般情况下,我们所编写的Servlet对象都继承自HttpServlet,在开发中所使用的具体Servlet对象就是HttpServlet对象,因为HttpServletServlet的实现类,并提供了HTTP请求的处理方法。

 

2.Servlet技术的特点

功能强大

Servlet采用Java编写,它可以调用Java API中的对象及方法。此外,ServletWeb应用进行了封装,提供了ServletWeb应用的编程接口,还可以对HTTP请求进行相应的处理。

 

可移植性强

Java语言是可以跨平台的,由于Servlet是用Java编写,因此Servlet继承了Java的优点。

 

性能高效

Servlet对象在Servlet容器启动时被初始化,当第一次请求时,Servlet容器将其实例化,此时它贮存于内存中。如果存在多个请求,Servlet不会再被实例化,仍然由此Servlet对其进行处理。每个请求都是一个线程,而不是进程,因为Servlet十分高效

 

安全性高

Servlet使用了Java的安全框架,同时Servlet容器还可以为Servlet提供额外的功能,因此安全性很高。

 

可扩展性

Java语言是面向对象的语言, Servlet是由Java编写,它继承了Java的面向对象的特点,在业务逻辑处理中,可以通过封装,继承等来扩展实际的业务需求,扩展性很强。

 

 

3.ServletJSP的区别

角色不同

JSP可以存在Java代码和HTML代码并存的情况。Servlet需要承担客户请求与业务处理的中间角色,只有调用固定的方法才能将动态的内容输出为静态的HTML代码。所以,JSP更具有显示层的角色。

 

编程方法不同

ServletJSP在编程方法上区别很大。使用Servlet开发Web需要遵循Java的标准,而JSP需要遵循一定的脚本语言规范。在Servlet代码中,需要调用Servlet提供的相关API接口方法,才可以对HTTP请求及业务进行处理,对于处理业务逻辑方面的处理能力更加强大些。在JSP页面中,通过HTML代码与JSP内置对象实现对HTTP请求及页面的处理,其显示界面的功能更加强大些。

 

Servlet需要编译后运行

Servlet需要在Java编译器编译后才可以运行,如果Servlet编写完成或修改完成后,没有被重新编译,则不能运行在Web容器中。JSP则与之相反,JSPJSP 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请求进行处理。其代码结构如下:

范例:

创建一个名为TestServletServlet

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()方法进行了实现,其他方法都没有实现,需要开发人员在使用中根据实际需要对其进行重写。




JSP详细篇——Servlet(一)