LOGO 第 9 章 Java Servlet 和 JSP 编程 孙焘
重点: servlet 编程原理 1 servlet 的基础类与编程实现 2 JSP 编程原理 3 JSP 的常用语法 4
难点: java servlet 的编程实现 1 servlet 和 JSP 间的关系 2
9.1 servlet 编程原理 动态 Web 页技术 Tomcat 配置 Tomcat 环境 Java servlet 特性 Servlet 原理 Servlet 功能 Servlet 版的 Hello, World!
9.1 servlet 编程原理 动态 Web 页技术 一个 Web 应用是使用 Web 技术的任何一个应用 软件, Web 技术包括 Web 浏览器、 Web 服务器 和 Internet 协议。在 Web 应用的中间层有一个 Web 服务器,它接受客户的请求,并把静态和 动态内容组装成 Web 页面,然后递交给客户。 其中 HTML 是构成 Web 页面的最基本元素。
9.1 servlet 编程原理 Tomcat Tomcat 是一个免费的开放源代码的 Web 应用 服务器,它提供一个支持 Servlet 和 JSP 运行的 容器。 Servlet 和 JSP 能根据实时需要,产生动 态网页内容。 Tomcat 则既能为动态网页服务,同时也能为静 态网页提供支持。尽管它没有通常的 Web 服务 器快、功能也不如 Web 服务器丰富,但是 Tomcat 逐渐为支持静态内容不断扩充。
9.1 servlet 编程原理 配置 Tomcat 环境 安装 Tomcat (本书以 Tomcat5.5 为例),须预先安装 JDK1.5 ,相关软件读者可以到官方网站上下载。然后 须设置环境变量: (1) 在 Windows 桌面上,选择 “ 我的电脑 ”->“ 属性 ”->“ 高级 ”->“ 环境变量 ”->“ 系统变量 ” ; (2) 新建 TOMCAT_HOME 属性,值设为 {Tomcat 安装目 录 } 。 (3) 新建 JAVA_HOME 属性,值设为 {JDK 安装目录 } 。 (4) 新建 CLASSPATH 属性,值设为.; %JAVA_HOME%\lib\dt.jar; %JAVA_HOME%\lib\tools.jar; (5) 找到 Path 属性,把 %JAVA_HOME%\bin 目录添加到 path 值的末尾。
9.1 servlet 编程原理 Java Servlet 特性 Servlet 是使用 Java Servlet 应用程序设计接口 ( API )及相关类和方法的 Java 程序。 除了 Java Servlet API , Servlet 还可以使用用 以扩展和添加到 API 的 Java 类软件包。 Servlet 在启用 Java 的 Web 服务器上或应用 服务器上运行并扩展了该服务器的能力。 Java Servlet API 定义了一个 servlet 和 Java 使 能的服务器之间的一个标准接口,这使得 Servlets 具有跨服务器平台的特性。
9.1 servlet 编程原理 Servlet 原理 Servlet 通过创建一个框架来扩展服务器的能力 ,以提供在 Web 上进行请求和响应服务。 当客户机发送请求至服务器时,服务器可以将 请求信息发送给 Servlet ,并让 Servlet 建立起 服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务 时,可以自动装入 Servlet 。 装入后, Servlet 继续运行直到其它客户机发出 请求。
9.1 servlet 编程原理 Servlet 功能 (1) 创建并返回一个包含基于客户请求的动态内容的 HTML 页面 (2) 创建可嵌入到现有 HTML 页面中的一部分 HTML 页面。 (3) 与其它服务器资源进行通信。 (4) 用多个客户机处理连接,接收多个客户机的输入,并将 结果广播到多个客户机上。例如, Servlet 可以是多参与者 的游戏服务器 (5) 当允许在单连接方式下传送数据的情况下,在浏览器上 打开服务器至 applet 的新连接,并将该连接保持在打开状态 。 (6) 对特殊的处理采用 MIME 类型过滤数据。 (7) 将定制的处理提供给所有服务器的标准例行程序。例如 , Servlet 可以修改如何认证用户。
9.1 servlet 编程原理 Servlet 版的 “Hello, World! ” (4) 在 WEB-INF 目录下创建 web.xml 文件; 编辑 web.xml 内容如下: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " myServlet1 hello.HelloWorldServlet myServlet1 /HelloWorld.do 上述配置虽然看起来繁琐,但实际需要程序员自定义的,只是上文加粗的几个字符串。含义是 通过 myServlet1 将 Web 访问的 URL 后缀( /HelloWorld.do )和类路径 hello.HelloWorldServlet 联 系起来。
9.1 servlet 编程原理 Servlet 版的 “Hello, World! ” (5) 在 WEB-INF 目录下创建 classes 目录; (6) 在 classes 目录下创建 hello (程序员自定义 的 java 包名)目录; (7) 在 hello 目录下创建 HelloWorldServlet.java 文 件; 编辑 HelloWorldServlet.java 内容如下:
9.1 servlet 编程原理 Servlet 版的 “Hello, World! ” public class HelloWorldServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // 获取 response 输出流 PrintWriter out = response.getWriter(); // 向输出流写入文本数据 out.println(" Servlet - HelloWorld" + " Hello, World! "); // 输出,清空缓存 out.flush(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { doPost(request, response); }
9.1 servlet 编程原理 Servlet 版的 “Hello, World! ” (8) 编译 HelloWorldServlet.java ,在 hello 目录下 生成 HelloWorldServlet.class 文件。 完成上述步骤后,启动 tomcat 服务(设服务端 口为 8080 ); 并在浏览器地址栏中输入: 即 可得到输出页面。
9.1 servlet 编程原理 Servlet 版的 “Hello, World! ” (1) 浏览器用户发出 请 求。 (2) localhost 主机,即本地的 tomcat 得到请求, 定位到 {tomcat 安装目录 }/webapps/myapp 目录 。 (3) 根据 /HelloWorld.do 请求,并结合 web.xml 文 件,得到 hello.HelloWorldServlet 字符串, 即得 到 servlet 服务类的路径 :WEB- INF/classes/hello/ HelloWorldServlet.class 。
9.1 servlet 编程原理 Servlet 版的 “Hello, World! ” (4) 由于请求是 get 方式提交,因此在 HelloWorldServlet 程序中,先进 doGet 方法;再进 doPost 方法。 (5) doPost 方法生成 HTML 网页,返回给用户浏览器。 Servlet 可以利用 HttpServletResponse 类的 setContentType( ) 方法来设定内容类型,我们要显示 为 HTML 网页类型,因此,内容类型设为 "text/html" , 这是 HTML 网页的标准 MIME 类型值。之后, Servlet 用 getWriter( ) 方法取得 PrintWriter 类型的 out 对象,它 与 PrintSteam 类似,但是它能对 Java 的 Unicode 字 符进行编码转换。最后,再利用 out 对象把 "Hello World" 的字符串显示在网页上。
9.2 JSP 编程原理 JSP 简介 JSP 版 Hello World! JSP 内置对象 Java Bean Java Bean 案例
9.2 JSP 编程原理 JSP 简介 JSP(Java Server Pages) 是由 Sun Microsystems 公司倡导、许多公司参与一起建 立的一种动态网页技术标准。 JSP 技术有点类似 ASP 技术,它是在传统的网 页 HTML 文件 (*.htm,*.html) 中插入 Java 程序段 (Scriptlet) 和 JSP 标记 (tag) ,从而形成 JSP 文件 (*.jsp) 。 用 JSP 开发的 Web 应用是跨平台的,既能在 Linux 下运行,也能在其他操作系统上运行。
9.2 JSP 编程原理 JSP 版的 Hello World! <% // 结果就是在屏幕上打印两行 Hello World! for ( int i=0; i<2; i++ ) { %> Hello, World! <% } %>
9.2 JSP 编程原理 JSP 版的 Hello World! (1) 案例中的 page 指令说明如下: ① language="java" 声明脚本语言的种类,目 前只能用 "java" 。 ② import="{package.class | package.* },..." 需 要导入的 Java 包的列表,这些包作用于程序段 ,表达式,以及声明。但如下的包在 JSP 编译 时已经导入了,所以就不需要再指明了: java.lang.*; javax.servlet.*; javax.servlet.jsp.*; javax.servlet.http.*;
9.2 JSP 编程原理 JSP 版的 Hello World! (2) 动作语法。主要包括 , , , , 和 。本案例暂时没有涉及。
9.2 JSP 编程原理 JSP 版的 Hello World! (3) 脚本语法。分为: ① HTML 注释: ,这种注释发送到 客户端,但不直接显示,在源代码中可以查看到。 ②隐藏注释: ,这种注释不发送 到客户端。 ③声明: ,例如 。 ④表达式: ,例如 表示输 出 i 的值到浏览器页面上。 ⑤脚本段: ,例如案例中的
9.2 JSP 编程原理 JSP 内置对象 (1)request 对象:客户端的请求信息被封装在 request 对象中,通 过它才能了解到客户的需求,然后做出响应。它是 HttpServletRequest 类的实例。 (2)response 对象:包含了响应客户请求的有关信息,但在 JSP 中 很少直接用到它。它是 HttpServletResponse 类的实例。 (3)session 对象: session 对象指的是客户端与服务器的一次会话 ,从客户连到服务器的一个 WebApplication 开始,直到客户端与 服务器断开连接为止。它是 HttpSession 类的实例。 (4)out 对象:是 JspWriter 类的实例, 是向客户端输出内容常用的对 象。 (5)page 对象:就是指向当前 JSP 页面本身,有点象类中的 this 指 针,它是 java.lang.Object 类的实例
9.2 JSP 编程原理 JSP 内置对象 (6)application 对象:实现了用户间数据的共享,可存放全局变量 。它开始于服务器的启动,直到服务器的关闭,在此期间,此对 象将一直存在;在任何地方对此对象属性的操作,都将影响到其 他用户对此的访问。服务器的启动和关闭决定了 application 对象 的生命。它是 ServletContext 类的实例。 (7)exception 对象:是一个例外对象,当一个页面在运行过程中发 生了例外,就产生这个对象。如果一个 JSP 页面要应用此对象, 就必须把 page 指令中的 isErrorPage 设为 true ,否则无法编译。实 际上是 java.lang.Throwable 的对象。 (8)pageContext 对象:提供了对 JSP 页面内所有的对象及名字空间 的访问,也就是说他可以访问到本页所在的 SESSION ,也可以取 本页面所在的 application 的某一属性值,他相当于页面中所有功 能的集大成者,它的本类名也叫 pageContext 。 (9)config 对象:是在一个 Servlet 初始化时, JSP 引擎向它传递信 息用的,此信息包括 Servlet 初始化时所要用到的参数(通过属性 名和属性值构成)以及服务器的有关信息 ( 通过传递一个 ServletContext 对象 ) 。
9.2 JSP 编程原理 Java Bean 概述 一个网站系统一般可分为 3 层:数据层、商业层和应用 层。如果 JSP 的脚本语言将应用表现层和商务逻辑层混 在一起,将造成修改不方便,并且代码也不能重复利 用;采用 Java 组件技术 Java Bean 就可以解决这些问题 ,并使系统更易维护,也使网站的开发人员分工更为 明确。 JavaBean 是一种 JAVA 语言写成的可重用组件。为写 成 JavaBean ,类必须是具体的和公共的,并且具有无 参数的构造器。 JavaBeans 通过提供符合一致性设计 模式的公共方法将内部域暴露称为属性,并且所有属 性都有 set 和 get 方法。 JSP 和 JavaBean 可以联合使用。
9.2 JSP 编程原理 Java Bean 案例 实现学号、姓名的输入程序,如果学号存在返 回错误提示页面;否则保存数据:若失败返回 保存失败提示页面,否则返回成功页面。 要求业务逻辑与页面显示分开。
9.2 JSP 编程原理 Java Bean 案例: student package student; public class Student { private String sno; private String sname; String getSno() { return sno; } void setSno(String value) { sno = value; } String getSname() { return sno; } void setSname(String value) { sname = value; } int save() { int error = 0; // 若学号存在 error=1; // 否则若保存失败 error=2; ... return flag; }
9.2 JSP 编程原理 Java Bean 案例:建立 jsp 文件 学生信息 学号: 姓名: <% int error = handle.flag; if (flag==1) { %> <% } else if (flag==2) { %>
9.2 JSP 编程原理 Java Bean 案例 :useBean <jsp:useBean id="beanInstanceName" scope="page | request | session | application" {class="package.class" | type="package.class" | class="package.class" type="package.class" | beanName="{package.class | }" type="package.class" { /> | > other elements }
9.2 JSP 编程原理 Java Bean 案例 :useBean ① id=“beanInstanceName” :在所定义的范围中确认 Bean 的变量,使之 能在后面的程序中使用此变量名来分辨不同的 Bean ,这个变量名对大小 写敏感。 ② scope=“page | request | session | application” : Bean 存在的范围以及 id 变量名的有效范围。 ③ class=“package.class” : 使用 new 关键字以及 class 构造器从一个 class 中实例化一个 bean 。这个 class 不能是抽象的,必须有一个公用的,没有 参数的构造器。这个 package 的名字区别大小写。 ④ type=“package.class” :如果这个 Bean 已经在指定的范围中存在,那 么赋予这个 Bean 一个的数据开库类型 。如果使用 type 属性的同时没有使 用 class 或 beanName , Bean 将不会被实例化。注意 package 和 class 的名 称区分大小写。 ⑤ type="package.class" :如果这个 Bean 已经在指定的范围中存在,那 么赋予这个 Bean 一个的数据开库类型 。如果使用 type 属性的同时没有使 用 class 或 beanName , Bean 将不会被实例化。注意 package 和 class 的名 称区分大小写。 beanName 可以是 package 和 class ,也可以是表达式,它 的值会传给 Beans.instantiate 方法。 type 的值可以和 Bean 相同,也可以是 它的基类,或者是它所实现的接口。
9.2 JSP 编程原理 Java Bean 案例 :jsp:setProperty <jsp:setProperty name="beanInstanceName" { property= "*" ? | property="propertyName" [ param="parameterName" ] ? | property="propertyName" value="{string | }" } />
9.2 JSP 编程原理 Java Bean 案例 :jsp:setProperty ① name="beanInstanceName" :表示已经在 “ ” 中 创建的 Bean 实例的名字。 ② property="*" :获取用户在 form 提交时输入的,即 JSP 页面中 request 对象的所有属性值,用于匹配 Bean 中的属性。 ③ property="propertyName" [ param="parameterName" ] :用一 个参数值来指定 Bean 中的一个属性值,一般情况下是从 request 对 象中获得的。其中 property 指定 Bean 的属性名, param 指定 request 中的参数名。 ④ property="propertyName" value="{string | }" :使用指定的值来设定 Bean 属性。 的含义将用户 在 form 上填写的,并通过 request 对象传递过来的学号、姓名传递 到 handle 对象的 sno,sname 属性中。
9.2 JSP 编程原理 Java Bean 案例 : jsp:getProperty ① name="beanInstanceName" : bean 的名字,由 指定。来分辨不同的 Bean ,这个变 量名对大小写敏感。 ② property="propertyName" :所指定的 Bean 的属性 名. 的含义是在页面输出对象 handle 的 sno 属性值。
9.3 servlet 和 JSP JSP 原理 JSP 与 servlet
9.3 servlet 和 JSP JSP 原理 (1) 客户端发出 Request( 请求 ) ; (2) JSP Container 将 JSP 转译成 Servlet 的源代 码; (3) 将产生的 Servlet 的源代码经过编译后,并 加载到内存执行; (4) 把结果 Response ( 响应 ) 至客户端
9.3 servlet 和 JSP JSP 与 servlet JSP 的脚本实际上与 Java Servlet 中 HttpServlet.doPost 及 HttpServlet.doGet 方法的 实现部分相对应。 doPost 和 doGet 的入口参数均为 HttpServletRequest 类和 HttpServletResponse 类的两个对象。 而 JSP 获取该两个对象并非由入口参数获得, 而是通过内置对象。
LOGO