![Java Web程序设计 课件汇 杨丰玉 第1-11章 JSP内置对象 - Web其它常用技术_第1页](http://file4.renrendoc.com/view6/M00/3F/3E/wKhkGWekM8iAVIcSAAERsZ2xUd0695.jpg)
![Java Web程序设计 课件汇 杨丰玉 第1-11章 JSP内置对象 - Web其它常用技术_第2页](http://file4.renrendoc.com/view6/M00/3F/3E/wKhkGWekM8iAVIcSAAERsZ2xUd06952.jpg)
![Java Web程序设计 课件汇 杨丰玉 第1-11章 JSP内置对象 - Web其它常用技术_第3页](http://file4.renrendoc.com/view6/M00/3F/3E/wKhkGWekM8iAVIcSAAERsZ2xUd06953.jpg)
![Java Web程序设计 课件汇 杨丰玉 第1-11章 JSP内置对象 - Web其它常用技术_第4页](http://file4.renrendoc.com/view6/M00/3F/3E/wKhkGWekM8iAVIcSAAERsZ2xUd06954.jpg)
![Java Web程序设计 课件汇 杨丰玉 第1-11章 JSP内置对象 - Web其它常用技术_第5页](http://file4.renrendoc.com/view6/M00/3F/3E/wKhkGWekM8iAVIcSAAERsZ2xUd06955.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章JSP内置对象主讲人:2025/2/612025/2/6《Web程序设计》21JSP对象2out对象3request对象4response对象5session对象6application对象7其他对象及综合示例本章课程目标知识目标掌握JSP内置对象基本属性及方法、使用方法;能力要求:能够理解并掌握Web程序设计中的基础知识与工作原理,将知识与原理应用于开发过程中的问题分析;具备复杂问题的分析与综合能力,能够综合运用所学知识,分析关键需求,设计适用于复杂问题的解决方案;2025/2/6《Web程序设计》36.1JSP内置对象JSP内置对象是Web容器创建的一组对象,开发人员在进行JSP页面编程时,不需要使用new关键字进行实例化,就可以使用的一组内置对象。由于这些对象是由容器在初始化时隐式创建的,因此,这些内置对象也称为JSP隐式对象。JSP中的内置对象有:out、request、response、session、application、config、pageContext、page、exception2025/2/6《Web程序设计》4特点这些内置对象具有以下特点:
由JSP容器提供实例化,程序开发人员无需实例化即可使用;
由JSP容器管理其生命周期,创建和销毁;
所有的JSP页面均可使用这些内置对象;
只有在脚本元素的表达式或代码段中才可使用(<%=使用内置对象%>或<%使用内置对象%>)。2025/2/6《Web程序设计》5示例2025/2/6《Web程序设计》6//设置请求字符的编码格式request.setCharacterEncoding("utf-8");//获取login.jsp页面表单元素的值,参数名称和表单元素名称一致Stringsname=request.getParameter("sname");Stringpasswd=request.getParameter("passwd");if(sname!=null&&!sname.equals("")&&passwd!=null&&!passwd.equals("")){out.println("登陆成功!"+"<br>");out.println("账号:"+sname+"<br>");out.println("密码:"+passwd+"<br>");}else{out.println("登录失败!");}工作机制JSP页面在被客户端请求时,容器首先判断该JSP页面是否为第一次访问,如果是第一次,则初始化该JSP页面:即生成JSP页面的java文件,编译为class,然后执行这个class文件,产生响应后的HTML代码,返回给客户端。2025/2/6《Web程序设计》7publicfinalclassindex_jspextendsorg.apache.jasper.runtime.HttpJspBaseimplementsorg.apache.jasper.runtime.JspSourceDependent,org.apache.jasper.runtime.JspSourceImports{
publicvoid_jspInit(){}publicvoid_jspDestroy(){}publicvoid_jspService(){finaljavax.servlet.jsp.PageContextpageContext;javax.servlet.http.HttpSessionsession=null;finaljavax.servlet.ServletContextapplication;finaljavax.servlet.ServletConfigconfig;javax.servlet.jsp.JspWriterout=null;finaljava.lang.Objectpage=this;javax.servlet.jsp.JspWriter_jspx_out=null;try{
}}2025/2/6《Web程序设计》81JSP对象2out对象3request对象4response对象5session对象6application对象7其他对象及综合示例out简介out是javax.servlet.jsp.JspWriter类的实例化对象,主要功能就是完成页面的输出操作,将计算结果和从数据库中获取的数值输出到网页上,使用println()或print()方法输出,形成最终返回给客户端的HTML代码。2025/2/6《Web程序设计》9方法作用publicvoidprintln()向客户端打印字符串,带’\n’publicvoidprint()向客户端打印字符串publicvoidclear()清除缓存区的内容,如果在flush之后调用会抛出异常。publicvoidclearBuffer()清除缓存区的内容,如果在flush之后调用不会抛出异常publicvoidflush()将缓存区内容输出到客户端publicintgetBufferSize()返回缓存区的大小以字节数的大小,如不设缓存区则为0publicbooleanisAutoFlush()返回缓存区满时,是自动清空还是抛出异常publicvoidclose()关闭输出流out使用示例out对象在使用时通常使用out.println()或out.print()输出文本信息。直接输出时,可采用”<%=xxx%>”方式替代。2025/2/6《Web程序设计》10<div><%out.println(“helloworld”);%><!--采用out.println()输出--></div><!--等同于下面这种方式--><div><%=“helloworld”%><!--采用<%=%>输出--></div>杨辉三角形示例输出的主要思路如下:指定n行,循环n次,每次输出其中的一行;采用一个二维数组存储杨辉三角形的值;在处理每一行时,先输出每一行前面的空格(由于HTML会将连续的“”看成一个,所以此处使用
字符);计算每行中的杨辉三角数值,然后输出该数值;输出换行符(由于HTML不会输出”\n”,因此采用<br>进行换行)。完整的示例代码如下所示:2025/2/6《Web程序设计》112025/2/6《Web程序设计》12<%!intn=10;//以10为例int[][]a=newint[n][n];inti,j;%><%for(i=0;i<n;i++){//循环n次,输出n行//输出前导空格for(j=0;j<n-i;j++)out.print(" ");//计算输出数字for(j=0;j<i;j++){if(i==0||j==0||i==j){a[i][j]=1;}else{a[i][j]=a[i-1][j]+a[i-1][j-1];}out.print("<spanclass='cell'>"+a[i][j]+"</span>");//每个数字后面2个空格}out.println("<br>");//输出后面的换行标记,注意输出"\n"不能使网页上的文本换行}%>2025/2/6《Web程序设计》131JSP对象2out对象3request对象4response对象5session对象6application对象7其他对象及综合示例6.3request对象request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。请求中一般包含了请求所需的参数值或者信息。因此,可以通过request来获取客户端和服务端的信息,如传递参数名和参数值、IP地址、应用系统名,服务器主机名等。2025/2/6《Web程序设计》14request对象常用方法Cookie[]getCookies()返回客户端所有的Cookie的数组EnumerationgetAttributeNames()返回request对象的所有属性名称的集合EnumerationgetHeaderNames()返回所有HTTP头的名称集合EnumerationgetParameterNames()返回请求中所有参数的集合HttpSessiongetSession()返回request对应的session对象,如果没有,则创建一个ObjectgetAttribute(Stringname)返回名称为name的属性值,如果不存在则返回null。StringgetParameter(Stringname)返回此request中name指定的参数,若不存在则返回nullString[]getParameterValues(Stringname)返回指定名称的参数的所有值,若不存在则返回nullStringgetHeader(Stringname)返回name指定的信息头StringgetProtocol()返回此request所使用的协议名和版本StringgetContextPath()返回requestURI中指明的上下文路径StringgetRemoteAddr()返回客户端的IP地址StringgetRequestURI()返回request的URIintgetContentLength()返回request主体所包含的字节数,若未知的返回-12025/2/6《Web程序设计》15request对象的主要作用体现在两个方面。1)获取请求中的参数值,主要通过request.getParameter(paramName)和request.getParameterValues(paramName)按参数名称获取,前者为获取单个值,后者通常用于获取多个值,例如多选框checkbox选中的值。请求中的参数值通过是采用映射表的形式存储,即key-value对,key为参数名称,对应表单元素的name或请求url中的参数名称,value为该参数的值;2)获取请求中的请求头参数(Headers),主要通过request.getHeader(paramName),请求头是HTTP协议规定的必要内容,通常用于标识该请求的一些相应设置2025/2/6《Web程序设计》16requestheaders2025/2/6《Web程序设计》17request请求处理当客户端通过超链接的形式发送请求时,可以为该请求传递参数,通过在超链接的后面加上问号“?”来实现。如果要同时指定多个参数,各参数间使用与符号“&”分隔即可。2025/2/6《Web程序设计》18<ahref=”detail.jsp?id=3320183901&from_module=22”>查看商品</a><!--detail.jsp--><%Stringid=request.getParameter(“id”);Stringmodule=request.getParameter(“from_module”);%>get与post请求通过form表单方式传递参数时,有个非常重要的属性method。method有两个值,分别是get和post。get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2KB。安全性较低但效率比post方式高。适合提交数据量不大,安全性不高的数据。如:搜索、查询等功能。post:将用户提交的信息封装在HTMLheader内。适合提交数据量大,安全性高的用户信息。比如:注册、修改、上传等功能。2025/2/6《Web程序设计》19中文参数值处理由于JSP页面默认使用iso-8859-1字符集,而中文字符集一般使用GBK或utf-8,因此容易出现中文乱码的情况。在JSP页面中处理中文乱码的情况需要注意以下几个方面(以utf-8字符集为例,GBK亦然):确认HTML编码字符集与JSP的contentType均为utf-8字符集JSP页面的保存文本字符集也要设置为utf-8字符集;在处理请求参数的页面,对获取到的中文参数值进行解码处理2025/2/6《Web程序设计》20request.setCharacterEncoding(“utf-8”);Stringname=request.getParameter(“item_name”);Stringname=newString(request.getParameter("item_name").getBytes("ISO-8859-1"),"utf-8")设置cookiecookie是用来存储小段的文本信息,在网络服务器上生成,并发送给浏览器的。通过使用cookie可以标识用户身份,记录用户名和密码,跟踪重复用户等。浏览器将cookie以key/value的形式保存到客户机的某个指定目录中。2025/2/6《Web程序设计》21//写入cookie对象Stringusername=request.getParameter(“username”);Cookiecookie=newCookie("username",username);//创建并实例化cookie对象cookie.setMaxAge(60*60*24*7);//设置cookie有效期为7天response.addCookie(cookie);//保存cookie对象//读取cookie值Cookie[]cookies=request.getCookies();//从request中获取cookie对象的集合Stringusername="";if(cookies!=null){//遍历cookie对象集合for(CookiecookieItem:cookies){if(cookieItem.getName().equals("username")){username=cookieItem.getValue();//读取cookie对象的的值}}}用户名:<inputtype=”text”name=”username”value=”<%=username%>”>request使用示例2025/2/6《Web程序设计》22注册页面(ex_req.jsp)提交查看页面(ex_req_save.jsp)2025/2/6《Web程序设计》23<formaction="ex_req_save.jsp"method="post"><div>用户:<inputtype="text"name="username"></div><div>密码:<inputtype="password"name="password"></div><div>确认:<inputtype="password"name="password2"></div><div>性别:<inputtype="radio"name="sex"value="1"checked="checked">男<inputtype="radio"name="sex"value="0">女</div><div>邮箱:<inputtype="text"name="email"></div><div>课程:<inputtype="checkbox"name="subject"value="0"/>计算机视觉<inputtype="checkbox"name="subject"value="1"/>人工智能<inputtype="checkbox"name="subject"value="2"/>自然语言处理<inputtype="checkbox"name="subject"value="3"/>数据可视化</div><div>简介:<textareaname="intro"cols="60"rows="8"></textarea></div><div><inputtype="submit"value="提交查看"></div><%!/*自定义函数,将字符串转码为中文*/publicstaticStringtoCN(Stringstr){if(str==null)returnstr;try{str=newString(str.getBytes("iso-8859-1"),"utf-8");}catch(UnsupportedEncodingExceptione){e.printStackTrace();}returnstr;}%><%//获取单个值使用getParameter方法
Stringusername=toCN(request.getParameter("username"));Stringpassword=request.getParameter("password");Stringpassword2=request.getParameter("password2");Stringsex=request.getParameter("sex");Stringintro=toCN(request.getParameter("intro"));//获取多个值使用getParameterValues方法,返回值是字符串数组
String[]subjects=request.getParameterValues("subject");if("0".equals(sex.trim())){sex="女";}else{sex="男";}
2025/2/6《Web程序设计》241JSP对象2out对象3request对象4response对象5session对象6application对象7其他对象及综合示例6.4response对象response对象用于响应客户请求,向客户端输出信息。response对象属于javax.servlet.http.HttpServletResponse接口的实例。它封装了JSP产生的响应,并发送到客户端以响应客户端的请求。请求的数据可以是各种数据类型,甚至是文件。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。response对象的主要作用是对客户端的请求进行回应,将Web服务器处理后的结果发回给客户端。2025/2/6《Web程序设计》25HTTP协议响应信息响应头描述Allow指定服务器支持的request方法(GET,POST等等)Cache-Control指定响应文档能够被安全缓存的情况。通常取值为public,private或no-cache等等。Public意味着文档可缓存,Private意味着文档只为单用户服务并且只能使用私有缓存。No-cache意味着文档不被缓存。Connection命令浏览器是否要使用持久的HTTP连接。close值
命令浏览器不使用持久HTTP连接,而keep-alive意味着使用持久化连接。Content-Disposition让浏览器要求用户将响应以给定的名称存储在磁盘中Content-Encoding指定传输时页面的编码规则Content-Language表述文档所使用的语言,比如en,en-us,,ru等等Content-Length表明响应的字节数。只有在浏览器使用持久化(keep-alive)HTTP连接时才有用Content-Type表明文档使用的MIME类型Expires指明啥时候过期并从缓存中移除Last-Modified指明文档最后修改时间。客户端可以缓存文档并且在后续的请求中提供一个If-Modified-Since请求头Location在300秒内,包含所有的有一个状态码的响应地址,浏览器会自动重连然后检索新文档Refresh指明浏览器每隔多久请求更新一次页面。Retry-After与503(ServiceUnavailable)一起使用来告诉用户多久后请求将会得到响应Set-Cookie指明当前页面对应的cookie2025/2/6《Web程序设计》26响应示例2025/2/6《Web程序设计》27response对象的主要方法方法描述StringencodeURL(Stringurl)将URL编码,回传包含SessionID的URLvoidaddCookie(Cookiecookie)添加指定的cookie至响应中voidaddHeader(Stringname,Stringvalue)添加指定名称的响应头和值voidreset()清除任何缓存中的任何数据,包括状态码和各种响应头voidsendError(intsc,Stringmsg)使用指定的状态码和消息向客户端发送一个出错响应voidsendRedirect(Stringlocation)使用指定的URL向客户端发送一个临时的间接响应voidsetCharacterEncoding(Stringcharset)指定响应的编码集(MIME字符集),例如UTF-8voidsetContentType(Stringtype)设置响应的内容的类型,如果响应还未被提交的话voidsetHeader(Stringname,Stringvalue)使用指定名称和值设置响应头的名称和内容2025/2/6《Web程序设计》28重定向网页使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面。在客户端浏览器上将会得到跳转的地址,并重新发送请求链接。用户可以从浏览器的地址栏中看到跳转后的地址。进行重定向操作后,request中的属性全部失效,并且重新创建一个新的request对象。2025/2/6《Web程序设计》29sendRedirect()方法的语法格式如下:2025/2/6《Web程序设计》30response.sendRedirect(Stringpath);参数说明:path:用于指定目标路径,可以是相对路径,也可以是不同主机的其他URL地址。<%response.sendRedirect(“login.jsp");//重定向到登录页面%>通过response对象可以设置HTTP响应报头。1)禁用缓存2)设置页面自动刷新3)设置定时跳转网页2025/2/6《Web程序设计》31<%response.setHeader("Cache-Control","no-store");//设置没有缓存response.setDateHeader("Expires",0);//设置缓存过期日期为0%><%response.setHeader("refresh","10");//单位为秒%><%response.setHeader("refresh","5;URL=login.jsp");//单位为秒%>response使用示例2025/2/6《Web程序设计》32<body><%Stringmsg=null,url=null;//获取输入的登录信息
Stringusername=request.getParameter("username");Stringpassword=request.getParameter("password");if(username==null||"".equals(username)){msg="用户名不能为空";url="login.jsp";}elseif(password==null||"".equals(password)||password.length()<6){msg="密码不能为空或长度过短";url="login.jsp";}else{msg="登录成功,即将跳转至系统首页!";url="index.jsp";}out.println(msg);//显示提示信息,设置5秒后自动跳转
response.setHeader("refresh","5;URL="+url);%></body>check.jsplogin.jspindex.jsp失败成功2025/2/6《Web程序设计》331JSP对象2out对象3request对象4response对象5session对象6application对象7其他对象及综合示例session简介session表示客户端与服务器的一次会话,是javax.servlet.http.HttpSession接口的实例化对象。Web中的session指定是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,与用户相关的所有信息都被保存在session中,因此,JSP中使用session对象存储与用户一次会话相关的所有信息。HTTP协议是一种无状态的协议(即不保存连接状态的协议),每次用户请求在接收到服务器的响应后,连接就关闭了。为了弥补这一缺点,HTTP协议提供了session。2025/2/6《Web程序设计》34Session对象的常用方法方法描述publicObjectgetAttribute(Stringname)返回session对象中与指定名称绑定的对象,如果不存在则返回nullpublicEnumerationgetAttributeNames()返回session对象中所有的对象名称publicStringgetId()返回session对象的IDpublicvoidinvalidate()将session无效化,解绑任何与该session绑定的对象publicbooleanisNew()返回是否为一个新的客户端,或者客户端是否拒绝加入sessionpubliclonggetLastAccessedTime()返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起publicvoidremoveAttribute(Stringname)移除session中指定名称的对象publicvoidsetAttribute(Stringname,Objectvalue)使用指定的名称和值来产生一个对象并绑定到session中publicvoidsetMaxInactiveInterval(intinterval)用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效2025/2/6《Web程序设计》35session生命周期管理session的生命周期分为三个阶段:创建、活动、销毁。(1)创建当客户端第一次访问某个JSP页面时,服务器会为当前会话创建一个sessionID,每次客户端向服务端发送请求时,都会将此sessionID一并发送过去,服务端会进行校验。(2)活动当session创建后,客户端再访问其它页面都属于同一次会话。只要当前会话页面没有全部关闭,重新打开的新的浏览器窗口访问同一项目资源时,也属于同一次会话。除非本次会话的所有页面都关闭后再重新访问系统某个页,将会创建新的会话。(3)销毁session的销毁只有三种方式:明确调用session.invalidate()方法、session过期(超时)、服务器重新启动。这三种方式会使当前的会话清除。2025/2/6《Web程序设计》36Tomcat的默认session超时时间为30分钟,可以通过session.setMaxInactiveInterval(time)方法设置某个session的超时时间。还可以通过web.xml中配置参数“session-timeout”,这种方法是设置所有的session超时时间。2025/2/6《Web程序设计》37<!--web.xml--><session-config>//单位是分钟
<session-timeout>10</session-timeout></session-config>session使用示例2025/2/6《Web程序设计》38<%//获取会话信息Stringusername=(String)session.getAttribute("username");DatelastAccessTime=newDate(session.getLastAccessedTime());DatecurTime=newDate();longminuteDiff=(curTime.getTime()-lastAccessTime.getTime())/(1000*60);//如果用户名不为空,则会话还在,且与上次访问时间相差不超过30分钟,则正常
if(username!=null&&minuteDiff<30){
}else{//认为会话已超期,跳转到登录页面
session.removeAttribute(“username”);session.invalidate();response.sendRedirect("/login.jsp");}%>session.setAttribute(“username”,username);//将用户名写入到会话中注销用户的登录状态,清空会话信息2025/2/6《Web程序设计》39<!--注销页面--><%//清空session中的信息Enumerationelem=session.getAttributeNames();while(elem.hasMoreElements()){Stringname=(String)elem.nextElement();session.removeAttribute(name);}session.invalidate();//跳转至登录页面response.sendRedirect(“/login.jsp”);%>2025/2/6《Web程序设计》401JSP对象2out对象3request对象4response对象5session对象6application对象7其他对象及综合示例6.6application对象application对象用于保存所有应用中的共有数据。它在服务器启动时自动创建,在服务器停止时销毁。当application对象没有被销毁时,所有用户都可以共享该application对象。与session对象相比,application对象的生命周期更长,类似于系统的“全局变量”。application对象是javax.servlet.ServletContext接口的实例化对象。向application中添加的数据,该web应用的所有JSP文件都能访问,在任何地方对application对象中的数据操作,都将影响到其他用户对此的访问。2025/2/6《Web程序设计》41application对象常用方法方法描述publicvoidsetAttribute(Stringname,Objectvalue);使用指定名称将对象绑定到此对话publicObjectgetAttribute(Stringname);返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回nullEnumerationgetAttributeName();返回所有可用属性名的枚举StringsetServerInfo();返回JSP(Servlet)引擎名及版本号StringgetRealPath(Stringpath);得到虚拟路径对应的绝对路径publicStringgetContextPath();取得当前的虚拟路径名称2025/2/6《Web程序设计》42应用内共享数据通过setAttribute()方法向application中添加数据,通过getAttribute方法从application中获取已添加的数据。2025/2/6《Web程序设计》43<%
//添加数据List<String>msgList=bo.getMessageList();application.setAttribute(“messageList”,msgList);
%><%//从application中获取数据List<String>messageList=(List<String>)application.getAttribute(“messageList”);if(messageList!=null){//要判断是否为空,因为可能还未添加}%>访问应用程序初始化参数application对象提供了对应用程序初始化参数进行访问的方法。应用程序初始化参数在web.xml文件中通过<context-param>标记配置应用程序初始化参数,web.xml位于Web应用WEB-INF子目录中。2025/2/6《Web程序设计》44<!--web.xml--><context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost/book_db</param-value></context-param><context-param><param-name>username</param-name><param-value>user</param-value></context-param>//通过参数名称获取单个参数Stringurl=application.getInitParameter("url");Stringusername=application.getInitParameter(“username”);//还可以通过参数枚举方法进行遍历Enumeration<String>elems=application.getInitParameterNames();//获取全部初始化参数while(elems.hasMoreElements()){Stringname=elems.nextElement();//获取参数名Stringvalue=application.getInitParameter(name);//获取参数值}application使用示例2025/2/6《Web程序设计》45<%@pagelanguage="java"contentType="text/html;charset=UTF-8"%><html><head><title>application对象使用示例</title></head><body><%Integercounter=(Integer)application.getAttribute("counter");if(counter==null||counter==0){//第一次访问
out.println("欢迎访问本网页!");counter=1;}else{//多次访问
out.println("欢迎再次访问本网站!");counter+=1;}application.setAttribute("counter",counter);%><div>页面累计访问量为:<%=counter%></div></body></html>这种方式计数的问题在哪?2025/2/6《Web程序设计》461JSP对象2out对象3request对象4response对象5session对象6application对象7其他对象及综合示例其他JSP内置对象pageContext对象pageContext对象是一个比较特殊的对象,用于获取页面上下文信息page对象page对象本质上是包含当前Servlet接口引用的变量,可以看作是this关键字。config对象config对象主要用于获取服务器的配置信息,实现了javax.servlet.ServletConfig接口。exception对象exception对象用来处理JSP文件执行时发生的所有错误和异常,只有在page指令中设置isErrorPage属性值为true的页面中才可以被使用。2025/2/6《Web程序设计》47综合示例用户登录页面为例,业务流程如下:2025/2/6《Web程序设计》48login.jspchk.jspapplication_page.jsp提交登录验证成功验证失败login.jsp增加了显示返回的消息功能2025/2/6《Web程序设计》49<formname="form1"action="chk.jsp">用户:<inputtype="text"name="user"><br>密码:<inputtype="password"name="pass"><br>类型:<selectname="utype"><optionvalue="1">用户</option><optionvalue="2">管理员</option></select><br><inputtype="submit"value="提交"><divid="info"><%StringinfoType=request.getParameter("info");if(infoType==null||"".equals(infoType)){//第一次进页面,即正常登录,不显示}elseif("1".equals(infoType)){//返回的信息类型为1out.println("用户名不存在,请核对!");}elseif("2".equals(infoType)){//返回的信息类型为2out.println("密码不正确,请重新输入!");}else{out.println("未知错误!");}%></div></form>chk.jsp判断用户名与密码是否正确,可返回不同类型错误2025/2/6《Web程序设计》50<body><%Stringu=request.getParameter("user");Stringp=request.getParameter("pass");Stringtype=request.getParameter("utype");//判断用户名与密码是否有效if("admin".equals(u)&&"abc12".equals(p)&&"2".equals(type)){//登录成功response.sendRedirect("application_demo_page.jsp");}elseif(!"admin".equals(u)){//用户名不存在response.sendRedirect("login.jsp?info=1");}elseif("admin".equals(u)&&!"abc12".equals(p)){//密码不正确response.sendRedirect("login.jsp?info=2");}%></body>application_page.jsp设置用户会话刷新访问量计数2025/2/6《Web程序设计》51<%!intnumbers=0;%><%!publicsynchronizedvoidcountPeople(){numbers++;}%><%//如果是新用户会话if(session.isNew()){countPeople();Stringstr=String.valueOf(numbers);session.setAttribute("count",str);}//更新application对象application.setAttribute(session.getId(),Integer.toString(numbers));%><div>你的sessionID为<%=session.getId()%>你是第<%=(String)session.getAttribute("count")%>个访客。</div>案例解析与讨论2025/2/6《Web程序设计》52product_add.jspproduct_add_do.jspproduct_list.jsp失败成功保存2025/2/6《Web程序设计》53本章结束第7章JDBC主讲人:2025/2/6542025/2/6《Web程序设计》551JDBC介绍2JDBC访问数据库3JDBC案例4相关应用技术本章课程目标知识目标掌握JDBC基本原理、主要函数及使用方法;掌握常用数据库的连接方法及数据读取和存储处理过程。能力要求:能够运用JDBC技术从数据库中读取和向数据写入数据;能够针对应用需要,设计并实现数据访问的方法;能够认识不同JDBC访问方法的局限性,选择恰当的方法用于应用中的数据访问。2025/2/6《Web程序设计》567.1JDBC介绍JavaDataBaseConnectivity(Java数据库连接),是一套Java语言编写的数据库连接标准的JavaAPI,用于Java程序访问数据库数据。从本质上看,JDBC是一种规范,它提供了一套完整的数据库访问接口,这些接口对程序员而言,可以无需了解具体实现细节即可访问业务数据库。2025/2/6《Web程序设计》57JDBC结构JDBCAPI支持两层和三层处理模型进行数据库访问,但一般的JDBC体系结构由两层组成:JDBCAPI:提供了应用程序对JDBC的管理连接。JDBCDriverAPI:支持JDBC管理到驱动器连接。2025/2/6《Web程序设计》58驱动程序管理器(DriverManager)JDBCAPI的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。数据库厂商要支持JDBC,必须在JDBC规范下,实现其中规定的接口API,使用自己的方式实现这些数据查询/操作接口,返回数据。这种具体的实现就称为厂商的JDBC驱动程序。2025/2/6《Web程序设计》59JDBCAPI主要组件(1)Driver接口Driver接口由数据库厂家提供,对于Java应用开发人员,只需要使用Driver接口进行驱动的实例化。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。驱动器的主类完整名称是要使用的数据库厂商驱动程序主类名称。2025/2/6《Web程序设计》60class.forName(“驱动器的主类完整名称”);class.forName(“com.mysql.jdbc.Driver”)动态实例化方法无需import该类JDBCAPI主要组件(2)DriverManager接口这个类管理数据库驱动程序的列表。根据所提供的数据库连接协议URL以及初始化参数,建立与数据库的连接,该方法如果操作成功,则返回Connection接口的一个实例,表明成功地建立了与指定数据库的连接。url:与数据库连接的URL,包含访问协议、数据库服务的地址与端口、连接参数等信息;username:用于数据库访问的用户名称;password:用于数据库访问的密码。2025/2/6《Web程序设计》61ConnectionDriverManager.getConnection(Stringurl,Stringusername,Stringpassword);URL协议示例2025/2/6《Web程序设计》622025/2/6《Web程序设计》631JDBC介绍2JDBC访问数据库3JDBC案例4相关应用技术访问过程加载JDBC驱动程序创建数据库的连接创建语句执行对象执行SQL语句访问结果集关闭连接资源2025/2/6《Web程序设计》64(1)加载JDBC驱动程序在连接数据库之前,首先要加载数据库驱动到JVM中,主要通过java.lang.Class类的静态方法forName()实现。2025/2/6《Web程序设计》65try{//加载MySql的驱动类Class.forName("com.mysql.jdbc.Driver");//后续操作
}catch(ClassNotFoundExceptione){System.out.println("找不到驱动程序类,加载驱动失败!");e.printStackTrace();}(2)创建数据库的连接成功加载JDBC驱动程序后,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。2025/2/6《Web程序设计》66Stringurl="jdbc:mysql://localhost:3306/testdb";Stringusername="user";Stringpassword="user666";try{Connectioncon=DriverManager.getConnection(url,username,password);}catch(SQLExceptionex){System.out.println("数据库连接失败!");ex.printStackTrace();}(3)创建语句执行对象数据库连接成功后,需要先创建一个Statement对象或其子类PreparedStatement、CallableStatement,用于执行SQL语句。Statement类的对象是用于执行静态SQL语句,PreparedStatement类的对象用于执行动态SQL语句,CallableStatement类的对象主要用于执行存储过程语句。2025/2/6《Web程序设计》67Connectioncon=DriverManager.getConnection(url,username,password);Statementstmt=conn.createStatement();(4)执行SQL语句执行SQL语句主要是通过Statement对象的方法executeQuery()和executeUpdate(),这两个方法分别用于执行查询和更新语句。executeQuery(),用于执行select的数据查询SQL语句executeUpdate(),用于执行insert/update/delete等SQL语句2025/2/6《Web程序设计》68Connectioncon=DriverManager.getConnection(url,username,password);Statementstmt=conn.createStatement();Stringsql=“select*fromt_orderorderbyiddesc”;ResultSetrs=stmt.executeQuery(sql);(5)访问结果集对于数据查询的结果集,需要通过遍历的方法,访问返回的数据。遍历主要通过rs.next()方法,判断结果集是否有数据并继续向下移动,访问下一行数据。2025/2/6《Web程序设计》69ResultSetrs=stmt.executeQuery(sql);while(rs.next()){System.out.println(“id:”+rs.getInt(“order_id”));System.out.println(“address:”+rs.getString(“address”));System.out.println(“createTime:”+rs.getDate(“create_time”));...}(6)关闭连接资源数据查询/更新操作完成以后,要把所有使用的JDBC对象都关闭,以释放JDBC资源。关闭的顺序和创建顺序相反:先关闭ResultSet,再是Statement对象,最后是Connection对象。2025/2/6《Web程序设计》70if(rs!=null){//关闭记录集对象rs.close();}if(stmt!=null){//关闭语句执行对象stmt.close();}if(conn!=null){//关闭连接对象conn.close();}Connection接口Connection是一个接口,用于创建与特定数据库的连接(会话),连接成功后可在会话中访问和操作数据表。Connection对象的常用方法是创建Statement类的对象,主要有三个方法,createStatement()、prepareStatement()与prepareCall(),分别创建Statement、PreparedStatement、CallableStatement的对象,用于SQL语句的执行。2025/2/6《Web程序设计》71Statement接口Statement是JDBC用于执行SQL语句并返回它所生成结果的对象。Statement本质上是一个接口,由各个数据库厂商负责具体的实现。考虑到不同的用途,Statement又额外有两个子接口:PreparedStatement和CallableStatement,分别负责执行动态SQL语句和存储过程语句。2025/2/6《Web程序设计》72Statement接口Statement接口专门用于执行静态的SQL语句,即该语句在执行前已确定SQL语句,没有动态参数需要传入。2025/2/6《Web程序设计》73方法说明voidaddBatch(Stringsql)将给定的SQL命令添加到此Statement对象的当前命令列表中。voidclearBatch()清空此Statement对象的当前SQL命令列表。voidclose()立即释放此Statement对象的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作。booleanexecute(Stringsql)执行给定的SQL语句,该语句可能返回多个结果。booleanexecute(Stringsql,intautoGeneratedKeys)执行给定的SQL语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于检索。int[]executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。ResultSetexecuteQuery(Stringsql)执行给定的SQL语句,该语句返回单个ResultSet对象。intexecuteUpdate(Stringsql)执行给定SQL语句,该语句可能为INSERT、UPDATE或DELETE语句,或者不返回任何内容的SQL语句(如SQLDDL语句)。voidsetQueryTimeout(intseconds)将驱动程序等待Statement对象执行的秒数设置为给定秒数。同一时间每个Statement对象在只能打开一个ResultSet对象。因此,如果读取一个ResultSet对象与读取另一个交叉,则这两个对象必须是由不同的Statement对象生成的。如果存在某个语句的打开的当前ResultSet对象,则Statement接口中的所有执行方法都会隐式关闭它。2025/2/6《Web程序设计》74PreparedStatement接口PreparedStatement表示预编译的SQL语句对象,支持动态SQL语句执行,即SQL语句中的某些数据可以在执行时通过参数动态的传入。PreparedStatement接口的实例化是通过connection对象的prepareStatement(sql)方法来实现的,其中sql为要执行的参数化SQL语句,其中的参数可用“?”表示,支持多个参数,通过PreparedStatement对象的setXXX(i,value)方法设置,“XXX”表示该参数的数据类型,这个数据类型必须与该字段数据库的数据类型一致。2025/2/6《Web程序设计》75示例2025/2/6《Web程序设计》76try{Stringsql=“insertintot_order(user_id,count,total,address)values(?,?,?,?)”;PreparedStatementpstmt=conn.prepareStatement(sql);//obj对象为传入的订单对象,已为每个属性赋了相应的值
pstmt.setInt(1,obj.getUserId());//用户id(int)pstmt.setInt(2,obj.getCount());//订单物品数量(int)pstmt.setFloat(3,obj.getTotal());//订单总金额(float)pstmt.setString(4,obj.getAddress());//地址(varchar)intresult=pstmt.executeUpdate();if(result>0){//如果插入成功
}}PreparedStatement的主要方法方法描述ResultSetexecuteQuery()在此PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象。intexecuteUpdate()在此PreparedStatement对象中执行SQL语句,该语句必须是一个SQLINSERT、UPDATE或DELETE语句;或者是一个什么都不返回的SQL语句,比如DDL语句。voidsetBlob(inti,Blobx)将指定参数设置为给定Blob对象。voidsetBoolean(intparameterIndex,booleanx)将指定参数设置为给定Javaboolean值。voidsetDate(intparameterIndex,Datex,Calendarcal)使用给定的Calendar对象将指定参数设置为给定java.sql.Date值。voidsetDouble(intparameterIndex,doublex)将指定参数设置为给定Javadouble值。voidsetFloat(intparameterIndex,floatx)将指定参数设置为给定Javafloat值。voidsetInt(intparameterIndex,intx)将指定参数设置为给定Javaint值。voidsetLong(intparameterIndex,longx)将指定参数设置为给定Javalong值。voidsetShort(intparameterIndex,shortx)将指定参数设置为给定Javashort值。voidsetString(intparameterIndex,Stringx)将指定参数设置为给定JavaString值。voidsetTimestamp(intparameterIndex,Timestampx)将指定参数设置为给定java.sql.Timestamp值。2025/2/6《Web程序设计》77相比于Statement,PreparedStatement具有以下优势:代码的可读性和可维护性比Statement高。能最大可能提高性能。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度建筑企业内部承包合同争议解决机制
- 2025年度个人信用贷款合同模板汇编
- 2025年度建筑抗震加固安装工程承包合同(安全耐久)
- 盐城江苏盐城市大丰区住房和城乡建设局招聘劳务派遣工作人员4人笔试历年参考题库附带答案详解
- 滁州2025年安徽滁州来安县司法局招聘5名司法协理员笔试历年参考题库附带答案详解
- 湖北2025年湖北理工学院专项招聘97人笔试历年参考题库附带答案详解
- 浙江浙江省卫生健康综合保障中心招聘编外人员笔试历年参考题库附带答案详解
- 洛阳2024年河南洛阳市孟津区引进研究生学历人才50人笔试历年参考题库附带答案详解
- 承德2025年河北承德市中心医院招聘笔试历年参考题库附带答案详解
- 2025年中国五矿机械市场调查研究报告
- 数学-河南省三门峡市2024-2025学年高二上学期1月期末调研考试试题和答案
- 2025年春新人教版数学七年级下册教学课件
- 《心脏血管的解剖》课件
- 心肺复苏课件2024
- 2024-2030年中国并购基金行业发展前景预测及投资策略研究报告
- 河道清淤安全培训课件
- 2024各科普通高中课程标准
- 7.3.1印度(第1课时)七年级地理下册(人教版)
- 教师培训校园安全
- 北师大版语文四年级下册全册教案
- 《湖南师范大学》课件
评论
0/150
提交评论