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> 


转其他常见类型文件如下:

(2)每个2秒钟刷新一次页面
<%@ 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不会再有更多的输出

(2)通过setRedirect实现页面跳转
<%@ 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本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是CookieSession

(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、概念

(1)JSP利用页面上下文对象pageContext可以获取页面所有相关的属性

(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>


Java Web 文章被收录于专栏

web技术简介,***页技术,JSP运行原理,JSP基本组成,脚本元素,指令元素

全部评论
活到老学到老
点赞 回复 分享
发布于 2022-09-28 16:54 河南

相关推荐

zyNotCute:感觉问题主要在学校,以及项目吧,项目有些偏简单了;专业技能方面没写redis和微服务有一点小薄弱;当然acm打得好也是不错的。可以再打磨一下祝找工顺利
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务