目录
前言
本章主要内容为servlet的部署、创建、与运行, servlet的工作原理,通过JSP页面访问servlet, 共享变量,doPost和doGet方法,重定向与转发, 使用session。本章难点为servlet的工作原理和重定向与转发
一、 servlet的部署、创建与运行
1.1 源文件及字节码文件
①Servlet类
写一个创建servlet的类就是编写一个特殊类的子类,这个特殊的类就是javax.servlet.http包中的HttpServlet类。HttpServlet的子类被习惯地称作一个Servlet类,这样的类创建的对象习惯地被称作一个servlet。
②字节码文件的保存
字节码文件按着类的包名对应的目录路径保存到Web服务目录中特定子目录中。包名moon.sun对应的目录路径是moon\sun,因此,保存到:\WEB-INF\classes\moon\sun。"保存类型"选择为"所有文件",将"编码方式"选择为"ANSI"。 然后用命令行进入moon\sun的父目录classes(不要进入moon或sun目录)编译
classes> javac -cp servlet-api.jar moon\sun\Example6_1.java
注意:编译时不要忘记使用-cp参数,该参数指定使用非核心类库中的类。本章使用的javax.servlet和javax.servlet.http包中的类不在JDK提供的核心类库中,均在servlet-aoi.jar文档中,因此可以将Tomcat安装目录中的lib子目录中的servlet-aoi.jar文件复制(不要剪切)到\WEB-INF\classes中。
1.2 编写部署文件web.xml
(1)Servlet类的字节码文件保存到指定的目录后,必须为Tomcat服务器编写一个部署文件,只有这样,Tomcat服务器才会用Servlet类创建
(2)部署文件是一个XML文件,名字必须是web.xml。
(3)编写的 web.xml文件必须保存到Web服务目录的WEB-INF子目录中。
1.3 servlet的创建与运行
用户就可以根据web.xml部署文件来请求Tomcat服务器创建并运行一个servlet。 如果Tomcat服务器没有名字为hello的servlet,就会根据web.xml文件中servlet标记的子标记servlet-class指定的Servlet类创建一个名字为hello的servlet。因此,如果名字是hello的servlet被创建之后,又修改Java源文件、编译得到新的Servlet类,并希望Tomcat服务器用新的Servlet类创建servlet,那么就要重新启动Tomcat服务器。
1.4 向servlet传递参数的值
在请求一个servlet时,可以在请求的url-pattern中额外加入参数及其值,格式是:
url-pattern?参数1=值&参数2=值…参数n=值
那么被请求的servlet就可以使用request对象获取参数的值,例如:
request.getParameter(参数n)
二、servlet的工作原理
2.1 servlet 对象的生命周期
servlet由Tomcat服务器负责创建并完成初始化工作。当多个用户请求一个servlet时,服务器为每个用户启动一个线程。 一个servlet的生命周期主要有下列三个过程组成:
(1) servlet第一次被请求加载时,服务器创建servlet,servlet调用init方法完成必要的初始化工作。
(2) 新诞生的servlet再调用service方法响应用户的请求。
(3) 当服务器关闭时,调用destroy方法销毁servlet。 init方法只被调用一次。当后续的用户请求servlet服务时,Tomcat服务器将启动一个新的线程,在该线程中,servlet调用service方法。也就是说,每个用户的每次请求都导致service方法被调用执行,其执行过程分别运行在不同的线程中。
2.2 init方法
servlet第一次被请求加载时,服务器创建一个servlet,这个对象调用init方法完成必要的初始化工作。该方法在执行时,服务器会把一个SevletConfig类型的对象传递给init()方法,这个对象就被保存在servlet中,直到servlet被销毁。
2.3 service方法
该方法是HTTPServlet类中的方法,可以在子类中直接继承该方法或重写这个方法,service方法的声明格式时:
public void service(HttpServletRequest request HttpServletResponse response)throw ServletException,IOException
Tomcat服务器将两个参数传递给该方法。一个是HTTPServletRequest类型的对象,该对象封装了用户的请求信息,另一个时HTTPServletResponse类型的对象,该对象用来响应用户的请求。和init方法不同的是,init方法只被调用一次,而service方法可能被多次的调用。因此,不同线程的service方法中的局部变量互不干扰,一个线程改变了自己的service方法中局部变量的值不会影响其他线程的service方法中的局部变量。
2.4 destroy方法
该方法是HTTPServlet类中的方法,子类可直接继承这个方法,一般不需要重写。声明格式为:
public destroy();
当Tomcat服务器终止服务时,destroy()方法会被执行,销毁servlet。
三、 通过JSP页面访问servlet
按照部署文件 web.xml 给出的 servlet的 url-pattern,用户除了可以在浏览器输人 url-pattern请求运行一个servlet外,也可以通过JSP页面来请求一个servlet。
需要特别注意的是,如果web.xml文件中给出的 servlet的url-pattcrn是/lookHello,那么JSP页面请求servlet时,必须要写成lookHello,不可以写成/lookHello,否则将变成请求root 服务目录下的某个servlet。
①通过表单向servlct 提交数据
Web 服务目录下的JSP页面都可以通过[orm表单请求该 Web服务日录下的某个servlet。如果web.xml文件中给出的servlet 的url-pattern 是/computeBill,那么form表单中action给出的值就是computeBill,如下所示:
< form action = "computeBill" >
</form>
②通过超链接访问servlet
JSP页面可以使用超链接去请求某个servlet。如果web.xml文件中给出的请求servlet的url-pattern是/circle,那么超链接标记中的href的值是circle(/circle):
<a href ="circle"></a>
四、共享变量
Servlet容器允许在不同的Servlet之间共享数据,以便实现信息的交换和共享。我们可以使用ServletContext对象来存储和获取这些共享变量。ServletContext对象在整个Web应用程序中是唯一的,并且可以在所有的Servlet中访问到。
五、 doGet和doPost方法
(1)HttpServlet类除了init、service、destroy方法外,该类还有两个很重要的方法:doGet和doPost,用来处理用户的请求并作出响应。
(2)实际上HttpServlet类所给出的service方法的功能是检查HTTP请求类型(get、post),并在service方法中根据用户的请求方式,在service方法中对应地再调用doGet或doPost方法。 因此,在编写的Servlet类(HttpServlet类的一个子类)时,也可以不重写service方法来响应用户,直接继承service方法即可。
(3)如果不重写service方法,就需要在Servlet类中重写doPost或doGet方法来响应用户的请求。如果不论用户请求类型是post还是get,Tomcat服务器的处理过程完全相同,那么可以只在doPost方法中编写处理过程,而在doGet方法中再调用doPost方法即可,或只在doGet方法中编写处理过程,而在doPost方法中再调用doGet方法。如果根据请求的类型进行不同的处理,就要在两个方法中编写不同的处理过程(这一点比service方法更为灵活)。
六、重定向与转发
重定向的功能是将用户从当前页面或servlet定向到另一个JSP页面或servlet。转发的功能是将用户对当前JSP页面或servlet的请求转发给另一个JSP页面或servlet。
①sendRedirect方法
重定向方法void sendRedirect(String location) 将用户重新定向到另一个JSP页面或servlet。
② forward方法
当前页面所转发道德JSP页面或servlet可以使用request获取用户提交的顺序。
③二者的区别
转发(forwar)和重定向方法(sendRedirect)不同的是,用户可以看到转发到的JSP页面或servlet的运行效果,但是,在浏览器的地址栏中不能看到forward方法转发到的JSP页面的地址或servlet的地址,用户在浏览器的地址栏中所看到的仍然是当前JSP页面的URL或servlet的url-pattern。如果此时刷新浏览器,那么请求将是当前的JSP页面或servlet。所转发到的标页面或servlet可以使用request获取用户提交的数据。而重定向的目标页面或servlet无法使用request获取用户提交的数据。另外,当servlet中执行forward方法实施转发操作时,Tomcat会立刻结速当前servlet的执行。而servlet中执行sendRedirect方法(重定向,也见4.2.3)时,Tomcat服务器还是要把当前的servlet代码执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前servlet代码的执行效果。如果在执行sendRedirect(URL url)方法后,servlet紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前servlet的执行。
④使用转发的好处
使用转发技术可以让JSP页面和处理数据的servlet解耦,JSP页面只需和处理转发的servlet打交道。
七、使用session
用户在访问一个 Web服务目录期间,Tomcat 服务器为该用户分配一个 session对象(称为用户的会话),Tomcat 服务器可以在各个页面以及servlet 中使用这个session记录用户的有关信息,而且Tomcat 服务器保证不同用户的session对象互不相同。有关session对象的原理、常用方法可参见4.3节。本节学习怎样在servlet中使用session对象记录有关信息。HttpServletRequest 对象request 调用getSession方法获取用户的session对象:
HttpSession session= request.getSession(true);
总结
以上便是本章的所有内容。需熟练掌握,多加练习。