Servlet个人学习总结
Servlet提供了一种基于组件的、平台无关的方法来构建基于Web的应用程序,而没有CGI( Common Gateway Interface,译作“通用网关接口”)程序的性能限制。Servlet可以访问整个Java API系列,包括用于访问企业数据库的JDBC API。
什么是Servlet?为什么要学习Servlet?
Java Servlet是在Web端或应用程序服务器上运行的程序,并充当来自Web浏览器或其他HTTP客户端的请求与HTTP服务器上的数据库或应用程序之间的中间层。
使用Servlet,我们可以通过网页表单收集来自用户的输入,显示来自数据库或其他来源的记录,并动态创建网页。
下图显示了Servlet在Web应用程序中的位置,其中HttpServlet通过Http协议为客户端提供服务,目前,Servlet也只有通过Http协议为我们提供服务,即GenericServlet只有HttpServlet这一个子类:
Servlet API
Servlet API由两个软件包构成,对应于HTTP协议的软件包以及对应于除了HTTP协议以外的其他软件包,因此Servlet API可以适用于任何通信协议。
笔者所学习的Servlet,是位于javax.servlet.http.HttpServlet包中的类和接口,是基于HTTP协议的。
一般在我们实际的编程中,Servlet必须符合一定的规则:
- 必须继承javax.servlet.http.HttpServlet;
- 重写其中的都Get()或doPost()方法。
doGet():接受并处理所有的get提交方式的请求;doPost():接受并处理所有的post提交方式的请求。
Servlet使用前提
Servlet要想使用,必须对其进行配置:在Servlet3.0版本之前,使用web.xml编写映射关系进行配置,在Servlet3.0之后,我们可以在类的定义之前用注释@WebServlet(value="url-pattern")
对该Servlet添加映射关系,因为Servlet是向下兼容的,所以也可以使用web.xml进行配置。
- web.xml方式:
- Servlet的执行流程:请求对应的链接=》到web.xml找该链接相应的
<url-pattern>
=》根据找到的<url-pattern>
对应的<servlet-mapping>
中的<servlet-name>
找到有对应的<servlet-name>
的<servlet>
的<servlet-class>
==》最后,Servlet容器将请求交给该<servlet-class>
对应的Servlet类进行处理。
- Servlet的执行流程:请求对应的链接=》到web.xml找该链接相应的
- 注释
@WebServlet
方式:- Servlet的执行流程:请求的地址与@WebServlet的value值进行匹配,如果请求成功,则说明请求的就是给注解所对应的类。
如果使用Eclipse编写Serlet,可以直接在package下直接新建一个Servlet,这样的话会自动完成继承HttpServlet的父类、重写相关的方法和web.xml或注释的相关映射编写操作。
我们编写的url-pattern的格式为“/URL”,其中的“/”代表的是一个根目录,对于一个html(包括后续使用的JSP)来说,“/”等同于服务器根目录,即http://ip.post;如果是在web.xml或Servlet注释,则等同于该项目的项目根路径,即ip:post/项目/。如果index.jsp中请求<a href="abc">abc</a>
,则会去项目的src的根目录下寻找该Servlet,也会到该项目的WebContent下去寻找该html或jsp。
自定义Servlet、HttpServlet的继承关系
- ServletVonfig接口:
- ServletContext getServletContext():获取Servlet上下文对象(可以先了解一下,相当于JSP九大内置对象的application);
- String getInitParameter(String name):在当前的Servlet范围内,获取名为name的参数值(也就是获取名为name的初始化值)。
- ServletContext(大致和JSP的application差不多)
- getContextPath():获取相对路径
- getRealPath():获取绝对路径
- String getInitParameter(String name):在当前的Web容器范围内,获取名为name的参数值(也就是获取名为name的初始化值)。
例如在一个自定义的Servlet(servlet.exampleServlet)下编写以下的init()方法:
public void init() throws ServletExecption{
//获取当前的Servlet的初始化参数,即ServletVonfig接口的String getInitParameter(String name)方法
String value = super.getInitParameter("servletParam");
System.out.println("当前Servlet的参数servletParam的值为:"+value );
//获取当前的Web容器的初始化参数,即ServletContext接口的String getInitParameter(String name)方法
ServletContext servletContext = super.getServletContext();
String globeValue = servletContext .getInitParameter("globeParam");
System.out.println("当前Web容器的参数servletParam的值为:"+globeValue );
}
在web.xml下:
<!--在整个web容器下设置初始化参数-->
<context-param>
<param-name>globeParam</param-name>
<param-value>globeValue</param-value>
</context-param>
<!--在指定的Servlet下设置初始化参数-->
<servlet>
<servlet-name>exampleServlet</servlet-name>
<servlet-class>servlet.exampleServlet</servlet-class>
<init-param>
<param-name>servletParam</param-name>
<param-value>servletParamValue</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>exampleServlet</servlet-name>
<url-pattern>/exampleServlet</url-pattern>
</servlet-mapping>
注意:不管是ServletVonfig接口的String getInitParameter(String name)方法还是ServletContext接口的String getInitParameter(String name)方法,都需要有该<param-name>
的<param-value>
,并且name需要写对。
Servlet的优势
Java Servlet通常具有与使用通用网关接口(CGI)实现的程序相同的目的。但是,与CGI相比,Servlet具有许多优势:
- 性能明显更好。
- Servlet在Web服务器的地址空间内执行。不必创建单独的过程来处理每个客户端请求。
- Servlet是平台无关的,因为它们是用Java编写的。
- 服务器上的Java安全管理器强制执行一组限制,以保护服务器计算机上的资源。因此,servlet是可信任的。
- servlet可使用Java类库的全部功能。它可以通过您已经看到的套接字和RMI机制与applet,数据库或其他软件进行通信。
Servlet软件包
Java Servlet是由Web服务器运行的Java类,该Web服务器具有支持Java Servlet规范的解释器。
就像任何其他Java类一样,Java servlet已经创建并编译好了。安装Servlet软件包并将其添加到计算机的Classpath之后,可以使用JDK的Java编译器或任何其他当前编译器来编译servlet。
Servlet的应用
- 读取客户端(浏览器)发送的显式数据。这包括网页上的HTML表单,也可能来自applet或自定义HTTP客户端程序。
- 读取客户端(浏览器)发送的隐式HTTP请求数据。这包括浏览器可以理解的cookie,媒体类型和压缩方案等。
- 处理数据并生成结果。此过程可能需要与数据库对话,执行RMI(Remote Method Invocation,译作“远程方法调用”)或CORBA(Common ObjectRequest Broker Architecture,译作“公共对象请求代理体系结构”)调用,调用Web服务或直接计算响应。
- 将显式数据(即文档)发送给客户端(浏览器)。该文档可以以多种格式发送,包括文本(HTML或XML),二进制(GIF图像),Excel等。
- 将隐式HTTP响应发送到客户端(浏览器)。这包括告诉浏览器或其他客户端正在返回哪种类型的文档(例如HTML)、设置cookie和缓存参数以及其他此类任务。
目录
Servlet-生命周期
说明:Servlet的生命周期一共有5个阶段(注意,3个阶段是不正确的),这5个阶段分别是:
- 加载:Servlet自动加载
- 初始化init()方法:该方法会在Servlet被加载并实例化后执行
- 服务:抽象方法service()——一般常用的是doGet()和doPost()方法
- 销毁destroy()方法:Servlet被系统回收时执行。
- 卸载:Servlet自动处理
Servlet-示例
Servlet-表单数据
Servlet-客户端请求
Servlet-Http代码
Servlet-编写过滤器
Servlet-异常
Servlet-Cookies处理
Servlet-Session跟踪
Servlet-文件上传
Servlet-页面重定向和请求转发的区别
Servlet-点击计数器
Servlet-注释
结语
Servlet一般应用在后台充当服务器进行对客户端请求的操作处理,然而也可以把他做成前端可展示的页面——jsp。jsp其实就是一种Servlet,然而,在学习jsp和Servlet过程中,我们一般推荐先学习Servlet,这样子在弄明白什么是客户端什么是服务器之后,再学习jsp就轻松许多了。