版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章JavaServlet基础主要内容servlet的部署、创建与运行servlet的工作原理
通过JSP页面访问servlet共享变量doPost和doGet方法重定向与转发使用session难点servlet的工作原理重定向与转发关键实践绘制多边形双色球福利彩票第6章JavaServlet基础■有些Web应用可能只需要JSP+Javabean就能设计得很好,但是有些Web应用,就可能需要JSP+Javabean+servlet来完成,即需要服务器再创建一些servlet,配合JSP页面来完成整个Web应用程序的工作。关于这一点将在第7章的MVC模式中讲述。▲本章在webapps目录下新建一个Web服务目录ch6,因此,除非特别约定,本章例子中涉及的JSP页面均保存在ch6中。创建servlet的类的字节码文件需要按要求存放,因此需要在ch6下建立如下的目录结构(目录名字WEB-INF中的字母大写):\ch6\WEB-INF\classes第6章JavaServlet基础▲Tomcat9版本(2019年9月)
servlet-api.jar提供的javax.servlet和javax.servlet.http包中的类不在JDK提供的核心类库中。如果使用的Tomcat是9.0版本,为了方便编译Java源文件,请事先将Tomcat安装目录lib子目录中的servlet-api.jar文件复制(不要剪贴)到\ch6\WEB-INF\classes中。▲Tomcat11版本(2026年5月)servlet-api.jar提供的jakarta.servlet和jakarta.servlet.http包中的类不在JDK提供的核心类库中。如果使用的Tomcat是11版本,为了方便编译Java源文件,请事先将Tomcat安装目录lib子目录中的servlet-api.jar文件复制(不要剪贴)到\ch6\WEB-INF\classes中。Tomcat11版本中servlet-api.jar文件提供的包名彻底变了,由原来的名字javax.servlet和javax.servlet.http变成jakarta.servlet和jakarta.servlet.http特别注意:6.1servlet的部署、创建与运行6.1.1源文件及字节码文件1.Servlet类写一个创建servlet的类就是编写一个特殊类的子类,这个特殊的类就是javax.servlet.http包中的HttpServlet类。HttpServlet实现了Servlet接口,实现了响应用户的方法(这些方法将在后续内容中讲述)。HttpServlet的子类被习惯地称作一个Servlet类,这样的类创建的对象习惯地被称作一个servlet。例子6_1中的Example6_1.java的Examle6_1类是一个简单的Servlet类。例子6_1Example6_1.java6.1servlet的部署、创建与运行6.1.1源文件及字节码文件2.字节码文件的保存字节码文件按着类的包名对应的目录路径保存到Web服务目录中特定子目录中。包名moon.sun对应的目录路径是moon\sun,因此,保存到:\ch6\WEB-INF\classes\moon\sun可以事先将Java源文件,按照其包名,比如,包名为moon.sun,保存到\ch6\WEB-INF\classes\moon\sun然后用命令行进入moon\sun的父目录classes(不要进入moon或sun目录)编译:例子6_1Example6_1.javaclasses>javac-cpservlet-api.jarmoon\sun\Example6_1.java6.1servlet的部署、创建与运行6.1.2编写部署文件web.xml部署文件web.xml■Servlet类的字节码文件保存到指定的目录后,必须为Tomcat服务器编写一个部署文件,只有这样,Tomcat服务器才会用Servlet类创建servlet对象。■部署文件是一个XML文件,名字必须是web.xml。<?xmlversion="1.0"encoding="utf-8"?><web-app><servlet><servlet-name>hello</servlet-name><servlet-class>moon.sun.Example6_1</servlet-class>
</servlet>
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/lookHello</url-pattern>
</servlet-mapping></web-app>■web.xml由Tomcat服务器负责管理,Tomcat服务器配有内置的解析器,可以解析XML文件的标记中的数据。■编写的web.xml文件必须保存到Web服务目录的WEB-INF子目录中,比如ch6\WEB-INF中(不要保存在ch6中)。根据例子6_1给出的Servlet类,web.xml文件的内容如下(需要用纯文本编辑器编辑web.xml)6.1servlet的部署、创建与运行6.1.2编写部署文件web.xml部署文件web.xml<?xmlversion="1.0"encoding="utf-8"?><web-app><servlet><servlet-name>hello</servlet-name><servlet-class>moon.sun.Example6_1</servlet-class>
</servlet>
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/lookHello</url-pattern>
</servlet-mapping></web-app>★Web服务目录的WEB-INF子目录下的web.xml文件负责管理当前Web服务目录下的全部servlet,当该Web服务目录需要提供更多的servlet时,只要在web.xml文件中增加servlet和servlet-mapping子标记即可。★对于webapps下的Web服务目录,如果修改并重新保存web.xml文件,Tomcat服务器就会立刻重新读取web.xml文件,因此,修改web.xml文件不必重新启动Tomcat服务器。但是,如果修改导致web.xml文件出现错误,Tomcat服务器就会关闭当前Web服务目录下的所有servlet的使用权限。所以必须保证web.xml文件正确无误,才能成功启动Tomcat服务器。但是,对于不是webapps下的Web服务目录,如果新建或修改了相应的web.xml文件,需要重新启动Tomcat服务器。6.1servlet的部署、创建与运行6.1.3servlet的创建与运行■用户就可以根据web.xml部署文件来请求Tomcat服务器创建并运行一个servlet。■如果Tomcat服务器没有名字为hello的servlet,就会根据web.xml文件中servlet标记的子标记servlet-class指定的Servlet类创建一个名字为hello的servlet。因此,如果名字是hello的servlet被创建之后,又修改Java源文件、编译得到新的Servlet类,并希望Tomcat服务器用新的Servlet类创建servlet,那么就要重新启动Tomcat服务器。根据6.1.2中的web.xml文件,用户需在浏览器输入::8080/ch6/lookHello请求Tomcat服务器运行名字是hello的servlet。6.1servlet的部署、创建与运行6.1.4向servlet传递参数的值在请求一个servlet时,可以在请求的url-pattern中额外加入参数及其值,格式是:url-pattern?参数1=值&参数2=值…参数n=值那么被请求的servlet就可以使用request对象获取参数的值,例如:request.getParameter(参数n)例子6_2中,用户请求servlet绘制一个椭圆,请求时将椭圆的宽(横轴长)和高(纵轴长)通过参数width和height传递给servlet。例子6_2Example6_2.java(servlet)ch6\WEB\INF\下的部署文件web.xml添加如下的servlet和servlet-mapping标记(见6.1.2),部署的servlet的名字是lookPic,访问servlet的url-pattern是在浏览器输入::8080/ch6/lookPic?width=200&height=50:8080/ch6/lookPic?width=200&height=506.2servlet的工作原理servlet由Tomcat服务器负责管理,Tomcat服务器通过读取web.xml,然后创建并运行servlet。6.2.1servlet对象的生命周期servlet由Tomcat服务器负责创建并完成初始化工作。当多个用户请求一个servlet时,服务器为每个用户启动一个线程。一个servlet的生命周期主要有下列三个过程组成:(1)servlet第一次被请求加载时,服务器创建servlet,servlet调用init方法完成必要的初始化工作。(2)新诞生的servlet再调用service方法响应用户的请求。(3)当服务器关闭时,调用destroy方法销毁servlet。init方法只被调用一次。当后续的用户请求servlet服务时,Tomcat服务器将启动一个新的线程,在该线程中,servlet调用service方法。也就是说,每个用户的每次请求都导致service方法被调用执行,其执行过程分别运行在不同的线程中。6.2servlet的工作原理6.2.2init方法publicvoidinit(ServletConfigconfig)throwsServletExceptionservlet第一次被请求加载时,服务器创建一个servlet,这个对象调用init方法完成必要的初始化工作。该方法在执行时,服务器会把一个SevletConfig类型的对象传递给init()方法,这个对象就被保存在servlet中,直到servlet被销毁。6.2.3service方法publicvoidservice(HttpServletRequestrequestHttpServletResponseresponse)throwServletException,IOExceptionTomcat服务器将两个参数传递给该方法。和init方法不同的是,init方法只被调用一次,而service方法可能被多次的调用。当后续的用户请求该servlet时,Tomcat服务器将启动一个新的线程,在该线程中servlet调用service方法响应用户的请求,调用过程运行在不同的线程中,互不干扰。因此,不同线程的service方法中的局部变量互不干扰,一个线程改变了自己的service方法中局部变量的值不会影响其他线程的service方法中的局部变量。6.2.4destroy方法publicdestroy()当Tomcat服务器终止服务时,destroy()方法会被执行,销毁servlet.子类可直接继承这个方法,一般不需要重写。6.3通过JSP页面访问servlet按着部署文件web.xml给出的servlet的url-pattern,用户除了可以在浏览器输入url-pattern请求运行一个servlet外,也可以通过JSP页面来请求一个servlet。需要特别注意的是,如果web.xml文件中给出的servlet的url-pattern是/lookHello,那么JSP页面请求servlet时,必须要写成lookHello,不可以写成/lookHello。■通过表单向servlet提交数据如果web.xml文件中给出的servlet的url-pattern是/computeBill,那么form表单中action给出的值就是computeBill:<formaction="computeBill"></form>当请求一个servlet时,也可以在请求的url-pattern中额外加入参数及其值,格式是:url-pattern?参数1=值&参数2=值…参数n=值例如:<formaction="computeBill?sideA=10.66&sideB=23.9&sideC=897"></form>6.3通过JSP页面访问servlet■通过表单向servlet提交数据例子6_3中,JSP页面example6_3.jsp通过form表单请求名字是computeBill的servlet,向所请求的computeBill提交一个账单明细,在请求computeBill的url-pattern中额外加入一个参数discount,其值代表优惠额度,例如discount值是6时,表示打6折。例子6_3JSP页面example6_3.jspServlet类Example6_3_Servlet.java向ch6\WEB\INF\下的部署文件web.xml添加如下的servlet和servlet-mapping标记(知识点见6.1.2),部署的servlet的名字是computeBill,访问servlet的url-pattern是/computeBill6.3通过JSP页面访问servlet■通过超链接访问servletJSP页面可以使用超链接去请求某个servlet。如果web.xml文件中给出的请求servlet的url-pattern是/circle,那么超链接标记中href的值是circle(不要写成/circle):<ahref="circle"></a>例子6_4JSP页面example6_4.jspServlet类Example6_4_Servlet.java例子6_4使用超链接请求url-pattern是/circle的servlet,在请求的url-pattern中额外加入参数radius,mess及其值。如果参数mess的值是area,servlet将求半径是radius的圆面积,如果参数mess的值是geometry,servlet将绘制半径是radius的圆的图形。web.xml6.4共享变量■Servlet类是HttpServlet的一个子类,在编写子类时就可以声明某些成员变量,那么,请求servlet的用户将共享该servlet的成员变量。■service方法可能被多次的调用。也就是说,当后续的用户请求该servlet时,Tomcat服务器将启动一个新的线程,在该线程中servlet调用service方法响应用户的请求,即每个用户的请求都导致service方法被调用执行,调用过程运行在不同的线程中,互不干扰。因此,不同线程的service方法中的局部变量互不干扰,一个线程改变了自己的service方法中局部变量的值不会影响其他线程的service方法中的局部变量。6.4共享变量数学上有一个计算PI的公式,例子6_5利用servlet的成员变量被所有用户共享这一特性实现多用户计算的值,即任何用户请求访问servlet时都参与了一次的计算。example6_5.jspExample6_5_Servlet.javaweb.xml例子6_5web.xml文件JSP页面Servlet类6.5doGet和doPost方法■HttpServlet类除了init、service、destroy方法外,该类还有两个很重要的方法:doGet和doPost,用来处理用户的请求并作出响应。■实际上HttpServlet类所给出的service方法的功能是检查HTTP请求类型(get、post),并在service方法中根据用户的请求方式,在service方法中对应地再调用doGet或doPost方法。■因此,在编写的Servlet类(HttpServlet类的一个子类)时,也可以不重写service方法来响应用户,直接继承service方法即可。■如果不重写service方法,就需要在Servlet类中重写doPost或doGet方法来响应用户的请求。如果不论用户请求类型是post还是get,Tomcat服务器的处理过程完全相同,那么可以只在doPost方法中编写处理过程,而在doGet方法中再调用doPost方法即可,或只在doGet方法中编写处理过程,而在doPost方法中再调用doGet方法。如果根据请求的类型进行不同的处理,就要在两个方法中编写不同的处理过程(这一点比service方法更为灵活)6.5doGet和doPost方法例子6_6的example6_5.jsp页面有两个form表单,每个form表单都请求名字为sumORproduct的servlet,并提交一串数字给sumORproduct。一个form表单的请求方式是post,另一个form表单的请求方式是get。当form表单的请求方式是post时,sumORproduct计算各数字的代数和,当form表单的请求方式是get时,sumORproduct计算各数字的乘积。example6_6.jspExample6_6_Servlet.javaweb.xml例子6_6web.xml文件JSP页面Servlet类6.6重定向与转发重定向的功能是将用户从当前页面或servlet定向到另一个JSP页面或servlet。转发的功能是将用户对当前JSP页面或servlet的请求转发给另一个JSP页面或servlet。本节学习在Servlet类中使用HttpServletResponse类的sendRedirect重定向方法,以及RequestDispatcher类的forward转发方法,并指出二者的区别。重定向方法voidsendRedirect(Stringlocation)将用户重新定向到另一个JSP页面或servlet。重定向方法仅仅是将用户从当前页面或servlet定向到另一个JSP页面或servlet,但不能将用户对当前页面或servlet的请求(HttpServletRequest对象)转发给所定向的资源。即重定向的目标页面或servlet无法使用request获取用户提交的数据。1.sendRedirect方法执行sendRedirect方法(重定向,也见4.2.3)时,Tomcat服务器还是要把当前的servlet代码执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前servlet代码的执行效果。如果在执行sendRedirect(URLurl)方法后,servlet紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前servlet的执行。6.6重定向与转发⑴RequestDispatcherdispatcher=request.getRequestDispatcher(JSP页面的URL或servlet的url-pattern);例如:RequestDispatcherdispatcher=request.getRequestDispatcher("target.jsp");⑵转发。在步骤(1)中获取的RequestDispatcher对象调用voidforward(ServletRequestrequest,ServletResponseresponse)throwsServletException,ava.io.IOException方法可以将用户对当前JSP页面或servlet的请求转发给RequestDispatcher对象所指定的JSP页面或servlet,例如:dispatcher.forward(request,response);把用户对当前JSP页面或servlet的请求转变为对转发到的JSP页面或servlet的请求。2.forward方法RequestDispatcher对象可以把用户对当前JSP页面或servlet的请求转发给另一个JSP页面或servlet,而且将用户对当前JSP页面或servlet的请求传递给转发到的JSP页面或servlet。也就是说,当前页面所转发到的标页面或servlet可以使用request获取用户提交的数据。6.6重定向与转发3.二者的区别■转发(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(URLurl)方法后,servlet紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前servlet的执行。6.6重定向与转发例子6_6中有3个servlet,其中名字是sort的servlet负责排序数字,名字是sum的servlet负责计算数字的代数和,名字是handleForward的servlet负责转发。用户在exmple6_6.jsp页面提供的form表单的textArea中输入一组数字(例如2,-65,1.618)请求handleForward,如果是单击名字含有sort的提交键,handleForward就将用户的请求转发给sort,如果单击名字含有sum的提交键,handleForward就将用户的请求转发给sum。如果用户没有输入任何数字,handleForward就将用户重定向到exmple6_6.jsp。example6_7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮店经理连锁餐饮经营管理绩效考评表
- 妇女节的暖心文案15篇
- 关于2026年采购计划的确认函件(4篇)
- 2026红队安全面试题及答案
- 学生掌握自主学习策略指导书
- 读书分享会:品味经典小学主题班会课件
- 守护生命之花文明出行在路上小学六年级主题班会课件
- 绩效管理实施方案及激励系统研究
- 诚实守信阳光成长小学主题班会课件
- 关于产品退换的说明函3篇
- 公交驾驶员招聘笔试题及答案
- 2026-2030中国润滑油用添加剂行业应用态势与需求趋势预测报告
- 2026-2030中国尾矿综合利用行业发展规划与投资策略建议报告
- GB 19302-2025食品安全国家标准发酵乳
- 2024-2025学年广西壮族百色市靖西县数学三年级第一学期期末学业质量监测模拟试题含解析
- NB-T20293-2014核电厂厂址选择基本程序
- 【人教版】六年级数学上册全册课件
- 电子书 -4C法颠覆培训课堂:65种反转培训策略
- 人类普遍交往与世界历史的形成发展
- 高等数学课件第一章函数与极限
- (完整)全套ISO16949质量手册及程序文件
评论
0/150
提交评论