JavaWeb程序设计基础二(服务器交互篇——九大内置对象)
一、out对象
1、概念
(1)out对象的作用主要是向浏览器输出数据,也可以通过out对象对缓冲区进行操作
(2)JSP程序利用out对象将网页内容输出时,都要和客户端做一次连接,为了节省资源,jsp设置一个缓冲区,输出内容先存放于此,等到满时再一次性将内容发送往客户端
(3)除了直接使用内置对象以外,还可以使用pageContext.getOut()方法获取out对象
(4)out对象被封装成javax.servlet.JspWriter接口,out对象的作用域是page(html都属于out)
2、常用方法
(1)out.println()用于分行显示各种类型的数据,相当于print()加上newLine(),也与“<%=%>”等价
(2)对缓冲区进行操作时
①clear()清空缓冲区中的内容,如果缓冲区中的数已经被刷新到客户端,则会引发IO异常
②clearBuffer()清空缓冲区中的内容,即使缓冲区中的数已经被刷新到客户端,也不会引发IO异常
3、代码例子
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>out对象应用实例</title> </head> <body> <% out.println("out对象应用实例:<br><hr>"); out.println("<br>输出布尔型数据:"); out.println(true); out.println("<br>输出字符型数据:"); out.println('l'); out.println("<br>输出字符数组数据:"); out.println(new char[]{'l','z','c'}); out.println("<br>输出双精度数据:"); out.println(5.66d); out.println("<br>输出单精度数据:"); out.println(36.8f); out.println("<br>输出整型数据:"); out.println(8); out.println("<br>输出长整型数据:"); out.println(123456789123456L); out.println("<br>输出对象:"); out.println(new java.util.Date()); out.println("<br>输出字符串:"); out.println("liuzc@hnrpc"); out.println("<br>输出新行:"); out.newLine(); out.println("<br>缓冲区大小:"); out.println(out.getBufferSize()); out.println("<br>缓冲区剩余大小:"); out.println(out.getRemaining()); out.println("<br>是否自动刷新:"); out.println(out.isAutoFlush()); out.flush(); out.println("<br>调用out.flush()"); out.close();/* out.close()后面的代码不再输出到浏览器 */ out.println(5.66d); %> </body> </html>
二、request对象
1、概念
(1)request是一个javax.servlet.http.HttpServletRequest对象,封装了浏览器的请求信息
(2)通过request对象可以获取用户的请求信息
(3)request也提供获取cookie、header和session等对象的数据的方法
拓展内容🧐:
(1条消息) HTTP 请求header信息讲解_流楚丶格念的博客-CSDN博客_http请求设置header(4)请求信息的内容包括请求的头部信息(Header)、系统信息(编码方式)、请求的方式(GET、POST)、请求的参数名称和参数值等信息
2、request对象的常用方法
3、获取请求头部信息的方法
String getHeader(String name):返回指定头部名称的字符串类型的信息值
Enumeration<String> getHeaderNames():返回所有头部信息的名称
Enumeration<String> getHeaders(String name):返回指定头部名称的所有信息值
int getIntHeader(String name):返回指定头部名称的类型信息值
long getDateHeader(String name):返回指定头部名称的代表日期对象的长整型信息值
<>:枚举型
<%@ page contentType="text/html;charset=UTF-8" import="java.util.*" %> <html> <head> <title> 使用request对象获取并显示全部请求头信息</title> </head> <body> <h1>您客户端发送的HTTP请求头包含如下信息:</h1> <% Enumeration<String>headers = request.getHeaderNames(); while(headers.hasMoreElements()){ String headerName = headers.nextElement(); String headerValue = request.getHeader(headerName); %> <b><%= headerName %></b>:<%= headerValue %><br/> <% } %> </body> </html>
4、获取请求参数的方法
String getParameter (String name):获取name的参数值。
Enumeration getParameterNames():获取所有参数的名称。
String[] getParameterValues(String name):获取name的所有参数值。
Map getParameterMap():取得一个要求参数的Map
(1)input.jsp文件
<html> <body> <form action="request.jsp" method=post name=form> <input type="text" name="boy"> <input type="submit" value="Enter" name="submit"> </form> </body> </html>(2)request.jsp文件
<%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <p>获取文本框提交的信息: <%String strContent=request.getParameter("boy"); %> <%=strContent%> <p> 获取按钮的名字: <%String strButtonName=request.getParameter("submit"); %> <%=strButtonName%> </body> </html>
三、response对象
1、概念
(1)是应答相关的HttpServletResponse类的一个对象,它封装了服务器对客户端的响应
(2)response对象产生的对客户的请求做出动态的响应,并向客户端发送数据,HttpServletResponse对象具有页面作用域
(3)JSP会根据客户端的请求建立一个默认的response对象,用来提供给客户端浏览器的参考信息,比如响应的头,响应的本体(HTML文本内容)以及服务端的状态码信息
2、常用方法
3、代码例子
(1)当前页面转换为excel文件
<%@ page contentType="text/html;charset=UTF-8" %> <html> <head><title>response对象的setContentType方法演示</title></head> <body bgcolor=cyan> <p>将当前页面保存为Word文档吗? <form action="" method="get" name=form> <input type="submit" value="yes" name="submit"> </form> <% String str=request.getParameter("submit"); if(str==null) {str="";} if(str.equals("yes")){ response.setContentType("application/vnd.ms-excel;charset=GB2312"); //尝试下不同的类型,比如application/pdf image/jpeg等 } %> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %> <html> <head> <title> response页面刷新 </title> </head> <body> <% response.setHeader("refresh","2"); out.println(new Date().toLocaleString()); %> </body> </html>
4、重定向的方法
(1)void sendRedirect (String url):将页面定向到指定的地址
String encodeRedirectURL (String url):对指定的地址进行编码
sendRedirect (String url):将对用户端的响应重新定向到指定的url上,这个方法必须在响应被提交之前调用。调用这个方法后,响应立即被提交,在调用这个方法后,Servlet不会再有更多的输出
<%@ page contentType="text/html;charset=UTF-8" %> <html> <head><title>response对象的setContentType方法演示</title></head> <body> <p>你要跳转页面吗? <form action="" method="get" name=form> <input type="submit" value="yes" name="submit"> <input type="reset" value="no" name="reset"> </form> <% String str=request.getParameter("submit"); if(str==null) {str="";} if(str.equals("yes")){ response.sendRedirect("3_5_respose_reflesh.jsp"); } %> </body> </html>
四、session对象
1、概念
(1)session对象是和请求相关的HttpSession对象,它封装了属于客户会话的所有信息
(2)Session在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话
(3)session对象的Id是指当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,同时分配一个字符类型的Id号,JSP引擎同时将这个Id号发送到客户端,存放在cookie中,这样session对象和客户之间就建立了一一对应的关系,当客户再访问连接该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭浏览器后,服务器端将该客户的session对象取消,服务器与该客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的session对象
2、常用方法
<%@ page contentType="text/html;charset=UTF-8"%> <html> <head> <title>session-uv和pv的差别</title> </head> <body> <%!//声明变量和函数 int pv = 0, uv = 1; synchronized void countPv() { pv++; } synchronized void countUv() { uv++; }%> <%//执行java语句 countPv(); //System.out.println(session.toString()); if (session.isNew()) { countUv(); }; // String str = String.valueOf(uv); //application.setAttribute("uv", str); //注销后会如何?其实并不影响session.invalidate(); %> <p> <p> 本网站的UV2:<%=uv %> </p> <p> 本页面访问量PV:<%=pv%> </p> </body> </html>
3、cookie(对比session)
简单理解:Cookie就是保存session传送来的信息的地方
(1)HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了(2)当用户使用浏览器访问一个支持cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器,接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息
这些信息并不是存放在HTTP响应体(Response Body)中,而是存放在HTTP响应头(Response Header),当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置,对于Window操作系统而言,可以从[系统盘]:\Documents and Settings [用户名] \ Cookies目录中找到存储的Cookie
(3)Cookie的常用用途:
①购物车(大部分送服务器的数据库)、逐步注册、搜索引擎记录、个性化服务
②站点跟踪特定访问者访问的次数,最后访问的时间以及访问者进入站点的路径
③Cookie能够帮助站点统计用户个人资料以实现各种各样的个性化服务
④Cookie实现自动登录功能,使得用户不需要输入用户名和密码就可以进入曾经浏览的站点(限定在同一网站)
在Cookie中信息的片段以“名/值”对(name-value pairs)的形式储存
(4)常用方法
(5)对于Cookie的写入和读取,需要结合response对象来实现,写入Cookie的主要步骤如下:
①创建Cookie对象
②设定Cookie的属性(一般设置Cookie的有效期)
③调用response.addCookie(Cookie c)方法将其写入客户端
<%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <!--这里是Cookie的写入 --> cookie write!!!! <% Cookie c=new Cookie("fit-10sss","123456aaaa"); c.setMaxAge(10); //1小时=60分钟*60秒,cookie的有效期,单位秒。不设置失效时间或设置为负数表示当前会话有效,也就是关闭浏览器后Cookie失效 response.addCookie(c); //respose进行add,request进行get %> <!--这里是Cookie的读取 --> <p> cookie read!!!! <p> <% Cookie a[]=request.getCookies(); //respose进行add,request进行get //根据设置时的cookie个数决定数组元素个数 for (int i =0;i<a.length;i++){ String s1=(String)a[i].getName(); String s2=(String)a[i].getValue(); out.println("<br>Cookie的名和值是:"+s1+" "+s2+"<br>"); } %> <body> <html>
4、Cookie和session的异同
(1)存放地点:Cookie存放在客户端的硬盘里,属于离线存放,而session存放在服务器的内存中
(2)存活时间:Cookie可以长期存放在客户端【chrome一般限制是400天】,具体的存活时间由setMaxAge()方法【单位秒】所指定的数值决定,session随用户访问服务器而产生,随客户超时或下线而消失(3)安全性:Cookie存放在客户端,可能会被别有用心的网站读取,安全性较差,而session存放在服务器的内存中,用户不能修改,且随客户端浏览器的关闭而消失,安全性较好
(4)联系:不论是Cookie还是session内置对象都需要浏览器支持Cookie并且没有禁用Cookie
五、application对象
1、概念
(1)application对象负责提供应用程序在服务器运行时的一些全局信息,它在服务器启动时创建,直到服务器关闭时消失,实现的是javax.servlet.ServletContext
(2)它实现了用户间数据的共享,可存放全局变量,这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作
(3)在任何地方对此对象属性的操作,都将影响到其他用户对此的访问
(4)服务器的启动和关闭决定了application对象的生命
2、有关属性操作的方法
(1)public void setAttribute(String name, Object value):在application对象中存储指定名字的属性和值,如果指定的属性名已经存在,则更改这个属性的值
(2)public Object getAttibue(String name):读取application对象中指定名字的属性的值,如果指定的属性名不存在,则返回null
(3)public Enumeration getAttributeNames():获取application对象中所有属性的名字
(4)public void removeAttribue(String name):删除application对象中指定名字的属性,如果指定的属性名不存在,则什么都不做
3、获取容器相关信息的方法
(1)public int getMajorVersion():获取Servlet支持的Servlet API的主版本号
(2)public int getMinorVersion():获取Servlet支持的Servlet API的次版本号
(3)public String getServerInfo():获取Servlet容器的名称和版本号
4、其他方法
(1)public String getMimeType(String file):获取指定文件的MIME类型
(2)public String getRealPath(String path):获取指定path的绝对路径
(3)public String getServletContextName():获取Web应用的名字
(4)public void log(String msg):将指定的信息写入日志文件
<%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <%! ServletContext application; synchronized void countPeople(){ application = getServletContext(); Integer number = (Integer)application.getAttribute("number"); if(number == null){ number = new Integer(1); application.setAttribute("number",number); }else{ number = new Integer(number.intValue()+1); application.setAttribute("number",number); } } %> <% if(session.isNew()){ countPeople(); } int personCount = ((Integer)application.getAttribute("number")).intValue(); %> <p>您是第<%=personCount%>个访问本站的人。 </p> </body> </html>
六、pageContext对象
1、概念
(2)通过pageContext对象也可以得到当前页面中所有其他的JSP内置对象(out、request、response、session、application等)及其所支持的属性
(3)它实现的接口为javax.servlet.jsp.PageContext
2、用户获取属性的方法
(1)public void setAttribute(String name, Object value):在pageContext对象中存储指定名字的属性和值,如果值为null,则效果等同于removeAttribute(String name)
(2)public void setAttribute(String name, Object value, int scope):在指定范围内存储指定名字的属性和值,如果值为null,则效果等同于removeAttribute(String name,int scope)
(3)public Object getAttibue(String name):读取pageContext对象中指定名字的属性的值,如果指定的属性名不存在,则返回null
(4)public Object getAttribute(String name, int scope):读取指定范围内指定名字的属性的值,如果指定的属性名不存在,则返回null
(5)public Enumeration getAttributeNamesInScope(int scope):获取指定范围内所有属性的名字
(6)public int getAttributesScope(String name):读取指定名字的属性的所属范围
(7)public void removeAttrbute(String name):删除pageContext对象中指定名字的属性,如果指定的属性名不存在,则什么都不做
(8)public void removeAttribute(String name, int scope):删除指定范围内指定名字的属性,如果指定的属性名不存在,则什么都不做
(9)public Object findAttribute(String name):依次在pageContext对象,request对象,session对象,application对象中搜索指定名字的属性。如果找到,则返回属性的值,如果没有找到,则返回null
3、常用方法
<%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <% //使用pageContext设置属性,该属性默认在page范围内 pageContext.setAttribute("name","fit pageContext"); request.setAttribute("name","编程 request"); session.setAttribute("name","蓝敏编程 session"); //session.putValue("name","计算机编程"); application.setAttribute("name","蓝敏编程 application"); application.setAttribute("age","99"); %> page设定的值:<%=pageContext.getAttribute("name")%><br> request设定的值:<%=pageContext.getRequest().getAttribute("name")%><br> session设定的值:<%=pageContext.getSession().getAttribute("name")%><br> application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 范围1内的值:<%=pageContext.getAttribute("name",1)%><br> 范围2内的值:<%=pageContext.getAttribute("name",2)%><br> 范围3内的值:<%=pageContext.getAttribute("name",3)%><br> 范围4内的值:<%=pageContext.getAttribute("name",4)%><br> <!--从最小的范围page开始,然后是reques、session以及application--> <%pageContext.removeAttribute("name",3);%> pageContext修改后的session设定的值:<%=session.getAttribute("name")%><br> <%pageContext.setAttribute("name","应用技术培训",4);%> pageContext修改后的application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 查找name的值(注意顺序从page至application逐个查找):<%=pageContext.findAttribute("name")%><br> 查找age的值:<%=pageContext.findAttribute("age")%><br> 属性name的范围:<%=pageContext.getAttributesScope("name")%><br> 属性age的范围:<%=pageContext.getAttributesScope("age")%><br> </body> </html>
七、page对象
1、概念
(1)page对象是JSP页面对应的Servlet类的实现对象,相当于this
(2)page对象是指指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例,page对象在实际开发过程中并不经常使用
2、 page对象常用方法如下:(主要是Object类中声明的方法)
(1)class getClass():返回此Object的类
(2)int hashCode():返回此Object的hash码
(3)boolean equals(Object obj):判断Object是否与指导的Object对象相等
(4)void copy(Object obj):把此Object拷贝到指定的Object对象中
(5)Object clone():克隆此Object对象
(6)String toString():把此Object对象转换成String类的对象
(7)void notify():唤醒一个等待的线程
(8)void notifyAll():唤醒所有等待的线程
(9)void wait(int timeout):使一个线程处于等待直到timeout结束或唤醒
(10)void wait():使仪的线程处于等待直到被唤醒
3、page和pageContext的区别
(1)page:java.lang.Object的实例,对应this关键字。JSP网页本身,page对象是当前页面转换后的Servlet类的实例。从转换后的Servlet类的代码中,可以看到这种关系:Object page = this,在JSP页面中,很少使用page对象。
(2)pageContext:javax.servlet.jsp.PageContext的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据。常用的方法有getServletContext和getServletConfig等八、config对象
1、概念
(1)config对象代表当前JSP页面的配置信息,它对应的接口是:是javax.servlet.ServletConfig
(2)通常情况下,JSP页面无需配置,因此config对象在JSP页面中比较少用,但它在Servlet中的作用比较大
2、config对象的常用方法
(1) public String getInitParameter(String name):获取指定名字的初始化参数的值,如果参数不存在,则返回null
(2)public Enumeration getInitParameterNames():获取所有初始化参数的名字,如果没有初始化参数,则返回一个空的枚举集合
(3)public ServletContext getServletContext():获取Servlet的上下文对象
(4)public String getServletName():获取Servlet对象的名称
<%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <!-- 直接输出config的getServletName的值 --> <%=config.getServletName()%> </body> </html>
九、exception对象
1、概念
(1)exception对象代表了JSP文件运行时所产生的错误和异常对象
(2)只有在包含<%@page isErrorPage="true" %>的页面中才可以使用
(3)在一般的JSP文件中使用该对象会导致无法编译JSP文件
2、常用方法
3、代码例子
(1)3_12_errorpage.jsp文件
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="error.jsp" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>起始页</title> </head> <body> <% float price = Float.parseFloat("10元"); %> </body> </html>(2)error.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>错误提示页面</title> </head> <body> <h2>这里是错误页面提示</h2> <h3> <%=exception.getMessage()%><br> <%=exception.getLocalizedMessage()%><br> <%=exception.toString()%><br> <%=exception.fillInStackTrace()%><br> </h3> </body>
web技术简介,***页技术,JSP运行原理,JSP基本组成,脚本元素,指令元素