2.7 Servlet介绍 2.7.1 Servlet的开发
2.7 Servlet介绍
前面已经介绍过,JSP
的本质就是Servlet
,开发者把编写好的JSP
页面部署在web
容器中之后,web
容器会将JSP
编译成对应的Servlet
。但直接使用Servlet
的坏处是:Servlet
的开发效率非常低,特别是当使用Servlet
生成表现层页面时,页面中所有的HTML
标签,都需采用Servlet
的输出流来输出,因此极其烦琐。而且Servlet
是标准的Java
类,必须由程序员开发、修改,美工人员难以参与Servlet
页面的开发。这一系列的问题,都阻碍了Servlet
作为表现层的使用。
自MVC
规范出现后,Servlet
的责任开始明确下来,仅仅作为控制器使用,不再需要生成页面标签,也不再作为视图层角色使用。
2.7.1 Servlet的开发
前面介绍的JSP
的本质就是Servlet
,Servlet
通常被称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户端的请求.Servlet
是个特殊的Java
类,这个Java
类必须继承HttpServlet
。每个Servlet
都可以响应客户端的请求.
HttpServlet方法
相应特定请求的方法
Servlet
提供不同的方法用于响应客户端请求:
doGet
:用于响应客户端的GET
请求。dopost
:用于响应客户端的POST
请求。doPut
:用于响应客户端的PUT
请求。doDelete
:用于响应客户端的DELETE
请求。
事实上,客户端的请求通常只有GET
和POST
两种,Servlet
为了响应这两种请求,必须重写doGeto0
和donoso
两个方法。如果Servlet
为了响应4种方式的请求,则需要同时重写上面的4个方法。
service方法
大部分时候,Servlet
对于所有请求的响应都是完全一样的。此时,可以采用重写一个方法来代替上面的几个方法:只需重写service()
方法即可响应客户端的所有请求
另外,HttpServlet
还包含两个方法:
init(ServletConfig config)
:创建Servlet
实例时,调用该方法的初始化Servlet
资源destroy()
:销毁Servlet
实例时,自动调用该方法的回收资源
通常无须重写init
和destroy
两个方法,除非需要在初始化Servlet
时,完成某些资源初始化的方法,才考虑重写init
方法。如果需要在销毁Servlet
之前,先完成某些资源的回收,比如关闭数据库连接等,才需要重写destroy
方法。
不用为Servlet
类编写构造器,如果需要对Servlet
执行初始化操作,应将初始化操作放在Servlet
的init()
方法中定义。如果重写了init(ServletConfig config)
方法,则应在重写该方法的第一行调用super.init(config)
。该方法将调用HttpServlet
的init
方法.
下面提供一个Servlet
的示例,该Servlet
将获取表单请求参数,并将请求参数显示给客户端。
1 | package lee; |
上面的Servlet
类继承了HttpServlet
类,表明它可作为一个Servlet
使用。程序的粗体字代码定义了service
方法来响应用户请求。对比该Servlet
和2.6.6节中的request1.jsp
页面,该Servlet
和request1.jsp
页面的效果完全相同,都通过HttpServletRequest
获取客户端的form
请求参数,并显示请求参数的值。Servlet
和JSP
的区别在于:
Servlet
中没有内置对象,原来JSP
中的内置对象都必须由程序显式创建。- 对于静态的
HTML
标签,Servlet
都必须使用页面输出流逐行输出。
这也正是前面介绍的,JSP
是Servlet
的一种简化,使用JSP
只需要完成程序员需要输出到客户端的内容,至于JSP
脚本如何嵌入一个类中,由JSP
容器完成。而Servlet
则是个完整的Java
类,这个类的service
方法用于生成对客户端的响应。
普通Servlet
类里的service
方法的作用,完全等同于JSP
生成Servlet
类的_jspService()
方法。因此原JSP
页面的JSP
脚本、静态HTML
内容,在普通Servlet
里都应该转换成service
方法的代码或输出语句;原JSP
声明中的内容,对应为在Servlet
中定义的成员变量或成员方法。