Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Jsp讲义

1,292 views

Published on

  • Be the first to comment

  • Be the first to like this

Jsp讲义

  1. 1. JSP 讲义 <ul><li>JSP 技术概述 </li></ul><ul><li>JSP 的运行环境 </li></ul><ul><li>JSP 的核心技术 </li></ul><ul><li>JSP 的组件技术 </li></ul><ul><li>JSP 的数据库技术 </li></ul><ul><li>Servlet 技术 </li></ul>
  2. 2. <ul><li>为何要学习 Jsp </li></ul><ul><li>JSP 的工作 原理 </li></ul><ul><li>JSP 的页面 形态 </li></ul><ul><li>学好 JSP 的综合 要素 </li></ul>JSP 技术概述
  3. 3. Jsp 技术 概述 : 网页技术的演变 <ul><li>网页技术经历的四个阶段 </li></ul><ul><li>Html - >CGI - >PHP 、 ASP - >JSP </li></ul><ul><ul><li>静态网页和 动态 网页 </li></ul></ul><ul><ul><li>网页内容的自动更新功能及与用户的交互功能 </li></ul></ul><ul><ul><li>数据库技术的产生 </li></ul></ul><ul><li>JSP 介绍 </li></ul><ul><li>动态网页技术的 比较 </li></ul>
  4. 4. 动态网页技术 <ul><li>HTML 只有静态页面显示功能 </li></ul><ul><li>CGI (公共网关接口)早期的动态网页技术 </li></ul><ul><ul><li>实现 web 应用程序由静态到动态的变革 </li></ul></ul><ul><ul><li>可用不同的语言编写 , 脚本程序处理客户请求并做出响应 ,编程难,效率低,修改复杂 </li></ul></ul><ul><li>微软的 ASP </li></ul><ul><ul><li>VB 简单易学 , 安装方便 (IIS), 对机器要求不高 </li></ul></ul><ul><ul><li>传统的即时编译,效率低,安全性、稳定性差 , 仅限于 windows 系列的操作平台 </li></ul></ul>
  5. 5. 动态网页技术 <ul><li>PHP </li></ul><ul><ul><li>简单易学 , 可跨平台 , 安全性好 </li></ul></ul><ul><ul><li>安装复杂 , 没有组件支持 , 缺少配套软件 </li></ul></ul><ul><li>SUN 公司的 JSP </li></ul><ul><li>ASP 、 JSP 的共同点 </li></ul><ul><ul><li>都是 HTML 内嵌式语言 , 内嵌不同的脚本代码 </li></ul></ul><ul><ul><li>脚本程序在服务器端运行 </li></ul></ul><ul><ul><li>将生成的 HTML 页面返回给客户端 </li></ul></ul>
  6. 6. Jsp 技术 概述 : 动态网页技术的比较 较差 较好 好 扩展性 Windows 和 unix windows 绝大部分 运行平台 简单 简单 容易掌握 难易程度 较大 较大 较小 运行耗损 较快 较快 快 运行速度 php asp jsp
  7. 7. 动态网页技术的比较 较广 较广 较广 应用程度 不支持 支持 支持 对组件的支持 支持 不支持 支持 对 xml 的支持 较多 较少 多 厂商支持 多 多 多 数据库支持 多 较少 多 函数支持 好 较差 好 安全性 php asp jsp
  8. 8. Jsp 技术 概述 : Jsp 特点 <ul><li>可将页面的显示和页面的逻辑相分离 </li></ul><ul><ul><li>用 Html 或 xml 标识设计页面 </li></ul></ul><ul><ul><li>用 jsp 标识或 java 脚本程序生成动态内容,并封装在 JavaBean 中 </li></ul></ul><ul><li>生成可复用的组件(效率高 ) </li></ul><ul><ul><li>将复杂的或常用的功能封装在组件中 </li></ul></ul><ul><ul><li>可数据共享,加速开发过程 </li></ul></ul><ul><li>采用标识简化页面的开发 </li></ul><ul><li>一次编写,随处运行 (代码的可移植性) </li></ul><ul><li>一次编译,一直运行 (代码执行效率高) </li></ul>
  9. 9. JSP 特点 <ul><li>支持绝大部分平台 (可跨平台操作) </li></ul><ul><ul><li>JSP 独特的运行方式决定 </li></ul></ul><ul><ul><li>编译后生成的不是特定机器的可执行码,而是独立于处理器结构的字节代码。 </li></ul></ul><ul><li>JSP 通过 JAVA 可以访问几乎所有的数据库 </li></ul><ul><ul><li>因为 Java 连接数据库技术是 JDBC 和 JDBC- ODBC 桥。 </li></ul></ul>
  10. 10. Jsp 技术 概述 :为何使用 Jsp 小结 <ul><li>随着 internet 的发展,动态 Web 页面被广泛使用 </li></ul><ul><li>Jsp 是由 servlet 发展起来的,所以具有 servlet 所具有的强大功能,又因为 JSP 在编写上简单,又不需要手工编译,所以被广泛使用。 </li></ul><ul><li>Jsp 是基于 Java 语言的,所以具有 Java 语言所具有的强大功能,如它的跨平台可操作性,安全性,快速性,以及在网络数据库应用上的优势。 </li></ul><ul><li>B/S 模式比 C/S 模式简单,且更容易维护,被更加广泛的使用。 </li></ul>
  11. 11. JSP 的工作原理 <ul><li>执行 HTML 页面请求,输入 URL 地址 ( http://www.netmen9.com/index.html ) </li></ul>客户端 (IE) Web 服务器 http 请求 http 响应 index.html login … .
  12. 12. JSP 的工作原理 <ul><li>HTML 工作原理 </li></ul><ul><li>http://www.netmen9.com/index.html </li></ul><ul><li>客户通过 web 浏览器向 web 服务器发送一个 Http 请求,即通过 http 协议向运行在域名为 netmen9.com 主机名为 www 的 web 服务器发送一个对 index.html 内容的请求,主机 web 服务器响应后,取出 index.html 文档发送到客户机,然后客户机把文档显示在用户界面上。 </li></ul>
  13. 13. JSP 工作原理图 <ul><li>执行 JSP 页面请求 , 输入 URL 地址 http://www.netmen9.com/index.jsp </li></ul>
  14. 14. Jsp 技术 概述 : JSP 的工作原理 <ul><li>JSP 工作原理 http://www.netmen9.com/index.jsp </li></ul><ul><li>客户端通过 web 浏览器向 web 服务器发送一个 Http 请求, web 服务器判断后 (.jsp 扩展名 ), 由 JSP 引擎把 JSP 页面转换成中间代码 (.java) , JSP 引擎再调用服务器端的 Java 编译器对中间代码 (servlet) 进行编译,将中间代码变成字节代码 (.class), 再由 Java 虚拟机执行此字节代码,最后将结果以 html 页面的形式返回给客户端 。 </li></ul>
  15. 15. Jsp 技术 概述 : JSP 的页面形态 <ul><li>它的页面结构很类似于 Microsoft 公司推出的 ASP 。 传统的 HTML 文件中加入 JAVA 代码片断, JAVA 代码内嵌在 “ <% %>” 标记符中 </li></ul><ul><li>页面组成 </li></ul><ul><li>HTML 标识符 </li></ul><ul><li>JSP 指令标识符 </li></ul><ul><li><% java 代码片断 %> </li></ul>
  16. 16. <ul><li><% @ page language=“java” %> </li></ul><ul><li><html> </li></ul><ul><li><head> </li></ul><ul><li><title> 标题 </title> </li></ul><ul><li></head> </li></ul><ul><li><body> </li></ul><ul><li><% =“ hello world”%> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>Jsp 技术 概述 : JSP 的页面形态
  17. 17. JSP 的页面形态及位置 <ul><li><%@ page language=java %> </li></ul><ul><li><html> </li></ul><ul><li><head> </li></ul><ul><li><title> 标题 </title> </li></ul><ul><li><script> JavaScript 代码 </script> </li></ul><ul><li></head> </li></ul><ul><li><body> </li></ul><ul><li><% Java 代码片断 %> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>
  18. 18. Jsp 技术 概述 : 学好 JSP 的综合要素 <ul><li>掌握 HTML 语言 : 可轻松建立 JSP 的表示页面。 </li></ul><ul><li>熟悉 Java 语言 : 特别是正确使用 Java 的类、接口和方法,可简单实现应用程序的功能 , 使得静态页面动态化,轻松连接数据库。 </li></ul><ul><li>掌握 JavaScript: 可控制浏览器及其页面资料 , 检查用户提交的窗体内容,使页面更规范更生动。 </li></ul><ul><li>掌握 Dreamweaver 页面排版软件 : 创建 显示页面更方便、更快捷。 </li></ul>
  19. 19. 学好 JSP 的综合要素 <ul><li>掌握 taglib 标签技术 </li></ul><ul><li>了解 MVC 设计模式 </li></ul><ul><li>掌握 Struts 框架技术 </li></ul><ul><li>掌握 JBuilder 集成开发工具 </li></ul>
  20. 20. JSP 的运行环境 <ul><li>JAVA 运行环境如:包含 JAVA 编译器、 JAVA 虚拟机、 JDBC-ODBC 桥、 Java 类库等。 </li></ul><ul><li>jdk1.4.1 </li></ul><ul><li>JSP 服务器: </li></ul><ul><li>用于转换 JSP 页面并充当 web 服务器的功能 </li></ul><ul><li>如: jswdk 、 tomcat 、 resin 、 WebLogic </li></ul><ul><li>安装 Jdbc 驱动程序:用于连接数据库 </li></ul><ul><li>JSP 开发编辑工具: </li></ul><ul><li>UltraEdit 、 HomeSet 、 EditPlus 等 </li></ul><ul><li>JBuilder ( 集成开发工具 ) </li></ul><ul><li>安装和配置数据库如: Access 、 SQLServer 、 Oracle 、 Sybase 、 MySQL </li></ul>
  21. 21. 运行 Web 应用程序要点 <ul><li>设置环境 变量 : 为了能在任何目录下被访问。 </li></ul><ul><li>协议必须是 Http 协议: 因为它是 web 服务器支持的协议。 </li></ul><ul><li>缺省端口号 : 8080 (可更改 server.xml 文件) </li></ul><ul><li>缺省主机名 : localhost 或 127.0.0.1 </li></ul><ul><li>默认页面地址 : </li></ul><ul><li>index.jsp 、 index.html 、 index.htm ( 可更改 web.xml 配置文件 ) </li></ul>
  22. 22. 设置运行 JSP 的环境变量 <ul><li>开始-设置-控制面板-系统-高级-环境变量 </li></ul><ul><li>JAVA_HOME: 表示 java 安装的目录 ( 新建或添加 ) </li></ul><ul><li>CLASSPATH: 指向 java 类库(新建或添加 ) </li></ul><ul><li>PATH: 指向可执行程序的路径 ( 添加 ) </li></ul><ul><li>例如下面的设置 : </li></ul><ul><li>JAVA_HOME: C:jdk1.4.1 </li></ul><ul><li>CATALINA_HOME:Cjakarta-tomcat-5.0.27 </li></ul><ul><li>CLASSPATH: C:jdk1.3lib ools.jar;C:jdk1.3libdt.jar;. </li></ul><ul><li>PATH: C:jdk1.3in;. </li></ul>
  23. 23. Jsp 在 tomcat 上的运行环境 Jakarta-tomcat5.0.27 conf 目录下 web.xml ( 系统配置文件 ) Jakarta-tomcat5.0.27 conf 目录下 server.xml ( 系统配置文件 ) httpd : //localhost : 8080 测试 (IE 浏览器 ) omcat5.0/bin shutdown.bat 关闭 服务器 omcat5.0/bin startup.bat 启动服务器 系统默认路径 Windows 2000 OS tomcat Webserver
  24. 24. Jakarta-tomcat5.0.27 webappsROOT 的子目录下 应用程序 .jsp.js .css.html 等程序 Jakarta-tomcat5.0.27 webappsROOTWEB-INF classes 的子目录 ( 包名 ) 下 JavaBean 或 servlet 编译后生成的 .class 文件 Jakarta-tomcat5.0.27 webappsROOTWEB-INF 应用配置文件 web.xml 系统默认位置 重要文件
  25. 25. 开发第一个 jsp 程序 <ul><li><html> </li></ul><ul><li><head> </li></ul><ul><li><title> 第一个 JSP 程序 </title> </li></ul><ul><li></head> </li></ul><ul><li><body> </li></ul><ul><li><font face = &quot; 宋体 &quot;><font size=&quot;+2&quot;> </li></ul><ul><li><center> </li></ul><ul><li>Hello World ! </li></ul><ul><li><p> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>
  26. 26. 开发第一个 jsp 程序 <ul><li><% ! String Greeting;%> </li></ul><ul><li><%Greeting=&quot;Hello World !!&quot; ; %> </li></ul><ul><li><% = Greeting%> </li></ul><ul><li><p> </li></ul><ul><li><% </li></ul><ul><li>String Greeting3=&quot;world !!!&quot;; </li></ul><ul><li>out.println(&quot;hello,&quot;+ Greeting3); </li></ul><ul><li>%> </li></ul><ul><li><p> </li></ul><ul><li><%!String Greeting1=&quot; 你好,世界 !!!!&quot;;%> </li></ul><ul><li><%=Greeting1%> </li></ul><ul><li><p> </li></ul><ul><li><%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=gb2312&quot;%> </li></ul>
  27. 27. 开发第一个 jsp 程序 <ul><li><!— 注释 --> </li></ul><ul><li><!-- Today is <%= new java.util.Date().toLocaleString() %> --> </li></ul><ul><li><%-- This comment will not be visible --%> </li></ul>
  28. 28. Jsp 核心技术 <ul><li>Jsp 脚本元素及实例 </li></ul><ul><li>Jsp 指令元素及实例 </li></ul><ul><li>Jsp 动作元素及实例 </li></ul><ul><li>Jsp 内置对象及实例 </li></ul>
  29. 29. 事件举例 <ul><li>Submit 提交按钮激活 onsubmit() 事件 </li></ul><ul><li>Button 按钮激活 onclick() 事件 </li></ul><ul><li><form action=&quot;User_List.jsp&quot; name=form1 id=form1 onsubmit=&quot;return confirm(' 您确定要删除吗? ')&quot; > </li></ul><ul><li><a href=&quot;http://www.sina.com.cn&quot; </li></ul><ul><ul><li>onMouseOver=&quot;StatusMsg(' 中国最全的新闻网站 '); </li></ul></ul><ul><ul><li>return document.returnValue&quot;> 新浪网 </a> </li></ul></ul><ul><li><input type=&quot;button&quot; id=&quot;reset&quot; name=&quot;reset&quot; value=&quot; 返回 &quot; onclick=&quot;javascript:history.go(-1)&quot; > </li></ul>
  30. 30. Jsp 核心 技术 : Jsp 脚本元素及实例 <ul><li>“ 通常的 HTML”+“ <% 程序段 %>”==“JSP” </li></ul><ul><li>扩展名为 .jsp </li></ul><ul><li>JSP 有下面所示的几种形式。 </li></ul><ul><li>1 、 注释 : <%-- 注解 --%> </li></ul><ul><li>2 、 声明 : <%! 声明 %> </li></ul><ul><li>3 、 表达式 : <%= 表达式 %> </li></ul><ul><li>4 、 程序段 : <% 程序代码段 %> </li></ul>
  31. 31. Jsp 核心 技术 : 注释 :<%-- 注解语 --%> 写在 JSP 程序中,但不会显示在客户的 HTML 源代码中 <%-- comment --%> <% // 单行注释 /** */ 多行注释 %> 隐 藏 注 释 写在 JSP 程序中,并显示在客户端 HTML 源代码中 <!-- comment --> <!-- comment [ <%= expression %> ]--> 显 示 注 释 描述 JSP 语法
  32. 32. Jsp 核心 技术 : 注释实例 <ul><li>实例 </li></ul><ul><li><!-- 此页面 <%=new java.util.Date()% > 被读取 --> </li></ul><ul><li><!-- Today is <%= new java.util.Date().toLocaleString() %> --> </li></ul><ul><li><%-- Today is <%= new java.util.Date().toLocaleString() %> --%> </li></ul><ul><li><%-- This comment will not be visible --%> </li></ul>
  33. 33. Jsp 核心 技术 : 声明: <%! 声明 %> <ul><li>声明你将要在 JSP 中用到的类、变量、方法等如下面所示: </li></ul><ul><li><!-- 声明的同时可赋初值 --> </li></ul><ul><li><HTML> </li></ul><ul><li>…… </li></ul><ul><li><%! int i = 0 ; %> </li></ul><ul><li><%! int a, b, c ; %> </li></ul><ul><li><%! String a =“hello” ; %> </li></ul><ul><li>…… </li></ul><ul><li></HTML> </li></ul>
  34. 34. Jsp 核心 技术 : 表达式 :<%= 表达式 %> <ul><li>JSP 表达式是一个值, 在运行后被自动转化为字符串 ,然后插入到这个表达式在 JSP 程序中所在的位置中。因这个表达式的值已被转化为字符串,所以 有输出显示 在屏幕上 </li></ul><ul><li><%int a=10,b=20; %> </li></ul><ul><li><br>a+b = <%=a+b%> </li></ul><ul><li><br>a*b= <%=a*b%> </li></ul>
  35. 35. Jsp 核心 技术 : 程序段 :<% 代码片段 %> <ul><li><!-- 使用表达式和代码片段,从大到小显示字符串“ Hello”--> </li></ul><ul><li><h2> 嵌入 JSP 脚本 </h2> </li></ul><ul><li><% </li></ul><ul><li>for (int i=1; i<=6; i++) { //java 代码 </li></ul><ul><li>%> </li></ul><ul><li><H <%= i %> >Hello</H <%= i %> > </li></ul><ul><li><% } %> </li></ul>
  36. 36. Jsp 核心 技术 : 程序段 : <% 代码片段 %> <ul><li><!-- 使用表达式和代码片段,从小到大显示字符串“ Hello”--> </li></ul><ul><li><% for(int i=6;i>0;i--) </li></ul><ul><li>{ </li></ul><ul><li>out.print( &quot; <h &quot; + i + &quot;>Hello </h&quot; + i + &quot; > &quot; ); </li></ul><ul><li>} </li></ul><ul><li>%> </li></ul>
  37. 37. Jsp 核心 技术 : Jsp 指令元素及实例 <ul><li>页面 page 指令 : 定义 JSP 文件的全局属性 </li></ul><ul><li>Include 指令 : 它的执行结果就是将它包含的文件插入到 JSP 文件中放置 include 指令的地方 , 包含文件执行完毕后 , 继续执行主 jsp 文件的下一行 ( 和主文件一起编译 , 一旦改变 , 需重新编译主文件 ) </li></ul><ul><li>taglib 指令 : 自定义标签 , 编写标签库配置文件 </li></ul><ul><li>格式如下 : </li></ul><ul><li><% @ page attribute=value attribute-list ……%> </li></ul>
  38. 38. Jsp 核心 技术 : 页面 page 指令的属性 language=&quot;java&quot; extends=&quot;package.class&quot; import =&quot;{package.class | package.*}, ...&quot; session=&quot; true | false&quot; buffer=&quot;none | 8kb | sizekb&quot; autoFlush=&quot; true | false&quot; ] isThreadSafe=&quot; true | false&quot; info=&quot;text&quot; ] errorPage =&quot;relativeURL&quot; contentType =&quot;mimeType [ ;charset=characterSet ]&quot; | &quot;text/html ; charset=ISO-8859-1 &quot; isErrorPage =&quot;true | false &quot;
  39. 39. Jsp 核心 技术 : 页面 page 指令的实例 <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; import=“java.util.*,java.sql.*” errorPage=“error.jsp”%> </li></ul>
  40. 40. Jsp 核心 技术 : include 指令实例 <ul><li>格式 <%@ include file= &quot; filename&quot; %> </li></ul><ul><li>Include 指令的使用 </li></ul><ul><li><%@ page contentType=&quot;text/html;charset=gb2312&quot;%> </li></ul><ul><li><%@ include file=“header.jsp&quot; %> </li></ul><ul><li><%@ include file=“side.jsp&quot; %> </li></ul><ul><li><%@ include file=“footer.jsp&quot; %> </li></ul>
  41. 41. Jsp 核心 技术 : include 指令分区实例 尾部 :footer.jsp 版本声明等 页面主体 :body.jsp 功能区 side.jsp 菜单 LOGO 头部 :header.jsp
  42. 42. Jsp 核心 技术 : Jsp 动作元素及实例 <ul><li><jsp:param> 可传递一个或多个参数 , 一般和其它动作 include 或 forward 共用 </li></ul><ul><li><jsp:include> </li></ul><ul><li><jsp:forward> </li></ul><ul><li>格式如下 : </li></ul><ul><li><prefix:tag attribute=value attribute-list…/> </li></ul><ul><li><jsp:param name=“ 参数名” value=“ 参数值” /> </li></ul>
  43. 43. Jsp 核心 技术 : include 动作实例 <ul><li><jsp:include page=&quot;login.jsp&quot; flush=&quot;true&quot; /> </li></ul><ul><li><jsp:include page=&quot;login.jsp&quot; flush=&quot;true&quot; > </li></ul><ul><li><jsp:param name=“username” value=“ 张三 &quot; /> </li></ul><ul><li></jsp:include> </li></ul><ul><li>和 include 指令不同之处 , 包含的内容可以是动态 </li></ul><ul><li>的 , 在执行时才确定 , 比 include 指令运行效率低 </li></ul>
  44. 44. Jsp 核心 技术 : forward 动作实例 <ul><li>作用 : 把当前页面重定向到另一个页面上 </li></ul><ul><li><jsp:forward page=&quot;http://www.sina.com.cn &quot; /> </li></ul><ul><li><jsp:forward page=&quot;login.jsp&quot;> </li></ul><ul><li><jsp:param name=&quot;userId&quot; value=“001&quot; /> </li></ul><ul><li><jsp:param name=“pasd&quot; value=“xxx&quot; /> </li></ul><ul><li></jsp:forward> </li></ul>
  45. 45. Include 动作实例( static.html ) <ul><li><html> </li></ul><ul><li><body> </li></ul><ul><li><form method=post action=&quot;jsp_include.jsp&quot;> </li></ul><ul><li><table> </li></ul><ul><li><tr><td>please input your name:</td></tr> </li></ul><ul><li><tr><td><input type=text name=name></td></tr> </li></ul><ul><li><tr><td>input you password:</td><td> </li></ul><ul><li><input type=text name=password></td></tr> </li></ul><ul><li><tr><td><input type=submit value=login></td></tr> </li></ul><ul><li></table> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>
  46. 46. two.jsp <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; language=&quot;java&quot; %> </li></ul><ul><li>举例说明 include 的工作原理: </li></ul><ul><li><br> </li></ul><ul><li>this is a1=<%=request.getParameter(&quot;a1&quot;)%> </li></ul><ul><li><br> </li></ul><ul><li>this is a2=<%=request.getParameter(&quot;a2&quot;)%> </li></ul><ul><li><br> </li></ul><ul><li><% out.println(&quot;hello from two.jsp&quot;);%> </li></ul>
  47. 47. Jsp_include.jsp <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; language=&quot;java&quot; %> </li></ul><ul><li><html><body> </li></ul><ul><li><%@ include file=&quot;static.html&quot; %> </li></ul><ul><li><a href=&quot;two.jsp&quot;>goto two--></a><br> </li></ul><ul><li>this examples show include works </li></ul><ul><li><jsp:include page=&quot;two.jsp&quot; flush=&quot;true&quot;> </li></ul><ul><li><jsp:param name=&quot;a1&quot; value=&quot;<%=request.getParameter(&quot;name&quot;)%>&quot; /> </li></ul><ul><li><jsp:param name=&quot;a2&quot; value=&quot;<%=request.getParameter(&quot;password&quot;)%>&quot; /> </li></ul><ul><li></jsp:include> </li></ul><ul><li></body></html> </li></ul>
  48. 48. forward 动作实例 (login.jsp) <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; %> </li></ul><ul><li><html><body> </li></ul><ul><li><form method=get action=checklogin.jsp> </li></ul><ul><li><table> </li></ul><ul><li><tr><td> 输入用户名: </td> </li></ul><ul><li><td><input type=text name=name value=<%=request.getParameter(&quot;name&quot;)%>></td></tr> </li></ul><ul><li><tr><td> 输入密码: </td> </li></ul><ul><li><td><input type=password name=password></td></tr> </li></ul><ul><li><tr colspan=2><td><input type=submit value=login></td></tr> </li></ul><ul><li></table></body></html> </li></ul>
  49. 49. checklogin.jsp <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; %> </li></ul><ul><li><html><body> </li></ul><ul><li><% </li></ul><ul><li>String name=request.getParameter(&quot;name&quot;); </li></ul><ul><li>String password=request.getParameter(&quot;password&quot;); </li></ul><ul><li>if(name.equals(&quot;hellking&quot;)) { %> </li></ul><ul><li><jsp:forward page=&quot;success.jsp&quot;> </li></ul><ul><li><jsp:param name=&quot;user&quot; value=&quot;<%=name%>&quot;/> </li></ul><ul><li></jsp:forward> </li></ul><ul><li><% } else {%> </li></ul><ul><li><jsp:forward page=&quot;login.jsp&quot;> </li></ul><ul><li><jsp:param name=&quot;user&quot; value=&quot;<%=name%>&quot;/> </li></ul><ul><li></jsp:forward> </li></ul><ul><li><% } %> </li></ul><ul><li></body></html> </li></ul>
  50. 50. success.jsp <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; %> </li></ul><ul><li>登陆成功 </li></ul><ul><li><br> </li></ul><ul><li>欢迎你 , </li></ul><ul><li><%=request.getParameter(&quot;name&quot;)%> </li></ul>
  51. 51. Jsp 核心 技术 : jsp 内建对象及实例 <ul><li>out 对象 </li></ul><ul><li>request 对象 </li></ul><ul><li>response 对象 </li></ul><ul><li>session 对象 </li></ul><ul><li>application 内部对象 </li></ul><ul><li>exception 内部对象 </li></ul><ul><li>page 对象 </li></ul><ul><li>pagecontext 对象 </li></ul><ul><li>config 对象 </li></ul>
  52. 52. Jsp 核心 技术 : out 对象及实例 <ul><li>实例 <!-- 显示字符串 --> </li></ul><ul><li>out.println(“ 学习使用 out 对象” ) ; </li></ul><ul><li>作用 : 可向客户端输出任何原始数据类型、对象及以字符构成的数组 </li></ul><ul><li>常用方法 : </li></ul><ul><li>out.print(String) , out.println(String) </li></ul><ul><li>outout.clear() , out.close() </li></ul><ul><li>out 对象被封装在 javax.servlet.jsp.JspWriter </li></ul><ul><li>接口中 </li></ul>
  53. 53. Jsp 核心 技术 : request 对象及实例 <ul><li>实例 <!-- 提取表单数据 --><!-- 显示服务器名称 --> </li></ul><ul><li>request.getParameter(“name&quot;) </li></ul><ul><li><%= request.getServerName()%> </li></ul><ul><li>作用:接受客户端的请求,另外还可获取服务器端及客户端的各种参数 , 如 IP 地址,端口号等。 </li></ul><ul><li>常用方法 </li></ul><ul><li>getParameter(String name) ; // 一般用它读取表单中参数 </li></ul><ul><li>getParameterNames() ; getParameterValues(String name) ; </li></ul><ul><li>// 一般用于 checkbox 、 select 提交的数据,其值是个 String 数组 </li></ul><ul><li>getAttribute(String name) ; </li></ul>
  54. 54. request <ul><li>getAttribute(String name) ; </li></ul><ul><li>setAttribute(String name , java.lang.Object obj); </li></ul><ul><li>removeAttribute(String name) ; </li></ul><ul><li>request 对象被封装在 HttpServletRequest 接口中 ) </li></ul>
  55. 55. Jsp 核心 技术 : respone 对象及实例 <ul><li>实例 <!-- 数字钟表 --> 和 <!-- 重定向 --> </li></ul><ul><li><%@page import=“java.util.Date”%> </li></ul><ul><li><%response.setHeader(&quot;Refresh&quot;,&quot;1&quot;);%> </li></ul><ul><li>现在时间是: <%=new Date()%> </li></ul><ul><li>sendRedirect(“http://www.sina.com.cn”); </li></ul><ul><li>常用方法: </li></ul><ul><li>setContentType ( String contentType ) </li></ul><ul><li>sendRedirect ( String location ) </li></ul><ul><li>setHeader(String name,String value); </li></ul><ul><li>Responset 对象被封装在 HttpServletResponse 接口中 </li></ul>
  56. 56. Jsp 核心 技术 : session 对象及实例 <ul><li>实例 <!-- 存储 --><!-- 调用 --> </li></ul><ul><ul><li>session.setAttribute (&quot;thename&quot;, name); </li></ul></ul><ul><ul><li>String name = (String) session.getAttribute(“thename&quot;); </li></ul></ul><ul><ul><li>session.putValue(&quot;thename&quot;, name); </li></ul></ul><ul><ul><li>String name = (String) session.getValue(&quot;thename&quot;); </li></ul></ul><ul><li>作用:保存用户信息以便跟踪每个用户的操作状态,对于那些希望通过多个页面完成一个事务的应用是非常有用的。 </li></ul><ul><li>主要方法: </li></ul><ul><li>GetId() , Long getLastAccessedTime() </li></ul><ul><li>getCreationTime(); </li></ul><ul><li>String[ ] getValueNames() , invalidate () </li></ul>
  57. 57. session <ul><li>setAttribute(String name,Object value); </li></ul><ul><li>getAttribute(String name); </li></ul><ul><li>getAttributeNames(String name); </li></ul><ul><li>putValue(String name,Object value); </li></ul><ul><li>getValue(String name); </li></ul><ul><li>getValueNames(); </li></ul><ul><li>removeValue(String name) </li></ul><ul><li>setMaxInactiveInterval(Int,interval); </li></ul><ul><li>和 session 对应的是 HttpSession 接口 </li></ul>
  58. 58. Jsp 核心 技术 : application 对象及实例 <ul><li>实例:计数器实例 ( 第四章 Page95) </li></ul><ul><ul><li>Application.jsp </li></ul></ul><ul><ul><li>test_application.jsp </li></ul></ul><ul><li>作用:为多个应用程序保存信息,它在服务器启动时自动创建,一直保持直到服务器关闭为止。 </li></ul><ul><li>主要方法: </li></ul><ul><li>get Attribute(String name) ; setAttribute(String name,Object object) ; </li></ul><ul><li>getAttributeNames( ) ; </li></ul><ul><li>getInitParameter(String name ) ; </li></ul>
  59. 59. Jsp 核心 技术 : exception 对象及实例 <ul><li>作用:处理异常和错误,只能在错误页面中使用 </li></ul><ul><li>常用方法: </li></ul><ul><ul><li>getMessage() </li></ul></ul><ul><ul><li>返回错误信息 ( 返回描述例外的消息 ) </li></ul></ul><ul><ul><li>toString() </li></ul></ul><ul><ul><li>以字符串的形式返回一个对异常的描述 </li></ul></ul><ul><ul><li>printStackTrace() </li></ul></ul><ul><ul><li>输出一个错误和错误的堆栈 </li></ul></ul>
  60. 60. Jsp 核心 技术 : page 对象及实例 7 <ul><li>主要方法: </li></ul><ul><li>String toString() </li></ul><ul><li>把对象转换成 String 类 </li></ul>
  61. 61. 动态页面和用户会话 <ul><li>创建动态页面的内容 </li></ul><ul><ul><li>根据时间的动态 </li></ul></ul><ul><ul><li>根据用户类型的动态 </li></ul></ul><ul><ul><li>根据用户自定义信息的动态 </li></ul></ul><ul><ul><li>根据用户不同区域、不同的语言的动态 </li></ul></ul><ul><ul><li>根据数据库内容的动态 </li></ul></ul><ul><li>常用的用户会话跟踪方法 </li></ul><ul><ul><li>隐藏字段 </li></ul></ul><ul><ul><li>URL 重写 </li></ul></ul><ul><ul><li>session </li></ul></ul>
  62. 62. 用户会话实例 <ul><li>用于实现不同页面之间的数据交换 </li></ul><ul><ul><li><Input type=“ hidden” name=“name” value=“ 张三” > </li></ul></ul><ul><ul><li><a href=modify_passd.jsp ?id=“001” </li></ul></ul><ul><ul><ul><li>&type=“ 一般用户” &city=“ 北京” …… > </li></ul></ul></ul><ul><ul><li>session </li></ul></ul><ul><ul><ul><li>Session.setAttribute(“name”,” 张三” ); </li></ul></ul></ul><ul><ul><ul><li>Session.setAttribute(“type”,” 一般用户” ); </li></ul></ul></ul><ul><ul><ul><li>Session.getAttribute(“name”); </li></ul></ul></ul><ul><ul><ul><li>Session.getAttribute(“type”); </li></ul></ul></ul>
  63. 63. 解决中文显示的问题 <ul><li>原因 : </li></ul><ul><li>与 Jdk 版本及 web 服务器、浏览器使用的编码方式不同有关。 </li></ul><ul><li>解决的办法: </li></ul><ul><ul><li>在浏览器里设置编码为简体中文编码 </li></ul></ul><ul><ul><li>在 Jsp 的页面指令中指定字符集的编码方式为 gb2312 ,即添加如下指令: </li></ul></ul><ul><ul><li><%@ page contentType=&quot;text/html; charset=gb2312 %> </li></ul></ul>
  64. 64. 中文显示问题 <ul><ul><li>对请求重新编码,添加如下指令 request.setCharacterEncoding(&quot;gb2312&quot;); response.setContentType(“text/html,charset=gb2312&quot;); </li></ul></ul>
  65. 65. JavaBean <ul><li>作用:用来封装事务逻辑、数据库操作 </li></ul><ul><li>组成:由属性和方法(事件)组成 </li></ul><ul><li>特性;使业务逻辑和前台程序分离,可实现代码的重复利用,易编写,易维护 </li></ul><ul><li>一个 JavaBean 实例: </li></ul><ul><li>一般包括:包名,类名,构造函数,属性,定义属性的读、写方法, 其它方法 。 </li></ul><ul><li>JavaBean 索引属性实例 </li></ul>
  66. 66. <ul><li><!– 名称: StudentInfo.java--> </li></ul><ul><li>package Student ; </li></ul><ul><li>public class StudentInfo { </li></ul><ul><li>int id; // 定义属性 </li></ul><ul><li>String name; </li></ul><ul><li>public StudentInfo() { // 初始化 </li></ul><ul><li>id=1001; </li></ul><ul><li>name=&quot; 张三 &quot;; </li></ul><ul><li>} </li></ul><ul><li>public void setId(int id){ // 定义方法 </li></ul><ul><li>this.id=id; </li></ul><ul><li>} </li></ul>1
  67. 67. 2 <ul><li> public int getId(){ // 定义方法 </li></ul><ul><li>return this.id; </li></ul><ul><li>} </li></ul><ul><li>public void setName(String name){// 定义方法 </li></ul><ul><li>this.name=name; </li></ul><ul><li>} </li></ul><ul><li>public String getName(){ // 定义方法 return this.name; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>改变 scope 范围为 page , session , application </li></ul><ul><li>体会它们各自不同的生命周期 </li></ul>
  68. 68. <ul><li><!-- 名称: student.jsp 在 jsp 页面中引用 StudentInfo--> </li></ul><ul><li><%@ page contentType=&quot;text/html; </li></ul><ul><li>charset=gb2312&quot;%> </li></ul><ul><li><jsp:useBean id=&quot;StuBean&quot; scope=&quot;application&quot; class=&quot;Student.StudentInfo&quot; /> </li></ul><ul><li>学号 :<%=StuBean.getId() %><br> </li></ul><ul><li>姓名 :<%=StuBean.getName() %>&nbsp; </li></ul><ul><li><jsp:getProperty name=&quot;StuBean&quot; property=“name&quot; /><br> </li></ul><ul><li><% StuBean.setName(&quot; 王五 &quot;); %> </li></ul>
  69. 69. Hello.java <ul><li>package Hai; </li></ul><ul><li>public class Hello{ </li></ul><ul><li>public String name=&quot;every one&quot;;// 定义属性 </li></ul><ul><li>public String output() // 定义方法 </li></ul><ul><li>{ </li></ul><ul><li>return &quot;hello &quot;+name; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  70. 70. Hai.jsp <ul><li><jsp:useBean id=&quot;HelloBeans&quot; scope=&quot;session&quot; class=&quot;Hai.Hello&quot; /> </li></ul><ul><li><%=HelloBeans.output() %> </li></ul><ul><li><br> </li></ul><ul><li><% </li></ul><ul><li>HelloBeans.name=&quot;world&quot;; </li></ul><ul><li>out.print(HelloBeans.output()); </li></ul><ul><li>%> </li></ul>
  71. 71. 1 <ul><li><!-- 索引属性实例 程序名: IndexBean.java--> </li></ul><ul><li>package com.jspdev.ch5; </li></ul><ul><li>public class IndexBean </li></ul><ul><li>{ </li></ul><ul><li>//type 为属性的名字,类型是 String </li></ul><ul><li>private String[ ] type=new String[ ]{&quot;jsp&quot;,&quot;ejb&quot;,&quot;servlet&quot;,&quot;javamail&quot;,&quot;jca&quot;,&quot;jdbc&quot;}; </li></ul><ul><li>//getXxx 方法,返回这个属性的值 </li></ul><ul><li>public String[ ] getType() </li></ul><ul><li>{ </li></ul><ul><li>return this.type; </li></ul><ul><li>} </li></ul>
  72. 72. 2 <ul><li>//setXxx 方法,设置这个属性的值。 </li></ul><ul><li>public void setType(String[ ] type) </li></ul><ul><li>{ this.type=type; } </li></ul><ul><li>// 另外的设置属性和获得属性值的方法。 </li></ul><ul><li>public void setType(int index,String value) </li></ul><ul><li>{ </li></ul><ul><li>type[index]=value; </li></ul><ul><li>} </li></ul><ul><li>public String getType(int index) </li></ul><ul><li>{ </li></ul><ul><li>return type[index]; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  73. 73. 3 <ul><li>引用: </li></ul><ul><ul><li>setType(4,”javabean”); </li></ul></ul><ul><ul><li>String type=getType(5); </li></ul></ul><ul><ul><li>String[ ] s=getType(); </li></ul></ul>
  74. 74. <ul><li>创建 JavaBean </li></ul><ul><ul><li><jsp:useBean id=“ 组件名” scope=“ 范围” class=“ 类路径和类名” /> </li></ul></ul><ul><li>设置 JavaBean 属性 </li></ul><ul><ul><li><jsp:setProperty name=“ 组件名” property=“*” /> </li></ul></ul><ul><ul><li>上面必须和表单中参数名相匹配,快捷方式 </li></ul></ul><ul><ul><li><jsp:setProperty name=“ 组件名” property=“ 属性名” value=“ 属性值” /> </li></ul></ul><ul><ul><li><jsp:setProperty name=“ 组件名” property=“ 属性名” param=“ 参数名” /> </li></ul></ul>在 JSP 中使用 JavaBean 语法
  75. 75. 设置 JavaBean 属性 <ul><li>实例如下 </li></ul><ul><li><jsp:useBean id=“StuBean” scope=“session” class=“Student. StudentInfo” /> </li></ul><ul><li><jsp:setProperty name=“StuBean” property=“*” /> </li></ul><ul><li><jsp:setProperty name=“StuBean 名” property=“name 名” param=“username”/> </li></ul><ul><li><jsp:setProperty name=“StuBean” property=“name” value=“ 李四” /> </li></ul>
  76. 76. 在 JSP 中使用 JavaBean 语法 <ul><li>获取 JavaBean 的属性,有显示输出 </li></ul><ul><ul><li><jsp:getProperty name=“ 组件名” property=“ 属性名” /> </li></ul></ul><ul><li>如: </li></ul><ul><li><jsp:useBean id=“StuBean” scope=“session” class=“ Student. StudentInfo” /> </li></ul><ul><li><jsp:getProperty name=“StuBean” property=“name” /> </li></ul><ul><li>其结果显示姓名 </li></ul>
  77. 77. JavaBean 小结 <ul><li>JavaBean 的常用属性 </li></ul><ul><ul><li>简单型:伴随有 get/set 方法的变量 </li></ul></ul><ul><ul><li>索引型:索引属性表示一个数组值,可以使用 get/set 方法设置或取得数组的值 </li></ul></ul><ul><li>get/set 方法的常规写法 </li></ul><ul><ul><li>变量的第一个字母是大字如: getName() ; </li></ul></ul>
  78. 78. JavaBean 小结 <ul><li>编写 JavaBean 程序如: aa.java </li></ul><ul><li>编译这个 Java 程序如: javac aa.java </li></ul><ul><li>在 WEB-INFclasses 目录下建文件夹及其子文件夹 </li></ul><ul><ul><li>其路径要和包名一致 </li></ul></ul><ul><ul><li>java 文件名要和类名一致 </li></ul></ul><ul><li>编写 jsp 程序, <jsp> 标签调用 JavaBean </li></ul>
  79. 79. 字符串转化为其它类型的方法举例 <ul><li>从表单中传来的数据类型都是字符串类型, JSP 内在机制会自动转化成 JavaBean 属性对应的类型 </li></ul>方法 属性 Java.lang. Integer.valueOf(String) Integer Java.lang. Integer.valueOf(String).IntValue() int Java.lang.Boolean.valueOf(String) Boolean Java.lang.Boolean.valueOf(String).boolean.Value() boolean
  80. 80. Jsp 的文件操作 <ul><li>使用 java 的 IO 系统 </li></ul><ul><li>实例 </li></ul><ul><ul><li>读取文件内容: </li></ul></ul><ul><ul><ul><li>FileReader 类或 FieldInputStream 类 </li></ul></ul></ul><ul><ul><li>写入内容到某个文件: </li></ul></ul><ul><ul><ul><li>FileWriter 类或 FieldOutputStream 类 </li></ul></ul></ul><ul><ul><li>文件上传 </li></ul></ul><ul><ul><ul><li>使用 SmartUpload 上传工具 </li></ul></ul></ul><ul><ul><li>文件下载 </li></ul></ul>
  81. 81. 读取文件内容实例 <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; import=&quot;java.io.*&quot; %> </li></ul><ul><li><% </li></ul><ul><li>try </li></ul><ul><li>{ </li></ul><ul><li>BufferedReader in=new BufferedReader(new FileReader(&quot;c:serSession.java&quot;)); </li></ul><ul><li>String file=&quot;&quot;; </li></ul><ul><li>String temp=&quot;&quot;; </li></ul><ul><li>while((temp=in.readLine())!=null) </li></ul><ul><li>{ </li></ul>
  82. 82. <ul><li>file+=temp; </li></ul><ul><li> } </li></ul><ul><li> in.close(); </li></ul><ul><li> out.println(file); </li></ul><ul><li> out.flush(); </li></ul><ul><li>} </li></ul><ul><li>catch(Exception e) </li></ul><ul><li>{ </li></ul><ul><li>out.println(e); </li></ul><ul><li>e.printStackTrace(); </li></ul><ul><li>} </li></ul><ul><li>%> </li></ul>读取文件内容实例
  83. 83. 写入内容到文件实例 <ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; import=&quot;java.io.*&quot;%> </li></ul><ul><li><html><body> </li></ul><ul><li><% </li></ul><ul><li>request.setCharacterEncoding(&quot;gb2312&quot;); </li></ul><ul><li>String content=request.getParameter(&quot;content&quot;); </li></ul><ul><li>%> </li></ul><ul><li><% </li></ul><ul><li>try </li></ul><ul><li>{ </li></ul><ul><li>PrintWriter writer= new PrintWriter(new BufferedWriter(new FileWriter(&quot;c:oo.out&quot;, true ))); </li></ul>
  84. 84. 写入内容到文件实例 <ul><li>writer.write(content); </li></ul><ul><li>writer.close(); </li></ul><ul><li>out.println(&quot; 已经把内容写入到 c:oo.java&quot;); </li></ul><ul><li>} </li></ul><ul><li>catch(Exception e) </li></ul><ul><li>{ </li></ul><ul><li>out.println(e); </li></ul><ul><li>e.printStackTrace(); </li></ul><ul><li>} </li></ul><ul><li>%> </li></ul><ul><li><form action=&quot;writeFile.jsp&quot; method=post> </li></ul><ul><li><textarea name=content cols=20 rows=5></textarea><br> </li></ul><ul><li><input type=submit value= 提交 > </li></ul><ul><li></form> </li></ul>
  85. 85. 文件上传实例 <ul><li><!-- 提交要上传的文件 --> </li></ul><ul><li><body><hr><center> </li></ul><ul><li>upload file<br> </li></ul><ul><li><form action=&quot;upload.jsp&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot; > </li></ul><ul><li><table><tr><td>name: </li></ul><ul><li><input type=&quot;file&quot; name=&quot;file2&quot; size=&quot;20&quot;></td></tr> </li></ul><ul><li><tr><td><input type=&quot;submit&quot; value=&quot; 上传 &quot;></td></tr> </li></ul><ul><li></table> </li></ul><ul><li></form> </li></ul><ul><li></center> </li></ul><ul><li></body> </li></ul>
  86. 86. <ul><li><!-- 保存上传文件 --> </li></ul><ul><li><%@ page contentType=&quot;text/html; charset=gb2312&quot; language=&quot;java&quot; import=&quot;java.sql.*&quot; errorPage=&quot;&quot; %> </li></ul><ul><li><%@ page import=&quot;com.jspsmart.upload.*&quot;%> </li></ul><ul><li><jsp:useBean id=&quot;mySmartUpload&quot; scope=&quot;page&quot; class=&quot;com.jspsmart.upload.SmartUpload&quot; /> </li></ul><ul><li><html> </li></ul><ul><li><head> </li></ul><ul><li><meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot;> </li></ul><ul><li></head> </li></ul>文件上传实例
  87. 87. <ul><li><body> </li></ul><ul><li><center> 正在上传文件 ... </li></ul><ul><li><% try // 上载附件 </li></ul><ul><li>{ </li></ul><ul><li>mySmartUpload.initialize(pageContext); </li></ul><ul><li>mySmartUpload.service(request,response); </li></ul><ul><li>mySmartUpload.upload(); </li></ul><ul><li>String fn=fn=mySmartUpload.getFiles().getFile(0). </li></ul><ul><li>getFileName(); </li></ul><ul><li>mySmartUpload.save(&quot; upload/ &quot;);// 文件保存目录 </li></ul>文件上传实例
  88. 88. <ul><li>out.println(&quot; 已经成功上传了文件,请查看 <a href=upload/&quot;+fn+&quot;> 这里 </a> ,看文件是否上传成功 &quot;); </li></ul><ul><li>} </li></ul><ul><li>catch(Exception e) </li></ul><ul><li>{ </li></ul><ul><li>e.printStackTrace(); </li></ul><ul><li>} </li></ul><ul><li>%> </li></ul><ul><li><a href=FileUpload.html> 重新上传 </a> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>文件上传实例
  89. 89. JavaBean 实例 <ul><li>index.jsp </li></ul><ul><ul><li>title.jsp </li></ul></ul><ul><ul><li>main.jsp </li></ul></ul><ul><ul><li>menu.jsp </li></ul></ul><ul><ul><ul><li>register.jsp (点击用户注册) </li></ul></ul></ul><ul><ul><ul><ul><li>include.inc (功能:连数据库) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>newuser.jsp (点击确定按钮) </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>UserInfo.java </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>UserRegist.java </li></ul></ul></ul></ul></ul>
  90. 90. 数据库和 JDBC 技术 <ul><li>JDBC 介绍 </li></ul><ul><ul><li>JDBC 的任务 </li></ul></ul><ul><ul><li>同一个数据库建立连接 </li></ul></ul><ul><ul><li>向数据库发送 SQL 语句 </li></ul></ul><ul><ul><li>处理数据库返回的结果 </li></ul></ul><ul><ul><li>JDBC 连接数据库的模型 </li></ul></ul><ul><ul><li>JDBC 连接数据库的两层模型 </li></ul></ul><ul><ul><li>JDBC 连接数据库的三层模型 </li></ul></ul><ul><ul><li>JDBC API </li></ul></ul>
  91. 91. 数据库和 JDBC 技术 <ul><li>JDBC 是一种用于执行 SQL 语句的 API ,它是由一组 JAVA 语言编写的类和接口组成,它使得我们不用为某一个数据库而专门编写一个程序,对 Sybase 、 Oracle 、 INFORMIX 、 SQLServer… 等数据库均通用。因为它是用纯 JAVA 语言写的 , 所以可跨平台操作 </li></ul>
  92. 92.
  93. 93. 数据库和 JDBC 技术 <ul><li>JSP 连接数据库的主要途径 </li></ul><ul><ul><li>JDBC 连接数据库 </li></ul></ul><ul><ul><li>JDBC-ODBC 桥 </li></ul></ul><ul><ul><ul><li>将 JDBC 调用映射为 ODBC 调用 </li></ul></ul></ul><ul><ul><ul><li>使 JDBC 能够访问 ODBC 数据源, </li></ul></ul></ul><ul><ul><ul><li>效率相对低下( JDBC 初期时使用) </li></ul></ul></ul>
  94. 94.
  95. 95. JDBC 是如何连接数据库的 (一)装载驱动程序 <ul><li>用 java.lang.Class 类的 forName() 的方法显式地加载驱动程序 </li></ul><ul><li>JDBC-ODBC 桥驱动 </li></ul><ul><li>Class.forName (“ sun . jdbc . odbc . JdbcOdbcDriver” ); </li></ul><ul><li>JDBC 驱动 </li></ul><ul><li>Class.forName (“ jdbc 驱动程序类名”); </li></ul><ul><li>实例 </li></ul><ul><li>// 装载 MS SQLServer JDBC 驱动 </li></ul><ul><li>Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver”); </li></ul>
  96. 96. (一)装载驱动程序 <ul><li>// 装载 MySQL JDBC 驱动 </li></ul><ul><li>Class.forName (“org.gjf.mm.mysql.Driver”); </li></ul><ul><li>// 装载 Oracle JDBC 驱动 </li></ul><ul><li>Class.forName(”oracle.jdbc.driver.OraclDriver”) ; </li></ul>
  97. 97. (二)创建与数据库的连接 <ul><li>DriverManager 类 :作用于用户和驱动程序之间,并在数据库和相应驱动程序之间建立连接 </li></ul><ul><li>Connection </li></ul><ul><li>用 DriverManager 类的 getConnection 方法创建一个特定的连接,这个连接就是 Connection 类的有关数据库的实例. </li></ul><ul><li>Connection con= </li></ul><ul><li>DriverManager.getConnection (url , user name , password) ; </li></ul><ul><ul><li>url :对不同的数据库驱动程序有所不同,有两种格式: </li></ul></ul>
  98. 98. Connection <ul><ul><li>格式①: </li></ul></ul><ul><ul><li>jdbc :子协议:子名称 ( 如:本地 ODBC 数据源名 ) </li></ul></ul><ul><ul><li>例如: jdbc : odbc : SQLshopping </li></ul></ul><ul><ul><li>格式②: </li></ul></ul><ul><ul><li>jdbc :子协议: // 主机名:端口号 / 数据库名 </li></ul></ul><ul><ul><li>例如: //MySQL </li></ul></ul><ul><ul><li>jdbc : mysql : //localhost : 3306/DBjsp </li></ul></ul><ul><li>//MS SQLServer </li></ul><ul><li>jdbc:microsoft:sqlserver://127.0.0.1:1433; </li></ul><ul><li>DatabaseName=jspdev,”sa”,”” </li></ul>
  99. 99. Connection <ul><li>主要方法: close() ; rolback(); </li></ul><ul><li>Statement creatStatement(); </li></ul><ul><li>PreparedStatement prepareStatement (String sql); </li></ul>
  100. 100. (三) 创建 Statement 用于执行 SQL 语句 <ul><li>Statement </li></ul><ul><li>通过 Connection 类的 createStatement() 方法,创建 Statement 实例,用于实现对数据库的具体操作,如:查询、修改、删除等 </li></ul><ul><ul><li>Statement stmt=con.createStatement(); </li></ul></ul><ul><ul><li>ResultSet rs=stmt.executeQuery(“select * from user_info”); </li></ul></ul><ul><li>主要方法 </li></ul><ul><ul><li>executeQuery() // 运行查询语句,返回 ResultSet 对象 </li></ul></ul><ul><ul><li>executeUpdate() // 运行更新操作,返回更新的行数 </li></ul></ul><ul><ul><li>execute() // 运行语句,返回是否有结果集 </li></ul></ul>
  101. 101. 发布 SQL 语句 <ul><li>PreparedStatement 类 </li></ul><ul><li>是 Statement 类的子类,可以和查询信息一起预编译,然后用不同的输入参数来多次执行编译过的语句,至少包含 1 个?占位符。 </li></ul><ul><li>PreparedStatement pstmt= </li></ul><ul><ul><li>con.prepareStatement(“insert user_info values(?,?,?,?,?,?,?)”); </li></ul></ul><ul><li>pstmt.setString(1,”hellking’); </li></ul><ul><li>pstmt.setInt(2,20); </li></ul><ul><li>…… </li></ul><ul><li>pstmt.executeUpdate(); </li></ul>
  102. 102. 发布 SQL 语句 <ul><li>CallableStatement 类 </li></ul><ul><li>是 PreparedStatement 的子类,用于执行对数据库已存储过程的调用,包含 1 个或多个?占位符 </li></ul><ul><li>strSQL=“{call demo_account(?,?,?,?)}”; </li></ul><ul><li>CallableStatement sqlStmt= </li></ul><ul><li>con.prepareCall(strSQL); </li></ul><ul><li>sqlStmt.setString(1,”userid_3”); </li></ul><ul><li>sqlStmt.setString(2,”userid_1”); </li></ul><ul><li>…… </li></ul><ul><li>Int i=sqlStmt.executeUpude(); </li></ul>
  103. 103. (四)处理由 SQL 操作返回的结果集 <ul><li>ResultSet 结果集: 用来装载查询 结果, 结果集一般是一个表,包括查询返回的列标题和它的值。 </li></ul><ul><ul><li>ResultSet rs=stmt.executeQuery(“select * from table1”) ; </li></ul></ul><ul><li>主要方法: </li></ul><ul><ul><li>String getString() ; </li></ul></ul><ul><ul><li>// 获取字符串对象,来自于指定的字段 </li></ul></ul><ul><ul><li>Date getDate() ; // 获取 Date 类型的对象,同上 </li></ul></ul><ul><ul><li>Blob getBlob() ; // 获取二进制大对象(图片) </li></ul></ul><ul><ul><li>Boolean next() ; // 向下移动一行,得到下一条查询结果 </li></ul></ul><ul><ul><li>First() ; // 指向第一条记录 </li></ul></ul><ul><ul><li>Last() ; // 指向最后一条记录 </li></ul></ul><ul><ul><li>void close() ; // 关闭同数据库的连接释放所占有的 JDBC 资源 </li></ul></ul>
  104. 104. ResultSet <ul><li>注意: ResultSet 维护指向当前数据行的游标,他的初始状态在第一行前,每调用一次 next 方法,游标下移一行,所以第一次调用要将它置于第一行,使它成为当前行,随着每次调用 next 导致游标下移一行。 </li></ul>
  105. 105. JDBC 小结 <ul><li>JDBC 是由 java.sql 包实现的,所以连接数据库操作之前要导入 java.sql 这个包 </li></ul><ul><li>SQLServer2000 JDBC 安装 </li></ul><ul><li>默认安装路径为: D:Program FilesMicrosoft SQL Server 2000 Driver for JDBC, JDBC 驱动 的核心程序是安装目录 lib 下的三个 jar 文件 mssqlserver.jar , msbase.jar , msutil.jar </li></ul><ul><ul><li>将这三个 jar 文件拷贝到 d:j2sdk1.4.1jrelibext 目录下 </li></ul></ul><ul><ul><li>将这三个 jar 文件拷贝到 d:jakarta_tomcatROOTWEB-INFlib 目录下 </li></ul></ul>
  106. 106. 常用 SQL 语句 <ul><li>查询(表) </li></ul><ul><ul><li>select * from user_info; </li></ul></ul><ul><ul><li>select * from user_info where userid<10; </li></ul></ul><ul><li>添加 ( 一条记录 ) </li></ul><ul><ul><li>insert into user_info (userid,username) values(1,” 张三” ); </li></ul></ul><ul><li>删除 ( 一条记录 ) </li></ul><ul><ul><li>delete from user_info where userid=3; </li></ul></ul><ul><li>修改 ( 字段 ) </li></ul><ul><ul><li>update user_info set username =“李四” where userid=1; </li></ul></ul>
  107. 107. 第一个连接数据库实例 <ul><li>建数据库,数据库名 jspdev ( page249 ) </li></ul><ul><li>建表,表名 book ,字段如下 </li></ul><ul><ul><li>bookId varchar(50) </li></ul></ul><ul><ul><li>bookname varchar(50) </li></ul></ul><ul><ul><li>publisher varchar(100) </li></ul></ul><ul><ul><li>price float </li></ul></ul><ul><li>添加数据到 book 表中(手工添加或 sql 脚本) </li></ul><ul><li>编写 testMssql.jsp 程序 , 显示表头及内容(参照 page254 ) </li></ul><ul><li>在 IE 中运行这个程序 </li></ul>
  108. 108. <ul><li><% Class.forName(&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;).newInstance(); </li></ul><ul><li>Connection con= java.sql.DriverManager.getConnection(&quot;jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev&quot;,&quot;sa&quot;,&quot;&quot;); </li></ul><ul><li>Statement stmt=con.createStatement(); </li></ul><ul><li>ResultSet rst=stmt.executeQuery(&quot;select * from book;&quot;); </li></ul><ul><li>while(rst.next()) </li></ul><ul><li>{ </li></ul><ul><li> out.println(&quot;<tr>&quot;); </li></ul><ul><li>out.println(&quot;<td>&quot;+rst.getString(&quot;bookId&quot;)+&quot;</td>&quot;); </li></ul><ul><li>out.println(&quot;<td>&quot;+rst.getString(&quot;bookName&quot;)+&quot;</td>&quot;); </li></ul><ul><li>out.println(&quot;<td>&quot;+rst.getString(&quot;publisher&quot;)+&quot;</td>&quot;); </li></ul><ul><li>out.println(&quot;<td>&quot;+rst.getFloat(&quot;price&quot;)+&quot;</td>&quot;); </li></ul><ul><li>out.println(&quot;</tr>&quot;); </li></ul><ul><li>} </li></ul>
  109. 109. 使用 预处理语句 添加数据到数据库实例 <ul><li>建表 contect (参照 page259 ) </li></ul><ul><ul><li>设定用户名为主键 </li></ul></ul><ul><li>编写 insert.jsp 程序,使用 预处理语句 添加多条记录到 contect 表中 ( 参照 page260) </li></ul><ul><li>在浏览器中运行这个程序 </li></ul><ul><li>到 SQLServer2000 企业管理界面查看添加的结果是否正确 </li></ul>
  110. 110. <ul><li><% </li></ul><ul><li>try </li></ul><ul><li>{ </li></ul><ul><li>// 装载驱动程序 Class.forName(&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;).newInstance(); </li></ul><ul><li>// 创建连接 </li></ul><ul><li>Connection con=java.sql.DriverManager. getConnection (&quot;jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev&quot;,&quot;sa&quot;,&quot;&quot;); </li></ul><ul><li>// 创建执行语句使用 PreparedStatement======// </li></ul><ul><li>PreparedStatement pstmt= con.prepareStatement(&quot;insert into contact values(?,?,?,?,?,?)&quot;); </li></ul>
  111. 111. <ul><li>pstmt.setString(1,&quot; 王小华 &quot;); </li></ul><ul><li>pstmt.setInt(2,136234234); </li></ul><ul><li>pstmt.setString(3,&quot;010455554&quot;); </li></ul><ul><li>pstmt.setString(4,&quot;lxh@some.com&quot;); </li></ul><ul><li>pstmt.setDate(5,new java.sql.Date(new java.util.Date().getTime())); </li></ul><ul><li>pstmt.setString(6,&quot; 很久没有联系了 &quot;); </li></ul><ul><li>pstmt.execute(); </li></ul><ul><li>//=======================// </li></ul><ul><li>pstmt.setString(1,&quot; 李小华 &quot;); </li></ul><ul><li>pstmt.setInt(2,136234234); </li></ul><ul><li>pstmt.setString(3,&quot;010455554&quot;); </li></ul><ul><li>pstmt.setString(4,&quot;lxh@some.com&quot;); </li></ul><ul><li>pstmt.setDate(5,new java.sql.Date(new java.util.Date().getTime())); </li></ul><ul><li>pstmt.setString(6,&quot; 很久没有联系了 &quot;); </li></ul>
  112. 112. <ul><li>// 执行插入数据操作。 </li></ul><ul><li>pstmt.execute(); </li></ul><ul><li>pstmt.close(); </li></ul><ul><li>//== 使用 Statement========// </li></ul><ul><li>Statement stmt=con.createStatement(); </li></ul><ul><li>// 一次添加一行数据 </li></ul><ul><li>stmt.execute(&quot;insert into contact(userName,mobile) values(' 陈军 ',136555555)&quot;); </li></ul><ul><li>out.println(&quot; 添加数据成功 &quot;); </li></ul><ul><li>// 关闭连接、释放资源 </li></ul><ul><li>stmt.close(); </li></ul><ul><li>con.close(); </li></ul><ul><li>} </li></ul><ul><li>catch(Exception e) </li></ul><ul><li>{ e.printStackTrace(); } </li></ul><ul><li>%> </li></ul>
  113. 113. 更新数据库内容实例 <ul><li>编写 update.jsp 程序修改某个字段内容(参照 page263 ) </li></ul><ul><li>运行 query.jsp 确认修改结果的正确性 </li></ul>
  114. 114. <ul><li>// 装载驱动程序 </li></ul><ul><li>Class.forName(&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;).newInstance(); </li></ul><ul><li>// 创建连接 </li></ul><ul><li>Connection con= java.sql.DriverManager.getConnection(&quot;jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev&quot;,&quot;sa&quot;,&quot;&quot;); </li></ul><ul><li>Statement stmt=con.createStatement(); </li></ul><ul><li>int col=stmt.executeUpdate(&quot;update contact set mem=' 他下个月来北京 ' where userName=' 陈军 '&quot;); </li></ul><ul><li>out.println(&quot; 成功更新 &quot;+col+&quot; 条数据 &quot;); </li></ul><ul><li>// 关闭连接、释放资源 </li></ul><ul><li>stmt.close(); </li></ul><ul><li>con.close(); </li></ul>
  115. 115. 删除记录实例 <ul><li>编写 delete.jsp 程序删除条记录 ( </li></ul><ul><li>运行 query.jsp 确认删除结果是否正确 </li></ul>
  116. 116. <ul><li><% </li></ul><ul><li>try </li></ul><ul><li>{ </li></ul><ul><li>Class.forName(&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;).newInstance(); </li></ul><ul><li>Connection con= java.sql.DriverManager.getConnection(&quot;jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev&quot;,&quot;bn&quot;,&quot;bn&quot;); </li></ul><ul><li>Statement stmt=con.createStatement(); </li></ul><ul><li>boolean col=stmt.execute(&quot;delete from contact where phone=null and mail=null and mobile=null&quot;); </li></ul><ul><li>stmt.close(); </li></ul><ul><li>con.close(); </li></ul><ul><li>} </li></ul><ul><li>catch(Exception e) </li></ul><ul><li>{ e.printStackTrace(); } </li></ul><ul><li>%> </li></ul>
  117. 117. JSP 通过 JavaBean 访问数据库实例 <ul><li>小结上面的实例:编程简单,维护性差,代码的重用性得不到满足 </li></ul><ul><li>下例参照 page269) </li></ul><ul><li>编写连接数据库的 ContactBean.java 程序 </li></ul><ul><ul><li>初始化连接 </li></ul></ul><ul><ul><li>定义在数据库中添加信息的 addContact(); 方法 </li></ul></ul><ul><ul><li>定义查询数据库的 getContact(); 方法 </li></ul></ul><ul><li>编写 jsp 程序 useBean.jsp 调用这个连接数据库的 Java 程序,页面容易维护,代码可重用。 </li></ul>
  118. 118. 在 Servlet 中使用 JDBC 访问数据库实例 <ul><li>下例参照 page 272 </li></ul><ul><li>编写 Servlet 程序 ContactServlet.java </li></ul><ul><ul><li>初始化连接 </li></ul></ul><ul><ul><li>定义删除信息的 deleteContact() 方法 </li></ul></ul><ul><ul><li>定义查询数据库的 getContact() 方法 </li></ul></ul><ul><li>编写 contact_sevlet_test.html 程序 </li></ul><ul><ul><li>提交用户名 </li></ul></ul><ul><ul><li>设置删除操作按扭 </li></ul></ul><ul><ul><li>设置显示操作按扭 </li></ul></ul><ul><li>修改 web.xml 配置文件添加 servlet 映射等 </li></ul>
  119. 119. 连接数据库综合实例 (page276) <ul><li>建表 </li></ul><ul><ul><li>商品分类表 </li></ul></ul><ul><ul><ul><li>表名: category </li></ul></ul></ul><ul><ul><ul><li>字段: catid,name,descn </li></ul></ul></ul><ul><ul><li>商品信息表 </li></ul></ul><ul><ul><ul><li>表名: product </li></ul></ul></ul><ul><ul><ul><li>字段: productid,category,name,producer,price,descn </li></ul></ul></ul><ul><ul><li>手工添加一些数据到这两个表中 </li></ul></ul><ul><li>编写这两个表的 JavaBean, </li></ul><ul><ul><li>名称: Category.java 和 Product.java </li></ul></ul><ul><ul><li>作用:把每个数据表都做成一个值对象的类,在 JavaBean 和 JSP 之间传递数据时可通过值对象来进行 </li></ul></ul>
  120. 120. 商品管理 <ul><li>编写连接数据库的 JavaBean </li></ul><ul><ul><li>名称: DataBaseConnection.java </li></ul></ul><ul><ul><li>功能:返回一个数据库的连接 </li></ul></ul><ul><li>编写查看商品分类的 JavaBean </li></ul><ul><ul><li>名称: ViewCategory.java </li></ul></ul><ul><ul><li>功能:返回商品的所有分类 </li></ul></ul><ul><ul><li>定义了 getAllCategory() 方法 </li></ul></ul><ul><li>编写与商品操作相关的 JavaBean </li></ul><ul><ul><li>名称: ProductBean.java </li></ul></ul><ul><ul><li>封装的业务逻辑有: </li></ul></ul><ul><ul><li>添加一个商品,删除一个商品,更改商品的信息,搜索所有的商品信息, 按照商品的类别查找商品,返回给定商品的信息等 </li></ul></ul>
  121. 121. 商品管理 <ul><li>编写添加商品界面的 jsp 程序 </li></ul><ul><ul><li>名称: addProduct.jsp </li></ul></ul><ul><li>编写执行添加商品功能的 JSP 程序 </li></ul><ul><ul><li>名称: addProduct_do.jsp </li></ul></ul><ul><li>编写删除商品界面的 JSP 程序 </li></ul><ul><ul><li>名称: deleteProduct.jsp </li></ul></ul><ul><li>编写执行删除商品功能的 JSP 程序 </li></ul><ul><ul><li>名称: deleteProduct_do.jsp </li></ul></ul><ul><li>编写更改商品信息界面的 JSP 程序 </li></ul><ul><ul><li>名称: modifyProduct.jsp </li></ul></ul><ul><li>编写执行更改商品功能的 JSP 程序 </li></ul><ul><ul><li>名称: modifyProduct_do.jsp </li></ul></ul>
  122. 122. 商品管理 <ul><li>编写查看所有商品信息的 JSP 程序 </li></ul><ul><ul><li>名称: viewProduct.jsp </li></ul></ul><ul><li>编写主程序 index.html ,将所有功能整合在一个页面上。 </li></ul><ul><li>添加商品 </li></ul><ul><li>删除商品 </li></ul><ul><li>更改商品信息 </li></ul><ul><li>查看所有商品 </li></ul><ul><li>查看所有商品类型 </li></ul>
  123. 123. 分页显示实例( page310 ) <ul><li>开发一个页面控制的 javabean 程序 </li></ul><ul><ul><li>名称: PageBean.java </li></ul></ul><ul><ul><li>属性: 当前是第几页,总页数,总行数,每页行数,本页中要显示的内容 </li></ul></ul><ul><ul><li>其中:总页数的计算如下: </li></ul></ul><ul><ul><li>if( 总行数 % 每页行数 )==0 </li></ul></ul><ul><ul><li>总页数 = 总行数 / 每页行数 </li></ul></ul><ul><ul><li>else </li></ul></ul><ul><ul><li>总页数 = 总行数 / 每页行数 +1 </li></ul></ul>
  124. 124. 分页显示实例 <ul><li>开发一个与逻辑业务相关的 javabean 程序 </li></ul><ul><ul><li>名称: ContactBean.java </li></ul></ul><ul><ul><li>连接数据库 </li></ul></ul><ul><ul><li>定义一个返回查询总记录数的方法 </li></ul></ul><ul><ul><li>定义获取指定页面数据的方法,结果返回 </li></ul></ul>

×