慕课网《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地址不会发生改变。其实就是一次请求,转发实际还是上一次请求。