本文共 3669 字,大约阅读时间需要 12 分钟。
Servlet是用Java编写的应用程序,在服务器上运行,处理请求的信息并将其发送到客户端。Servlet在初始化后驻留内存,因此没做请求时无需加载。
用户的请求和Web应用通过Internet从一台计算机发送到另一个台计算机或服务器,使用超文本传输协议HTTP,HTTP是一个客户端和服务器请求和答应的标准。
Get和Post方法
HTTP请求消息使用Get和Post方法在Web上传输请求。
检索信息时用Get方法,要检索的信息作为字符序列传递,称为查询字符串,因此传递的数据对客户端是可见的,即将查询字符串附加到URL中,但查询字符串有长度限制,最多1024字节。
Post方法是HTTP定义的另一种请求方法,使用Post发送数据对客户端是不可见的,且对数据量没有限制。
比较Get与Post方法
Get方法是从服务器上获取数据,Post是向服务器传送数据;
在客户端,Get通过URL提交数据,数据在URL可见,Post把数据放在form数据体内提交;
Get提交的数据最多只有1024字节,Post没有数据量限制;
使用Get时,参数显示在地址栏,而Post不会,所以,如果数据是非敏感的,使用Get,反之使用Post。
当使用交互式Web应用时,Web服务器接收会话请求,处理请求和访问数据,并生成结果返回显示,servlet就是用于该过程的。
Java Servlet是为响应Web应用程序上下文中的HTTP请求而设计的。在创建一个Java Servlet时,一般需要子类HttpServlet,当用户通过URL发送一个请求时,Java运行环境(JRE)将结果包装在一个HttpServletResponse中,然后将原HTTP响应送回给发处该请求的客户机。在与Web应用进行交互式,通常是多个请求并获得响应,所有这些都是在一个会话语境中,Java语言将之包装在一个HttpSession对象中。
容器(如Tomcat)将为Servlet容器管理运行时环境。通过容器中的各种配置文件,在URL与服务器端组件之间搭建了一座桥梁,这些组件处理URL请求。在运行时,容器将加载并初始化servlet,管理其生命周期。
声明类
Servlet是一个类。
1 2 3 4 5 6 7 8 9 10 11 12 | import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); writer.println( "Hello, World!" ); writer.close(); } } |
其中javax.servlet.*是存放与HTTP协议无关的一般性Servlet类;javax.servlet.http.*增加了与HTTP协议有关的功能。
所有Servlet必须实现javax.servlet.Servlet接口,但通常选择实现javax.servlet.GenericServlet或javax.servlet.http.HttpServlet,如果写的Servlet代码与HTTP协议无关,必须继承GenericServlet类;若有关,必须继承HttpServlet类。
javax.servlet.*里面的ServletRequest和ServletResponse接口提供存储一般的请求和响应;而javax.servlet.http.*里面的HttpServletRequest和HttpServletResponse接口提供HTTP请求及响应的存取服务。
配置web.xml
1 2 3 4 5 6 7 8 9 10 | < web-app > < servlet > < servlet-name >hello</ servlet-name > < servlet-class >servlet.HelloWorldServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >hello</ servlet-name > < url-pattern >/hello</ url-pattern > </ servlet-mapping > </ web-app > |
Servlet的配置,需要配置两个标签<servlet>和<servlet-mapping>。
对于<servlet>,配置servlet的名字,所要调用的Java类,还有Servlet初始化时传入的参数。对于<servlet-mapping>,制订了Servlet名字,然后设置url连接,这里Servlet名字必须和上面的<servlet>标签中的<servlet-mapping>的值一致。
当在页面中设定的连接和<url-pattern>中设定的值一致时,则会通过<servlet-name>找到对应的Servlet类来运行。
Servlet容器将Servlet动态加载到服务器,HTTP Servlet使用HTTP请求和HTTP响应与客户端进行交互。因此Servlet容器支持请求和响应的HTTP协议。
客户端对Servlet的请求首先会被HTTP服务器接收,HTTP服务器将客户的HTTP请求提交Servlet容器,Servlet容器调用响应的Servlet,Servlet做出响应传递到Servlet容器,并进而有HTTP服务器将响应传给客户端。
Tomcat容器模型
Tomcat是一个小型的轻量级应用服务器,具有处理HTML的功能,同时它是一个Servlet和JSP容器,Tomcat就是HTTP服务器和Servlet容器的两个部分。
Servlet是实现javax.servlet.Servlet接口的对象,大多数Servlet通过从GenericServlet或HttpServlet类来进行扩展实现,Servlet API包含两个包:javax.servlet和javax.servlet.http。
Servlet运行在Servlet容器中,其生命周期由容器管理。Servlet的生命周期通过javax.servlet.Servlet接口的init()、service()和destroy()方法来表示。
Servlet生命周期包含4个阶段:
加载和实例化
Servlet容器负责加载和实例化Servlet。容器通过Java反射API来创建Servlet实例。
初始化
在Servlet实例化后,容器调用Servlet的init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化工作。对于每一个Servlet实例,init()方法只被调用一次。
处理请求
Servlet容器调用Servlet的service()方法对请求进行处理。在service()方法中,通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。对于HttpServlet类,该方法作为HTTP请求的分发器,这个方法在任何时候都不能被重载。在请求到来时,service()方法决定请求的类型(GET、POST,并发请求分发给相应的处理方法(doGet()、doPost())。
服务停止
当容器检测到一个Servlet实例应该从服务器中移除的时候,容器会调用实例的destroy()方法,以便让实力可以释放它所使用的资源。让需要释放容器或者容器被关闭时,容器就会调用Servlet实例的destroy()方法。在调用destroy()方法后,容器会释放这个Servlet实例,该实例随后被Java的垃圾收集器回收。