《JSP笔记》之十(数据库)(新2009年10月20日)
jsp基础语法课堂笔记
5)、useBean 动作标记
该标记用来创建并使用一个Javabean,是非常重要的一个动作标记,我们将在第4章详细讨论。Sun公司的倡导是:用HTML完成JSP页面的静态部分,用Javabean完成动态部分,实现真正意义上的静态和动态分离。
3)、JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
4)、JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
二、jsp语法
1、JSP页面的基本结构
一、jsp简介
1)、JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
2)、JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
5. JSP中的注释
1)、 HTML注释格式:
<!-- 注释内容 -->
2)、 JSP注释格式:
<%-- 注释内容 --%>
6. JSP 指令标记
1)、page 指令标记
?? (5)、buffer 属性 内置输出流对象out负责将服务器的某些信息或运行结果发送到客户端显示,buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。
例如: <%@ page buffer= “24kb” %>buffer属性的默认值是8kb 。buffer属性可以取值" none",设置out不使用缓冲区。
JSP中的数据库操作
2013-7-8
张燕
山东财政学院计算机信息工程学院
7
主要内容
什么是JDBC JDBC驱动程序类型 用JDBC进行数据库编程
用JDBC访问Access数据库 用JDBC访问MySQL数据库 使用配置文件访问数据库
数据库连接池的配置与使用
2013-7-8
张燕
山东财政学院计算机信息工程学院
2013-7-8
张燕
山东财政学院计算机信息工程学院
5
JDBC
Java 应用程序 编程接口 插入 修改
Java应用程序
JDBC (Java 数据库连接) (sun公司提供)
数据库
删除
查询
2013-7-8
张燕
山东财政学院计算机信息工程学院
6
JDBC技术介绍
JDBC是一种底层API,在访问数据库时需要 在业务逻辑中直接嵌入SQL语句。由于SQL语 句是面向关系的,依赖于关系模型,所以 JDBC传承了简单直接的优点,特别是对于小 型应用程序十分方便。 JDBC不能直接访问数据库,必须依赖于数据 库厂商提供的JDBC驱动程序。
Connection con = DriverManager.getConnection(url, "sa",""); //取得数据库连接 Statement stmt = con.createStatement(); //获取Statement对象
为了执行Statement对象,被发送到数据库的SQL语句将被作为参 数提供给Statement类中的指定方法。例如,通过Statement对象执行 查询的SQL语句: ResultSet rs = stmt.executeQuery("select * from user");
JSP课堂笔记
get:url传参数,中文会出现乱码
解决方法://解决url传参数带有中文的乱码的解决方法
String abc=new String(request.getParameter("abc").getBytes("ISO-8859-1"),服务器上的脚本 。Linux+mysql+Php(最佳组合)
actionscript:flash flex技术
带宽的问题。
c/s:client/server,对于一些实时性比较强
b/s:brower/server,对于维护方便,版本又一停更新的
(ADDRESS = (PROTOCOL = TCP)(HOST = onest)(PORT = 1521))
)
)
扩展:poi 读取word,Excel,ppt文件内容,下载poi jar包 难度适中
jfreeChat 用来显示图表信息,做一些报表。
number的转化:
<fmt:formatNumber value="1234567890" type="number"></fmt:formatNumber><br/>
传参数:有限制,限制2KB
c)method="post"
传参数是没有限制,就安全性来说 ,会比较安全,隐式的传参
3)out:向页面输出html,文本
4)session:用来存储有关用户会话的所有信息,保存在服务器中
5)application:类似于系统的“全局变量”,用于实现用户之间的数据共享,保存在服务器中
JSP中使用数据库
• 7.2.3 Statement接口
– public boolean execute(String sql):用于执行返回 多种成果集、多种更新计数或两者结合旳SQL语句。
– public int[] executeBatch():用于执行几种SQL语 句。Statement接口使用addBatch(String sql)措施 将几种SQL语句添加到一种语句块中,然后一同提 交给数据库服务器,同步执行。当执行多种SQL insert语句时效率将很高,因为一次提交比屡次提 交要节省诸多系统资源。
• 7.2.4 数据成果集——ResultSet接口
– public XXX getXXX(String columnName): XXX代表任意旳数据类型,参数columnName 代表列名。
– public XXX getXXX(int columnIndex):XXX代 表任意旳数据类型,参数columnIndex代表列 号。
– public static Class forName(String className)
• DrvierManager类旳使使用方法: • (1)加载驱动
– 例如: – Class.forName("com.mysql.jdbc.Driver");
• (2)与数据库建立连接
– DriverManager.getConnection(String url,String user,String password);
• 全部旳利用JDBC访问数据库旳程序都具有 下列旳流程:
– 加载JDBC驱动程序 – 建立和数据库旳连接 – 执行SQL语句 – 存储处理成果 – 与数据库断开连接
• 7.3.1 经过JDBC-ODBC桥连接来访问数据 库
jsp基础知识备份
注意: include指令元素和行为元素主要有两个方面的 不同点。 1.include指令是静态包含,执行时间是在编译阶段执行, 引入的内容为静态文要,在编译成servlet时就和包含 者融合到一起。所以file不能是一个变量,也不能在file 后接任何参数。 2.include行为是动态包含,执行时间是在请求阶段执 行,引入的内容在执行页面时被请求时动态生成再包 含到页面中。
TAGLIB指令
功能: taglib指令用来引用一个标签库或者自定义标签, 通过taglib指令可告诉容器此jsp页面将使用哪些标签库, 并可以给引用的标签库指定一个前缀,在jsp文件中使用到 这个标签库的时候,就可以使用指定的前缀来标识标签库, 语法 :<%@ taglib uri="tagLibraryURL" prefix="tagPrefix"%> uri=“tld文件所在的路径” prefix=“前缀” 例子 <%@taglib uri="/WEB-INF/标签文件名.tld" prefix="test"%>
<%! public String foo(String str) { return str; %> <%=foo(“helloword”)%> 注意: <%= %> 是输出语句,将表达式结果转换成字符串,在页面输出 表达式里不需要“;”且只能写一句
JAVA 脚本
语法 :<% java 代码;%> 例子 <% for(int i=0;i<10;i++){ out.println(“<font color=red>第”+i+”次 </font>”); } %>
JSP数据库应用开发知识点
JSP数据库应用开发:1、了解数据库的基本概念2、了解数据库mysql3、掌握在mysql中创建数据库、数据表4、熟悉sql的常用查询语句5、了解jdbc的工作原理6、掌握使用jdbc连接数据库的方法7、了解jdbc-odbc桥接8、掌握纯java驱动方式连接数据库9、掌握在web项目中创建连接数据库的工具类具体内容:1、了解数据库的基本概念:(1)数据库技术产生于20世纪60年代;(2)数据VS信息:1)数据——对客观事物描述和记载的可以鉴别的物理符号,是客观事物的基本表达;2)信息是数据的集合、含义与解释,是事物变化、特征的反映。
(3)数据库是指在计算机内按照一定形式存放、有组织、统一管理的相关数据和数据库对象的集合。
其中数据库对象是指表、视图、存储过程、触发器等。
(4)数据库管理系统:是位于用户和操作系统之间的一层数据管理软件。
它能科学的组织和存储数据、高效地获取和维护数据,并能为用户提供访问数据的方法,包括数据库的创建、查询、插入、修改和删除等。
(5)数据库系统:是指实现有组织、动态的存储大量关联数据、方便用户访问计算机硬件、软件和数据资源的系统,它主要由数据库、数据库管理系统、应用系统、数据库管理员及用户组成。
数据库系统常称为数据库。
(6)数据库分类:一句数据库管理系统的数据模型,可以分为层次数据库、网状数据库、关系数据库、面向对象数据库。
最常用的是关系数据库。
支持关系数据库的产品有:IBMDB2 Oracle Sybase Microsoft SQL Server等(7)关系数据库:是以关系模型为基础的;(8)关系模型是利用二维表格表示数据的数据模型。
(9)数据表a 也叫做关系a(10)关系的首行:叫做属性、也叫做字段、也就是关系各列的名字,属性描述了所在列的意义。
关系中每个属性都有一个取值范围,也就是这个属性的数据类型的取值范围,称为该属性的域。
(11)关系的模式:关系名和关系的属性的集合,也就是数据表的名字和数据表首行的各个字段的集合,例如数据表user,里面有三个字段id, username,userpassword,那么,关系模式是:user(id,username,userpassword)(12)记录:在关系中,字段的有序集合称为记录,记录的各个分量分别对应着关系的各个属性。
jsp学习笔记初级
MVC:JSP + +Java:复习java基础知识Jsp:JSP、PHP、 三门技术被称为Web 后端开发的3P 技术,其中JSP 依托J2EE 平台更是Web 开发领域的一枝独秀。
学好JSP,是进入J2EE 企业开发的第一步。
通过本阶段内容的学习,你将能够搭建JSP 的开发环境,了解JSP 的基本语法及内部对象的使用。
Servlet:Servlet 是Server Applet 的缩写,也称为服务端小程序。
Servlet 技术一直处于不断的发展及进步之中,现在已经成为很多框架的技术基础,比如Spring、Struts2 等。
通过本阶段课程的学习,你将了解Servlet的运行原理,Servlet 过滤器的知识并能编写出相对复杂的Java Web 程序。
Javabean:JavaBeans是一个可重复使用的软件组件JavaBeans是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称beans。
JSP页面应当将数据的处理过程指派给一个或几个beans来完成,我们只需在JSP页面中调用这个beans即可,从而有效的分离的静态工作部分和动态工作部分JDBC:JDBC 是Java 对关系型数据库进行访问的最主要的API,是Java 数据库编程的技术基础。
通过本阶段内容的学习,你能够掌握数据库的基本知识及JDBC 技术的基本原理,并能够使用JDBC编写出对数据库进行增删改查的简单程序Spring:Spring 是一个开源框架,也是一个基于控制反转、依赖注入的轻量级容器,它的出现大大简化了传统的J2EE 开发模式。
Spring 的主要优势之一就是其分层架构,该架构允许使用者自主选择任意件,同时为J2EE 应用程序开发提供集成框架。
现在,Spring 已经成为J2EE 企业开发中的标准配置。
Struts2:Spring MVC是一种基于Java的轻量级Web框架,它使用了MVC架构模式的思想,将web 层进行职责解耦,用来简化日常开发。
jsp复习要点
request对象属性的应用
1、request属性传递数据:如图
2.request属性传递数据的步骤 使用 request.setAttribute(String name,Object obj)方 法向request属性存入数据 获取一个RequestDispatcher转发实例,转发到目标资 源
1.JSP(Java Server Pages)是指在HTML中嵌入Java脚本语言, 由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本语 言命令将生成的整个页面信息返回给客户端。 2.JSP优点:跨平台,编译后执行,提高执行效率,采用java技 术,java应用广泛,学习较容易,是J2EE的十三种技术之一, 可共同构建企业应用。 (内容动态生成与静态表示分离,可重复使用的组件,简化页 面开发跨平台 ) JSP缺点:开发环境安装复杂,先装JDK,再装服务器。相对于 asp,java语言学习较困难。 3.使用场合:JSP技术解决界面显示问题 ;Servlet主要解决内 部逻辑问题
1.Servlet类的层次结构:如图 2.Servlet API的原则:
重写doGet方法来处理get请求 重写doPost方法来处理post请求 如果需要在Servlet实例化进进行初始化工作,可以重写init()方法 如果需要在Servlet被释放时进行资源清理的工作,可以重写 destroy()方法
用于对需要传递给HttpServletResponse接口中的sendRedirect()方法的URL进行 自动URL重写
2.隐藏域是用于收集或发送信息的不可见元素。当表单提交时,隐藏域会将 信息用事先设置时定义的名称和值发送给服务器 .
JSP复习教程
第四章 JSP基础入门(重点)
数据库各章记忆重点
数据库各章记忆重点第1章数据是信息的载体,信息是数据的内涵数据库的特征:数据结构化实现数据共享减少数据冗余度数据独立性统一的数据安全保护数据模型的要求:真实模拟世界能为人理解能在计算机上实现数据模型:概念模型(信息模型):实体-联系模型基本数据模型:网状模型层次模型关系模型面向对象模型数据库系统的核心和基础:数据模型数据模型三要素:数据结构数据操作(检索更新)数据约束条件PK 主关键字FK外部关键字关系模式(对关系的描述):格式为关系名(属性名1,属性名2,...,属性名n)自然连接的前提条件:二表之间存在外键约束关系完整性约束(保证数据的完整性和相容性):实体完整性:不能存在两个完全相同的记录参照完整性:必须有外键域完整性用户定义完整性数据库应用模式:客户服务器应用模式(CS)浏览器服务器应用模式(BS)第4章ole对象P74文本框(text box):记录源组合框(combo box)列表框(list box)标签(label)按钮(button)子窗体/子报表(subform/subreport)直线(line)矩形(rectangle)图像(image)图表(chart)复选框(check box):是/否值,独立控件,用对勾表示选项按钮(option group):是/否值,只能选中一个选项按钮,用点表示选项组(option group)切换按钮(toggle button)选项卡控件(tab control)页(page)分页符(page break)超链接(hyperlink)附件(attachment)绑定对象框(bound object frame)未绑定对象框(unbound object frame)窗体类型按是否绑定数据表:绑定窗体未绑定窗体按窗体表现形式:平面窗体分割窗体多项目窗体主/子窗体数据透视图窗体数据透视表窗体选项卡窗体切换面板窗体模式对话框窗体第五章报表分类:表格式报表标签式报表报表视图:报表视图布局试图设计视图打印预览视图第七章计算机基本原理:按序编写自动执行VBA结构化编程过程:进入VBE开发环境;插入模块和过程,并在过程中输入代码;运行代码,得到结果编程界面构成:工程资源管理器窗口属性窗口代码窗口(代码窗口视图:过程视图全模块视图)Ctrl+G 显示立即窗口数据类型:具有的运算确定数据取值范围确定数据在计算机类的表示方式确定Byte 字节型(0-255),boolean布尔型(2字节存储,0变成false,其他值变成true;false 变成0,true变成-1)integer整型,single单精度,double双精度,currency(货币型,声明字符@,变比整型,小数点左边15位,右边4位),date(日期型) string(串类型-变长),学号必须是字符型,默认的是variant,string*length (定长的字符串)例题:常量:一、立即窗口显示常量及对应类型1、?2print 22、?Typename(“江西财经大学”)?Typename(#2009-12-12#)二、Option explict 强制显式声明变量:变量赋值语句let【let】<变量名>=<表达式>将右赋值给左,表达式一般是常量,但也可以是变量a,b,c 结果输出后之间有空格a;b;c 结果输出后无空格函数:系统函数自定义函数举例:monthname(month(date()))Left(b,4)从左求四个字符子串函数Mid(b,3,2)从第三个位置开始,截取2个字符其中b为表达式,如“中华人民共和国”Now()系统当前时间系统函数(其后面的表达式必须有括号,无论表达式是常量还是变量)一、数值处理函数1、三角函数(tan,sin,cos,atn反正切)2、一般计算(exp(数值表达式):自然对数e的数值表达式次方,log(<数值表达式>):数值表达式的自然对数值,sqr求平方根)3、产生随机数(rnd:返回0到1之间的随机数值)4、求绝对值(abs)5、sgn(求符号函数,正号为1,符号为-1)6、取整(int,fix)二、字符函数1、大小写转换转换为大写Lcase转换为小写Ucase2、建立重复字符的字符串建立空格函数space(3)输出3个空格重复字符函数string(3,“中华人民共和国”)将中华人民共和国共和国的第一个字“中”重复3次,即输出“中中中”3、len(“中华人民共和国”):返回中华人民共和国的字符长度,结果为74、设置字符串格式Format(8315.4,“00000.00”)将8315.4转换成后面那种格式,结果输出为08315.40 Format(now,yyyy年MM月dd日hh 时mm分)将现在的时间转换为“XXXX年XX月XX日XX时XX分”的形式5、处理字符串Instr(“江西财经大学”,“财经”):财经的财在江西财经大学第3个位置,所以输出3 Left(“江西财经大学”,4):从左数截取4个字符,得江西财经Right(“江西财经大学,4”):从右数截取4个字符,得财经大学Mid(“江西财经大学”,3,2)得财经,mid(“江西财经大学”,3)未指定长度,则直到尾部,得财经大学Ltrim删除前置空格,Rtrim删除尾部空格,Trim删除前置和尾部空格,注意是尾部,而不是后置6、ASCII值与ANSI值用asc和chr三、日期函数[日期时间类型为:2013-11-22 12:13:11]返回日期或时间计算日期dateadd日期加或减一个时间间隔后的日期Datediff求指定日期间的时间间隔Datepart求日期所在旳季度、日数、周数等转换日期或时间dateserial将时分秒转换为时间类型如dateserial(2010,07,07)得2010-07-07TimeserialDatevalue(date)求日期时间类型的日期Timevalue(date)求日期时间类型的时间Weekday(date)求日期的星期数设置日期或时间Date=#2014-12-13#Time=#13:23:34#计时Timer从午夜开始到现在的秒数四、金融函数五、输入输出函数Spc(22)在当前打印位置输出22个空格符号Tab函数Msgbox函数Msgbox(提示信息,按钮,标题)Inputbox(提示信息,标题,默认值)表达式数值表达式:mod求模运算,即求余数字符表达式:& ?“江西”&“南昌”+日期和时间表达式:?#2010-02-01#- #2013-03-03# 日期差#2010-02-01#-31 前31天的日期#2010-02-01#+31 后31天的日期关系表达式:比较运算符>,<,>=,<=,<>,=Like运算符?,*,#,【A-Z】,【!A-Z 】Is 运算符逻辑表达式not and or xor(抑或,两侧不同时为true) eqv(异同,两侧结果相同时为true),imp: A Imp B=(Not A )Or B 表达式优先级:数值表达式(字符或日期表达式)>关系表达式>逻辑表达式注释符:rem或(’)续行符:-第9章对象是类的实例,对象是由属性和方法(或事件)构成的方法或事件是对象具有的某种功能,在程序代码上表现为一个过程,方法调用属于显式调用,事件调用是隐式的,通常不存在一条语句来说明事件被调用,需要用户去操作,即事件驱动接口:可以实现交互消息:类:生产多个具有相同属性和方法(或事件)的对象模板,类是对象的抽象,对象是类的实例。
jsp复习笔记——第10章 连接数据库 之 dao设计模式 - 堕落天使 - javaey
JSP复习笔记——第10章连接数据库之DAO设计模式-堕落天使- JavaEy...之前的开发可以发现以下问题:1、所有的JDBC代码写在JSP页面之中,维护困难2、JSP中不应该使用任何SQL包,即不能在JSP中直接使用java.sql.*,原因是JSP只关注于数据的显示,而不关心数据是从哪儿来,或向哪里存储3、所有的数据库操作代码最好使用PreparedStatement 区分:J2EE的组件层次客户端? 表示层? 业务层? 数据层? 数据库*.jsp/servletDAO属于J2EE数据层的操作即:在DAO中封装一个表在一个项目中所应该具有的所有的操作Java代码create table person(id varchar(32) not null primary key,name varchar(20) not null,password varchar(20) not null,age varchar(20) not null,email varchar(20) not null);create table person(id varchar(32) not null primary key,name varchar(20) not null,password varchar(20) not null,age varchar(20) not null,email varchar(20) not null);程序在变更数据库之后,前台页面不会出现过多改变?首先需要规定出整个模块之中对person表的全部操作:*增加*删除*修改* 按ID查询* 查询全部* 模糊查询按以上要求,规定出操作此张表的标准,之后只要针对于不同的数据库实现这些标准即可在JA V A中只有通过接口可以定义出标准? DAO规定的就是一个接口插入? 针对对象插入对象? VO、TO、POJO(值对象、传输对象、最根本的JA VA对象)即:只包含属性和setter、getter方法的类客户– vo ? DAOVO的对象与表中的字段对应定义好接口之后,要定义出接口的具体实现类,具体实现DAO接口中对数据库表的一切操作可以发现以下的一个重要问题:PersonDAO dao = new PersonDAOImpl();接口直接通过其子类实例化,直接的影响就是程序在调用时必须知道具体的子类,这样会造成修改不方便所以,必须使用工厂设计,是前台不关注于具体子类DAO整体设计,是采用以下模式:调用处? DAO工厂? 具体子类实现? 完成数据库操作|------------------|------------VO-----------------------|直接的好处:前台显示与后台逻辑操作分离Java代码package org.sky.darkness.factory ;import org.sky.darkness.dao.* ;import org.sky.darkness.dao.impl.* ;public class DAOFactory{public static PersonDAO getPersonDAOInstance() {return new PersonDAOImpl() ;}};package org.sky.darkness.factory ;import org.sky.darkness.dao.* ;import org.sky.darkness.dao.impl.* ;public class DAOFactory{public static PersonDAO getPersonDAOInstance() {return new PersonDAOImpl() ;}};--PersonDAO.java Java代码package org.sky.darkness.dao ;import java.util.* ;import org.sky.darkness.vo.* ;// 规定出了操作person表在此项目里的全部方法public interface PersonDAO{// 增加操作public void insert(Person person) throws Exception ;// 修改操作public void update(Person person) throws Exception ;// 删除操作public void delete(String id) throws Exception ;// 按ID查询操作public Person queryById(String id) throws Exception ;// 查询全部public List queryAll() throws Exception ;// 模糊查询public List queryByLike(String cond) throws Exception ; }package org.sky.darkness.dao ;import java.util.* ;import org.sky.darkness.vo.* ;// 规定出了操作person表在此项目里的全部方法public interface PersonDAO{// 增加操作public void insert(Person person) throws Exception ;// 修改操作public void update(Person person) throws Exception ;// 删除操作public void delete(String id) throws Exception ;// 按ID查询操作public Person queryById(String id) throws Exception ; // 查询全部public List queryAll() throws Exception ;// 模糊查询public List queryByLike(String cond) throws Exception ; }Java代码package org.sky.darkness.vo ;// 值对象,包含属性,setter,getter方法public class Person{private String id ;private String name ;private String password ;private int age ;private String email ;// 生成getter、setter方法public void setId(String id){this.id = id ;}public void setName(String name){ = name ;}public void setPassword(String password){this.password = password ; }public void setAge(int age){this.age = age ;}public void setEmail(String email) {this.email = email ;}public String getId(){return this.id ;}public String getName(){return ;}public String getPassword(){return this.password ;}public int getAge(){return this.age ;}public String getEmail(){return this.email ;}};package org.sky.darkness.vo ;// 值对象,包含属性,setter,getter方法public class Person{private String id ;private String name ;private String password ;private int age ;private String email ;// 生成getter、setter方法public void setId(String id){this.id = id ;}public void setName(String name){ = name ;}public void setPassword(String password) {this.password = password ;}public void setAge(int age){this.age = age ;}public void setEmail(String email){this.email = email ;}public String getId(){return this.id ;}public String getName(){return ;}public String getPassword(){return this.password ;}public int getAge(){return this.age ;}public String getEmail(){return this.email ;}};Java代码package org.sky.darkness.dao.impl ; import java.sql.* ;import java.util.* ;import org.sky.darkness.vo.* ;import org.sky.darkness.dbc.* ;import org.sky.darkness.dao.* ;// 此类需要完成具体的数据库操作,需要JDBC代码public class PersonDAOImpl implements PersonDAO {// 增加操作public void insert(Person person) throws Exception {String sql = "INSERT INTO person(id,name,password,age,email) V ALUES (?,?,?,?,?)" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt =dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,person.getId()) ;pstmt.setString(2,person.getName()) ;pstmt.setString(3,person.getPassword()) ;pstmt.setInt(4,person.getAge()) ;pstmt.setString(5,person.getEmail()) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 修改操作public void update(Person person) throws Exception{String sql = "UPDATE person SETname=?,password=?,age=?,email=? WHERE id=?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt =dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,person.getName()) ;pstmt.setString(2,person.getPassword()) ;pstmt.setInt(3,person.getAge()) ;pstmt.setString(4,person.getEmail()) ;pstmt.setString(5,person.getId()) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 删除操作public void delete(String id) throws Exception{String sql = "DELETE FROM person WHERE id=?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt =dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,id) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 按ID查询操作public Person queryById(String id) throws Exception{Person person = null ;String sql = "SELECT id,name,password,age,emailFROM person WHERE id=?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt =dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,id) ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;if(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return person ;}// 查询全部public List queryAll() throws Exception{List all = new ArrayList() ;String sql = "SELECT id,name,password,age,emailFROM person" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt =dbc.getConnection().prepareStatement(sql) ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;while(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象Person person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;// 将查询出来的数据加入到List对象之中all.add(person) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return all ;}// 模糊查询public List queryByLike(String cond) throws Exception {List all = new ArrayList() ;String sql = "SELECT id,name,password,age,email FROM person WHERE name LIKE ? or email LIKE ?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt =dbc.getConnection().prepareStatement(sql) ;// 设置模糊查询条件pstmt.setString(1,"%"+cond+"%") ;pstmt.setString(2,"%"+cond+"%") ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;while(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象Person person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;// 将查询出来的数据加入到List对象之中all.add(person) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return all ;}};package org.sky.darkness.dao.impl ;import java.sql.* ;import java.util.* ;import org.sky.darkness.vo.* ;import org.sky.darkness.dbc.* ;import org.sky.darkness.dao.* ;// 此类需要完成具体的数据库操作,需要JDBC代码public class PersonDAOImpl implements PersonDAO {// 增加操作public void insert(Person person) throws Exception {String sql = "INSERT INTO person(id,name,password,age,email) V ALUES (?,?,?,?,?)" ; PreparedStatement pstmt = null ; DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ; pstmt.setString(1,person.getId()) ;pstmt.setString(2,person.getName()) ;pstmt.setString(3,person.getPassword()) ;pstmt.setInt(4,person.getAge()) ;pstmt.setString(5,person.getEmail()) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}// 修改操作public void update(Person person) throws Exception {String sql = "UPDATE person SETname=?,password=?,age=?,email=? WHERE id=?" ; PreparedStatement pstmt = null ; DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ; pstmt.setString(1,person.getName()) ;pstmt.setString(2,person.getPassword()) ;pstmt.setInt(3,person.getAge()) ;pstmt.setString(4,person.getEmail()) ;pstmt.setString(5,person.getId()) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 删除操作public void delete(String id) throws Exception{String sql = "DELETE FROM person WHERE id=?" ; PreparedStatement pstmt = null ; DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ; pstmt.setString(1,id) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 按ID查询操作public Person queryById(String id) throws Exception {Person person = null ;String sql = "SELECT id,name,password,age,email FROMperson WHERE id=?" ;PreparedStatement pstmt = null ; DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ; pstmt.setString(1,id) ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;if(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return person ;}// 查询全部public List queryAll() throws Exception{List all = new ArrayList() ;String sql = "SELECT id,name,password,age,email FROM person" ;PreparedStatement pstmt = null ; DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;while(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象Person person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;// 将查询出来的数据加入到List对象之中all.add(person) ;}rs.close() ;pstmt.close() ;catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return all ;}// 模糊查询public List queryByLike(String cond) throws Exception {List all = new ArrayList() ;String sql = "SELECT id,name,password,age,email FROM person WHERE name LIKE ? or email LIKE ?" ; PreparedStatement pstmt = null ; DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;// 设置模糊查询条件pstmt.setString(1,"%"+cond+"%") ;pstmt.setString(2,"%"+cond+"%") ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;while(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象Person person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;// 将查询出来的数据加入到List对象之中all.add(person) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return all ;}};定义一个数据库连接类,她只负责数据库的连接:Java代码package org.sky.darkness.dbc ;import java.sql.* ;// 主要功能就是连接数据库、关闭数据库public class DataBaseConnection{private final String DBDRIVER ="oracle.jdbc.driver.OracleDriver" ;private final String DBURL ="jdbc:oracle:thin:@localhost:1521:SKY" ;private final String DBUSER = "scott" ;private final String DBPASSWORD = "darkness" ;private Connection conn = null ;public DataBaseConnection(){try{Class.forName(DBDRIVER) ;this.conn =DriverManager.getConnection(DBURL,DBUSER,DBPASSWO RD) ;}catch (Exception e){}}// 取得数据库连接public Connection getConnection(){return this.conn ;}// 关闭数据库连接public void close(){try{this.conn.close() ;}catch (Exception e){}}};。
Java相关课程系列笔记之10JSP学习笔记(建议用WPS打开)
JSP学习笔记Java相关课程系列笔记之十笔记内容说明JSP(程祖红老师主讲,占笔记内容100%);目录一、JSP基础 (1)1.1什么是JSP (1)1.2为什么要使用JSP (1)1.3 JSP与Servlet的关系 (1)1.4如何写一个JSP文件 (1)1.5 JSP是如何运行的 (1)1.6隐含对象 (2)1.7指令 (2)1.8 JSP注释 (3)1.9案例:创建emplist.jsp页面,将表示逻辑交给JSP处理 (3)二、JSP标签和EL表达式 (4)2.1什么是JSP标签 (4)2.2 JSTL及其使用 (4)2.3什么是EL表达式 (4)2.4 EL表达式的使用 (4)三、JSTL中的几个核心标签 (7)3.1 if (7)3.2 choose (7)3.3 forEach (7)3.4 url (8)3.5 set (8)3.6 remove (8)3.7 catch (8)3.8 import (8)3.9 redirect (8)3.10 out (8)3.11 JSP标签是如何运行的 (8)3.12案例:将员工列表中的Java代码改为JSP标签,并添加分页 (9)四、自定义标签 (10)4.1如何写一个自定义标签 (10)4.2 JavaEE5.0中,如何使用EL表达式和JSTL (10)4.3案例:自定义标签 (10)4.4案例:修改之前员工列表中的日期显示 (11)五、MVC (13)5.1什么是MVC (13)5.2使用MVC的目的 (13)5.3如何使用MVC来开发一个Web应用程序(JavaEE) (13)5.4 MVC的优缺点 (13)5.5案例:简易贷款(贷款数小于余额数*10) (13)5.6修改5.5案例,使用户无法直接访问view.jsp页面 (15)1一、JSP基础1.1什么是JSPJSP(Java Server Page)是Java服务器端动态页面技术。
JSP中数据库的使用
15
基于JDBC的登陆案例
<% try • 在登录处理页面中,通过 JDBC访问数据库,判断从 { 表单中获取的用户名和密码是否正确。 Class.forName(DBDRIVER) ;
conn = DriverManager.getConnection(DBURL,"sa", "sa",) ; stmt = conn.createStatement() ; sql = "SELECT * FROM userinfo WHERE name='"+name+"' and password='"+password+"'" ; rs = stmt.executeQuery(sql) ; if(rs.next()) { // 如果有记录,则说明用户是合法的,可以登陆 flag = true ; } conn.close() ; } catch(Exception e) {} 16 %>
PreparedStatement
• PreparedStatement 继承 Statement • PreparedStatement比Statement对象使用起 来更加灵活,效率更高
Statement 接口
当 SQL 语句将运行多次时,尽 量使用PreparedStatement,以 便提高运行效率
数据库服务器
应用服务器
数据库服务器
3
JDBC程序的工作原理
Java 应用程序
• JDBC API
– 供程序员调用的接口与类,集成在 java.sql包中,如: • DriverManager类 • Connection接口 • Statement/PreparedStatement接口 • ResultSet接口
JSP数据库开发
第6章 JSP数据库开发由于历史等原因,Internet上连接的数据库大多数在使用的硬件平台、操作系统或数据库管理系统等方面各不相同,如何对这些异构数据库进行查询和使用就成了首要问题。
JDBC (Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
有了JDBC,Java程序员就可以为不同的数据库编写相同的程序。
本章的内容,需要读者已经学习了数据库原理和SQL语言。
6.1 JDBC简介6.1.1 从ODBC到JDBCInternet上大量信息必须通过数据库系统才能有效管理。
由于历史等原因,Internet上的数据库系统不少是异构的。
为了在Internet环境下,基于异种系统平台实现对异构数据库的查询和联合使用,必须提供一个独立于特定的数据库管理系统的统一编程界面。
微软公司很早就提出了数据库访问接口标准,即开放数据库互连(Open Database Connectivity,ODBC)的概念,它建立了一组规范,并提供了一组对数据库访问的标准API (应用程序编程接口),这些API利用SQL来完成其大部分任务。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。
也就是说,不论是MySQL、SQL Server、Access还是Oracle数据库,均可用ODBCAPI进行访问。
由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
目前,Microsoft 的ODBC API 可能是使用最广的、用于访问关系数据库的编程接口。
它能在几乎所有平台上连接几乎所有的数据库。
但是ODBC 不适合直接在Java 中使用,因为它使用C 语言接口。
JSP中的高级数据库应用
Tomcat-Home/conf/server.xml配 置
数据源的名 <Context> 称 <Resource name="jdbc/mysqltest" auth="Container" type="javax.sql.DataSource" driverClassName=“com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/sql_test" username="scott" password="tiger" maxActive="20" maxIdle="10" maxWait="-1"/> </Context>
数据源使用方式
第一种方式在程序中创建类的对象,该对 象实现JDBC驱动程序中的DataSource接 口,并使用该对象获取数据库连接 第二种方式是使用JNDI注册数据源,然后 在程序中查询获取在JNDI服务中的数据 源.这样用户只需要提供一个逻辑名称,而 不是数据库登陆的具体细节
DataSource类
代码中创建一个数据源的实例,并设置数据库连 接的方式和参数,然后通过DataSource接口提 供的getConnection方法获取数据库连接.
MysqlDataSource source = new MysqlDataSrouce(); source.setDriver(); srouce.setUrl(); source.setUsername(); source.setPassword(); Connection conn = source.getConnection();
JSP个人博客系统(SQL数据库)
JSP个人博客系统(SQL数据库)摘要博客信息管理系统致力于为广大用户提供优质的互动交流平台,提高网站的知名度和访问量,从而获得为企业提供更多产品介绍及展示的机会,提升自己网站的价值。
为了满足博客信息管理系统的要求,实现系统静态与动态页面的相互分离,系统采用JSP+JavaBean+Servlet和SQL Server2000数据库相结合的开发模式。
论文首先论述了系统的开发背景和设计目标,并对系统开发所采用的技术进行相应的简单介绍。
在系统分析中,对系统的模型进行简单分析,明确系统的操作流程,并对系统进行可行性分析,确定在目前的条件下,开发博客信息管理系统是可行的。
在需求分析结果的基础上,对系统的功能模块进行划分。
接着对系统中的数据库进行模型设计,包括数据流图、实体联系图及数据表结构。
在系统的设计与实现中,确定系统的开发思想以及开发环境,并对系统中的JavaBean和Servlet代码进行设计。
最后给出了系统中模块的详细设计与实现,并对系统模块涉及到的关键源代码进行了详细的分析。
经过调试运行后表明,系统可以满足用户创建个人博客的各项要求。
关键词:MVC,设计模式,知识共享,博客信息管理系统ABSTRACTThe blog information management system is concentrates on high-quality interactive exchanges platform for a large number of users, increasing the visits and making the website more and more famous, thereby can acquiring for the opportunity that business enterprise providing more introductions and shows of products, promoting the value of the website.Satisfy for the functions of blog information management system, achieving the system's static page separate with dynamic page mutually, using JSP+ JavaBean+ Servlet with the mode ofdevelopment that the database of SQL Server2000 combine together.The paper discusses the background of development of the system and the design of the target first, and introduces the tecknique which used to develop simply.In the analyse of system, proceeded the simple analysis to the model of the system, made sure the operation process of the system, proceed the analyse to the system, ensure that under the current term, developing blog information management system is feasible. At the foundation of requirement with the analyse result, proceeding the providing of the function module of the system. Follow, designing the database model, including the data flow diagram, entity relation diagram and data tables. during the design and realization of the system, making sure the development thought of the system and install the environment of development,at last show the design details with realize finally an a key for of detailed design with realization, and analyzed the program which relate to the system module.After debugging and running ,it shows that the system can satisfy with users to create personal blog.Keywords: MVC,Design Patterns,Knowledge sharing,The Blog Information Management System目录第1章绪论 11.1 博客信息系统概述 11.2 博客发展趋势 21.3 系统开发的背景 21.4 技术路线 31.5 系统设计目标分析 3第2章基本技术方案 42.1 JSP中的各种技术 42.1.1 JSP概述 42.1.2 SERVLET概述 42.1.3 JAVABEAN概述 52.2 基于B/S的WEB应用体系结构 5 2.2.1 传统的两层体系结构 52.2.2 三层体系结构 62.2.3 JSP网站开发模式 62.3 ECLIPSE简介 72.4 TOMCAT简介 72.5 SQL SERVER简介 82.6 MVC设计模式 8第3章系统分析与总体设计 103.1 系统需求分析 103.1.1 用户需求分析 103.2 数据分析 113.3 系统流程 113.4 功能模块划分 143.5 功能模块介绍 153.5.1 博客注册登录管理模块 153.5.2 博客及文章检索查询模块 153.5.3 博客页面显示模块 163.5.4 博客个人维护管理模块 16 第4章系统详细设计 174.1 数据库分析 174.1.1 数据库设计E-R图 174.2 系统数据表设计 204.3 数据连接 23第5章系统功能的具体实现 24 5.1 系统的主窗口 245.2 公共核心类的设计 265.2.1 数据库相关 265.2.2 编写JAVABEAN类 28 5.2.3 管理类设计 295.3 系统主要功能模块详述 31 5.3.1 博客管理员登陆模块 31 5.3.2 日志管理显示模块 325.3.3 撰写日志模块 355.3.4 删除日志模块 365.3.5 修改日志模块 385.3.6 日志搜索模块 39结论 40参考文献 41致谢 42第1章绪论1.1 博客信息系统概述“博客”(Blog或Weblog)一词源于“Web Log(网络日志)”的缩写,是一种十分简易的傻瓜化个人信息发布方式。
jsp笔记
JSP 学习笔记 8.18.2012 1. JSP 简介 1)JSP 全称是 Java Server Pages——java 服务页面。
jsp 最终是翻译为 servlet 使用的。
2)Jsp 是一种动态 web 资源开发技术:因为 jsp 中允许编写 java 代码,并且允许获取 request、response 等常用 web 开发对象,实现与浏览器交互,所以称 jsp 为动态 web 资源开发技术。
3)jsp 实例 1:输出当前时间(day0812) 分析:jsp 会转为 servlet 去执行,其中 jsp 页面中的 html 元素会在 service 方法中 的 out.write()中输出,而其中的 java 代码将原样呈现为 java 代码。
2. JSP 最佳实践 Servlet 作为 web 应用中的控制器组件,jsp 作为数据显示模版。
IE 将请求发给 servlet,servlet 处理数据以后通过请求转发(forward)技术转发到 jsp 做显示输出。
此时 servlet 及其转向的 jsp 页面共享同一个请求,在 servlet 中通 过 req.setAttribute(“data”);将数据传给 request 域,然后再 forward 就可以将 request 转发过去。
3. Jsp 语法 1)Jsp 模版元素 jsp 页面中的 html 内容,定义了网页的结构和外观。
2)jsp 脚本表达式(expression)用于将程序数据输出到客户端 语法:<%=变量或表达式 %> Jsp 中向页面输出数据的方法: 使用 jsp 的内置对象 out 输出:out.write(date); 使用脚本表达式输出:<%=date %> 3) jsp 脚本片段(scriptlet)用于在 jsp 页面中嵌入多行 java 代码。
语法: <% 多行 java 代码 %> 多个脚本片段中的代码可以互相访问。
09JSP中使用数据库
executeUpdate(“DELETE FROM <表名> WHERE <条件子句>' ");
executeUpdate("DELETE FROM product WHERE number = '888' ");
学习目标
知识点:掌握怎样在JSP中使用JDBC实现数据库的 连接、查询、修改等操作。
重点:掌握连接数据库的常用两种方式:JDBCODBC桥接器方式和加载纯Java数据库驱动程序方 式。
难点:怎样实现数据库表的分页查询。 关键实践:编写jsp页面,使用JavaBean实现数据
库表的分页查询。
重点介绍
信。
本地API和Java驱动 这类驱动程序使用JDBC驱动程序和
程序(JDBC-Native 厂商提供的专用API的混合形式来
API Bridge)
访问数据库
Java驱动程序-中 使用一个独立于数据库的协议将翻
间件(JDBC-
译的JDBC请求发送给一个服务器中
middleware)
间件,该中间件将JDBC请求转换为
ResultSet rs=sql.executeQuery(“SELECT * FROM 表名”);
ResultSet对象使用next()方法一次看到一个数据行,用getXxx (索 引或字段名)方法获取字段值。
注: P139 注意内容。
ResultSet接口的常用方法:
方法名称
next() previous() first()/beforeFirst() last()/afterLast() absolute() relative() getRow()
jsp笔记
1.Jsp(Java Server Page)和Servlet的关系相同点: 都是web组建,需要web容器进行管理,需要web Server(web服务器)运行,且本质上Servlet和jsp具有完全相同的功能.差异: 语法结构不同,Servlet是java class,而jsp更类似于html的结构;结构不同导致两者擅长实现的功能不同,在实际应用中,应将两者分别应用于其擅长的领域Servlet能做的东西jsp都能做,Servlet没有主函数,但是还是class,擅长逻辑方面的控制Jsp类似于html,把java代码嵌到html里面,擅长做页面两者关系: 配合,协作,共同实现2.Mvc模型1: jsp+javabeanJavabean完成操作(业务逻辑)和数据保存,jsp实现显示逻辑和控制逻辑该模型用于控制逻辑简单的小型应用注:javabean是有一定要求的java类可能代码量多一点模型2: jsp+Servlet+javabeanJavabean完成操作(业务逻辑)和数据保存,jsp实现显示逻辑和控制逻辑,Servlet实现控制逻辑,该模型用于控制逻辑相对复杂的中大型应用操作步骤:以登陆操作为例1)客户端请求提交给Servlet客户端login.html将数据(username,password)提交给LoginServlet2)Servlet调用javabean完成具体操作LoginServlet获取客户端传递的参数,并使用该参数调用DAO的Boolean check(String username,String password)进行登陆验证3)Servlet如果需要传递数据到jsp,通常使用Attribute进行传递,范围根据需求决定注:通常都有该请求传递的数据多为javabean对象如果登录失败,不传递数据如果登录成功,创建User对象,并将User 对象使用Session级的Attribute传递给jsp4)Servlet跳转到jsp页面登录失败,跳转到login.html登录成功跳转到Welcome.jsp5)Jsp获取Servlet传递的信息并填入页面中完成显示使用<jsp:useBean>获取保存的Session中的User对象,根据该User对象中的信息显示欢迎信息动态:可以跟客户进行交互.3.开发1)工程中的位置与html文件存放位置相同2)扩展名为.jsp3)语法实现:将java代码按照一定得规则嵌入html页面中注:扩展名决定其类型,即使没有嵌入任何java代码,在服务器进行处理时也将按照jsp 的方式进行4)部署后,在服务器中的位置与html文件存放的位置相同,且不存在任何转换操作.5)浏览器访问路径包含协议,服务器地址和端口,web应用和jsp文件http://localhost:8888/jsp_jd0902/hello.jspServlet的后面的路径是假的路径Jsp是真路径6)服务器处理方式A.Html访问时直接访问web应用下的html文件,将内容发送给客户端http://localhost:8888/jsp_jd0902/hello.htmlB.Jsphttp://localhost:8888/jsp_jd0902/hello.jspE:\java\tomcat\jakarta-tomcat-5.0.28\work\Catalina\localhost\jsp_jd0902\org\apache\jspstep1: 服务器将jsp文件转换为Servlet(.java )step2: 服务器编译转换后的Servlet(.java)step3: 服务器加载编译后的class文件step4: 服务器将class文件的响应结果发送给客户端,其实质为调用该Servlet的_jspService()方法,JSP的访问没有Get和Post的区别注1:转换和编译后文件存放位置在tomcat根目录\work,java文件命名为: JSP文件的文件名_jsp.javafinal类不被继承的类注2: step1---step3只在jsp文件第一次被访问或jsp文件被修改时执行一切以结果来说话4.基本语法1)指示标记<%@....%>用于对页面内容进行说明,常用的有<%@page…%>,<%@include...%>转换后的位置由具体指示决定2)定义标记<%!...%>用于定义Servlet中的属性或方法转换后位置在Servlet的类中3)表达式标记<%= …%>用于将表达式的内容显示在网页中转换后位置在Servlet的_jspService()的out.print(…);的参数4)脚本标记<%...%>用于写入普通java代码转换后位置在Servlet的_jspService()中5.指示标记1)<%@include file=”相对路径”%>将file参数指定的文件内容包含到当前文件的指定位置2)<%@page 属性名=属性值...%>用于对当前JSP文件的页面特性和访问特性进行指定主要属性如下:nguage=”嵌入代码的语言”,默认为java,目前只支持javaB.extends=”转换后的Servlet继承的父类”,默认转换后的父类是org.apache.jasper.runtime.HttpJspBase,不建议重新制定C.(常用)inport=”导入的包,….”,制定Servlet需要导入的包,导入很多的话中间用逗号隔开D.session=”是否支持会话”,默认值是trueE.buffer=”缓冲区设置”,默认为8kb,可指定数字表示缓冲区大小,如16表示16k,也可指定none表示没有缓冲区(不建议,会大幅降低效率).该缓冲区用于向客户端响应时保存响应信息F.autoFlush=”当缓冲区满时是否自动将内容写到客户端”,默认为true,通常不修改该属性值G.isThreadSafe=”当前JSP文件是否线程安全”,默认为true,表示允许多线程并发访问,效率高.如果代码无法做到线程安全,则应将该属性设置为FALSE,则web server将以SingleThreadModel方式操作该Servlet,效率影响很大=”描述信息”,用于指定jsp的信息,可使用getServletInfo()方法获得(没用)I.(常用)isErrorPage=”当前jsp页面是否为错误处理页面”,默认为FALSE,如果指定为true,在转换为Servlet代码时有附加的内容,用于错误处理J.(常用)errorPage=”当前页面对应的错误处理页面”,没有默认值,被指定为错误处理页面的jsp文件的isErrorPage属性值必须为true,否则将出错K.(常用)contentType=”响应的内容类型和编码方式”,默认值为”text/html;charset=环境默认值”L.(常用)pageEncoding=”jsp文件页面(内容)的编码方式”,默认值决定于系统的开发工具,中文编码方式为”GBK”gb2312是gbk的子集M.(常用)isELIgnored=”是否忽略EL语言”,默认值决定于web.xml的版本注:EL为1种表达式语言6.JSP的访问模型与Servlet相同,采用单实例多线程模型,即无论有多小个客户端访问,只创建1个Servlet 实例,每个客户端以线程方式调用_jspService()7.Servlet的SingleThreadModel模型Servlet可以实现SingleThreadModel接口使其变为单实例单线程的操作模式,可以保证线程安全性,但执行效率将会明显下降…peprecated 不赞成使用的8.Jsp解决线程安全目的: isThreadModel的值必须为true方法: 不使用实例变量,如果必须使用,在合理的位置对最少的代码使用synchronized进行并发访问控制,使对效率的影响降到最低9.常用Jsp标记1)<jsp:include>用于执行文件包含,在包含时可以选择是否需要传入参数该操作相当于Servlet中的RequestDispatcher的include()注:<%@include file=”...”%>无法传入参数语法—不传参<jsp:include page=”被包含的文件”/>语法—传参,每个参数对应1个<jsp:param>标记<jsp:include page=”被包含的文件”>< jsp:param …/>…</ jsp:include >如果被包含的是jsp文件,则被包含文件的<%@page%>操作应独立指定,与包含文件无关;对于html结构,包含文件和被包含文件是整体结构,被包含文件允许为html代码片段Jsp是命名空间的前缀Include标记Page标记值2)<jsp:forward>用于执行资源跳转,在跳转时可以选择是否需要传入参数该操作相当于Servlet中的RequestDispatcher的forward()语法---不传参< jsp:forward page=”跳转的目标文件”/>语法---传参,每个参数对应1个<jsp:param>标记< jsp:forward page=”跳转的目标文件”>< jsp:param …/>…< /jsp:forward>3)<jsp:param>用于在<jsp:include>和<jsp:Forward>操作时传递参数语法:<jsp:param name=”参数名” value=”参数值”/>获取参数的方式为request.getParameter(“参数名”)4)<jsp:useBean>用于创建JavaBean对象语法:<jsp:useBean id=”引用名称”scope=”对象范围”class=”对象类型”type=”引用类型”/>Class和type必须指定全名,与jsp文件是否执行import无关对象范围默认值为page,可用值为page,request,session和application,其中application 相当于ServletContext引用类型如果不指定,默认与对象类型一致User u=new User();Map m=new HashMap();5)<jsp:setProperty>用于为对象赋值,相当于调用set方法语法(形式1):<jsp: setProperty name=”对象引用” property=”property名称” param=”参数名称”/>操作: 对象引用. setProperty名称(request.getParameter(参数名称));语法(形式2):<jsp: setProperty name=”对象引用” property=”property名称” value=”需要赋的值”/>操作: 对象引用. setProperty名称(需要赋的值);注:需要赋的值可以使用表达式标记语法(形式3):智能匹配<jsp: setProperty name=”对象引用” property=”*” />操作: 对象引用的所有property都可以执行set方法,前提是存在同名的parameter,就是提交的参数的名称和property的名称一样6)<jsp:getProperty>用于取出对象的property值并输出到浏览器语法:<jsp:getProperty name=”对象引用” property=”property名称”/>操作:对象引用.getProperty名称(),将返回结果输出到浏览器10.Jsp文件中的注释1)Html注释语法:<!—注释内容-->注: 在注释内容中可以使用jsp的表达式作用范围: 存在于jsp源文件,转换后的Servlet源文件,编译后的Class文件并被发送到客户端用途:需要给客户端阅读的注释内容2)Jsp注释语法:<%--注释内容--%>作用范围:只存在于jsp源文件用途:对jsp文件本身的说明3)Java注释语法: 在定义标记和脚本标记中使用<%! /*注释内容*/%>,<%//注释内容%>等作用范围:存在于jsp源文件,转换后的Servlet源文件用途:对嵌入的java代码的说明11.Javabean1)定义:规范化得java类,有一定的实现规则2)标准化规则A.实现序列化接口(需要被序列化/反序列化时必须实现)B.所有属性为private权限C.规范化属性命名(第一个单词小写,从第二个单词起首字母大些)D.根据逻辑要求提供public权限的get和set方法,方法命名规范化,如name实行对应的方法为getName()和setName()E.存在无参构造器注意:其中D和E在任何情况下必须实现3)Property的概念:通常与属性混淆,其本质与属性有区别,但如果使用标准化命名方式,在使用时是相同的命名规则为:get和set方法去除get/set的部分,并将首字母变为小写/*该类存在一个property,名为id可读可写,age只能读取*/public class User{private int id;private int age;public User(){}public int getId(){return id;}public void setId(int id){this.id=id;}Public int getAge(){Return age;}}4)存放位置:与Servlet相同,在工程的src目录中5)在jsp中的使用方式1:在脚本标记中使用java代码的方式创建对象,调用get和set方法进行操作等,在使用时应保证已进行import方式2(推荐):使用jsp标记实现创建,get,set行为<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty><jsp:useBean>的操作逻辑:根据scope决定是否需要创建对象,步骤如下:A.判断指定范围中是否存在有效可用的对象判断标准:对象类型,对象引用,范围.getAttribute(“对象引用名”)如果返回对象存在且可用,则认为存在有效可用的对象如:<jsp:useBean id=”u” class=”er” scope=”session”/>则判断Session.getAttribute(“u”)返回的是否为User对象,是就直接使用,不是则创建对象并使用B1. 如果存在有效可用对象,直接使用该对象(不创建对象)B2. 如果不存在有效可用的对象,创建对象12.Jsp的异常处理1)对于jsp中产生的异常(包含jsp使用的javabean产生的异常),如果没有进行处理将会在客户端浏览器显示错误信息2)浏览器中显示的错误信息对开发者有一定价值,可以参照进行代码调试,所以在开发阶段可以不进行异常处理;但正式运行后,应显示给客户端更友好的错误信息,应对可能产生的异常进行处理3)处理方式(c和d是在正式运行后较常用的处理方式)A.在jsp的定义标记和脚本标记中使用try…catch进行处理B.在javabean的代码中使用try…catch进行处理C.在jsp中定义错误处理页面进行处理示例:Index.jsp需要在产生异常时由error.jsp进行处理Index.jsp<%page errorPage=” Index.jsp”%>Error.jsp<%page isErrorPage=”true”%>操作:当Index.jsp中产生任类型的异常时,跳转到error.jsp进行处理定义isErrorPage=”true”的页面存在1个名为exception的对象,该对象保存产生异常的页面所产生的异常对象在jsp页面中,可在表达式标记和脚本标记中使用该对象在jsp页面中产生的异常,exception对象将保存真正的异常类型;在javabean中产生的异常,exception对象将保存jsp中的异常包装类org.apache.jasper.JasperException对象,该对象的实现原理与ServletException类似跳转方式为服务器内部跳转,错误处理页面可以使用产生异常的页面的所有Request或更大范围的所有信息如果是内部跳转的话地址栏的不变,外部跳转就变D.在web.xml中配置错误处理页面进行处理原理:在web.xml的配置信息指定根据错误类型或异常类型分别跳转到不同的错误处理页面错误类型: 浏览器的错误分类,常用的有404(页面没有找到)和500(服务器内部错误,所有运行时产生的异常都属于该类型)等异常类型: java异常类型如ng.NumberFormatException配置方式: 在<web-app>下配置<error-page>,每个对应1个错误处理页面根据错误类型跳转包含以下子标记<error-code>浏览器错误号</error-code><location>错误处理页面(绝对路径)</location>注:绝对路径以”/”开头,表示web应用的根根据异常类型跳转包含以下子标记<exception-type>异常类型全名</exception-type><location>错误处理页面(绝对路径)</location>注意事项:A.如果两种配置都存在且都符合,异常类型方式优先B.Javabean中产生的异常被包装处理,所以无法匹配定义的真正的异常类型C.与errorPage方式不重复使用D.跳转方式为服务器内部跳转E.对web应用中的所有jsp页面都有效,且本身具有根据错误类型和异常类型分别处理的功能,在应用中使用最广13.Jsp内建对象1)定义:在jsp的脚本标记和表达式标记中,存在8+1个不需要定义即可直接使用的对象,称为jsp的内建对象2)本质:内建对象是_jspService()的局部变量,在方法中定义3)列表a.pageContext 表示page范围,类型为PageContextb.request(常用) 表示Request范围,也表示客户端发起的请求,类型为HttpServletRequestc.session (常用) 表示Session范围,类型为HttpSessiond.application (常用) 表示web应用范围,类型为ServletContexte.response(常用) 表示对客户端的响应,类型为HttpServletResponsef.out(常用) 用于向客户端输出内容,类型为JspWriterg.config 与Servlet (由jsp转换生成的Servlet) 对应,保存Servlet的部分信息,类型为ServletConfigh.page 值为this,表示当前Servlet对象,类型为Objecti.exception (只有isErrorPage=”true”的jsp存在该变量)表示页面中产生的异常,类型为Throwable14.环境1)开发环境: 用于开发的文件框架结构,通常由开发工具决定,不同的开发工具的开发环境的文件结构不同,jsp,Servlet,Html等内容的实现都在开发环境下进行2)运行环境: 在运行时的文件框架结构,由运行的服务器决定,不同的服务器的运行环境的文件结构不同,其文件结构与开发环境没有必然的联系3)部署:将开发环境中的内容按运行环境的要求放入运行环境中,通常使用开发环境工具中的部署工具进行15.4个范围1)Application 表示web应用,文件结构上对应webapps下的1个文件件,该文件夹中的所有内容共同组成1个web应用,该对象在整个web应用的使用中只存在1个,在web应用启动时创建2)Session 表示会话,也就是1个客户端对1个web应用中资源的若干次访问.关系:1个application对应多个Session客户端的判断决定于浏览器IE浏览器---使用普通方式打开,每个浏览器表示1个客户端;使用1个浏览器中的连接打开另一个浏览器,两个浏览器表示相同的客户端FireFox-------在1台机器上打开任意数量的浏览器都表示相同的客户端注:关于客户端的判断可随浏览器版本更新而改变3)Request 表示请求,也就是从客户端发起请求开始到获得服务器响应为止的一个过程,在该过程中操作的所有资源都属于1个请求关系:1个session对应多个Request4)Page 表示资源,也就是当前正在访问的jsp或Servlet关系:1个Request对应多个page5)范围内信息的传递媒介-----AttributeA.4种范围都存在1个可读可写的信息传递机制(Attribute)B.操作方式创建/修改信息范围.setAttribute(“信息名”,信息内容);获取信息范围.getAttribute(“信息名”);返回对应的信息内容,如不存在该信息名返回null删除信息范围.removeAttribute(“信息名”);删除指定的信息名和其对应的信息内容C.范围之间存在包含关系,范围的信息之间互相独立,没有任何关系D.应用示例在购物系统中的购物车应在什么时候执行初始化操作?初始化后怎么操作才能使所有需要使用购物车的页面都能使用?解决方法:在Session创建时创建购物车,并将购物车对象存入Session范围的Attribute中,需要使用时可以调用getAttribute()获取购物车对象代码实现:创建对Session的Listener,监听Session的创建和销毁,创建时执行上述解决方案,销毁时执行创建时的反操作16.Jsp标记1)基本概念: 在jsp页面中,可以按照一定的语法要求,以xml的格式使用特定的功能,称为使用标记进行jsp操作2)本质: 每个标记都是1个独立的java类,通过配置文件(.tld文件)定义使用规则,按照规则使用即可执行对应类的功能3)分类:A.预定义标记:在web组建使用时可以直接使用的标记,其类的定义和配置操作在web server中已完成如: <jsp:useBean>,<jsp:Forward>B.自定义标记:先实现java类并对配置文件进行配置,然后才能在jsp页面中使用a.完全自定义: 复杂程度很高,通常开发人员不使用该方法定义标记b.使用专业人员定义好的标记库,最常用的标记库为jstl使用方法: 将标记库(通常为jar文件)放入web server中即可使用,jar文件包含类定义和配置文件17.Jsp文件的优化目前对jsp代码优化的标准为:不存在任何定义标记,表达式标记和脚本标记---在jsp页面中消灭jsp的语法解决方案:1)必须按照mvc模型开发2)使用jsp自定义标记实现页面中的java功能18.表达式语言(EL)1)功能: 用于表示表达式中内容,对页面而言功能与jsp的表达式标记基本相同,但在标记库中大量使用2)基本语法符号:${表达式内容}注:在jsp页面中使用时功能相当于<%=表达式内容%>3)语法:A.如果不需要表达式语言生效,使用”\”如:\${1}表示在页面上显示${1}B.EL中只有1种数字类型,该类型保存方式类似于double,但显示时,如果没有小数部分则不显示C.EL没有字符类型,只有字符串,字符串可以使用比较运算符比较大小(> >= < <=),结果规则按照字典顺序;如果字符串和数字进行比较,则先将数字转换为字符串后再比较D.显示javabean中的属性信息格式1(常用): ${对象引用名.Bean的Property名}注: ${er}相当于<%user.getUser()%>格式2: ${对象引用名[“Bean的Property名”]}E.EL存在内建对象可以直接使用i)Param表示客户端提交的参数信息获取客户端参数的语法格式1(常用): ${param.参数名}注:${param.password}相当于<%=Request.getParameter(“password”)%>格式2:${param[“参数名”]}ii)p ageScope|requestScope|sessionScope|applicationScope分别表示jsp的4个范围获取Attribute的语法:表示范围的内建对象.Attribute名19.JSTL1)预备工作:将jstl.jar和standard.jar放入tomcat安装目录\common\lib,并在工程中导入这两个包.2)Jstl是1个庞大的标记库,拥有多类标记,如核心库,xml操作库,数据库操作库等,通常使用的绝大部分为核心库中的标记3)核心库的常用的标记注:核心库标记通常使用前缀”c”,但需要时也可以修改前缀名A.<c:set><c:set var=”变量名” value=”变量值”/>将变量值赋给变量名<c:set value=”值”target=”javabean的引用名(EL)”Property=”被设置的Property名”/>将值赋给指定对象的指定PropertyB.<c:out><c:out value=”需要输出的信息,通常使用EL表达式”/><c:out value=”需要输出的javabean信息(EL)”/>注:i)当没有指定操作范围时,将会从小到大依次查找,直到找到符合的变量.ii)当输出的变量可能不存在时,使用default属性,该属性表示如果变量不存在,则输出default的属性值C.<c:remove>作用: 删除4个范围的Attribute<c:remove var=”Attribute名” scope=”范围名”/>操作:范围.removeAttribute(“Attribute名”)<c:remove var=”Attribute名”/>操作: 将4个范围的名称匹配的Attribute全部删除D.<c:if><c:if test=”判定表达式(EL)” var=”保存判断结果的attribute名” scope=”范围”/> 操作:将判定结果保存在制定范围的制订的Attribute中<c:if test=”判定表达式(EL)”>内容</c:if>操作:当判定表达式结果为true时执行内容1次E.<c:choose>相当于switch,但没有switch的限制,可以实现所有的判定结构<c:choose><c:when test=”判定表达式(EL)”>内容</c:when>/*可以包含多个<c:when>*/<c:otherwise>内容</c:otherwise></c:choose>操作:依次执行<c:when>的判定表达式,如果为true则执行内容1次,执行后操作结束;如果所有<c:when>的判定表达式都为FALSE,则执行<c:otherwise>的内容1次F.<c:forEach>用于执行循环结构<c:forEach ar=”循环变量名”begin=”循环变量初始值”end=”循环变量最大值”stop=”循环变量增加值,默认为1”>循环代码</c:foreach>操作:根据循环变量反复执行循环代码<c:foreachvar=”存储从集合中取出来的对象名的变量名”items=”需要迭代的集合对象(EL)”start=”起始索引,默认为0”end=”最大索引,默认为不限制”step=”索引增加值,默认为1”varStatus=”保存集合状态的变量名”>循环代码</c:foreach>操作:迭代指定的集合,将集合中的每个元素取出保存在变量中,然后对每个元素执行循环代码1次注:集合状态包括Index 索引,从0开始Count 元素数量First 是否为第一个元素Last 是否为最后一个元素4)配置信息在jsp页面中需要对自定义标记进行使用时,必须使用指示标记进行定义,语法如下<%@ taglib uri=”标记库的URL,为指定值”prefix=”使用前缀,对标记的功能没有影响”%>练习:使用jsp实现猜数字游戏1.包含表单,用于输入所猜数字并提交2.提交到jsp文件用于判断猜的数字与目标值是否匹配(目标值在0—100之间,有随机数产生),如果匹配输出相应信息(包含猜测次数),如果不匹配则显示表单并提示所猜数字与目标值的大小,直到猜对提示: 可用1个jsp文件完成所有功能注:不需要考虑线程问题,假设只有一个客户端在进行猜数字的操作3.修改猜数字游戏的实现方式,创建javabean实现逻辑操作,逻辑操作包括生成猜的目标数字,判断所猜的数字与目标数字是否相同等,在jsp页面中不再进行逻辑操作,改为调用javabean中的相应方法实现.修改目标:尽量减少jsp中嵌入的java代码Estore(网上购书系统)的实现1.建立数据库2.创建工程estore(Web Project)1)加载数据库驱动包2)导入Hibernate组建3)将demo目录下的html文件改名后放入WebRoot目录,用于实现显示模块4)将code目录下的com文件夹放入src目录5)完成注册和登录功能。
JSP与数据库
(7)查询结果排序
在查询表中数据时,特别是表中数据较多时, 在查询表中数据时,特别是表中数据较多时, 总是希望表中的数据能够按照我们要求的顺序 显现出来,利用Order By就可以实现 例如, 就可以实现。 显现出来,利用Order By就可以实现。例如, 将查询结果按姓名升序排列: 将查询结果按姓名升序排列: Select * From users Order By real _ name ASC
1.2 Insert语句
Insert Into表(字段1,字段2,…)Values(字段1的 Into表 字段1 字段2 …)Values(字段 字段1 字段2的值, 值,字段2的值,…) 下面举一些常见的例子说明。 下面举一些常见的例子说明。
(1)只插入user_name字段 只插入user_name字段
Insert Into users (user_name) Values ("liya")
(2)只插入user_name和real_name字段 只插入user_name和real_name字段
Insert Into users (user_name , real_name) Values ("feiyun", "费云") "费云 费云")
下面举几条经常出错的Insert语句。 下面举几条经常出错的Insert语句。 语句 (1)user_name 是主键,但没有赋值 是主键, Insert Into users (real_name) Values ("涂涂") ("涂涂 涂涂") (2)real_name 字段不允许空字符串,却赋了 字段不允许空字符串, 空字符串(两个双引号表示空字符串) 空字符串(两个双引号表示空字符串) Insert Into users (user_name, real_name) Values ("tutu" "") (3)字符串字段两边没有加双引号 Insert Into users (user_name, real_name) Values ("tutu",涂涂) ("tutu",涂涂)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《JSP笔记》之十第七章JSP中使用数据库在本章中,我们使用SQL Server 2000数据库管理系统。
特别约定,建立新的数据库名为:student,在其下创建表:表1:student;表2:login 。
§7.1 SQL Server 2000数据库管理系统§7.2 JDBCJDBC是Java数据库连接API,它由一些Java类和接口组成。
在JSP中可以使用JDBC 实现对数据库中表记录的查询、修改、插入和删除等操作。
JDBC技术在JSP开发中占有很重要的地位。
经常使用JDBC进行如下操作:1.与一个数据库建立连接2.向已连接的数据库发送SQL语句3.处理SQL语句返回的结果§7.3 数据库连接的常用方式应用程序必须首先与数据库建立连接。
本节介绍常用的两种连接方式:建立JDBC-ODBC桥接器和加载纯Java数据库驱动程序。
§7.3.1 JDBC-ODBC桥接器使用JDBC-ODBC桥接器方式与数据库建立连接,要经过:创建ODBC数据源――>建立JDBC-ODBC桥接器――>和ODBC数据源指定的数据库建立连接共3个步骤。
1.创建ODBC数据源:步骤见教材,这里规定:数据源名:student,数据库名:student, 用户名:sa 密码:sa。
2.建立JDBC-ODBC桥接器为了连接student数据源的student数据库,首先要建立一个JDBC-ODBC桥接器:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);这里,Class是包ng中的一个类,该类通过调用它的静态方法forName加载sun.jdbc.odbc包中的JdbcOdbcDriver类来建立JDBC-ODBC桥接器。
建立桥接器时可能发生异常,因此捕获这个异常。
所以建立桥接器的标准语句是:try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);}Catch(ClassNotFoundException e){out.println(e)}3.与ODBC数据源指定的数据库建立连接编写连接数据库的Java代码不会出现数据库的名称,只能出现数据源的名字。
先使用java.sql包中的Connection类声明一个连接对象,然后再使用类DriverManager调用它的静态方法getConnection创建这个对象:Connection con=DriverMagager.getConnection(“jdbc:odbc:数据源名字”,”login name”,”password”);其中login name 和password 是建立数据源时所使用的用户名和密码。
建立连接时应捕获SQLException异常:try{Connection con=DriverManager.getConnection(“jdbc:odbc:student”,”sa”,”sa”);}catch(SQLException e){out.println(e);}这样就与数据源student建立了连接。
应用程序一旦与某个数据源建立连接,就可以通过SQL语句与该数据源所指定的数据库中的表交互信息,如查询、修改、更新表中的记录。
下例中是一个简单的JSP页面,该页面中的Java程序片代码负责连接到数据源student,查询该数据源中的数据库student中的表student的全部记录。
例1用JDBC-ODBC连接数据库,并显示表student中的全部记录。
chap9-1(odbc).jsp<%@ page contentType="text/html;charset=GB2312" %><%@ page import="java.sql.*" %><HTML><BODY><%Connection con;Statement sql;ResultSet rs;try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundException e){out.println(e);}try {con=DriverManager.getConnection("jdbc:odbc:student","sa","sa");sql=con.createStatement();rs=sql.executeQuery("SELECT * FROM student");%><Table Border bgcolor="#CCFFFF"><TR><TH width=100><font face="宋体">学号</font><TH width=100><font face="宋体">姓名</font><TH width=50><font face="宋体">学分</font></TR><%while(rs.next()){%><TR><TD ><div align="center"><%=rs.getString(1)%></div></TD><TD ><div align="center"><%=rs.getString(2)%></div></TD><TD ><div align="center"><%=rs.getInt(3)%></div></TD></TR><% }%></Table><% con.close();}catch(SQLException e1) {}%></BODY></HTML>§7.3.2 使用纯Java数据库驱动程序方式实现连接用Java语言编写的驱动程序称为纯Java驱动程序。
简单地说,JDBC可以调用本地的纯Java驱动程序和相应的数据库建立连接。
这种连接数据库方式要经过2个步骤:加载纯Java驱动程序->与指定的数据库连接。
1.加载纯Java驱动程序:这种方式下不需要设置数据源,由于不依赖于ODBC,使得应用程序具有很好的移植性。
目前,许多数据库厂商都提供了自己的相应的纯Java驱动程序。
当使用纯Java驱动程序访问数据库时,必须要保证在连接数据库的应用程序所驻留的计算机上安装相应DBMS提供的纯Java驱动程序。
比如,Tomcat服务器上的某个Web应用程序想访问SQKServer2000数据库管理系统所管理的数据库,Tomcat服务器所驻留的计算机上必须要安装SQLServer 2000提供的纯Java驱动程序。
我们这里,使用的是MS SQL Server 2000数据库管理系统。
所以需要把该厂商提供的jar包:mssqlserver.jar、msutil.jar、msbase.jar挎贝到Java的jre\lib\ext中,或复制到Tomcat 服务器安装目录的文件夹的common\lib中。
准备好了后,加载纯Java驱动程序:try{Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).newInstance();}catch(Exception e){out.println(e);}2.和指定的数据库建立连接假设应用程序要与SQL Server 数据库服务器管理的数据库student建立连接,而有权访问数据库student的用户的id和密码分别是sa、sa,那么建立连接的代码如下:try{String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=student”;String user=”sa”;String password=”sa”;con=DriverManager.getConnection(url,user,password);}catch(SQLException e){out.println(e);}下面的例子是采用纯Java数据库驱动程序方式来实现上一个例题的例子。
例2使用纯Java数据库驱动方式显示表中的全部记录chap9-2(jdbc).jsp<%@ page contentType="text/html;charset=GB2312" %><%@ page import="java.sql.*" %><%@ page import="java.util.*"%><HTML><BODY><%Connection con;Statement sql;ResultSet rs;try{Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();}catch(Exception e){out.print(e);out.print("***************");out.print("<br>");}try{String url;url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=student";String user="sa";String password="sa";con=DriverManager.getConnection(url,user,password);sql=con.createStatement();rs=sql.executeQuery("SELECT * FROM student");%><CENTER><TABLE border="" bgcolor="#74bbc0"><TBODY><TR><TH width="100">学号</TH><TH width="100">姓名</TH><TH width="50">学分</TH></TR><%while(rs.next()){%><TR align="center"><TD><%=rs.getString(1)%></TD><TD><%=rs.getString(2)%></TD><TD><%=rs.getInt(3)%></TD></TR><%}%></TBODY></TABLE></CENTER><%con.close();}catch(SQLException e1){out.println(e1);}%></BODY></HTML>§7.3.3 关闭与数据库的连接当程序不再使用与数据库的连接时,应使用Connection对象的close方法关闭与数据库的连接。