Servlet基础
Servlet 简介
什么是Servlet
Servlet 是一个符合特定规范的Java程序,是一个基于Java技术的Web组件。Servlet运行在服务端,由Servlet容器所管理,用于处理客户端,并作出响应。
Servlet运行于服务器端。说明:Serlvet容器:Servlet容器也称为Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务。管理和运行Servlet/JSP的容器也称为Web容器,我自己介绍的web容器,Servlet容器,和web容器是同义的。
Servlet容器主要用于生成动态的内容。它可以接受和处理请求,并动态生成HTML内容对客户端进行响应,其工作过程如下。
Servlet与JSP的关系
Servlet与JSP都可以在页面上动态显示数据,两者之间存在什么样的关系?
在使用JSP技术开发Web程序时,我们所要做的是在JSP中写入Java代码,当服务器运行JSP时,将JSP转化成为Java类并编译执行,动态获取数据生成HTML代码,最终显示在客户端浏览器上。整个过程如下。
此流程中的将Java翻译成Java源代码这一步骤揭示了JSP的技术根源。
当部署项目并运行后,在Tomcat安装目录的\work\Catalina\localhost\store\org\apache\jsp下会生成一个内容。
打开运行后编译成的类,我们可以看到就是一个java程序,这个xxx_jsp类继承自org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase又继承自一个重要的Servlet类HttpServlet,由此可以得出一个结论:JSP在运行时会被编web容器翻译成为一个Servlet,动态响应内容是通过运行这个Serlvet类产生的。Servlet是Java Web动态交互技术的关键组件,也是JSP的技术基础,容器在运行JSP时,需要先将其内容翻译成Servlet的语法,在安装Serlvet的方式运行。
JSP实际上就是为了简化Serlvet的开发而产生的,避免了编写繁杂的输出方法,更加适用于开发带有页面内容的表示层组件。
Servlet API
初步了解Serlvet的功能和特点,但是Servlet到底是什么?符合哪些规范?实际上就是按照Servlet规范编写一个java类。下面就了解下开发Servelt需要用到的主要接口和类,也就是Servlet API。
Servlet API 包含在两个包内,javax.servlet包中的类和接口是通用的不依赖协议的Servlet API,包括servlet,ServletResponse,ServletConfing,ServletContext 接口及抽象类GebericServlet。javax.servlet.http包中的类和接口使用于支持HTTP协议的Servlet API。
Servlet 接口
Servlet接口定义了所有Servlet需要实现的方法,它常用的方法如下。
方法名称 | 功能描述 |
---|---|
public abstract void init(ServletConfing config) | 由Servlet容器调用,用于完成Servlet对象在处理客户请求前的初始化工作 |
public abstract void service(ServletRequest req,ServletRseponse res) | 由Servlet容器调用,用于处理客户端的请求 |
public abstract void destroy() | 由Servlet容器调用,释放servlet对象所使用的的资源 |
public abstract ServletConfing getServletConfig() | 返回ServletConfig 对象,该对象包含此Servlet的初始化和启动参数。返回ServletConfig对象是传递给init()方法的对象 |
public abstract String getServletInfo() | 返回有关Servlet的信息,如作者,版本,和版权。返回的字符串是纯文本,而不是任何种类的标记(如HTML,XML等) |
GebericServlet抽象类
GebericServlet抽象类实现了Servlet接口和ServletConfig接口,给出除了service()方法外的其他方法的简单实现,定义了通用的,不依赖协议的Servlet。它常用的方法如下。
方法名称 | 功能描述 |
---|---|
public void init(ServletConfig config) | 对Servlet接口中 init(ServletConfig config)方法的实现,并将ServletConfig实例进行保存以备用。此方法还有一个无惨的重载方法init(),可用于子类中重写,以实现用户订制的初始化工作 |
public String getInitParameter(String name) | 通过调用ServletConfig的getInitParameter(String name)方法获取web.xml中设置的以name命名的初始化参数值 |
public ServletContext getServlet() | 返回ServletContext对象的引用 |
经验:通常只需要重写不带参数的init()方法,如果重写init(ServletConfig config)方法,则应该包含super.init(config)代码。
如果要编写一个通用的Servlet,只要继承自GenericServlet类,实现servlet()方法即可。
HttpServlet 抽象类
大多数的网络应用是通过HTTP协议访问服务器资源的,因此我们编写的Servlet大多数也是应用于处理HTTP协议的请求和响应。抽象类HttpServlet 继承自GenericServlet类,具有与GenericServlet类似的方法,并提供了与HTTP相关的实现,支持对HTTP的POST,GET等请求方式进行差异化处理。开发中如果需要编写Servlet,主要就是继承HttpServlet抽象类。
方法名称 | 功能描述 |
---|---|
public void service(ServletRequset req,ServletResponse res) | GenericServlet 类中service()方法的实现,将请求分发给protected void service(HttpServletRequest req,HttpServletResponse res) 方法 |
protected void service(HttpServletRequest req,HttpServletResponse res) | 接收HTTP请求,并将它们分发给此类中定义的doXxx()方法 |
protected void doXxx(HttpServletRequest req,HttpServletResponse res) | 根据请求方式的不同分别定义的处理方法,如doGet().doPost()等 |
经验:HttpServet的service(HttpServletRequest req,HttpServletResponse res)方法相当于一个分发器,可以根据请求方法的类型,调用响应的doXxx()方法。所以在编写Servlet时只需要根据应用的需要,重写doGet() 或者doPost()方法。
ServletConfig接口
Servlet容器使用ServletConfig接口的实例在Servlet初始化期间向其传递配置信息,ServletConfig接口定义的方法如下。
方法名称 | 功能描述 |
---|---|
public String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数值 |
public ServletContext getServletContext() | 返回Servlet的上下对象引用 |
ServletContext 接口
一个ServletContext接口的实例表示一个Web 应用的上下文,Servlet使用ServletContext接口定义的方法与它的Servlet容器进行通信。JSP内置对象application就是ServletContext的实例。
Servlet容器厂商负责提供ServletContext接口的实现,容器在应用程序加载时创建ServletContext对象,ServletContext对象被Servlet容器中的所有Servlet共享。
方法名称 | 功能描述 |
---|---|
public String getInitParameter(String name) | 获取系统范围的名称为name的初始化参数值,系统范围的初始化参数可以在部署描述符中使用元素定义 |
public void setAttribute(String name,Object object) | 设置名称为name |
public Object getAttribute(String name) | 获取名称为name的属性 |
public String getRealPath(String path) | 返回参数所代表目录的真是路径 |
public void log(String message) | 记录一般日志信息 |
ServletRequset 和HttpServletRequset 接口
1.ServletRequset接口
当客户请求时,有Servlet容器创建ServletRequset 对象用于封装客户的请求信息,这个对象将被容器作为service()方法的参数之一传递给Servlet,Servlet能够利用ServletRequset对象获取客户端的请求数据。
ServletRequset常用的接口
方法名称 | 功能描述 |
---|---|
public abstract Object getAttribute(String name) | 获取名称为name的属性值 |
public abstract void setAttribute(String name,Object object) | 在请求中保存名称为name的属性 |
public abstract void removeAttribute(String name) | 清楚请求中名字为name的属性 |
public abstract String getCharactEncoding() | 返回请求体所使用的字符编码 |
public abstract void setCharacterEncodig() | 返回请求体的字符编码 |
public abstract String getParameter(String name) | 返回请求的参数的值 |
public abstract String[] getParamterValue(String name) | 返回指定参数的全部值 |
public abstract RequestDispatcher getRequestDispatch(String path) | 返回指向指定路径的请求分发对象 |
2.HttpServletRequest接口
HttpServletRequest 位于javax.servlet.http包中,继承自ServletRequest接口,通过该接口同样可以获取请求中的参数。HttpServletRequset接口除了继承ServletRequset接口中的方法,还增加了一些用于读取请求信息的方法。
方法名称 | 功能描述 |
---|---|
public abstract String getContextPath() | 返回请求URL中表示请求上下文的路径,上下文路径是请求URL的开始部分 |
public abstract Cookie[] getCookies() | 返回客户端在此请求中发送的所有cookie对象 |
public abstract HTTPSession getSession() | 返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session |
public abstract String getMethod() | 返回此次请求所使用的HTTP方法的名字,如GEt,POST |
public abstract String getHeader() | 获取指定的请求头信息 |
ServletResponse 和HttpServletResponse接口
1.ServletResponse接口
Servlet容器在接受客户请求时,除了创建ServletRequset对象用于封装客户的请求信息外,还创建了一个ServletResponse对象,用于响应数据,并且同时将两个对象一并作为参数传递给Servlet。Servlet利用ServletRequset对象获取客户端的请求数据,经过处理后由ServletResponse对象发送响应数据。
方法名称 | 功能描述 |
---|---|
public abstract PrintWriter getWriter() | 返回PrintWriter对象,用于向客户端发送文本 |
public abstract String getCharacterEncodig() | 返回在响应中发送的正文所使用的字符编码 |
public abstract void setCharacterEncodig(String charset) | 设置发送到客户端的响应的字符编码 |
public abstract void setContentType(String type) | 设置发送到客户端响应的内容类型,此时响应的状态属于尚未提交 |
2.HttpServletResponse接口
于HttpServletRequset对象类似,HttpServletResponse也是集成ServletResponse接口,用于客户端的响应。它除了具有ServletResponse接口的常用的方法外,还添加了新的方法。
方法名称 | 功能描述 |
---|---|
public abstract void addCookie(Cookie cookie) | 增加一个cookie到响应中,这个方法可以多次调用,设置多个cookie |
public abstract void addHeader( String name,String value) | 将一个名称为name,值为value的响应报头添加到响应中 |
public abstract void sendRedirect·(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL |
public abstract void encodeURL(String url) | 使用session ID 对用于重定向的URL进行编码 |