Servlet的说明及使用案例
Servlet的说明及使用案例
制作人:全心全意
Servle的基础介绍
Servlet结构体系

Servlet对象、ServletConfig对象与Serializable对象是接口对象,其中Serializable是java.io包中的序列化接口,Servlet对象、ServletConfig对象是javax.servlet包中定义的对象,这两个对象定义了Servlet的基本方法以及封装了Servlet的相关配置信息。GenericServlet对象是一个抽象类,它分别实现了Servlet、ServletConfig与Serializable三个接口,该对象为Servlet接口及ServletConfig接口提供了部分实现。这个对象为HTTP请求中的POST、GET等类型提供了具体的操作方法,所以,通常情况下,我们所编写的Servlet对象都继承于HttpServlet,在开发中,所使用的具体的Servlet对象就是HttpServlet对象,原因是HttpServlet是Servlet的实现类,并提供了HTTP请求的处理方法。
Servlet的技术特点
Servlet使用Java语言编写,它不仅继承了Java语言中的优点,而且还对Web的相关应用进行了封装,同时Servlet容器还提供了对应用的相关扩展,无论是在功能、性能、安全等方面都十分优秀,其技术特点表现在以下几方面。
功能强大:Servlet采用Java语言编写,它可以调用Java API中的对象及方法。此外,Servlet对象对Web应用进行了封装,提供了Servlet对象Web应用的编程接口,还可以对HTTP请求进行相应的处理,如处理提交数据、会话跟踪、读取和设置HTTP头信息等。由于Servlet既拥有Java提供的API,而且还可以调用Servlet封装的Servlet API编程接口,因此,它在业务功能方面十分强大。
可移植:Java语言是跨越平台的,所谓跨越平台是指程序的运行不依赖于操作系统平台,它可以运行到多个系统平台中,如目前常用的操作系统Windows. Linux和UNIX等,由于Servlet使用Java语言编写,所以,Servlet继承了Java语言的优点,程序一次编码,多平台运行,拥有超强的可移植性。
性能高效: Servlet对象在Servlet容器启动时被初始化,当第一次被请求时,Servlet容器将其实例化,此时它驻存于内存中。如果存在多个请求,Servlet不会再被实例化,仍然由此Servlet对其进行处理。每一个请求是一个线程,而不是一个进程,因此,Servlet对请求处理的性能是十分高效的。
安全性高:Servlet使用了Java的安全框架,同时Servlet容器还可以为Servlet提供额外的功能,它的安全性是非常高的
可扩展:Java语言是面向对象的编程语言,Servlet由Java语言编写,所以它继承了Java的面向对象的优点。在业务逻辑处理中,可以通过封装、继承等来扩展实际的业务需要,其扩展性非常强。
Servlet与JSP的区别
Servlet是使用Java Servlet接口(API)运行在Web应用服务器上的Java程序,其功能十分强大,它不但可以处理HTTP请求中的业务逻辑,而且还可以输出HTML代码来显示指定页面。而JSP是一种在Servlet规范之上的动态网页技术,在JSP页面中,同样可以编写业务逻辑处理HTTP请求,也可以通过HTML代码来编辑页面,在实现功能上,Servlet与JSP貌似相同,实质存在一定的区别,主要表现在以卜几方面。
角色不同:JSP页面可以存在HTML代码与Java代码并存的情况,而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页面由JSP Container对其进行管理,在每次执行不同内容的动态JSP页面时,JSP Container都要对其自动编译,所以,它的效率低于Servlet的执行效率。而Servlet在编译完成之后,则不需要再次编译,可以直接获取及输出动态内容。在JSP页面中的内容没有变化的情况下,JSP页面在编译完成之后,JSP Container不会再次对JSP进行编译。
说明:在JSP产生之前,无论是页面设计还是业务逻辑代码都需要编写于Servlet中。虽然Servlet在功能方面很强大,完全可以满足对Web应用的开发需求,但如果每一句HTML代码都由Servlet的固定方法来输出,则操作会过于复杂。而且在页面中,往往还需要用到CSS样式代码、JS脚本代码等,对于程序开发人员而言,其代码量将不断增加,所以操作十分繁琐。针对这一问题,Sun提出了JSP (Java Server Page)技术,可以将HTML. CSS, JS等相关代码直接写入到JSP页面中,从而简化了程序员对Web程序的开发。
Servlet代码结构
在Java中,通常所说的Servlet是指HttpServlet对象,在声明一个对象为Servlet时,需要继承HttpServlet类。HttpServlet类时Servlet接口的一个实现类,继承该类后,可以重写HttpServlet类中的方法对HTTP请求进行处理。其代码结构如下:
package com.zq; 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对象中,最常用的方法是doGet()与doPost()方法,这两个方法分别用于处理HTTP的Get与Post请求。
Servlet API编程常用的接口和类
Servlet接口
Servlet的运行需要Servlet容器的支持,Servlet容器通过调用Servlet对象提供了标准的API接口,对请求进行处理。在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 getServletConfig() | 用于获取Servlet对象的配置信息,返回ServletConfig对象 |
| public String getServletInfo() | 返回有关Servlet的信息,它是纯文本格式的字符串,如作者、版本等 |
在Servlet中,主要的方法是service(),当客户端请求到来时,Servlet容器将调用Servlet实例的service()方法对请求进行处理。
ServletConfig接口
ServletConfig接口位于javax.servlet包中,它封装了Servlet的配置信息,在Servlet初始化期间被传递。每一个Servlet都有且只有一个ServletConfig对象。该对象定义了4个方法,其功能及作用如下表所示。
| 方 法 | 说 明 |
| public String getInitParameter(String name) | 返回String类型名称为name的初始化参数值 |
| public Enumeration getInitParameterNames() | 获取所有初始化参数名的枚举集合 |
| public ServletContext getServletContext() | 用于获取Servlet上下文对象 |
| public String getServletName() | 返回Servlet对象的实例名 |
HttpServletRequest接口
HttpServletRequest接口位于javax.servlet.http包中,继承了javax.servlet.ServletRequest接口,是Servlet中的重要对象,在开发过程中较为常用,其常用方法及说明如下表所示。
| 方 法 | 说 明 |
| public String getContextPath() | 返回请求的上下文路径,此路径以“/”开关 |
| public Cookie[] getCookies() | 返回请求中发送的所有cookies对象,返回值为cookie数组 |
| public String getMethod() | 返回请求所使用的HTTP类型,如get、post等 |
| public String getQueryString() | 返回请求中参数的字符串形式,如请求MyServlet?username=admin,则返回username=admin |
| public String getRequestURI() | 返回主机名到请求参数之间的字符串形式 |
| public StringBuffer getRequestURL() | 返回请求的URL,此URL中不包含请求的参数。注意此方法返回的数据类型为StringBuffer |
| public String getServletPath() | 返回请求URI中的Servlet路径的字符串,不包含请求中的参数信息 |
| public HttpSession getSession() | 返回与请求关联的HttpSession对象 |
HttpServletResponse接口
HttpServletResponse接口位于javax.servlet.http包中,它继承了javax.servlet.ServletResponse接口,同样是一个非常重要的对象,其常用方法及说明如下表所示。
| 方 法 | 说 明 |
| public void addCookie(Cookie cookie) | 向客户端写入cookie信息 |
| public void sendError(int sc) | 发送一个错误状态码为sc的错误响应到客户端 |
| public void sendError(int sc,String msg) | 发送一个包含错误状态码及错误信息的响应到客户端,参数sc为错误状态码,参数msg为错误信息 |
| public void sendRedirect(String location) | 使用客户端重定向到新的URL,参数location为新的地址 |
GenericServlet类
在编写一个Servlet对象时,必须实现javax.servlet.Servlet接口,在Servlet接口中包含的5个方法,也就是说创建一个Servlet对象要实现这5个方法,这样操作非常不方便。javax.servlet.GenericServlet类简化了此操作,实现了Servlet接口
GenericServlet类是一个抽象类,分别实现了Servlet接口与ServletConfig接口。该类实现了除service()之外的其他方法,在创建Servlet对象时,可以继承GenericServlet类来简化程序中的代码,但需要实现service()方法。
HttpServlet类
GenericServlet类实现了javax.servlet.Servlet接口,为程序的开发提供了方便;但在实际开发过程中,大多数的应用都是使用Servlet处理HTTP协议的请求,并对请求作出响应,所以通过继承GenericServlet类仍然不是很方便。javax.servlet.http.HttpServlet类对GenericServlet类进行了扩展,为HTTP请求的处理提供了灵活的方法。
HttpServlet类仍然是一个抽象类,实现了service()方法,并针对HTTP1.1中定义的7种请求类型提供了相应的方法——doGet()方法、doPost()方法、doPut()方法、doDelete()方法、doHead()方法、doTrace()方法和doOptions()方法。在这7种方法中,除了对doTrace()方法与doOptions()方法进行了简单实现外,HttpServlet类并没有对其他方法进行实现,需要开发人员在使用过程中根据实际需要对其进行重写。
HttpServlet类继承了GenericServlet类,通过其对GenericServlet类的扩展,可以很方便地对HTTP请求进行处理及响应。
Servlet的创建示例
NewServlet类:处理HTTP的get请求,通过PrintWriter对象进行简单输出。
package com.zq; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class NewServlet extends HttpServlet { protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println(" <HEAD><TITLE>Servlet实例</TITLE></HEAD>");
out.println(" <BODY>");
out.print("Servlet实例:");
out.print(this.getClass());
out.println(" </BODY>");
out.println(" </HTML>");
out.flush();
out.close();
}
}
web.xml文件:声明和映射Servlet
<servlet>
<servlet-name>newServlet</servlet-name>
<servlet-class>com.zq.NewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>newServlet</servlet-name>
<url-pattern>/zq/newServlet</url-pattern>
</servlet-mapping>
Servlet的说明及使用案例的更多相关文章
- javaweb 基于java Servlet登入 简单入门案例
项目流程 第一步:创建一个java webproject第二步:创建三个界面,1,login.jsp 2 success.jsp 3 fail.jsp第三步:更改新建界面编码格式,utf-8 默然编码 ...
- Servlet学习的两个案例之网站访问次数的统计
一.统计次数的Servlet源码 package com.shanrengo; import java.io.IOException; import javax.servlet.ServletCont ...
- JavaWeb中Servlet和JSP的分工案例
jsp和Servlet的分工: * JSP: > 作为请求发起页面,例如显示表单.超链接. > 作为请求结束页面,例如显示数据. * Servlet: &g ...
- Servlet中response的相关案例(重定型,验证码,ServletContext文件下载)
重定向 首先设置状态码,设置响应头 //访问Demo1自动跳转至Demo2 //设置状态码 response.setStatus(302); //设置响应头 response.setHeader(&q ...
- javaweb之servlet 全解
①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...
- Java技术分享:如何编写servlet程序
身为计算机专业的我,从接触java至今,已经有七年之久,从最开始的小白到现在的大白,这是一个漫长而曲折的历程. 大学刚接触Java这个学科时,一点儿都不理解java是要干嘛的,只知道学起来肯定不容易, ...
- 七、Servlet概述
Servlet概述 生命周期方法:void init(ServletConfig):出生之后(1次):void service(ServletRequest request, ServletRes ...
- JavaWeb学习总结(二) Servlet
本文目录 一.Servlet概述 二.Servlet接口 三.GenericServlet 四.HttpServlet 五.Servlet细节 六.ServletContext 回到顶部 一.Serv ...
- Servlet原理解析&使用指南
Servlet(Server Applet)全称Java Servlet,是用Java编写的服务器端程序.广义上指任何实现了Server接口的类,主要功能在于交互式地浏览和生成数据,生成动态Web内容 ...
随机推荐
- PyCharm创建文件时自动添加头文件
依次找到以下路径: File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/env ...
- POJ3709 K-Anonymous Sequence 斜率优化DP
POJ3709 题意很简单 给n个递增整数(n<=500000)和一种操作(选择任意个数 使他们减少整数值) 使得对于所有的整数 在数列中 有k个相等的数 O(n^2)的DP方程很容易得出 如下 ...
- oracle中WMSYS.WM_CONCAT函数的版本差异
昨天在测试的时候发现,开发人员写的一段程序放在开发库中是好的,但是放在测试库中就会有问题.开发人员一直找不到问题的原因在哪里.于是就花了点时间协助开发人员来找问题的根本原因. 通过一些技术手段,定位到 ...
- Ubuntu搭建Eclipse+JDK+SDK的Android (转载)
转自:http://blog.csdn.net/ithomer/article/details/6960989 今晚重装Ubuntu系统,重新安装了一套eclipse+jdk+SDK的Android开 ...
- bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】
参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...
- P1266 速度限制(分层图spfa)
P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快. ...
- centos docker 安装mysql 8.0
centos 版本 CentOS Linux release 7.5.1804 (Core) 内核版本: 3.10.0-862.el7.x86_64 下载最新版mysql docker pull m ...
- 说说Charles
本文来源 https://blog.csdn.net/Aaroun/article/details/79109917 今天,给大家做一次分享,主要面向移动端测试,介绍了我平时接口开发工作中用到的功能. ...
- [Qt Creator 快速入门] 第5章 应用程序主窗口
对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...
- 实现div左右上下都居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...