伤城文章网 > 其它课程 > 《Java web程序设计》教案

《Java web程序设计》教案


课题:第一章 【教学目标】

Java Web 概述

掌握 JSP 运行环境的搭建,能进行简单的 JSP 程序编写与运行。 【教学重点】 Eclipse+Dreamweaver 工具、项目的导入、导出、发布打包 【教学难点】 Eclipse+Dreamweaver 工具、项目的导入、导出、发布打包 【教学方法】讲解、讨论 【教学地点】教学楼、综合楼 【课时安排】4 课时 【教学过程】 1.1 配置JSP运行环境 1.1.1 任务描述与实现正确安装Tomcat服务器,并显示其欢迎页面。如图1-1所示。

图1- 1 使用Tomcat欢迎页面 实现过程: 1.安装JDK 安装Tomcat服务器前首先安装JDK(Java Development Kit), 其包括了Java运行环境, Java 工具和Java基础的类库。目前,提供下载的最新版本为JDK7。读者可到官方网站下载,下载 地址为http://www.oracle.com/technetwork/java/javase/downloads/index.html。 下载后双击安装,画面如图1-2所示,按“下一步”操作直到完成。

图 1- 2 JDK 安装界面 2.安装Tomcat Tomcat 官 方 网 站 下 载 地 址 : http://tomcat.apache.org 。 本 书 采 用 的 版 本 是 Tomcat-7.0.20。 下载后,双击安装,如图1-3所示。点击Next到第一步,进行安装组件选择,如图1-4所 示。第二步选择路径,按照系统默认路径即可。第三步为配置Tomcat端口信息和账号信息, 如图1-5所示,按照实际配置即可。第四步为选择JDK的安装路径,如图1-6所示,选择在之前 第1步操作中安装的JDK所在的位置。之后单击“Next”开始安装。安装完毕后,提示安装完 成,如图1-7所示。单击“Finish”完成Tomcat的安装。 安装完成之后, 在程序菜单中可以看到Tomcat的选项, 如图1-8所示。 点击Monitor Tomcat, 可在任务栏看到Tomcat的服务图标,如图1-9所示,双击该图标,弹出如图1-10所示的Tomcat 启动界面,在此界面中可以选择启动或停止Tomcat服务。 启动Tomcat后,在地址栏中输入http://localhost:8080,若出现图1-1的显示效果,则 Tomcat已正常安装并运行。

图 1-3 Tomcat 安装:欢迎界面 1.1.2 新知识点——JSP概述、Tomcat目录结构、虚拟目录配置 1.1.2.1 JSP概述 1. 动态网页 动态网页是在服务器运行的程序或者网页,它们会随不同用户、不同时间、不同需求, 返回不同的内容。如:当登录到论坛时,作为论坛管理员身份,就可以看到“删除”、“修 改”等操作;作为论坛普通用户身份,则只能看到帖子的浏览页面。 动态网页会使用服务器端脚本语言,比如目前流行的JSP等,访问动态网页时会获取最新 内容显示,这就是为什么不同时间访问网页显示内容会发生变化的原因。 动态网页的特点: 交互性好:即网页会根据用户需求和选择而动态改变和响应。例如用户在网页中填写表 单信息并提交,服务器经过处理将信息自动存储到后台数据库中,并转到相应提示页面。因 此,采用动态网页技术的网站可以实现与用户的交互功能,如用户注册、用户登录、信息查 询等。 自动更新:对于网页设计者来说,无需每次修改页面内容,只需在后台添加或者删除要 显示的信息即可。例如,在论坛发布信息,后台服务器将自动生成新的网页内容。 2.B/S技术 使用动态网页技术开发网站实际上是B/S技术的一种应用,因此,要更好地理解动态网页 的开发原理,首先需要了解B/S技术的一些基本概念。

B/S技术跟C/S技术的区别: C/S(客户机/服务器)结构分为客户机和服务器两层,一般将应用软件安装在客户机端, 通过网络与服务器相互通信,实现交互,如QQ、飞信、MSN等软件。对于这类系统的结构如图 1-11所示。 对于 C/S 结构的应用软件,若要在客户机运行,就必须在先安装,而且每次对系统做了微小 的改动,所有客户机的应用软件都需要更新。 3. JSP简介 (1) 什么是JSP JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动 态网页技术标准。它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet) 和JSP标记(tag),从而形成JSP文件(*.jsp)。Web服务器在遇到访问JSP网页的请求时,首先 对其中的Java代码进行处理,然后将执行结果连同JSP文件中的HTML代码一起返回给客户的浏 览器。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的 功能。 4.JSP的特点 JSP最大的优点是开发的跨平台结构,它可以运行在几乎所有的操作系统平台。 JSP的优势: 一次编写,到处运行。在这一点上Java比PHP更出色,除了系统之外,代码不用做任何更 改。 系统的多平台支持。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系 统部署,在任意环境中扩展。相比ASP/PHP的局限性是显而易见的。 强大的可伸缩性。从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器进 行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数台服务 器,Java显示了一个巨大的生命力。 多样化和功能强大的开发工具支持。这一点与ASP很像,Java已经有了许多非常优秀的开 发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。 JSP的劣势: 与ASP一样,Java的一些优势正是它致命的问题所在。正是由于为了跨平台的功能,为了 极度的伸缩能力,所以极大的增加了产品的复杂性。 Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用 户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列 的.java文件和.class文件以及对应的版本文件。 5. JSP开发及运行环境要求

① 操作系统要求 操作系统可以选择Windows操作系统、Unix操作系统和Linux操作系统等。 ②软件环境要求 集成开发工具:集成开发工具有NetBeans、Eclipse等。本书选用Eclipse。 Web 服务器:JSP 运行时需要安装 JDK 和 Web 服务器,目前使用较多的 Web 服务器有 Tomcat、 WebLogic、Jboss 和 Resin 等。本书选用 Tomcat。Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公 司及个人共同开发而成。本书选用目前最新版本 Tomcat7.0。 1.1.2.3 虚拟目录配置 配置JavaWebExample的虚拟目录,方法如下: 1.前期准备工作 ① 在D盘建立D:\WorkSpace\JavaWebExample的文件夹(也可以建立在其他磁盘)。 ② 在JavaWebExample文件夹中新建index.html文件,输入“欢迎”二字。 2. 配置Tomcat虚拟目录 ① 打开Tomcat的安装目录下conf文件夹的server.xml文件。在<Host>和</Host>标签之 间加上虚拟目录配置标签,即<Context path=”/JavaWebExample” docBase=”D:\WorkSpace\JavaWebExample”/>,其中path属性值为虚拟目录名称,docBase 属性值为虚拟目录指向的物理目录。修改后如图1-16所示。这里path保存的值是你在浏览器 中输入的值即虚拟目录,docBase保存的值是你要访问的文件的物理绝对路径。 1.2 利用开发工具制作Hello.jsp 1.2.1 任务描述与实现任务描述: 利用Dreamweaver、Eclipse搭配开发一个简单的JSP网页。 开发过程采用Eclipse和Dreamweaver搭配开发,设计显示界面部分用Dreamweaver实现, 代码在界面制作自动生成基础上在Eclipse中编写,最后在Eclipse中测试运行实现过程: 1.下载安装Eclipse 到Eclipse的官方网站下载Eclipse IDE for Java EE Developers,下载后解压即可使用。 Eclipse官方网站http://www.eclipse.org。 2.下载并安装DreamWeaver8 3.配置Eclipse开发环境 启动后, 配置Web项目测试服务器。 打开Window→Preferences菜单, 选择Server→Runtime Environments选项,然后选择添加服务器,添加已经安装的Tomcat v7.0。 4.在Eclipse中创建JavaWebExample项目 在新建项目选择对话框,选择Dynamics Web Project,如图1-24所示。单击“Next”按

钮后,出现如图1-25所示的对话框,填写项目名称JavaWebExample,选择与项目相关的信息。 在本例中,项目文件都置于D:\workspace\ JavaWebExample中,因此以默认选项配置;测试 用服务器选择Tomcat7.0,其它部分按默认配置,之后单击“Finish”按钮。 5.在Dreamweaver中创建JavaWebExample站点 在Dreamweaver中创建站点时,其站点根目录指向在Eclipse中创建的项目的WebContent 目录,本例的根目录为D:\workspace\ JavaWebExample\WebContent,如图1-29所示。此外, 设置站点为JSP站点,并指定前缀。 6.测试。 测试在Dreamweaver中编写的Web页面,在Eclipse中运行。本例中为了方便演示,在 Dreamweaver 的 JavaWebExample 站 点 的 Chapter1 文 件 夹 创 建 一 个 简 单 的 JSP 页 面 exam1_1_Hello.jsp 1.2.2 新知识点——Eclipse、Dreamweaver工具简介 1.2.2.1 Eclipse简介 Eclipse是著名的跨平台的自由集成开发环境(IDE),最初主要用于Java语言开发,目前 也有人通过插件使其作为其他计算机语言(如C++和Python)的开发工具。虽然Eclipse本身只 是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具 有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。 Eclipse就其本身而言,它只是一个框架和一组服务,但可通过插件组件构建集成开发环 境。Eclipse附带了一个标准的插件集,包括Java开发工具(Java Development Tools,JDT)。 Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE Eclipse,2001年11月贡献给开源社区,现在它由非盈利软件供应商联盟Eclipse基金会 (Eclipse Foundation)管理。 1.2.2.2 Dreamweaver简介 Dreamweaver,简称DW,是一款有着多年历史和良好口碑的可视化网页编辑工具,它最大 的优点就是所见即所得,对W3C网页标准化支持十分到位。同时它还支持网站管理,包含HTML 检查、HTML格式控制、HTML格式化选项、HomeSite/BBEdit捆绑、图像编辑、全局查找替换、 全FTP功能、处理Flash和Shockwave等多媒体格式和动态HTML,以及支持ASP、JSP、PHP、 ASP.NET、XML等程序语言的编写与调试。 1.2.2.3 工具联合开发调试项目 使用Eclipse开发程序时,虽然系统框架结构会给你带来方便,但并不太适合于开发Web 显示界面,而Dreamweaver开发Web页面时可以实现所见即所得的效果,页面也遵循W3C国际标 准。因此,可以利用这些开发工具各自的优点,结合开发Web程序,从而提高开发效率。 1.2.3 扩展——现有项目导入、导出、发布打包

对于程序员来说,有时需要将现有项目导入、导出和发布打包,下面介绍如何将项目导 入、导出和发布打包。 1.2.3.1 项目导入 项目导入可直接将文件拷贝至相应文件夹中,也可导入 War 文件。下面先来介绍第一种 方法。 1. 文件拷贝 (1) 新建项目 在Eclipse中新建project,参考1.2.2中介绍新建项目。新建项目 test,此时src及 WebContent均为空, 【教学小结】 本章介绍了进行Java Web应用开发的特点,B/S架构的优势,介绍了Java Web程序的服务 器运行的安装配置及开发工具的搭配使用,重点介绍了JDK、Tomcat的安装与配置,以及利用 DreamWeaver与Eclipse搭配开发项目。 通过本章的学习,读者可以创建简单的 JSP 文件,并且进行测试。

课题:第二章 JSP 语法 【教学目标】 掌握 JSP 的页面组成,掌握 JSP 简单网站的制作 【教学重点】 page 指令、include 指令、tablib 指令、<jsp:include>动作指令、<jsp:forward>动作指令 【教学难点】 page 指令、include 指令、tablib 指令、<jsp:include>动作指令、<jsp:forward>动作指令 【教学方法】讲解、讨论 【教学地点】教学楼、综合楼 【课时安排】4 课时 【教学过程】 2.1 制作第一个JSP页面 2.1.1 任务描述与实现在Jsp文件中定义方法实现两个数的加法 定义方法实现两个数的加法,调用其计算1+2并显示结果,如图2-1所示。

图2-1 求和效果 实现过程: 1.新建 JSP 文件。在项目的 chapter2 文件夹中,单击右键选择 New→JSP File 选项, 弹出如图 2-2 所示的对话框,在 File name 中输入 exam2_1_sum.jsp,单击 Finish 之后进入 JSP 页面编辑窗口,输入代码如程序 2-1。 2.1.2 新知识点——JSP页面组成、声明、代码段、表达式、注释 JSP页面由两部分组成,一部分为静态部分,即HTML标记,用来完成数据页面显示;另一 部分为动态部分,用来完成数据处理,包括脚本元素、指令元素和动作元素。

脚本元素用来嵌入Java代码,这些Java代码将成为转换得到的Servlet的一部分;JSP指 令元素用来从整体上控制Servlet的结构;动作元素用来引入现有的组件或者控制JSP引擎的 行为。 2.1.2.1 声明 <% ! %> JSP中声明部分可以进行变量、方法和类的声明,其一般在<%!%>标签中进行。其语法格 式为<%! 声明1;声明2;??%>。 如在程序 2-1 中,进行了求和方法的声明。下边进行一个变量的声明,如程序 2-2。 2.1.2.2 代码段 <% %> 在JSP页面中嵌入Java代码来执行特定的功能,其放置在<% %>标记中。 格式为: <% Java代码段1 Java代码段2 ?? %> 这种 Java 代码在 Web 服务器响应请求时就会运行。如程序 2-3,定义 2 个变量并输出。 2.1.2.3 表达式 <%= %> JSP表达式可以把JSP页面中的数据直接输出到页面,其格式为: <%=表达式 %> 表达式一次只能使用一个表达式,并且该表达式是完整的。在表达式的语句中不能使用 分号。如程序2-4,进行了变量输出 这种代码段的主要功能是输出一个变量或常量,有时候将其叫做表达式输出。使用方法见程 序 2-5 所示。 2.1.2.4 注释 在JSP中支持两种注释,一种是显式注释,这种注释客户端允许查看的;另一种是隐式注 释,这种注释客户端是看不到的。 1. 显式注释语法(HTML注释) <!-- 这是显式注释? 2. 隐式注释语法 (1) // Java提供的单行注释 (2) /* Java提供的多行注释 */ (3) <%-- JSP 注释 --%> 2.1.3 扩展——代码编写规范

好的代码应该容易理解,并且见名知意的,因此大家都需要遵守一些约定,下面介绍一 些常规的编写规范。 1.JSP文件命名 JSP文件名称要以小写字母命名,名称要体现出该页面的意义,最好能够与模块名称联系 在一起。 例如: login.jsp --登录页面 register.jsp --注册页面 message.jsp --消息页面 2.Java Web项目文件夹组织规范 Java Web项目的目录结构为: src ---存放java源文件的文件夹 WebContent -- web站点文件存放文件夹 |--images --图片文件夹 |--css --样式文件夹 |--js -- js文件夹 |--?? --其他功能模块文件夹(存放与某个功能模块相关的资源) |--WEB-INF --网站配置及类和库文件夹 |--classes -- 存放类编译后的字节码文件的文件夹 |--lib -- 存放 jar 文件的文件夹 2.2 制作一个带包含文件的 JSP 页面 2.2.1 任务描述与实现 实现静态包含功能,编写三个不同类型的文件,然后将这三个不同类型的文件静态包含 于某一 JSP 文件中 2.2.2 新知识点——JSP指令:page指令、include指令 JSP指令是为JSP引擎而设计的。它们并不直接产生任何可见的输出,而只是告诉引擎如 何处理其余的JSP页面。JSP指令有三种,分别为页面设置指令page、页面包含指令include和 标记指令taglib。 JSP指令一般语法形式为: <%@ 指令名称 属性=“值”%> 1.page指令 page 指令就是通过设置内部的多个属性来定义 JSP 文件中的全局特性。需要注意的是, page 指令只能对当前自身页面进行设置,即每个页面都有自身的 page 指令。如果没有对属性

进行设置,JSP 将使用默认指令属性值。 2.include指令 在JSP开发中,可以将一些重用的代码写入一个单独的文件中,然后通过include指令引 用该文件,从而缓解代码的冗余问题,修改也比较方便。Include指令语法格式为: <%@ include file=”被包含的文件路径”%> inlcude也被称为静态包含指令,包含的文件可以是JSP文件、HTML文件、文本文件和Java 程序段。静态包含指令只是简单的将内容合在一起显示,所以,在一个完整的页面中,对于 <html>、<head>、<title>、<body>等元素只能出现一次,如果重复出现,则会造成HTML错误。 在 2.2.1 节任务中,其主要采用 include 指令完成不同类型文件的包含。 2.2.3 扩展——taglib指令的使用 使用<%@ taglib%>指令在JSP文件中导入标签,以便在JSP中使用标签方便地完成一些动 作。 Taglib指令的语法为: <%@ taglib uri=”tagLibraryURI” prefix=”tagPrefix” %> uri是一个URI标识标记库描述器。一个标记库描述器用来唯一的命名一组定制的标记, 并且告诉包容器如何处理特殊的标记。 Prefix 定义一个 prefix:tagname 形式的字符串前缀,用于定义定制的标记。 2.3 制作一个简单的JSP网站 2.3.1 任务描述与实现 2.3.1.1 制作一个简单的JSP网站 制作一个简单的JSP网站。网站主题为产品网站,主要包括网站首页、产品和下载页面等, 效果如图2-10~2-12所示。要求公共部分采用单独文件,并被包含。开发过程采用Eclipse和 Dreamweaver搭配开发,设计显示界面部分全部用Dreamweaver实现,JSP程序部分在Eclipse 中编写,最后在Eclipse中测试运行。 2.3.2 新知识点——JSP动作指令、<jsp :include> 在JSP中,还存在另外一类标记,其符合XML的语法格式。利用这些标记可以达到控制 Servlet引擎的作用,如动态的插入文件,调用JavaBean,页面重定向等,这类标记称为JSP 动作标记。 JSP 的 常 用 动 作 标 记 有 <jsp:include> 、 <jsp:useBean> 、 <jsp:setProperty> 、 <jsp:getProperty>、<jsp:forward>、<jsp:plugin>、<jsp:params>等。 2.3.3 扩展——<jsp:forward>的使用 <jsp:forward>动作指令表示把当前的页面控制权转向另外一个对象,该对象可以是一个 HTML文件、JSP文件或者一个Servlet文件。

<jsp:forward>的语法格式: <jsp:forward page=”转向的文件路径|<%=表达式%>”/> 或者 <jsp:forward page=”转向的文件路径|<%=表达式%>”> <jsp :param name= ?param1 ? value= ?value1 ?/> <jsp :param name= ?param2 ? value= ?value2 ?/> </jsp:forward> 在上述格式中,page 属性为一个字符串或者一个表达式,用来表示转向文件的路径; <jsp :param>字句指令为传递参数,name 指定参数名,value 指定参数值。 【教学小结】 本章主要介绍了JSP页面的组成、 指令、 动作等技术, 重点介绍了JSP的page指令、 include 指令的使用,<jsp:include>、<jsp:forward>等动作指令的使用。 通过本章的学习,读者可以建立一个简单功能的 JSP 网站。

课题:第三章 【教学目标】 掌握 JSP 常用内置对象及使用方法 【教学重点】 JSP 内置对象 【教学难点】 JSP 内置对象 【教学方法】讲解 【教学地点】教学楼、综合楼 【课时安排】4 课时 【教学过程】 3.1获取客户端数据 3.1.1 任务描述与实现 3.1.1.1 实现用户注册信息获取及显示

JSP 内置对象

编写用户注册功能,注册信息包括用户名、密码、性别、E-mail、熟练开发语言,如图 3-1所示,提交后,显示用户输入的数据。 为了提高开发效率,开发过程采用Eclipse和Dreamweaver搭配开发,设计显示界面部分 全部用Dreamweaver实现,代码在界面制作自动生成基础上在Eclipse中编写,最后在Eclipse 中测试运行。 3.1.2 新知识点——JSP内置对象、request 3.1.2.1 JSP内置对象概述 为了简化Web页面的开发过程,JSP提供了一些由容器实现和管理的对象,这些对象在JSP 中可以直接使用,不需要JSP页面编写进行实例化,可以直接使用,此类对象称之为JSP的内 置对象。 JSP中规范定义了9个内置对象, 分别是request、 response、 session、 application、 out、 page、pageContext和exception。其说明见表3-1。 表3- 1 JSP内置对象对象 request 所属类 javax.servlet.http.HttpServle tRequest response javax.servlet.http.HttpServle tResponse session javax.servlet.http.HttpSessio 与当前请求相关的会话 包含了响应客户请求的相关信息 说明 封装了客户端的请求信息

n application javax.servlet.ServletContext 存放全局变量, 实现用户间的数据 共享 out page javax.servlet.jsp.JspWriter java.lang.Object 向客户端输出数据的对象 指当前JSP页面本身,作用类似于 this pageContext javax.servlet.jsp.PageContext 提供了对JSP页面内所有的对象及 名字空间的访问 config javax.servlet.servletConfig Servlet初始化时,向其传递配置 参数的对象 exception java.lang.Throwable 页面运行中发生异常而产生的对 象

3.1.3 扩展——中文乱码处理、request中其他信息获取 3.1.3.1 获取显示含有中文的信息 客户端提交数据当含有中文时,JSP不能正常显示。如将3.1.1.1节的表单增加个人简介 后,程序为exam3_1_reg_2.jsp,此处略,运行效果如图3-6,其提交后显示会是乱码,如图 3-7所示。因此,要对含有中文的表单数据,要进行编码设置。其主要方法为在获取程序中设 置字符集,使request其字符集与页面字符集保持一致。 3.1.3.2 获得客户端请求的相关信息 HttpServletRequest包含很多可以获取与当前请求相关信息的方法,具体可查看API文档,下 面 的 例 子 将 展 示 其 中 一 部 分 方 法 的 使 用 , exam3_1_request.jsp 是 提 交 请 求 的 页 面 , exam3_1_showInfo.jsp是处理请求的页面,在此页面中将调用request对象的各种方法,以获 取与当前请求相关的一些信息。 3.2 处理服务器响应 3.2.1 任务描述与实现 3.2.1.1 实现四则运算测试功能 针对刚学会整数四则运算的小学生,开发一个测试网站。要求在测试页面中能随机产生 一个四则运算式,当用户在userAnswer表单域内填写答案并提交后,获取用户所填的答案, 判断答案的对错后,如果错误则进入错误提示页面;如果正确则进入正确页面 3.2.2 新知识点——response、out 3.2.2.1 response

JSP的内置对象response代表服务器端返回给客户端的相应,其主要用于处理响应数据。 该对象的方法主要包括处理响应头的相关属性的方法、设定响应状态码的方法、重定向方法、 设置响应体相关内容和属性的方法等等。其常用方法见表3-3所示。 表3- 3 response对象的常用方法方法 void setHeader(String name, String value) oolean containsHeader(String name) void addCookie(Cookie cookie) 说明 为名为name的响应头设定值为value 判断响应对象中是否有名为name的头 将参数指定的cookie添加到response对 象中 void sendRedirect(String location) void setContentType(String type) PrintWriter getWriter() 3.2.2.2 out对象 out对象是javax.servlet.jsp.JspWriter类的实例,表示一个输出流,用于向客户端输出数 据 。 查 阅 API 文 档 可 知 , JspWriter 对 象 和 由 ServletResponse 的 getWriter() 方 法 得 到 的 PrintWriter对象是有依赖关系的。如果页面没有缓冲区,那么写入JspWriter对象的数据将 直 接 通 过 PrintWriter 对 象 进 行 输 出 ; 如 果 页 面 有 缓 冲 区 , 则 直 到 缓 冲 区 满 且 如 setContentType()等操作都合法时才创建PrintWriter对象,由PrintWrtier对象进行输出。 3.2.3 扩展——设置响应的MIME类型 任务:将一个文本文件包含在jsp页面中,且在显示页面内容之前先让用户选择查看文件 所使用的方式,将三种可选方式(文本方式、网页方式、word文档方式)放在下拉框中供用 户选择。当用户选择并点击“查看按钮”后,按用户所选方式展现内容。 3.3 存储用户会话 3.3.1 任务描述与实现 3.3.1.1 判断用户是否已登录 实现如下功能:用户成功登录后,只要未关闭浏览器的情况下,可随时访问本站点的任 何页面(当然此处本站点只有登录页面和欢迎页面),如果用户在未登录的情况下访问欢迎 页面的话,给出相应的提示,并在5秒后跳转到登录页面。 实现:当用户在登录页面(exam3_3_login.jsp)输入用户名和密码并点击登录后,在处 理页面exam3_3_login_do.jsp(代码如程序3-12所示)中判断用户名和密码是否正确,如果 正确,即登录成功,则将名为“username”,值为用户所输入的用户名的属性添加到session 对象中,然后进入exam3_3_welcome.jsp(代码如程序3-13所示)中;如果用户名或密码不正 确,则输出提示“用户名或密码不正确,5秒后为您跳转回登录页面”,并在5秒后跳转回登 将页面重定向到参数所指定的URL 设置响应的MIME类型 得到返回客户端的打印流

录页面。如果用户没有登录,而直接访问exam3_3_welcome.jsp,则输出提示“您必须先登录, 5秒后为您跳转回登录页面”,并在5秒后跳转回登录页面。 3.3.2 新知识点——session、aplication 3.3.2.1 session session(会话)是用来在访问一个网站时发出的多个页面请求或者在多次页面跳转之间 识别同一个用户并且存储这个用户的相关信息的一种方式。通常从一个客户连接到某个服务 器开始,直到他关闭浏览器离开这个服务器为止,称之为一次会话。 Servlet容器使用 javax.servlet.http.HttpSession这个接口在HTTP客户端和服务器端之间创建一个会话,JSP 的内置对象session就是这个接口的一个实例。一个session通常只对应一个用户,它有一定 的生存时间,它可以使同一个用户在访问同一个Web站点时在多个页面连接和请求之间共享数 据。服务器通常通过cookie或者重写URL的方式来维持session,不过开发者无需关心这些细 节。 HttpSession接口的方法主要分为两类,一类是查看和操作关于这个session的信息的方 法,如session的ID、创建时间、最近访问时间等;另一类方法是将对象绑定到session中, 以能够使用户信息在客户端与服务器端的多次连接中能够共享。 3.3.2.2 application JSP内置的application对象是javax.servlet.ServletContext类的一个实例,可以通过 它和Servlet容器进行通信,如获取一个文件的MIME类型,转发请求,写日志文件等等;也可 以通过它共享一些全局信息。 Application对象表示Servlet的上下文,每台Java虚拟机上的同一个Web应用只有一个上 下文,即当Web应用被部署到服务器上,服务器启动时就创建一个application对象,所有访 问该应用的客户都共享同一个application对象,直到服务器关闭。因此可以通过将一些信息 放在application对象里,以实现全局共享,当然要注意这个“全局”只是相对的,因为不同 的Java虚拟机上的Servlet上下文也是不同的。 3.3.3 扩展——cookie 3.3.3.1记录用户以往访问当前站点的相关信息 任务描述:当用户访问本网站的登录页面时,能够自动显示出该用户以前访问本网站时 曾经使用过的用户名。 实现过程:这样的功能一般都是基于cookie实现的。首先创建一个web应用,当用户访问 本网站的登录页面exam3_3_cookie_login.jsp(代码如程序3-17所示)时,该页面读取客户 端的cookie,如果cookie中存在username记录,则在登录表单的用户名一栏中自动填入该 username值。当用户成功登录后,将该username存入cookie中。 3.3.3.2 知识点:Cookie简介

Cookie 是 Web服务器发送给客户端的一小段信息。如果服务器需要在客户端记录某些数 据时,就可以向客户端发送Cookie,客户端接收并保存该 Cookie,而且客户端每次访问该服 务器上的页面时就会将 Cookie 随请求数据一同发送给服务器。下面从向客户端发送Cookie 以及从客户端读取Cookie两方面来介绍Cookie的使用方法。 1.向客户端发送Cookie 首先需要创建Cookie对象:Cookie c=new Cookie(“cookieName”, “cookieValue”); 然后需要调用setMaxAge(long time)为Cookie对象设置有效时间(该时间参数以秒为单位), 不 然 浏 览 器 关 闭 时 Cookie 就 会 被 删 除 ; 最 后 使 用 HttpServletResponse 对 象 的 addCookie(Cookie c)方法把Cookie对象添加到HTTP响应头中发送到客户端。 2.从客户端读取Cookie 首先获取客户端上传的Cookie数组:调用HttpServeltRequest对象的getCookies()得到 一个Cookie对象的数组;然后遍历该数组,找寻需要的Cookie对象:通过Cookie的getName() 方法,获取Cookie对象的name属性,通过getValue()方法获取Cookie对象的值。 【教学小结】 本章介绍了 JSP 的各个内置对象,并着重讲解了 request、response、session、 application、out 这几个最常用的对象,这些对象在 JSP 开发中具有很重要的地位,希望读 者能够结合本章任务理解这些对象,并能够掌握其用法。对于其它未详解的对象,可参考相 关的 API 文档。

课题:第四章 【教学目标】

JDBC 与数据库应用

掌握通过 JDBC 连接数据库并进行数据操作的方法 【教学重点】 连接数据库和读取数据库、写入数据库 【教学难点】 连接数据库和读取数据库、写入数据库 【教学方法】讲解、演示 【教学地点】教学楼、综合楼 【课时安排】4 课时 【教学过程】 4.1 连接数据库并读取数据 4.1.1 任务描述与实现 通过JDBC连接Mysql数据库,查询hncst数据库中users数据表中的数据,并以表格形式 显示,如表4-1所示。Users表的结构如表4-1所示。 表4- 1 任务执行结果用户名 密码 性别 Email 熟练开发语 言 leiyanrui 123456 female leiyanrui@ hnspi.edu. cn ? ? ? ? ? JAVA,C,C#

4.1.2 新知识点——JDBC概述、JDBC连接Mysql数据库 4.1.2.1 JDBC简介 JDBC的英文名称是Java Database Connecivity,中文名称是Java数据库连接,它是一种 用于执行SQL语句的Java API类包,由一组用Java语言编写的类和接口组成,通过它可以构建 更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序。 JDBC是Java操作数据库的方法,由SUN提供。有了JDBC,向各种关系数据发送SQL语句就 是一件很容易的事。换言之,有了JDBC API,就不必为访问MySQL数据库专门写一个程序,为 访问Oracle数据库又专门写一个程序。使用JDBC API,程序员只需用JDBC API写一个程序就 够了,它可向相应数据库发送SQL调用,这和Microsoft的ODBC技术是类似的,ODBC是由 Microsoft公司倡导并得到业界普遍响应的数据库连接技术,通过它可以使用一组通用的接口 与各种数据库进行连接,但这仅限于Windows平台;而JDBC不同,使用Java编写的应用程序可 以在任何支持Java的平台上运行,程序员甚至不必在不同的平台上编写不同的应用。这也是

Java语言“编写一次,处处运行”的优势。 4.1.2.2 Mysql 数据库简介 MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16 日被Sun公司收购。2009年,Sun又被Oracle收购。目前MySQL被广泛地应用在Internet上的中 小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点受到了众 多中小型网站制作者的青睐。MySQL的开发也得到了很多著名厂商和技术团队支持。 4.1.2.3 JDBC连接Mysql数据库的基本步骤 1. 下载驱动。要通过JDBC连接数据库需要使用数据库厂商提供的JDBC Drive。在Mysql 官方网站下载其JDBC驱动,官网地址:www.mysql.com,下载页面如图4-2所示。2.将下载好 的驱动mysql-connector-java-5.1.17-bin.jar文件(此处的5.1.17为驱动版本号),复制到 当前工程的WEB-INF的lib目录中,如图4-3、图4-4所示。3.编写数据库连接程序。 (1)加载驱动。 Class.forName(“com.mysql.jdbc.Driver”).newInstance(); (2)建立连接对象。 String url=”jdbc:mysql://localhost:3306/hncst”;// 连 接 字 符 串 Connection conn=DriverManager.getConnection(url); (3)建立 Statement 对象或 PreparedStatement 对象。 Statement stmt=conn.createStatement();//创建 Statement 对象 String sql=”select * from users where oolean=? ; And password=?” ; // 创 建 PreparedStatement 对 象

pstmt=conn.prepareStatement(sql)

Preparedment

pstmt.setString(1,”admin”); pstmt.setString(2,”liubin”); Statement是PreparedStatement的父接口。Statement 对象用于执行不带参数的简单SQL 语句;PreparedStatement 对象用于执行预编译SQL语句;也就是说,Statement接口提供了 基本方法,而PreparedStatement接口添加了处理 IN 参数的方法。对于需多次执行的SQL语 句,用PreparedStatement即可以减轻编码负担,又可以提高系统效率。 (4)执行SQL语句。 执行SQL查询○1 String sql=”select * from users”; ResultSet rs=stmt.executeQuery(sql); 执行insert,update,delete等语句,先定义sql ○2 stmt.executeUpdate(sql); Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。

(5)关闭对象,释放资源。 Rs.close(); stmt.close(); conn.close(); 通过上面五个步骤,就可以完成JDBC连接数据库,执行SQL语句,并在执行完后释放数据库资 源。 4.1.3 扩展——JDBC连接SQL Server、Oracle 4.1.3.1 JDBC连接SQL Server SQL Server是一个关系型数据库管理系统。SQL Server使用集成的商业智能工具提供企 业 级 的 数 据 管 理 , 可 以 为 不 同 规 模 的 企 业 提 供 不 同 的 数 据 管 理 解 决 方 案 。 下 边 以 SQL Server2005为例,介绍JDBC连接SQL Server数据库。 实现过程: 通过JDBC连接SQL Server的hncst数据库,实例文件为exam4_2_sqlserver.jsp,具体步 骤如下: 1.在Microsoft SQL Server的官网下载SQL Server JDBC 驱动(不同版本的数据库对应不 同驱动程序)。将下载好的驱动sqljdbc.jar文件复制到网站的lib目录中。 2.将SQL Server的验证方式改为混合验证方式, 并设置合法用户名和密码。 打开Microsoft SQL Server Management Studio Express,通过右键点击数据库“服务器属性”面板,在“安全” 选项里进行配置,重启SQL Server后生效, 4.1.3.2 JDBC连接Oracle 与JDBC连接Mysql、SQLServer类似,需要先下载Oracle数据库的JDBC驱动,并将其放置 在网站的lib目录下。在此不再详细描述。其次,创建连接文件JDBCOracleConnection.jsp, 代码如程序4-3所示。 4.2 写入数据库 4.2.1 任务描述与实现 编写程序完成用户注册功能,即通过JDBC连接数据库,并向users表中添加一条新记录。 注册的资料包含姓名、密码、性别、熟练开发语言、个人简介。 4.2.2 新知识点——Connection、Statement、ResultSet等对象的常用方法 在Java语言中提供了丰富的类和接口用于数据库编程,利用它们可以方便地进行数据的 访问和处理。下面主要介绍Java.sql包中提供的常用类和接口。1.Driver接口 每个数据库驱动程序必须实现Driver接口,对于JSP开发者来说只要使用Driver接口就可 以了。在编程中要连接数据库必须要装载特定的数据库驱动程序(Driver),格式如下: Class.forName(“数据库商提供的驱动程序名称”);

在使用Class.forName之前,应先使用Import语句导入java.sql包,即 在Java源程序中为:import java.sql.*; 在JSP程序中为:<%@ page import=”java.sql.*”%> 2.DriverManager接口 java.sql.DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,作用 于用户和驱动程序之间,用来管理数据库中的所有驱动程序。它可以跟踪可用的驱动程序, 注册、注销以及为数据库连接合适的驱动程序,设置登录时间限制等。 4.Statement接口 Statement接口用于在已经建立连接的基础上向数据库发送SQL语句。Statement接口中包 含了执行SQL语句和获取返回结果的方法。 在JDBC中有3种Statement对象:Statement、PreparedStatement和 CallableStatement。 Statement对象用于执行不带参数的简单SQL语句;PreparedStatement继承了 Statement,用 于处理需要被多次执行的SQL语句;CallableStatement继承了PreparedStatement,用于执行 对数据库的存储过程的调用。5.PreparedStatement接口 PreparedStatement接口继承Statement,包含已经编译的SQL语句。这就是使语句“准备 好 ” , 所 以 它 的 执 行 速 度 要 高 于 Statement 对 象 。 因 此 , 将 多 次 执 行 的 SQL 语 句 创 建 为 PreparedStatement对象,可以提高效率。 6.ResultSet接口 ResultSet 接口用来暂时存放数据库查询操作所获得的结果。ResultSet 接口中包含了一系列 get 方法,用来对结果集中的数据进行访问。 4.2.3 扩展 数据库连接是 JDBC 数据库应用程序中最为耗时的一个部分。服务器的资源有限,程序如 果一直保持数据库的连接状态,就会消耗数据库服务器的资源,影响服务器的正常响应。在 部分情况下 JSP 也会自动关闭数据库连接进而释放资源,例如在一个方法或一个类的内部创 建数据库连接,当这个方法或类运行结束时,JSP 将会自动的回收资源,并不需使用 close 方 法主动释放资源。但在实际应用中,JDBC 连接数据库通常会使用 servlet(见第五章) ,而 servlet 会一直保持在服务器内,servlet 的数据库连接也会一直保存在服务器内,所以为了 减少消耗服务器资源,应该习惯在方法或类中创建数据库连接,并通过 close 方法主动关闭 数据库连接。 4.3.2 新知识点——分页 如果要显示的数据太多,在一个页面上显示不仅会使用户难以阅读,更加会影响程序的 运行,加重服务器的负担,解决的途径就是对记录进行分页显示。 分页的方法有很多种,下面我们介绍一种最简单最容易理解的:通过前面的学习,我们

可以通过RecordSet对象的方法,获得记录集中的记录条数,已知每页显示的记录个数,可以 很容易的计算出分页的页数,页数等于记录条数除以每页记录条数,再将结果向上取整,即 页数=总记录条数/每页记录数;当前页显示的记录可以通过SQL中Select语句的Limit来限定, 已知当前页码,则显示记录的起始位置为(当前页码-1)*每页记录数,以MYSQL为例,构造 出的SQL语句为:Select * from users limit (当前页码-1) *每页记录数,每页记录数。 分页只显示符合要求的部分记录,所以一定要设计翻页连接帮助用户翻页浏览,常用的 翻页连接有首页、尾页、上一页和下一页,首页即页码为1的页面,尾页即页码为总页数的页 面,上一页即页码为当前页减1的页面,下一页即页码为当前页加1的页面,根据这些设置超 连接进行翻页。 SQL Server 的 SQL 语句没有 Limit 关键字,如果要对 SQL Server 中的数据表进行分页就 要利用 T_SQL 中的 top 和 not in 语句,top 关键字用来指定返回结果集的前 n 行,很容易理 解,第一页就是 select top 每页记录数 from users,第二页 select top 2*每页记录数 from user,结果是前两页的记录,然后要将第一页的记录从记录集中剔除,使用 not in, select 即 top 2*每页记录数 from users where id not in (select top 每页记录数 id from users )。 则当前页的分页 SQL 语句为 select top 当前页*每页记录数 * from users where id not in (select top (当前页-1)*每页记录数 id from users)。 【教学总结】 本章介绍了应用 JDBC 技术实现对 Mysql、SQLServer、Oracle 数据库的连接、数据的查 询和更改等操作,并对数据查询的分页技术进行了详细的讲解。数据库操作是 JSP 技术的核 心内容,必须扎实掌握本章的知识。本章为了便于学习,将数据库逻辑直接放置在 JSP 页面 中,这样凡要进行数据操作的页面都要加上连接数据库的代码,不便于维护。

课题:第五章 JavaBean技术

【教学目标】 1.掌握JSP中使用JavaBean的语法 2.掌握JavaBean的作用域 3.掌握JavaBean封装方法 【教学重难点】 封装用户信息、实现数据库连接的 JavaBean 【教学方法】讲解 【教学地点】教学楼、艺术馆 【课时安排】4 课时 【教学过程】 5.1 封装用户信息的JavaBean 5.1.1 任务描述与实现 5.1.1.1 实现封装用户信息的JavaBean 创建封装用户信息的JavaBean,用户信息包括用户名、密码、性别、年龄和家庭住址等 内容。如表5-1所示。 表5- 1 用户信息表属性 用户名 密码 性别 年龄 家庭住址 变量 userName userPassword Sex age address 类型 String String String int String

5.1.2 新知识点——JavaBean 概述、JSP 调用 JavaBean 5.1.2.1 JavaBean 概述 一.JavaBean 技术介绍 JavaBean 是一种 Java 语言写成的可重用组件,JavaBean 归根结底就是一个封装了属性 和方法的类。 为写成 JavaBean, 类必须是具体的和公共的, 并且具有无参数的构造器。 JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合 这种模式,其他 Java 类可以通过自身机制发现和操作这些 JavaBean 属性。 使用 JavaBean 的最大优点就在于它可以提高代码的重用性。编写一个成功的 JavaBean, 宗旨是“一次性编写,任何地方执行,任何地方重用”这正迎合了当今软件开发的潮流,将 复杂需求分解成简单的功能模块,这些模块是相对独立的,可以继承、重用,这样为软件开 发提供了一个简单、紧凑、优秀的解决方案。

1.一次性编写 一个成功的 JavaBean 组件重用时不需要重新编写,开发者只需要根据需求修改和升级代 码即可。 2.任何地方执行 一个成功的 JavaBean 组件可以在任何平台上运行,由于 JavaBean 是基于 Java 语言编写 的,所以它可以轻易移植到各种运行平台上。 3.任何地方重用 一个成功的 JavaBean 组件能够被在多种方案中使用,包括应用程序、其他组件、Web 应 用等。 二.JavaBean 的组成 一个 Bean 由两部分组成: 1.属性(properties) JavaBean 提供了高层次的属性概念, 属性在 JavaBean 中不只是传统的面向对象的概念里 的属性,它同时还得到了属性读取和属性写入的 API 支持。属性值可以通过调用适当的 Bean 方法进行。比如,可能 Bean 有一个名字属性,这个属性的值可能需要调用 String getName() 方法读取,而写入属性值可能要需要调用 void setName(String str)的方法。 每个 JavaBean 属性通常都应该遵循简单的方法命名规则,这样应用程序构造器工具和最 终用户才能找到 JavaBean 提供的属性,然后查询或修改属性值,对 Bean 进行操作。JavaBean 还可以对属性值的改变作出及时的反应。比如一个显示当前时间的 JavaBean,如果改变时钟 的时区属性,则时钟立即重画,显示当前指定时区的时间。 2.方法(method) JavaBean 中的方法就是通常的 Java 方法,它可以从其它组件或在脚本环境中调用。默认 情况下,所有 Bean 的公有方法都可以被外部调用,但 Bean 一般只会引出其公有方法的一个 子集。由于 JavaBean 本身是 Java 对象,调用这个对象的方法是与其交互作用的唯一途径。 三.JavaBean 规范 (1)JavaBean 类必须是一个公共类,并将其访问属性设置为 public ,如: public class User{......}。 (2)JavaBean 类必须有一个必须要有不带参的默认构造函数:类中必须有一个不带参数的 公用构造器。 (3)一个 JavaBean 类不应有公共实例变量, 类变量都为 private,如: private int id。 (4)属性应该通过一组存取方法(getXxx 和 setXxx)来访问,一般是 IDE(Eclipse、 JBuilder) 为属性生成 getter/setter 方法。

(5)一般 JavaBean 属性以小写字母开头,驼峰命名格式,相应的 getter/setter 方法 是 get/set 接上首字母大写的属性名。例如:属性名为 userName,其对应的 getter/setter 方法是 getUserName/setUserName。 5.1.2.2 JSP 调用 JavaBean 在 JSP 页中,既可以用程序代码来访问 JavaBean,也可以通过特定的 Jsp 标签来访问 JavaBean。采用特定的 Jsp 标签来访问 JavaBean 可以减少 JSP 网页中的程序代码。 (1)导入 JavaBean 类 在 Jsp 页面中访问 JavaBean, 首先要通过<%@ page import=””%>指令引入 JavaBean 类。 例如: <%@ page import="chapter5.UserInfo_do"%> 这里的chapter5.UserInfo_do是指在包chapter5下的UserInfo_do.java类。 (2)调用JavaBean 调用JavaBean使用的是动作标签<jsp:useBean>。语法如下: <jsp:useBean id=“user“ class=“chapter5.UserInfo_do“ scope=“session“/> 上述代码中声明了一个名字为user的JavaBean对象。<jsp:useBean>标签具有id、class 和scope三个属性。具体说明如下: id属性:代表JavaBean对象的ID,表示引用JavaBean对象的局部变量名,以及存放在特 定范围内的属性名。 class属性:用来指定JavaBean对象的类名。 scope属性:用来指定JavaBean对象的存放范围,可选择的值包括page,request,session 和application。 (3)设置JavaBean属性 设置JavaBean的属性,使用的是<jsp:setProperty>标签。语法如下: <jsp:setProperty name=“user”property=”password” value=”123”/> <jsp:setProperty>标签具有以下属性。 name属性:必须和<jsp:useBean>标签中的id属性值匹配。 property属性:用来指定JavaBean对象的某个属性值。如果值为*号,则是指定所有属性。 value属性:用来指定属性的属性值。 相当于使用<%user.setPassword(123);%>。 (4)访问JavaBean属性 访问JavaBean属性,使用的是<jsp:getProperty>标签。语法如下: <jsp:getProperty name=“user”property=”password”/> <jsp:getProperty>标签的name属性也必须和<jsp:useBean>标签中的id属性值匹配。根 据ID为user的JavaBean对象,然后打印它的password属性。

相当于使用<%=user.getPassword()%>。 5.1.3 扩展——JavaBean 作用域 在 我 们 调 用 bean 的 时 候 其 中 最 重 要 的 三 个 属 性 是 需 要 设 定 的 , 他 们 分 别 是 : id=““ class=““ scope=““在这三个属性中,id 表示我们要创建的事例对象名称;class 表示我们调用的 bean,也就是你编写 bean 完成后通过编译生成的.class 文件;scope 就表示 我们创建的 bean 的事例对象的生命周期。 我们经常看到这样的代码来控制 bean 的生命周期: (1).<jsp:useBean id=“user“ class=“chapter5.UserInfo_do “ scope=“page“> (2).<jsp:useBean id=“user “ class=“chapter5.UserInfo_do “ scope=“request“> (3).<jsp:useBean id=“user “ class=“chapter5.UserInfo_do “ scope=“session“> (4).<jsp:useBean id=“user“ class=“chapter5.UserInfo_do“ scope=“application“> 5.2 数据库连接的 JavaBean 5.2.1 任务描述与实现 5.2.1.1 实现注册信息的添加并写入数据库 数据库连接对动态网站来说非常重要,通过 JavaBean 来访问数据库实际上就是建立一个 JavaBean 组件,然后再使用 JavaBean 来完成与数据库的连接。5.2.2 新知识点——数据库连 接的 JavaBean 在 JSP 文件中 HTML 与大量 Java 代码交织,且直接嵌入访问数据库的代码及 SQL 语句则 会使页面设计困难。使得程序员难以理解、维护、扩展、调试程序。将 JSP 和 JavaBean 技术 结合在一起,可以用 JavaBean 实现业务逻辑和数据库操作的封装,JSP 只负责页面的显示。 用户端浏览器发送 JSP 文件请求,JSP 文件访 问 JavaBean,JSP 页面响应请求并将处理结果 返回客户,而使用 JavaBean 处理所有的数据访问。其架构如图 5-8 所示 :
1 请求 JSP文件 浏 览 器 4 响应 2

3 JavaBean 数据库

在访问数据库时,使用这种结构可使 JSP 页面中只需要嵌入少量的 Java 代码甚至不使用 Java 代码,可重用对数据库进行处理的 JavaBean,方便调试。并且将对数据库的操作封装在

JavaBean 中使得数据库的地址、登录用户名和密码等信息都封装在应用程序中,用户在浏览 器上看不到任何对数据库操作进行访问的源代码,只有通过 JavaBean 对数据库进行访问,从 而提高了对数据库进行访问的安全性。 【教学总结】 本章主要介绍 JavaBean 技术的使用,JavaBean 的属性,JSP 中与 JavaBean 相关的操作 指令的语法和用法,JavaBean 的作用域和通过 JavaBean 访问数据库等内容。首先介绍了如何 在 eclipse 中创建 JavaBean,然后介绍了如何在 Jsp 页面应用 JavaBean。在讲到 JavaBean 的作用域时用两个例子作比较,通过这两个例子体现作用域的不同用法。在讲解每个知识点 时都先会举相关的例子来说明,然后通过例子来引出和扩展知识点。通过阅读本章,读者可 以熟悉 JavaBean 并且掌握 JavaBean 的使用。为以后更深入的学习打好基础。

课题:第六章 JavaServlet技术

【教学目标】 掌握 Java Servlet 及使用方法 【教学重难点】 JavaServlet 的编写与部署过程、Servlet 的生命周期、Servlet 接口 【教学方法】讲解、讨论 【教学地点】教学楼、综合楼 【课时安排】4 课时 【教学过程】 6.1 建立并部署Servlet 6.1.1 任务描述与实现 使用Eclipse创建简单的HelloServlet程序,Servlet运行效果见图6- 1所示。

图6- 1 HelloServlet运行效果 实现过程: 1. 创建 Servlet。 2.配置web.xml文件 Tomcat7.X版本创建Servlet将在.java文件中配置@WebServlet声明,可进行URL映射配 置,在上例中的配置为: @WebServlet( description = “Hello ,Servlet 程序”, urlPatterns = { “/HelloServlet”,

“/chapter6/HelloServlet” }) 在 Tomcat6.X 之前版本,创建 Servlet 后,需要在 web.xml 文件中进行配置,使用 Eclipse 创建 Servlet 过程和前面的过程相同,创建 Servlet 后,Eclipse 会在 web.xml 文件中自动创 建配置节点,详细代码见程序 6-2。 3.访问HelloServlet 打开浏览器,在地址栏 输入 http://localhost:8080/JavaWebExample/chapter6/HelloServlet,可以看到图 6-1 所 示运行效果。 6.1.2 新知识点——Java Servlet概述 1.Java Servlet简介 Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编 译 成 .class 文 件 , 然 后 将 此 class 文 件 放 在 Servlet Engline 路 径 下 。 Servlet API 使 用 javax.servlet和javax.servlet.http两个包的接口类。 当服务器上的一个JSP网页被第一次请求执行时,服务器上的JSP引擎首先将JSP页面文件 转译成一个Java文件(即Servlet类),再将这个Java文件编译成class字节码文件,然后执行 以响应客户的请求,当这个JSP页面再次被请求执行时,JSP引擎将直接执行这个字节码文件 来响应客户,响应速度比第一次执行快很多。 2.Web.xml文件 Java Web 应用通过一个基于XML的发布描述文件来配置其发布信息。Web.xml文件中可包 含的配置信息有: Servlet的定义; Servlet的初始化参数; Servlet以及JSP的映射; 安全域配置参数; 资源引用; 环境变量的定义。 3.Java Servlet功能 Servlet是使用Java Servlet应用程序设计接口及相关类和方法的Java程序。它在Web服 务器上或应用服务器上运行并扩展了该服务器的能力。Java Servlet对于Web服务器就似乎 Java Applet对于Web浏览器。Applet装入Web浏览器并在Web浏览器内执行,而Servlet则是装 入Web服务器并在Web服务器内执行。Java Servlet API 定义了Servlet和服务器之间的一个 标准接口,这使得Servlet具有跨服务器平台的特性。 Servlet通过创建一个框架扩展服务器的能力,采用请求-响应模式提供Web服务。当客户

机发送请求至服务器时,服务器将请求信息发送给Servlet,Servlet生成响应内容并将其传 给Server,然后再由Server将响应返回给客户端。 Servlet的功能涉及范围很广,Servlet可完成如下功能: 创建并返回一个包含基于客户请求性质的动态内容的完整的 Html页面。 创建可嵌入到现有 HTML 页面中的一部分 HTML 页面(HTML 片段)。与其他服务器资源 (文件、数据库、Applet、Java应用程序等)进行通信。 用多个客户机处理连接,接受多个客户机的输入,并将结果广播到多个客户机上。例如, Servlet 可以是多参与者的游戏服务器。 将定制的处理提供给所有服务器的标准例行程序。例如,Servlet 可以修改如何认证用 户。 通过使用Servlet API,开发人员不必担心服务器的内部运作方式。表格资料、服务器头、 cookies等皆可通过Servlet处理。另外,因为Servlet是用Java编写,能将其从一个服务器移 到另一个服务器以供发布,同时不必担心操作系统或服务器的类型。 6.1.3 扩展——Java Servlet版本历史 Servlet 1.0 版本由 Sun Microsystems 公司创建于 1997 年, 2.3 版本开始, 从 Java Servlet 由 JCP 组织下开发,JCP 是 Java Community Process 的缩写,一个由全世界的 Java 开发人 员和获得许可的人员组成的开放性组织,其对 Java 技术规范、参考实现和技术兼容性包进 行开发和修订。JSR53(Java Specification Request,Java 规范请求,指向 JCP 提出增加一 个标准化技术规范请求)定义了 Servlet 2.3 和 JSP 1.2 规范,JSR 154 提出了 Servlet 2.4 和 2.5 规范,直到 2010 年 3 月,推出了现行 Servlet 3.0 规范。 6.2 获取客户端数据并写入数据库 6.2.1 任务描述与实现 当前Web应用程序,用户信息注册时最为广泛的功能之一,下面以用户信息注册并写入数 据库为例介绍使用JSP和Servlet结合完成信息注册并保存在数据库中,如图6- 6所示。3.创 建Servlet。 在Eclipse中添加Servlet,其中包名chapter6,类名为:RegistToDb,仅选择doPost方法, 在doPost方法中输入代码,详细代码见程序6-4所示。4.注意事项 在 这 里 要 注 意 , 如 果 是 Servlet3.0 以 上 版 本 , 需 要 在 RegistToDb.java 文 件 中 找 到 @WebServlet("/chapter6/RegistToDb") 修 改 Servlet 访 问 路 径 , 这 里 的 路 径 为 /chapter6/RegistToDb 。 如 果 是 3.0 以 下 版 本 , 则 需 要 在 web.xml 文 件 中 修 改 <servlet-mapping>节中的<url-pattern>,修改为/chapter6/RegistToDb。 6.2.2 新知识点——Java Servlet工作过程 1.Servlet的工作过程 Servlet为客户端和服务器端信息的处理提供了一种“请求/应答”模式机制。同时,Java

的Servlet API 为客户端和服务器之间的请求和应答信息定义了标准接口。图6-8描述了一个 Servlet的工作过程: 客户端发送请求给服务器端; 服务器将请求信息发送至Servlet。 Servlet生成响应内容并将其传给服务器。 响应内容动态生成, 通常取决于客户端的请求。 服务器将应答返回给客户端。 Servlet看起来像是通常的Java程序,Servlet导入特定的属于Java Servlet API的包。 因为是对象字节码,可动态地从网络加载,可以说Servlet对Server就如同Applet对Client一 样,但是,由于Servlet运行于Server中,它们并不需要一个图形用户界面。从这个角度讲, Servlet也被称为FacelessObject。 一个Servlet就是Java编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留 着可以通过“请求-响应”编程模型来访问的应用程序。虽然Servlet可以对任何类型的请求 产生响应,但通常只用来扩展Web服务器的应用程序。 2.Servlet的生命周期 通过Servlet的工作过程, 我们可以看出, 客户端的程序并不是直接与Servlet进行通信, 而 是 通 过 Web 服 务 器 和 其 他 应 用 服 务 器 来 完 成 的 。 一 个 Servlet 是 javax.servlet 包 中 HttpServlet类的子类,类似一个Java Applet是java.apple.Applet类似,只不过Servlet运 行在服务器端而已,需要支持Servlet的服务器完成对Servlet的初始化,Servlet生命周期如 图6-9所示。Servlet的生命周期由Servlet容器来控制,主要有初始化、运行和销毁三个过程 来完成, (1)初始化Servlet,Servlet第一次被请求加载时,服务器创建一个Servlet对象, Servlet容器调用Servlet对象的init方法进行初始化。 (2)运行Servlet,创建的Servlet对象根据客户端的请求,调用 Service 方法响应客 户端的请求。 (3)销毁Servlet,当Web应用被终止时,Servlet容器会先调用Servlet对象的destrory 方法,然后再销毁Servlet对象,释放Servlet对象占用的资源。 在Servlet生命周期中,Servlet的初始化和和销毁阶段只会发生一次,而service方法执 行的次数则取决于客户端的请求次数。 3.Servlet核心类 HTTP Servlet 使用一个HTML 表单来发送和接收数据。要创建一个 HTTP Servlet,请扩 展HttpServlet 类,该类是用专门的方法来处理 HTML 表单的 GenericServlet 的一个子类。 HTML 表单是由 <form> 和 </form> 标记定义的。表单中典型地包含输入字段(如文本输入字 段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务 器应 执行哪一个 Servlet( 或其它的程 序)。 HttpServlet 类包含 init()、 destroy()、

service() 等方法。其中 init() 和 destroy() 方法是继承的。 (1)GenericServlet类GetnericServlet类定义了一个普通的、依赖于协议的Servlet, 如 果 要 写 一 个 用 于 Web 的 HTTP Servlet , 扩 展 HpptServlet 。 一 个 Servlet 可 以 直 接 扩 展 GenericServlet类(扩展一个指定协议的子类(如HttpServlet)更为普遍)。 GenericServlet类使编写Servlets变得更容易。它提供了一般版本的生命周期方法:inin(), destroy()和来自ServletConfig接口的方法。GenericServlet类也实现了log()方法,这是一 个在ServletContext类中定义的方法。 6.2.3 扩展——JavaServlet接口 1.Servlet接口 Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接 口。在Servlet接口中定义了5个方法。这些方法的功能及使用方法如下: (1) init() 方法 在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执 行的。可以配置服务器,以在启动服务器或客户机首次访问 Servlet时装入Servlet。无论有 多少客户机访问Servlet,都不会重复执行init()。 缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型 的是管理服务器端资源。例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改 进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。 缺省的 init() 方法设置了Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启 动配置, 因此所有覆盖 init() 方法的Servlet 应调用 super.init() 以确保仍然执行这些 任务。在调用 service() 方法之前,应确保已完成了init() 方法。 (2) service() 方法 service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象 的service() 方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和 一个“响应”(ServletResponse)对象作为参数。在 HttpServlet 中已存在 service() 方 法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方 法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆 盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方 法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。 Servlet的响应可以是下列几种类型: 一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。 一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。 (3)doGet()方法 当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被

调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器 端的数据时,应该使用doGet()方法。 (4)doPost()方法 当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请 求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据 时,应该使用doPost()方法。 (5) destroy() 方法 destroy() 方法仅执行一次, 即在服务器停止且卸装Servlet 时执行该方法。 Servlet 将 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖 它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编 写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一 个示例是关闭数据库连接。 当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间 隔过后调用destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程, 因此请确认在调用destroy() 方法时,这些线程已终止或完成。 (6) GetServletConfig()方法 GetServletConfig()方法返回一个 ServletConfig 对象, 该对象用来返回初始化参数和 ServletContext。ServletContext 接口提供有关servlet 的环境信息。 (7) GetServletInfo()方法 GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、 版权。 当服务器调用Servlet 的Service()、 doGet()和doPost()这三个方法时, 均需要“请求” 和“响应”对象作为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个 将响应信息返回给浏览器的一个通信途径。 2.ServletRequest接口 ServletRequest接口封装了客户端请求的细节。它与协议无关,并有一个指定HTTP的子 接口。ServletRequest主要处理: 找到客户端的主机名和IP地址 检索请求参数 取得和设置属性 取得输入和输出流 6.3 处理服务器响应 6.3.1 任务描述与实现 用户登录是Web应用程序开发最常见的功能之一,登录过程为:首先获取用户输入的用户

名或密码,然后在数据库中比对,查找相匹配用户信息,成功则保存会话,并跳转到对应页 面,否则提示用户名密码错误。 6.3.2 新知识点——Servlet中会话存储、重定向到JSP页面 1.会话跟踪 Servlet API提供了一种简单而又高效的模型来跟踪会话信息。在Web服务器看来,一个 会话是由在一次浏览过程中所发出的全部HTML请求组成的。换句话说,一次会话是从你打开 浏览器开始到你关闭浏览器结束。会话跟踪的第一个障碍就是如何惟一标识每一个客户会话。 这只能通过为每一个客户分配一个某种标识,并将这些标识保存在客户端上,以后客户端发 给服务器的每一个HTML请求都提供这些标识来实现。 Servlet中使用HttpservletRequest对象的getSession方法来取得当前的用户会话。 getSession的 参数决定了如果会话尚不存在,getSession 是否创建一个新会话。还有一个版本的 getSession 没有任何参数,它将缺省地创建一个新会话。当一个新用户第一次调用 Servlet 引擎 时,这将会强制产生一个新的会话。请注意,我是说 Servlet 引擎而不是某一个 Servlet。所有 的会话数据都是由 Servlet 引擎来维护的,并且在 Servlet 之间共享。这样你就可以使用一组 Servlet 一起为一个客户会话服务了。另外,Servlet API 规范上指出:“为了确保会话被正确维 护,Servlet 的开发都必须在提交应答之前调用 getSession 方法。”这正是说,在向应答的输出 流中写入之前,你一定要调用 getSession 方法。 一旦你获得了会话对象,它工作起来就像标准Java的哈希表或字典一样。使用一个惟一 的键,你可以在会话对象中加入或者获取任何对象。由于会话数据是由Servlet引擎维护存储 的,你在为这些键赋值时一定要注意维护它的惟一性。我建议将Servlet的名字甚至它的包名 作为键的一部分,这样你就不会不小心修改其他Servlet设置的键值了。 2.Servlet中会话存储 我们知道Web应用是基于HTTP协议的,而HTTP协议恰恰是一种无状态协议,为解决这个矛 盾,Session由此产生。既然Web应用并不了解有关同一用户以前请求的信息,那么解决这个 问题的一个办法是使用Servlet/JSP容器提供的会话跟踪功能,Servlet API规范定义了一个 简单的HttpSession接口,通过它我们可以方便地实现会话跟踪。 HttpSession接口提供了存储和返回标准会话属性的方法。标准会话属性如会话标识符、 应用数据等,都以“名字-值”对的形式保存。简而言之,HttpSession接口提供了一种把对 象保存到内存、在同一用户的后继请求中提取这些对象的标准办法。在会话中保存数据的方 法 是 setAttribute(String s, Object o) , 从 会 话 提 取 原 来 所 保 存 对 象 的 方 法 是 getAttribute(String s)。 在服务器端,每当新用户请求一个使用了HttpSession对象的JSP页面,Servlet/JSP容器 除了发回应答页面之外,它还要向浏览器发送一个特殊的数字。这个特殊的数字称为“会话

标识符”,它是一个唯一的用户标识符。此后,HttpSession对象就驻留在内存之中(这当然 是在服务器端),等待同一用户返回时再次调用它的方法。 在客户端,浏览器保存会话标识符,并在每一个后继请求中把这个会话标识符发送给服 务器。会话标识符告诉JSP容器当前请求不是用户发出的第一个请求,服务器以前已经为该用 户创建了HttpSession对象。此时,JSP容器不再为用户创建新的HttpSession对象,而是寻找 具有相同会话标识符的HttpSession对象,然后建立该HttpSession对象和当前请求的关联。 3.Servlet重定向到JSP页面 重定向技术可以分为两类,一类是客户端重定向,一类是服务器端重定向。客户端重定 向可以通过设置特定的HTTP头,或者写JavaScript脚本实现。 6.3.3 扩展——JavaServlet与JSP的共享对象 Java Web应用程序有四个对象存放共享对象。这些共享对象存放在那里,以便存放者或 者其它程序代码日后使用。这四个对象分别是页面、请求、会话和应用程序,它们都是以数 据结构键/值对的形式保存的。同时这四个对象形成了四个级别的共享对象存放地,即应用程 序对象中的共享对象是全局性的,在整个应用程序的生命周期内有效(当然主动去掉除外) , 属于所有的上网用户;会话对象中的共享对象是在一个会话期内有效,属于用户的当前会话; 请求对象中的共享对象在一个请求期内有效,属于用户发送的当前请求;页面对象中的共享 对象只属于当前页面的执行实例。 【课堂小结】 : 本章通过3个具体的任务,介绍了Java Servlet 功能,历史版本及配置方法,介绍了 Servlet工作原理、Servlet生命周期、Servlet核心类和Servlet接口的常用方法,还介绍了 Servlet会话跟踪、Servlet会话管理、重定向技术以及Servlet和JSP共享对象方法。 Java Servlet 是 Java Web 技术的基础。通过上述知识的学习,有助于读者更加深刻的理解和 应用 Java Web 开发技术。

课题 第七章 EL 【教学目标】 掌握 Java EL 及使用方法。 【教学重点】EL 语法、EL 中的隐含对象 【教学方法】讲解 【教学地点】教学楼、综合楼 【课时安排】4 课时 【教学过程】 7.1 配置和使用EL 7.1.1任务描述与实现 使用EL配合JSTL标签遍历输出JSP容器中的一个Map中的数据。运行后的效果如图7-1所 示。

图 7-1 使用EL访问JSP容器中的数据 实现过程: 1.引入JSTL库文件 转到tomcat目录下,找到\webapps\examples\WEB-INF\lib下的jstl.jar和standard.jar 两个文件,拷贝到项目WEB-INF\lib目录下。 2.创建JSP文件 在Eclipse中JavaWebExample项目下创建chapter7目录,并创建exam7_1_el.jsp文件,在 文件首部添加<%@taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %> , 在本例中,我们使用EL访问JSP容器中的数据,详细代码见程序7-1。 1.EL语法结构 EL语法非常简单,${expression},是一个以“${”开始,以“}”结束的表达式, expression通常是一个变量名称或者表达式,功能是在JSP页面中输出该变量或表达式对应的 值。 2.EL运算符

EL 提供“.”和“[ ]”两种运算符来存取数据。当要存取的属性名称中包含一些特殊字 符,如.或?等并非字母或数字的符号,就一定要使用“[ ]”。 例如:${user.My-Name}应当改为${user[“My-Name”] } 此外,如果要动态取值时,应该使用“[ ]”,因为“.”无法做到动态取值。 例如:${sessionScope.user[data]}中data 是一个变量 3.变量 EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为 username的变量。 由于我们并没有指定是哪一个范围的变量username,所以它会依序从page、request、 session、application范围查找。假如途中找到username,就直接回传,不再继续找下去, 但是假如全部的范围都没有找到时,就回传null。属性范围在EL中的名称,见表 7- 1。

7.1.2 新知识点——EL语法基础 EL(Expression Language),表达式语言,是JSP2.0的一个重要组件,在JSTL中被广 泛使用。EL使用十分方便,语法也很简单,已成为标准规范之一。EL的主要优势在于:简化 对象的访问、简化对象属性的访问、简化集合元素的访问、简化请求参数等的访问,同时EL 还提供了运算符集合、支持条件输出、支持自动类型转换等功能。 7.1.3 扩展——EL 运算符 JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符,基本分为四大 类,分别是算术运算符、关系运算符、逻辑运算符和其他运算符。 1.算术运算符 表达式语言支持的算术运算符和逻辑运算符非常多,所有在 Java 语言里支持的算术运算 符,表达式语言都可以使用;甚至 Java 语言不支持的一些算术运算符和逻辑运算符,表达式 语言也支持。 7.2 使用 EL 简化 JSP 开发 7.2.1 任务描述与实现 使用 EL 重写 JSP 页面。完成与 3.1 节相同的注册功能,但要求在获取请求参数时不再使 用 Java 脚本获取,而是使用 EL 表达式获取 request 参数。用户注册页面如图 7- 2 所示,当 注册请求提交后服务器返回的响应页面如图 7- 3 所示。 7.2.2 新知识点——EL 内建对象 JSP 有 9 个隐含对象, EL 也有自己的内建对象。 内建对象分为 6 大类, 而 EL 总共有 11 个, 详细描述见表 7-6 所示。 7.2.3 扩展——EL 数据类型和自动类型转换 EL 是为了便于存取数据而定义的一种语言,JSP2.0 之后才成为一种标准。EL 借鉴了 JavaScript 语言简单的数据类型和多类型之间转换无关性的特点,使用非常方便。 1. EL数据类型 表达式语言EL定义了5种数据类型,也称之:EL字面量(Literals)。 Boolean:布尔型,值为true或false。 Integer:整型,与Java语言一样。 Float:浮点型,与Java语言一样。 String:字符串,与Java语言中的String一样。 Null:空值,null。 2.EL自动类型转换 表达式语言EL 除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转

变类型,主要优点表现在于: EL元素可以出现在常规的页面正文、HTML以及JSP的标签属性中。EL表达式的结果会被强 制转换成字符串,并和其他静态文本拼接在一起。 EL的各种操作运算中,不需要考虑运算对象和结果的类型转换,原因是在表达式内部已 经处理好了。从隐含对象中获取参数的值时,可以自动进行类型转换,对类型的限制很宽松。 比如:${param.count + 20},假若窗体传来count的值为10时,那么上面的结果为30。 空值代替错误消息。大多数情况下,缺失的值或 NullPointerExceptions会导致空串, 不会抛出异常。 所以,EL 排除了大部分类型的转换,使得 JSP 编程变得更加灵活、更容易。 【课堂小结】 : 本章通过 2 个具体的任务,介绍了 JSP 中 EL 表达式语言,包括 EL 的基本语法、算术运 算符、内建对象、数据类型和类型转换。EL 可提高 JSP 页面上的逻辑能力。这样能减少页面 使用 Java 代码提供逻辑支持,从而实现 Java 代码和 HTML 界面的分离,能够提高 Web 程序的 开发进度。

课题: 第八章 Java web 高级编程技术 【教学目标】 掌握 Java web 高级编程技术。 【教学重难点】 访问权限控制、数据库连接池 【教学方法】讲解 【教学地点】教学楼、艺术馆 【课时安排】4 课时 【教学过程】 8.1 访问权限控制 8.1.1 任务描述与实现 完成系统某些模块的受限访问。即当用户未登录访问位于admin目录下的系统后台页面 时,给出如图8-1所示的提示,当用户单击该提示对话框中的确定按钮后,跳转至如图8-2所 示的登录页面。

图8- 1未登录访问后台管理页面时的提示信息

图8- 2 系统登录页面 8.1.2 新知识点——Filter 8.1.2.1 Filter 1. Filter的概念 Filter(过滤器)是在源数据和目的数据之间起过滤作用的中间组件。对Web应用来说, 过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和资源之间的请求与响应信息, 并对这些信息进行过滤。 当Web容器接收到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联,如果 有,那么容器将把请求交给过滤器处理。在过滤器中,你可以改变请求的内容,或者重新设 置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时,容器同 样会将响应先转发给过滤器。在过滤器中,还可以对响应的内容进行转换,然后再将响应发 送给客户端。 过滤器在Web开发中的一些主要应用如下: (1) 对用户请求进行统一认证; (2) 对用户的访问请求进行记录和审核; (3) 对用户发送的数据进行过滤或替换; (4) 转换图像格式; (5) 对响应内容进行压缩,减少传输量; (6) 对请求或响应进行加解密处理; (7) 触发资源访问事件。 2. 过滤器的实现 在javax.serlvet和javax.servlet.http包中提供了开发过滤器的相关API,其中过滤器 类要实现的接口是javax.servlet.Filter,该接口的具体使用方法见8.1.2.2节。 3. 过滤器的部署 在实现一个过滤器后,需要在部署描述文件web.xml中对过滤器进行配置,这是通过 <filter>和<filter-mapping>元素来完成的。

在<filter>元素内,<description>、<display-name>、<icon>元素与以往Servlet配置 中 的 相 同 。 <filter-name> 用 于 为 过 滤 器 指 定 一 个 名 字 , 该 元 素 的 内 容 不 能 为 空 。 <filter-class>元素用于指定过滤器的全限定类名。<init-param>元素用于为过滤器指定初 始化参数, 它的子元素<param-name>用于指定参数的名字, <param-value>用于指定参数的值。 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。 下面的程序8-5是<filter>元素的一个配置例子。 程序8- 5 <filter>元素配置例子 -------------------------------------------<filter> <filter-name>testFitler</filter-name> <filter-class>org.test.TestFiter</filter-class> <init-param> <param-name>word_file</param-name> <param-value>/WEB-INF/word.txt</param-value> </init-param> </filter> <filter-mapping>元素用于指定过滤器关联的url样式或Servlet。其中<filter-name>子 元 素 的 值 必 须 是 在 <filter> 元 素 中 声 明 过 的 过 滤 器 的 名 字 。 <url-pattern> 元 素 和 <servlet-name>元素可以选择其中一个;<url-pattern>元素指定过滤器关联的URL样式; <servlet-name>元素用于指定过滤器对应的Servlet。只有当用户访问<url-pattern>元素指 定的URL上的资源或<servlet-name>元素指定的Servlet时,该过滤器才会被容器调用。 <filter-mapping>元素还可以包含0~4个<dispatcher>,指定过滤器对应的请求方式,可以 是 REQUEST、INCLUDE、FORWARD和ERROR之一,默认为REQUEST。 REQUEST:当用户直接请求网页资源时,Web容器将会调用过滤器。如果目标资源是通过 Request Dispatcher的include或forward方法访问,那么该过滤器就不会被调用。 INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问,那么该过滤器 将被调用,反之,该过滤器不会被调用。 FORWARD:如果目标资源是通过RequestDispatcher的forward方法访问,那么该过滤器将 被调用,反之,该过滤器不会被调用。 ERROR:如果目标资源是通过声明式异常处理机制调用,那么该过滤器将被调用,反之, 过滤器不会被调用。 8.1.2.3 处理字符编码的过滤器 任务:编写一个处理中文乱码的过滤器,该过滤器能够将所有请求参数(包括get和post

方式提交的参数)的编码方式由“ISO-8859-1”改为“UTF-8”编码。 实现: 1. 根据Decorator(装修者)设计模式,对HttpServletRequest对象进行进一步装饰, 在 该 类 中 改 变 其 getParameter(String name) 方 法 的 行 为 特 性 。 即 : 自 定 义 一 个 MyServletRequest , 该 类 继 承 HttpServletRequestWrapper 包 装 类 。 2. 编 写 过 滤 器 类 Encoding,在该类的doFilter方法中,在使用FilterChain对象将请求传递至下一个过滤器或 调用目标资源前,将原request对象进行装饰。 8.1.3 扩展—— Servlet 3.0新特性 Servlet 3.0在Servlet 2.5版本的基础上提供了若干新特性用于简化Web应用的开发和部 署。其中有几项特性的引入获得了Java开发人员的赞誉: 1. 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才 能输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的 操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗 时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。 2. 新增的注解支持:Servlet 3.0新增了若干注解, 用于简化 Servlet、过滤器(Filter) 和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。 3.可插性支持:熟悉 Struts2 的开发者一定会对其通过插件的方式与包括 Spring 在内 的各种常用框架的整合特性记忆犹新。 将相应的插件封装成 JAR 包并放在类路径下, Struts2 运行时便能自动加载这些插件。现在 Servlet 3.0 提供了类似的特性,开发者可以通过插件 的方式很方便的扩充已有 Web 应用的功能,而不需要修改原有的应用。 下面对新增的注解支持@WebFilter作进一步的介绍: @WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体 的属性配置将相应的类部署为过滤器。该注解具有的一些常用属性(如表 8-1 所示),属性 均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值。 8.2 使用连接池优化数据库连接 8.2.1 任务描述与实现 编写一个数据库连接工具类,该类所提供的功能与第5章提供的DBManager的功能一致, 要求在其中使用数据库连接池来管理数据库连接,连接池使用Tomcat DBCP。 实现过程: 1.编写JNDI配置代码 8.2.2 新知识点——数据库连接池原理、Tomcat DBCP 8.2.2.1数据库连接池技术

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得 尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序 的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释 放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据 库连接遗漏。这项技术能明显提高对数据库操作的性能。 1.基本概念及原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入 一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后 再放回去。可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是 可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发、测试及性能 调整提供依据。 2.服务器自带的连接池 JDBC的API中没有提供连接池的方法。很多的WEB应用服务器都提供了连接池的机制,但 是必须由其第三方的专用类方法支持连接池的用法。 连接池关键问题分析: 1.并发问题 为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题 相对比较好解决,因为Java语言自身提供了对并发管理的支持,使用synchronized关键字即 可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如: public synchronized Connection getConnection() 2.多数据库服务器和多用户 对于大型的企业级应用,常常需要同时连接不同的数据库。如何连接不同的数据库呢? 采用的方法是,设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建 时读取一个资源文件,该资源文件中存放着多个数据库的url地址,用户名,密码等信息。根 据资源文件提供的信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接 池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。 对于同一个数据库有多个用户使用不同的名称和密码访问的情况,也可以通过资源文件 处理,即在资源文件中设置多个具有相同url地址,但具有不同用户名和密码的数据库连接信 息。3.事务处理 事务具有原子性,此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组 SQL语句要么全做,要么全不做。 在Java语言中,Connection类本身提供了对事务的支持,可以通过设置Connection的

AutoCommit属性为false,然后显式调用commit或rollback方法来实现。但要高效的进行 Connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现, 这种方法可以大大降低事务管理的复杂性。 4.连接池的分配与释放 连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接 的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。 8.2.3 扩展——Tomcat JDBC Connection Pool 本小节主要介绍Tomcat7.0的新功能。 1.Tomcat jdbc pool简介 Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做为连接池的实现,但是dbcp饱受 诟病,原因有: (1)dbcp 是单线程的,为了保证线程安全会锁整个连接池 (2)dbcp 性能不佳 (3)dbcp 太复杂,超过 60 个类 (4)dbcp 使用静态接口,在 JDK 1.6 编译有问题 (5)dbcp 发展滞后 因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecp, druid (@wenshao ) 等。为此,Tomcat 从 7.0 开始引入一个新的模块:Tomcat jdbc pool (1)tomcat jdbc pool 近乎兼容 dbcp ,性能更高 (2)异步方式获取连接 (3)tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的 日志框架 (4)使用 javax.sql.PooledConnection 接口获取连接 (5)支持高并发应用环境 (6)简单,核心文件只有8个,比c3p0少 (7)更好的空闲连接处理机制 (8)支持 JMX (9)支持 XA Connection tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在独立的应用中使用。 【课堂小结】 : 本章主要介绍了 Java web 中访问权限控制、数据库连接池技术等高级编程技术,通过实 现登录访问控制过滤器案例,介绍了访问权限控制过滤器的设计流程和 Filter,通过实现字 符过滤器案例,介绍了字符过滤器的设计思路和方法,通过实现连接池优化数据库连接案例,

介绍了数据库连接池原理及配置方法等。

课题: 第九章 Java web 常用实用组件 【教学目标】 【教学重点】 在线编辑器、注册时自动发送欢迎邮件、上传文件到服务器、上传图片自动生成缩略图、 上传图片增加水印 【教学方法】讲解 【教学地点】教学楼、综合楼 【课时安排】4 课时 【教学过程】 9.1 在JSP中使用在线编辑器 9.1.1 任务描述与实现 一般在进行信息在线编辑时,需要插入图片,进行文字排版等,使显示的时候以固定排 版格式显示,因此,需要在录入时,能够允许进行信息的在线样式编辑,如图9-1所示。

图9- 1 在线编辑器效果 在JSP中,可采用Ckeditor在线编辑器实现以上描述功能。 实现过程: 1 . 下 载 CKEditor 。 在 CKEditor 官 方 网 站 网 址 http://ckeditor.com/download 下 载 CKEditor for Java。 本例下载当前最新版本CKEditor for Java 3.6.2.war。 2. 将 ckeditor 文 件 夹 和 jar 复 制 到 指 定 位 置 。 下 载 后 解 压 , 将 CKEditor 的 ckeditor-java-core-3.5.3.jar复制到采用站点的WEB-INF/lib/目录下,ckeditor文件夹复

制到站点文件夹下。 3.编写调用表单文件。编写含有在线编辑器的表单,即在原先表单制作的基础上,增加 相应CKEditor的调用语句即可。程序9-1为实现了含有在线编辑器的一个表单页面。 9.1.2 CKEditor 1 Web在线编辑器简介在线编辑器是指用于在线编辑的工具,编辑的内容是基于HTML的文 档。Web在线编辑器可用于在线编辑HTML的文档,因此,它经常 需要用户输入普通HTML的地方。 1.CKEditor 免费、开源、用户量庞大的在线编辑器,有良好的社区支持。 CKEditor创建于2003年,起初为FCKeditor,2009年更名为CKEditor,是目前市场使用非 常广泛的一个在线编辑器。官方网站:http://ckeditor.com。 2.TinyMCE 这是免费、开源、轻量的在线编辑器,基于JavaScript,高度可定制、跨平台。 3.YUI Editor 这是Yahoo! YUI 的一部分,能输出纯净的Xhtml代码。 4.eWebEditor 这是国产商业化的编辑器,不免费,功能丰富。 5.Free Rich Text Editor 这是非常容易部署的在线编辑器,输出XHTML代码,功能丰富。 9.1.2.2 CKEditor常用标签及属性 1. <ckeditor:replace>标签 该标签用于设置在线编辑器替换表单元素,其常用属性有: replace:需要用编辑器替换的表单元素。 basePath:在线编辑器CKEditor的位置。 config:设置编辑器对象的属性,如设置宽度,高度。 如: <% CKEditorConfig settings = new CKEditorConfig(); settings.addConfigValue("width","500"); %> <ckeditor:replace replace="editor1" basePath="/ckeditor/" config="<%=settings %>" /> 表示设置一个编辑器,宽度为500px。

2. <ckeditor:editor>标签 该标签主要用来在表单页面创建在线编辑器,其常用属性有: basePath:在线编辑器CKEditor的位置。 editor:编辑器表单元素的名字。 value:表单元素的默认值。 textareaAttributes:编辑器的属性,其用java.util.Map设置键值对。如: <% Map<String, String> attr = new HashMap<String, String>(); attr.put("rows", "8"); attr.put("cols", "50"); %> 使用该标签创建在线编辑器的格式为: <ckeditor:editor textareaAttributes="<%=attr %>" basePath="/ckeditor/"

editor="editor1" value="<%=attr %>" /> 9.1.3 扩展1——修改信息时采用在线编辑器 在线信息修改时,需要将原有信息读取出来,显示在在线编辑器,再做调整,因此需要 使用在线编辑器时使用默认值。 采用<ckeditor:replace>标签时,只要将原表单元素设置默认值,则采用编辑器后,仍 然保持默认值,如对程序9-1,其原表单元素为: <textarea cols="80" id="ArtContent" name="ArtContent" rows="3"></textarea> 设置默认值: <textarea cols="80" id="ArtContent" name="ArtContent" rows="3">编辑器默 认值 </textarea> 采用<ckeditor:replace>标签替换后, 9.1.4 扩展2——简洁的在线编辑器 收集信息时,表单文本框个别情况不需要做太多编辑,只需简单的编辑,因此,编辑器 不需太复杂,所以采用简化的编辑器,CKEditor提供了的简化样式。 9.2 注册时自动发送欢迎邮件 9.2.1 任务描述与实现在网站注册成功后,会发送邮件到注册者邮箱,提示注册成功, 如图9-5所示,自动发送到编者注册信箱ljq816-2@yahoo.cn。 9.2.2 新知识点——JavaMail JavaMail API 是一个用于阅读、编写和发送电子消息的可选包(标准扩展),可以用来建 立标准的邮件客户端程序,它支持各种网络邮件协议。

1.SMTP SMTP (Simple Mail Transfer Protocol,简单邮件传输协议)由RFC 821定义。它定义了 发送电子邮件的机制。在JavaMail API环境中,基于JavaMail的程序将与您的公司或Internet 服务供应商的(Internet Service Provider’s,ISP’s)SMTP服务器通信。SMTP服务器会中 转消息给接收方SMTP服务器,以便最终让用户经由POP或IMAP获得。这不是要求SMTP服务器成 为开放的中继,而是要求尽管SMTP服务器支持身份验证,但还是要确保它的配置正确。像配 置服务器来中继消息或添加、删除邮件账号这类任务的实现,JavaMail API中并不支持。 2.POP POP(Post Office Protocol)代表邮局协议。 目前使用的是版本3, 因此也称POP3, 1939 RFC 定义了这个协议。POP 是一种机制,Internet上大多数人用它收发邮件,也规定每个用户支 持一个邮箱。虽然这是它所能做的,但也造成了许多混淆。使用POP时,用户熟悉的许多性能 并不是由POP协议支持的, 如查看新邮件消息这一性能。 这些性能内建于如Eudora或Microsoft Outlook之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是 新的。因此当使用JavaMail API 时,如果想要以上这些信息,就必须自己计算。 3.IMAP IMAP是更高级的用于接收消息的协议。在RFC 2060中被定义,IMAP代表Internet消息访 问协议(Internet Message Access Protocol),目前使用的是版本4,因此也称IMAP4。当使 用IMAP时,邮件服务器必须支持这个协议。不能仅把使用POP的程序用于IMAP,并期望它支持 IMAP所有性能。假设邮件服务器支持IMAP,基于JavaMail API的程序可以利用这种情况—— 用户在服务器上有多个文件夹(folder),并且这些文件夹可以被多个用户共享。 4.MIME MIME代表多用途Internet邮件扩展标准(Multipurpose Internet Mail Extensions)。它 不是邮件传输协议,但对传输内容的消息、附件及其他内容定义了格式。这里有许多不同的 有效文档,如RFC 822、RFC 2045、RFC 2046和RFC 2047。作为一个JavaMail API的用户,通 常不必对这些格式操心。无论如何,一定存在这些格式而且程序会用到它。 9.3 上传文件到服务器 9.3.1 任务描述与实现 9.3.1.1 使用commons FileUpload组件上传文件 实现一个简单的期末论文提交网页,要求论文提交页面有学号、姓名、论文题目的输入 框,以及一个上传文件的表单域,当用户填写内容并选择文件进行提交之后,将用户所上传 的文件重命名成“学号-姓名-论文题目.后缀名”的格式存储到服务器D盘的uploadPaper文 件夹下,并在响应页面向用户提示他所上传的文件名,以及上传后的新文件名。 实现:

1. 下 载 文 件 上 传 组 件 。 到 apache 官 网 http://commons.apache.org/fileupload/ 和 http://commons. apache.org/io/下载commons FileUpload组件以及commons io组件,本例 使用这两个组件目前的最新版本:commons-fileupload-1.2.2.jar和commons-io-2.3.jar。 2. 将上述jar包添加到项目的WebContent/WEB-INF/lib文件夹中。 3. 创 建 论 文 提 交 页 面 。 在 WebContent\ chapter9 文 件 夹 中 创 建 一 个 名 为 exam9_3_uploadPaper. jsp的JSP页面,该页面为文件上传表单页面,具体代码如程序9-7所 示,其中链接了一个外部css文件来简单调整页面布局,具体内容请参见随书光盘。 9.3.2 新知识点——上传组件及方法 目前,如邮箱附件、个性头像等等,绝大多数的Web应用中都涉及到了文件的上传功能。 自从RFC1867规范中要求HTML增加file类型的input标签后,只要简单地设置一个标签,浏览 器端就能很好地对文件上传功能进行支持;但在Web服务器端要获取并存储浏览器上传的文 件,需要较复杂的处理,所以一般会借助第三方组件来简单地实现文件的上传功能;此外, Servlet 3.0 也提供了这个功能,而且使用也非常简单,所以也可不借助额外的组件,而是 使用Servlet3.0提供的方式来 解决文件上传问题。 9.3.2.1 commons FileUpload组件 FileUpload是Apache commons项目的一个子项目,它实现了在JSP/Servlet中高效的文件 上传功能;而FileUpload还需要commons的另一个子项目IO进行支持,commons IO组件提供了 很多I/O工具。所以,要运用FileUpload组件实现文件上传功能需要下载这两个组件。 当客户端的文件上传请求到达服务器端后,就需要服务器获取文件内容并进行存储,这里当 然不需要我们处理具体的I/O流,我们只需要使用FileUpload组件提供的类来进行简单的较高 层处理即可。下面详细介绍FileUpload组件中常用的类和方法。 1. FileItem接口 FileUpload组件可以将multipart/form-data类型的request中的所有表单项,不管是文 件类型还是其它类型,都封装成FileItem对象。注意FileItem是个接口,它的具体实现类是 DiskFileItem,但我们不需要关心DiskFileItem的具体实现,我们直接采用FileItem接口类 型对DiskFileItem对象进行引用和访问即可。下面一一介绍FileItem接口常用的方法。 (1)public boolean isFormField() 该方法用于判断FileItem对象封装的数据是否属于一个普通表单域,如果是普通的文本 表单域则返回true,如果是属于一个文件表单域则返回false。 (2)public String getName() 该方法用于获取文件域的文件名,注意,如果数据包是通过windows系统下的浏览器提交 的,那么获取的文件名是带有上传文件在客户端的绝对路径的全文件名;如果是Linux或者

Unix提交,则不带路径,读者在使用时请注意测试。如果当前FileItem对象对应的不是文件 域,则返回null。 (3)public String getFieldName() 该方法用于获取该FileItem对象所对应的表单字段的name属性值,即HTML中<input>标签 的name属性值。 (4)public void write(File file) 该方法用于将FileItem对象中保存的主体内容保存到参数file所指定的文件中。普通表 单字段的内容也可以用此方法写到文件中。 (5)public String getString([String encoding]) 该方法将FileItem对象中的主体内容作为一个字符串返回。其中的参数encoding可选, 可以指定一个字符编码方式。当没有参数时,该方法使用缺省的字符编码进行字符串转换, 有参数的话就使用参数指定的编码方式进行转换。注意:如果encoding参数所指定的编码方 式不存在或当前系统不支持的话,会抛出java.io.UnsupportedEncodingException。指定编 码方式可以防止中文乱码现象的出现。 (6)public String getContentType() 此方法用于获取上传文件的类型,如“application/msword”、“image/jpeg”等。如 果FileItem对象对应的是普通表单字段,则返回null。 (7)public long getSize() 此方法能获取上传文件的大小(以字节为单位)。 (8)public boolean isInMemory() 此方法用于判断FileItem对象封装的主体内容是存储在内存中,还是在临时文件中,如 果在内存中则返回true,否则返回false。 (9)public void delete() 此方法用来清空FileItem的主体内容,如果它存在临时文件中,该方法将删除该临时文 件。 尽管FileItem对象被垃圾回收器回收时会自动清除临时文件, 但建议最好在调用完write() 方法之后就及时调用delete()方法清除临时文件,及时释放系统资源。 2. DiskFileItemFactory 类 DiskFileItemFactory类就是将request中的每一个表单项封装成一个FileItem对象的工 厂,它实现的接口是FileItemFactory。此类封装FileItem对象时,如果上传的文件大小小于 规定临界值时,则直接将文件内容保存在内存中;如果文件size大于规定值时,则将文件存 储在临时文件夹中。下面一一介绍这个类的重要属性和方法。 9.3.3 扩展——下载 任务:实现文件下载功能。当用户点击下载页面的文件下载按钮或链接时,能弹出文件

下载对话框,用户能够将服务器上的相关文件下载到客户机上。 实现: 1. 创建文件下载页面exam9_3_downloadFile.jsp,该页面提供“2011010201-张三-浅谈 Spring的IoC机制.docx”这个文件的下载按钮。当点击该按钮提交表单时,下载任务交由 “/JavaWebExample/ servlet/downloadFile”这个Servlet来处理。 9.4 上传图片自动生成缩略图 9.4.1 任务描述与实现 任务: 完成一个上传图片并自动生成缩略图的功能。 当用户在图片上传页面上传JPG/JPEG 格式的图片时,能够正确将用户上传的图片以“当前时间的毫秒数_100以内随机数”重命名 后 存 储 到 服 务 器 “D:\uploadImg” 目 录 下 , 并 生 成 该 图 片 的 缩 略 图 存 储 到 “D:\uploadImg\small” 目录下,然后在响应页面打印出用户所上传的图片的名称、大小、 缩略图以及原始图。 9.4.2 新知识点——缩略图原理 生成缩略图的方式有许多种,可以按如下思路使用Java 提供的强大的图形处理类来生成 一个图片的缩略图: 1. 使用javax.imageio.ImageIO类的静态方法BufferedImage read(File input)从磁盘 文件中将图片读取到内存中,存储在一个java.awt.image. BufferedImage对象中; 2. 构建一个仿射变换对象java.awt.geom.AffineTransform。然后确定目标图片与原图 片 的 宽 度 比 例 以 及 高 度 比 例 , 依 据 这 两 维 的 缩 放 比 例 调 用 AffineTransform 的 setToScale(float,float)方法将此变换设置为缩放变换。 3. 根据上面的仿射变换对象构造出一个java.awt.image.AffineTransformOp对象,该对 象能够使用仿射转换来执行从源图像到目标图像的线性映射。具体使用的方法是 filter(BufferedImage src, BufferedImage dst),此方法将转换源 BufferedImage 并将结 果存储在目标 BufferedImage 中。 4. 使用 ImageIO 类的 write 方法将转换好的目标 BufferedImage 以一定的图片类型写到 磁盘文件上。 9.4.3 扩展——图片增加水印任务:给用户上传的图片添加水印。当用户在图片上传页 面填写用户名并从客户端选择文件提交上传请求后,服务器能够将用户上传的图片存储到服 务器的特定路径下,并能够将用户名以水印的形式标记到图片上,存储该水印图片并打印到 响应页面。 【课堂小结】 : 本章介绍了几种在 Java Web 开发中常用的组件,包括使用 CKEditor 向 JSP 页面中添加 在线编辑器、使用 JavaMail 发送邮件以及使用 commons FileUpload 实现文件上传功能等,

也介绍了使用 Servlet 3.0 提供的接口来完成文件上传工作的方法,同时向读者展示了文件 下载的实现以及使用 Java 的图形工具实现缩略图的生成、向图片添加水印等方法。

课题: 第十章 综合实例——文章管理系统 【教学目标】 【教学重点】 【教学方法】讲解、讨论 【教学地点】教学楼 、综合楼 【课时安排】4 课时 【教学过程】 10.1 系统分析和设计 10.1.1 文章管理系统简要需求文章管理系统具有完备的文章发布审核体系,管理人员可 以灵活地对文章进行管理,主要有如下功能: 10.1.1.1 管理员管理 管理人员在系统中按级别构成审核发布体系。本例中,分为发布管理员、审核管理员和 超级管理员3个级别。 超级管理员可以对其他两个身份的人员进行管理,管理功能有添加管理员、禁用管理员 和修改管理员密码。 10.1.1.2 文章分类管理 本例中文章有两级分类,即一级分类和二级分类,两级分类有级联关系,各级分类等够 在线添加、修改和删除。 10.1.1.3 文章管理 文章管理模块为文章管理系统的主要部分,文章管理主要包括文章的添加、修改、审核、 删除和恢复等功能。 在文章管理上,各个级别权限的管理人员的区别为:发布人可以添加、修改文章(文章一 旦被审核后,不能修改;不能修改别人的文章)。审核管理员和超级管理员可以添加、审核、 修改、删除和恢复文章。 文章设置关键字,关键字以逗号分隔。 文章标题颜色可选,默认为黑色。 文章可进行置顶管理。 文章可以在线编辑,需要有在线编辑器,有文件上传功能,图片编辑功能等。 文章可以根据主题查找,给定关键字后,实现模糊查找。 文章管理以列表呈现,列表以二级分类进行分类检索显示;可单独列出待审核文章。 建立回收站,已经删除的文章可在回收站中恢复。 10.1.1.4 文章显示及调用功能 文章管理系统设计为适用于网站群的管理系统,每个子站可以独立调用所属子站的文章,

并且可以建立自己部门的模板,实现文章与本部门网站风格的一致性。 10.1.1.5 日志功能 日志功能记录文章管理系统的操作日志,主要包括记录登录、添加文章、编辑文章、审 核文章、删除文章、恢复文章等相关操作的时间、事件、操作人等信息。 日志列表可分类显示,显示“登录日志”,“文章管理日志”。 日志能以日期区间查询,列出指定时间范围内的操作记录。 10.1.2 系统体系设计 文章管理系统采用 JSP+Servlet+JavaBean+Ajax 来实现,系统设计由 JSP 完成页面显示, Servlet 完成事务处理,如添加、修改、删除、恢复等操作,JavaBean 完成数据库交互,Ajax 完成数据异步通信,即所有功能操作,通过在页面提交 Ajax 异步请求,接收到响应后在当前 页面显示。 10.2 数据库设计 10.2.1 E-R图 根据前文10.1节对文章管理系统的需求的分析,设计符合该系统需求的数据库,设计出 的该数据库E-R图如图10-2所示。文章管理系统文章表结构说明如表10-1所示。其他表结构说 明此处略,在建立表结构的SQL语句中有注释说明。 本系统选用的数据库为MySQL。 10.2.3 建立视图 建立视图,可以提高显示列表和详细内容时检索效率以及减少检索次数。所以本系统将 建立4个视图,主要程序见10-2。 10.3 用户身份认证模块功能实现 10.3.1 身份认证模块系统结构 用户身份认证模块主要完成文章管理系统的身份校验和权限认定功能,包括用户登录、 权限控制过滤器、注销三个子模块,登录模块主要校验用户身份是否正常,权限控制过滤器 完成会话有效性判断,即在操作文章管理过程中,确保会话有效,当无效时,自动提示错误 并跳转到登录页面要求重新登录,注销完成会话清理,三个子模块关系图如图10-4所示,系 统结构图如图10-5所示。 10.3.2 管理员类文章管理系统根据给定需求,设计管理员身份类主要结构如图10-6所 示,源码见程序10-3。 10.3.3 登录模块实现根据前文分析,登录模块主要由登录表单、Ajax异步调度程序、 Servlet检索数据库校验程序构成,表单代码见程序10-4,Ajax调度代码见程序10-5,Servlet 登录校验代码见程序10-6。 10.4 文章管理模块功能实现

10.4.1 文章管理模块系统结构文章管理模块主要功能有文章的添加、修改、删除、审核、 恢复等。其实现采用Ajax+JSP+Servlet+ JavaBean系统结构开发,根据10.1.2分析结构,文 章管理模块的系统程序结构及方法调用流程如图10-14所示, 每个流程分为五个步骤。 1-1~1-5 为添加文章的流程方法,2-1~2-5为编辑文章的流程方法,3-1~3-5为审核文章的流程方法, 4-1~4-5为删除文章的流程方法。 10.4.5 文章审核、删除、还原模块实现 10.4.5.1 文章审核时显示文章详细信息页面 审核文章模块。在主界面即全部文章列表页上,没通过审核的文章在操作栏显示审核按 钮,通过审核的文章显示“已审核”;此外,在主界面可以单击“待审核文章”链接,列出 所有没有审核的文章列表,在列表上单击审核时,显示文章详细信息页代码见程序10-16。 【教学小结】 本章根据Web系统开发的流程,介绍了文章管理系统的设计与开发。在系统实现中采用 Ajax+Servlet+JavaBean的模式开发程序,遵循MVC模式设计系统,主要包括系统体系结构设 计、数据库设计、主要模块代码设计与实现等。 通过本章的理解,读者可以将本文章管理系统完整的系统进行改编后应用到实际的开发 程序中。


搜索更多“《Java web程序设计》教案”

网站地图

All rights reserved Powered by 伤城文章网 5xts.com

copyright ©right 2010-2021。
伤城文章网内容来自网络,如有侵犯请联系客服。zhit325@126.com