j2ee资料ppt.docx
- 文档编号:9249945
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:9
- 大小:21.71KB
j2ee资料ppt.docx
《j2ee资料ppt.docx》由会员分享,可在线阅读,更多相关《j2ee资料ppt.docx(9页珍藏版)》请在冰豆网上搜索。
j2ee资料ppt
HTTP协议无状态性
HTTP协议无状态连接的优点
Web服务器需要为潜在的大量的用户服务。
对于一个服务器,接受一条网络连接就意味着通过一个套接字侦听进入的请求,这会消耗掉服务器大量的资源,包括线程和内存。
为了能够服务于大量的用户,HTTP被设计成在每一次新请求中都使用新的连接。
HTTP协议无状态连接的影响
由于HTTP具有的这种无状态性,使得基于Servlet技术的Web应用也是无状态的。
也就是说我们不能把任何数据存储在Servlet的实例变量中来表示客户的状态。
会话的特征
会话能够把同一用户发出的不同请求之间关联起来。
不同用户的会话应当是相互独立的。
会话一旦建立就应当一直存在,直到用户空闲时间超过了某一个时间界限,容器才应当释放该会话资源。
在会话的存活期间,用户可能给服务器发送了很多请求,该用户的这些请求信息都可以存储在会话中。
URL重写技术建立在这样的一种思想之下:
客户第一次访问网站时,将会话信息添加或嵌入到由服务器发出的每一个响应的URL中。
当用户再次访问网站时,URL中会把这个会话信息作为用户请求参数返回服务器端,服务器根据返回的会话信息来标识该客户,维护整个会话的信息持续性。
隐藏窗体技术原理
HTML表单允许把一些字段信息隐藏起来,而在浏览器上不被显示出来。
例如:
使用隐藏窗体技术实现会话管理
这种方式的工作机制为:
在用户第一次请求时,服务器在为客户准备的页面上添加一个或多个隐藏表单,把一些要隐藏的信息如标识该客户的ID号存储在那里。
当客户提交该表单时,这些信息会作为查询参数返回服务器,服务器可以利用HttpServletRequest对象的getParameter()方法读取出来。
这样就达到了在服务器端维护会话信息持续的作用。
维护会话的方式----隐藏窗体技术比较
可以这样认为,同重写URL技术相比,隐藏窗体技术在表单参数中传递会话信息,而重写URL技术是在GET参数中传递会话信息。
除了这点,二者并无根本区别。
如:
都属于非持久化会话方案
都使用页面动态修改技术,因此不支持静态HTML
代码编写方式很相似
Servlet中的解决方案------HttpSession
Servlet2.3提供了一种较高级别的会话跟踪机制,使得程序员从中解脱出来。
Servlet2.3规范定义了一个HttpSession接口,允许Servlet容器针对每一个用户建立一个HTTP会话(即HttpSession对象),每个HTTP会话将会自动被赋予一个唯一的会话编号(sessionID),而无需程序员编程实现。
HttpSession对象提供了和ServletContext对象相似的一组会话属性的方法,这样就可以很容易地在服务器端存放用户会话状态。
获取与请求关联的会话对象
HttpServletRequest对象提供了getSession方法,通过这个方法,Servlet就可以获得与当前请求关联的会话对象的引用。
该方法为重载的方法,有两个版本:
publicHttpSessiongetSession();
返回与当前请求相关联的会话,如果当前请求还没有一个相关联的会话,就创建一个并返回。
publicHttpSessiongetSession(boolbCreate);
返回与当前请求相关联的会话对象。
如果没有,且参数create的值为true,则创建并返回一个新的会话。
如果create的值为false,且请求没有相关联的会话对象,将返回null。
可以利用这点判断用户是否为第一次访问站点:
如果getSession(false)返回null,则表示用户是第一次访问站点,如果返回非null则表示用户不是第一次访问站点。
会话与请求的关系
ervlet容器在创建每一个新的HTTP会话对象时,都会赋予一个新的ID号。
servlet容器保证它在Web应用范围内是唯一的。
会话ID是实际包含在Http请求/响应报文中的会话数据。
这个ID号可以通过HttpSession对象的getId()获得。
例如:
HttpSessionsession=request.getSession();
StringsessionId=session.getId();
HttpSession工作原理
1、当用户第一次发出请求时,Servlet容器会建立一个HttpSession对象,并自动分配一个Web应用范围内唯一的SessionID与之对应。
这个SessionID也会随着HTTP响应内容传递给用户端浏览器。
传递的方式默认情况下为cookie,如果用户端浏览器关闭了cookie功能,就会使用URL重写技术传递给用户浏览器。
2、在用户发出的后续请求中,请求信息中会包含Servelt容器传递给它的SessionID。
Servlet容器就会根据传回的SessionID将原来建立的HttpSession对象将请求与HttpServletRequest对象关联起来。
所以,对于同一个用户,调用getSession()方法返回的将是同一个HttpSession对象。
JDBC基本概念
1、JavaSoft公司定义的数据库连接应用编程接口(JDBC,JavaDatabaseConnectivityAPI),是Java核心API的一部分。
2、JDBC允许使用Java编写的各种应用程序(Applet、Application、WebApplication等)以相同的形式访问、查询和修改远程数据库。
3、JDBC访问数据库使用的语言是标准的SQL语言,这样Java应用程序就可以利用一个简单的、标准的API(JDBCAPI)建立连接,而不用考虑数据库平台的类型。
JDBC特点
1、调用级的SQL接口
JDBC是一个Java语言在客户机上使用的调用级接口。
它完全独立于各种DBMS。
JDBC是一个低级的应用程序编程接口,允许Java程序发出SQL语句并接收SQL语句的执行结果。
2、一致性的API
JDBC提供与Java系统其他部分完全相一致的Java接口。
3、简洁性
JDBC的工作机制非常简洁,容易理解和使用。
4、健壮性
JDBC使用健壮、动态的数据类型,这样应用在编译时就会检查出更多的错误。
JDBC连接数据库的典型结构主要有四个组件:
一、JDBC应用程序
二、驱动程序管理器
三、驱动程序
四、数据源
JDBC应用程序利用JDBC代码来连接数据库、向数据库系统发送SQL语句、接收SQL执行结果。
这部分代码需要完成的工作有:
1、向数据库系统发出请求建立连接2、向数据库系统发送SQL语句3、为返回的结果集中的数据确定相应的数据类型4、查询和处理结果集5、处理数据库异常6、关闭连接
JDBC驱动程序管理器的主要作用是帮助客户应用程序装载和实例化特定的驱动程序。
它要完成的任务有:
1、定位和装载特定数据库的驱动程序2、处理JDBC驱动程序的初始化工作
3、可以管理多个不同的数据库驱动程序
JDBC驱动程序负责向数据库系统发送SQL语句,并接收执行结果。
具体来说,驱动程序可以完成以下任务:
1、建立与数据库的连接2、向数据库系统发送数据请求3、将数据库系统的错误代码转换为JDBC的错误代码
4、可以管理结果集游标5、可以初始化事务
JDBCAPI是为数据库开发人员提供的一些个可编程的接口。
供程序员编程使用的常用的接口有:
java.sql.DriverManager:
处理驱动器的加载、数据库连接的建立。
java.sql.Connection:
处理特定数据库的连接。
java.sql.Statement:
处理数据库连接中的SQL语句。
有2个子接口
java.sql.PreparedStatement:
用于处理带有参数的SQL语句。
java.sql.CallableStatement:
用于处理数据库存储过程
java.sql.Result:
用于处理数据库操作的结果集。
分以下几步访问数据源:
1、装载驱动程序2、建立数据库连接3、建立语句4、发送SQL语句
5、关闭数据库连接6、检索数据p134
1、装载驱动程序
第一种方式是显式地装载JDBC驱动程序,只需要一行代码,例如:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
另一种方式是直接调用DriverManager类的registerDriver()方法。
例如:
DriverManager.registerDriver(newsun.jdbc.odbc.JdbcOdbcDriver());
2、建立数据库连接
这是通过DriverManager类的getConnection()方法来完成的。
例如:
Connectionconn=DriverManager.getConnection("jdbc:
odbc:
myodbc","username","password")
在三个参数中,最重要的是用来指定数据源的URL。
3、建立Statement对象
向数据库服务器发送SQL语句。
这是通过创建Statement对象来完成的。
可使用Connection对象的createStatement()方法创建该对象,例如:
Statementstmt=conn.createStatement();
PreparedStatement
如果需要向数据库服务器传递带参数的SQL,则应使用PreparedStatement对象,该对象是由Connection对象的repareStatement()方法生成的,例如:
Stringsql="select*fromemployeewheresalary>?
";
PreparedStatementstmt=conn.prepareStatement(sql);
CallableStatement
如果需要调用数据库的存储过程,则需要创建CallableStatement对象来达到这一目的:
StringcallProc="{callmyproc}";
CallableStatementcstmt=conn.prepareCall(callProc);
4、发送SQL语句
一旦创建了Statement对象,下一步是把SQL发送到数据库。
Statement对象有两个主要的方法用于此目的。
使用哪个方法取决于是否需要返回结果。
executeQuery()
对于需要返回结果集的SELECT语句,应当使用executeQuery()方法,该方法只有一个字符串参数,用来存放SELECT语句,查询成功则以ResultSet对象的形式返回查询结果。
例如:
Stringsql="select*fromstudents";
ResultSetrs=stmt.executeQuery(sql);
executeUpdate()方法
如果调用INSERT、UPDATE、DELETE不需返回查询结果的SQL语句,应采用executeUpdate()方法。
executeUpdate()方法也只接受String类型的SQL语句作参数,返回类型为int。
如果返回值为0则表示SQL语句不返回任何数据,否则返回数据库中受到INSERT、UPDATE、DELETE语句影响的数据行数。
例如:
Stringsql="DELETEFROMSTUDENTWHERESCORE<=60";
intret=stmt.executeUpdate(sql);
5、管理数据连接
JDBC的Statement和Connection对象都有一个close()方法用于此目的。
例如:
stmt.close();
conn.close()
六、检索数据
常用while或for循环遍历ResultSet对象,而do循环不太合适:
……
Stringsql="selectLastName,FirstNamefromEmployeeswherecity='London'";
rs=stmt.executeQuery(sql);
while(rs.next()){
rowNum++;
lastName=rs.getString("lastName");
firstName=rs.getString
(2);
address=rs.getString(3);
System.out.println(rowNum+""+firstName+","+lastName+""+address);
}
……
例一:
连接数据库的控制台程序
publicstaticvoidmain(String[]args){
Connectionconn;Statementstmt;ResultSetrs;introwNum=0;
StringlastName,firstName,address;
System.out.println("NowNum\tName\tAddress");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection("jdbc:
odbc:
northwind","","");
stmt=conn.createStatement();
rs=stmt.executeQuery("selectLastName,FirstName,AddressfromEmployees
wherecity='London'");
while(rs.next()){
rowNum++;
lastName=rs.getString("lastName");
firstName=rs.getString
(2);
address=rs.getString(3);
System.out.println(rowNum+""+firstName+","+lastName+""+address);
}
}catch(Exceptione){
System.out.println(e.getMessage());
}
}
例二:
在JSP中访问数据库
<%
Connectionconn=null;Statementstmt=null;ResultSetrs=null;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection("jdbc:
odbc:
northwind","","");
stmt=conn.createStatement();
rs=stmt.executeQuery("selectfirstname,lastnamefromemployeeswherecity=‘London’");
introwNum=0;
while(rs.next()){
rowNum++;StringfirstName=rs.getString
(1);StringlastName=rs.getString("lastname");
%>
<%}%>
<%
}catch(Exceptione){
out.println(e.getMessage());
}finally{
//关闭数据库连接
}
%>