本文将使用
javax.servlet.http
包中的类 ,javax.servlet.http
包不在JDK 的核心类库中, 因此需要将 Tomcat 安装目录lib 子目录中的servlet-api.jar
文件复制到 Tomcat服务器所使用的JDK的扩展目录中,比如,复制到D:\jdk1.7\jre\lib\ext
中。
一、servlet的部署、创建与运行
Java Servlet的核心思想是在服务器端创建能响应用户请求的对象, 即创建servlet
, 简称servlet
。因此, 学习JavaServlet的首要任务是掌握怎样编写创建servlet
的类、怎样在 Tomcat服务器上保存编译这个类所得到的字节码、怎样编写 部署文件、怎样请求Tomcat服务器创建一个servlet
。
1、源文件及字节码文件
- Servlet类
写一个创建servlet
的类就是编写一个特殊类的子类,这 个特殊的类就是javax.servlet.http
包中的HttpServlet
类。这 样的子类创建的对象习惯地被称作一个servlet
。 - 字节码文件的保存
为了调试代码的方便,可以事先将创建servlet
的类的源文件, 按着其包名,保存到Web服务目录的下述子目录中:
\WEB-INF\classes\myservlet\control
然后按如下格式编译源文件:classes>javac myservlet\control\Servlet
源文件 例如:
classes>javac myservlet\control\Example5_1_Servlet.java
2、编写部署文件 web.xml
Servlet类的字节码保存到指定的目录后,必须为Tomcat服务器编写一个部署文件,只有这样,Tomcat服务器才会 按用户的请求使用Servlet
字节码文件创建对象。
编写的web.xml
文件需要保存到Web服务目录的WEB-INF 子目录中, 比如ch5\WEB-INF
中。根据例子1给出的 Servlet类,我们编写的web.xml
文件的内容如下):
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>myservlet.control.Example5_1_Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/lookHello</url-pattern>
</servlet-mapping>
</web-app>
<servlet>
标记及子标记
<servlet>
标记需要有2个子标记:
<servlet-name>
和<servlet-class>
其中<servlet-name>
标记的内容是创建的servlet
的名字.
<servlet-class>
标记的内容指定用哪个Servlet
类来创建servlet
。<servlet-mapping>
标记及子标记
一个<servlet>
标记会对应地出现一个 <servlet-mapping>
标记,
<servlet-mapping>
标记需要有两个子标记:
<servet-name>
和<url-pattern>
.
其中<servet-name>
标记的是创建的servlet
的名字,<url-pattern >
标记 用来指定用户用怎样的URL格式来请求servlet
,比如,<url-pattern>
标记的内容是:/lookHello
,
那么用户必须在浏览器的地址栏中键入:
http://127.0.0.1:8080/ch5/lookHello
来请求名字是hello
的servlet
。
3、servlet的创建与运行
servlet
由Tomcat 服务器负责创建, Web 设计者只需为 Tomcat服务器预备好Servlet
类的字节码文件、编写好相应的配置文件web.xml
即可。用户就可以根据web.xml
部署文件来 请求服务器创建并运行一个servlet
。
4、向servlet传递参数的值
在请求一个servlet
时,可以在请求的url-pattern
中额外的加入参数及 其值,格式是:
servlet名?参数1=值1&参数2=值…参数n=值
那么被请求的servlet
就可以使用request
对象获取参数的值,例如:
request.getParameter(参数n)
比如可以在浏览器的浏览器键入:
http://127.0.0.1:8080/ch5/lookHello?moon=loveliness
请求lookHello
中的servlet
,并向其传递参数moon
的值:"loveliness
"。
二、servlet的工作原理
servlet
是javax.servlet
包中HttpServlet
类的子类的一个实例、由服务器负责创建并完成初始化工作。当多个用户请求一个servlet
时,服务器为每个用户启动一个线程而不是启动 一个进程,这些线程由服务器来管理,与传统的CGI为每个用户启动一个进程相比较,效率要高的多。
1、servlet 对象的生命周期
一个servlet
的生命周期主要有下列三个过程组成:
- 初始化
servlet
。servlet
第一次被请求加载时,服务器初 始化这个servlet
,即创建一个servlet
,这servlet
调用init
方法完成必要的初始化工作。 - 诞生的
servlet
再调用service
方法响应用户的请求。 - 当服务器关闭时,调用
destroy
方法,消灭servlet
。
init
方法只被调用一次,即在servlet
第一次被请求加载时调用该方法。当后续的用户请求servlet
服务时,Web服务将启动一个新的线程,在该线程中,servlet
调用service
方法响应用户的请求,也就是说,每个用户的每次请求都导致service
方法被调用执行,其执行过程分别运行在不同的线程中。
2、init方法
该方法是HttpServlet
类中的方法,可以在子类中重写这个 方法。init方法的声明格式:
public void init(ServletConfig config) throws ServletException
servlet
第一次被请求加载时,服务器创建一个servlet
,这 个对象调用init
方法完成必要的初始化工作。init
方法只被调用 一次,即在servlet
第一次被请求加载时调用该方法。
3、service方法
该方法是HttpServlet
类中的方法,我们可以在子类中直接 继承该方法或重写这个方法。service
方法的声明格式:
public void service(HttpServletRequest request HttpServletResponse response)throw ServletException,IOException
当后续的用户请求该servlet
时,服务器将启动一个新的线 程,在该线程中,servlet
调用service
方法响应用户的请求,即每个用户的请求都导致service方法被调用执行,调用过程运行在不同的线程中,互不干扰。
4、destroy方法
该方法是HttpServlet
类中的方法,子类可直接继承这个方法,一般不需要重写。destroy
方法的声明格式:
public destroy()
当服务器终止服务时,比如关闭服务器等,destroy()
方法会被执行,消灭servlet
。
三、通过JSP页面访问servlet
用户除了可以在浏览器的地址栏中直接键入servlet
的请求 格式来请求运行一个servlet
外,也可以通过JSP页面来请求一 个servlet
。也就是说,可以让JSP页面负责数据的显示,而让 一个servlet
去做和处理数据有关的事情。
需 要 特 别 注 意 的 是 , 如果 web.xml
文 件 中 <servlet-mapping>
标记的子标记<url-pattern>
指定的请求servlet
的格 式是“/lookHello
”,那么JSP页面请求servlet
时,必须要写成 “ lookHello
” , 不可以写成“/lookHello
” , 否则将变成请求 root
服务目录下的某个servlet
。
1、通过表单向servlet提交数据
如果web.xml
文件中<url-pattern>
指定的请求servlet
的格 式是 “/computeBill
”, 那么form
表单中 action
给出的值就是 "computeBill
",如下所示意:
<form action= "computeBill" … …>
</form>
当请求一个servlet
时,可以加入参数及其值,格式是:
servlet名?参数1=值1&参数2=值…参数n=值
例如:
<form action="computeBill?sideA=10.66&sideB=23.9&sideC=897"
… …>
</form>
2、通过超链接访问servlet
如果web.xml
文件中<url-pattern>
指定的请求servlet
的格式是"/triangle
",那么<a>
超链接标记中href
的值是"triangle
",如下所示意:
<a href="triangle"></a>
四、共享变量
对于Servlet
类所创建的servlet
的,用户将共享该servlet
的成员变量。
五、doGet和doPost方法
可以在Servlet
类中重写doPost
或doGet
方法来响应用户的请求,这样可以增加响应的灵活性,并降低服务器的负担。
如果不论用户请求类型是post
还是get
,服务器的处理过程完全相同,那么可以只在doPost
方法中编写处理过程,而在doGet
方法中再调用doPost
方法即可,或只在doGet
方法中编 写处理过程,而在doPost
方法中再调用doGet
方法。
如果根据请求的类型进行不同的处理,就需在两个方法中编写不同的处理过程。
六、重定向与转发
重定向的功能是将用户从当前页面或servlet
定向到另一个JSP页面或servlet
;
转发的功能是将用户对当前JSP页面或servlet
的请求转发给另一个JSP页面或servlet
。
1、sendRedirect方法
void sendRedirect(String location)
是 HttpServletResponse
类中的方法。
当用户请求一个servlet
时,该servlet
在处理数据后,可以 使用重定向方法将用户重新定向到另一个JSP页面或servlet
。 重定向方法仅仅是将用户从当前页面或servlet
定向到另一个JSP页面或servlet
,
但不能将用户对当前页面或 servlet
的请求(HttpServletRequest
对象)转发给所定向的资源。
也就是说,重定向的目标页面或servlet
无法使用request
获取用户提交的数据。
2、RequestDispatcher对象
实现转发的步骤如下:
得到RequestDispatcher
对象
RequestDispatcher dispatcher=
request.getRequestDispatcher("a.jsp");
转发
例如:dispatcher.forward (request,response);
将用户对当前JSP页面或servlet
的请求转变成对a.jsp
页面的请求。
注意:
- 转发的目标页面或
servlet
可以使用request
获取用户 提交的数据。 - 用户在浏览器的地址栏中不能看到
forward
方法转发的页面的地址或servlet
的地址,只能看到该页面或servlet
的运行效果
七、使用session
HttpServletRequest
对象request
调用getSession
方法获取用户的session
对象:
HttpSession session=request.getSession(true);