慕课网《JAVA遇见HTML——JSP篇 第三章 JSP内置对象(上)》学习笔记

课程链接:https://www.imooc.com/learn/166

3-1:JSP内置对象简介

JSP内置对象是Web容器创建的一组对象,不需要使用new关键字来创建,就可以直接使用。例子:

<%

  int[] value = { 60, 70, 80 };

  for( int i: value){

    out.println( i );

  }

%>

JSP九大内置对象:

常用的5个:out, request, response, session, application, 不常用的4个:Page, pageContext, exception, config。

3-3:Web程序的请求与响应模式

Web应用程序都是基于请求/响应模式的。

用户发送请求(request)

服务器给用户响应(response)

 

点击登录向服务器发送请求,在请求对象中封装了用户名和密码。

服务器端接受用户的请求,判断用户名和密码后,给客户端发送响应页面。

3-4:out对象

什么是缓冲区:

缓冲区:Buffer,内存的一块区域用来保存临时数据。

out对象:

out对象是JspWriter类的实例,是向客户端输出内容常用的对象。(这里客户端就是指我们的浏览器)

常用方法如下:

(1)void println() 向客户端打印字符串

(2)void clear() 清除缓冲区的内容,如果在flush之后调用会抛出异常

(3)void clearBuffer() 清除缓冲区的内容,如果在flush之后调用不会抛出异常

(4)void flush() 将缓冲区的内容输出到客户端

(5)void getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0

(6)void getRemaining() 返回缓冲区还剩余多少可用

(7)boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常

(8)void close() 关闭输出流

实例学习:

 

加上out.flush(),强制将缓冲区的内容输出到客户端。

 

 

 发现无影响,只是缓冲区剩余大小变大了。原因是前几句内容在被flush()之后,就会被清空。所以缓冲区剩余大小变大了。

 在flush()之后调用out的clear方法。

 

 

 只输出了前两句话,后台报错。”错误:尝试清空已刷新的缓冲区“。

抛出异常后,后面的语句都不会被执行了。

将out.clear()注释掉。执行out.clearBuffer():

 全都打印出来了,且后台不抛出异常:

 

 

3-6:get与post提交方式的区别

表单常用的提交方式:

get与post区别:

<form name="regForm" action="动作" method="提交方式">

</form>

method属性表示表单的提交方式。

表单有两种提交方式:get和post

(1)get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2KB。安全性较低但效率比post方式高。适合提交数据量不大,安全性不高的数据。比如我们执行搜索、查询等等功能时。

(2)post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息。比如:注册、修改、上传等功能。

实例练习:

 

 

 

 以post方式提交:实际是将表单信息封装到一个数据包里,这个数据包就是HTML HEADER,

 

3-7:request对象(上)

request对象,表示客户端的一次请求。客户端的请求信息被封装在request对象中,通过它才能够了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下:

(1)String getParameter( String name ) 返回name指定参数的参数值

(2)String[] getParameterValues( String name ) 返回包含参数name的所有值的数组

(3)void setAttribute( String, Object ) 存储此请求中的属性

(4)Object getAttribute( String name ) 返回指定属性的属性值

(5)String getContentType( ) 得到请求体的MIME类型

(6)String getProtocol( ) 返回请求用的协议类型及版本号

(7)String getServerName( ) 返回接受请求的服务器主机名

 

 

 出现了中文乱码。tomcat在提交表单时,里面提交的字符串它默认使用的是ISO-8859-1这个字符集,要想更正中文乱码问题,最简单的办法:

在接受这些参数之前,使用request的一个方法,设置它的默认字符集:

<%

  request.setCharacterEncoding("utf-8");

%>

这个setCharacterEncoding设置的值呢,需要跟我在提交表单的那个页面所设置的字符集编码相一致。

 

 出现了空指针异常。是因为你通过URL传参时,你只传了用户名的信息,而没有传hobbies。

加上判断:

 

 

3-8:request对象(下)

void setAttribute( String, Object ) 可以在request请求对象中保存一些属性。

Object getAttribute( String name ) 可以获取属性。

 

String getContentType( ) 得到请求体的MIME类型

String getProtocol( ) 返回请求用的协议类型及版本号

String getServerName() 返回接受请求的服务器主机名

int getServerPort() 返回服务器接收此请求所用的端口号

String getCharacterEncoding() 返回字符编码方式

void setCharacterEncoding() 设置请求的字符编码方式

int getContentLength() 返回请求体的长度(以字节计)

String getRemoteAddr() 返回发送此请求的客户端IP地址

String getRealPath( String path ) 返回一虚拟路径的真实路径(或者说,请求的物理路径)

String request.getContextPath() 返回上下文路径

3-10:response对象

response对象

response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对当前页面无效。常用方法如下:

String getCharacterEncoding() 返回响应用的是何种字符编码

void setContentType( String type ) 设置响应的MIME类型

PrintWriter getWriter() 返回可以向客户端输出字符的一个对象(获得一个输出流对象)(注意比较:PrintWriter与内置out对象的区别)

sendRedirect( java.lang.String location ) 重新定向客户端的请求(请求重定向)

 

 我们发现一个奇怪的现象:outer对象输出的内容,总是在前面来打印,而内置对象out输出的内容,是在PrintWriter对象输出之后来显示。

即:response对象获得的PrintWriter对象,在打印时,是提前于我们内置的out对象的。

怎样让内置out对象输出的<h1>response内置对象</h1>在PrintWriter对象输出的内容的前面呢?

out.flush();//强制清空缓冲区,在清空缓冲区的同时,会将缓冲区的内容写到浏览器上。

 

 sendRedirect( java.lang.String location ) 请求重定向。相当于给客户端发了一个新的请求,让这个请求重定向到一个新的资源。

敲回车,访问register.jsp,跳转到register.jsp。

 

3-11:请求重定向与请求转发的区别

请求重定向:是属于response重定向的一个方法。是客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。

请求转发:服务器端行为,是request的一个方法。request.getRequestDispatcher().forward( req, resp ); 是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。

 (1)测试请求重定向:

 

 请求重定向属于response对象的方法。response.sendRedirect("request.jsp")。

然后我们在request.jsp里来看一下能否正常来接收用户名和爱好。如果能正常接收,那么说明前次请求的对象被保存了。如果不能够正常接收,说明它是一次新的请求。

 

 用户名为null,爱好也没有显示出来。地址栏发生了改变,跳转到了request.jsp。表单本应该提交给response.jsp来处理,结果response.jsp做了请求重定向,相当于让客户端发了一个新的请求,请求到request.jsp,在request.jsp中,由于是一次新的请求,所以说它上一次请求对象当中的提交的用户名和爱好这些参数,是没有办法保存的。所以这里用户名显示为null,爱好为空。这也就说明了,请求重定向,本质上是两次请求,前一次的请求对象不会保存,且地址栏的URL地址会发生改变。

(2)测试请求转发:

 请求转发属于request对象的方法,request.getRequestDispatcher( "request.jsp" ).forward( request, response )。getRequestDispatcher后面参数为你要转发的地址。由于它会保存request对象,所以向后传递forward,传递我们的内置对象request和response。

 参数能够正常传过来。页面内容是request.jsp的页面内容,但是地址栏上的地址还是response.jsp,地址栏并没有发生变化。也就说明了,请求转发是服务器端行为,相当于一次请求,转发后的请求会保存前面那个请求的对象,地址栏的URL地址不会发生改变。其实就是一次请求,转发实际还是上一次请求。

猜你喜欢

转载自www.cnblogs.com/pingfanliliang/p/11681080.html