JSP(二)--九大内置对象/4大范围对比/验证码/重定向
来源:互联网 发布:ps4 阿里云 编辑:程序博客网 时间:2024/05/01 18:52
JSP的九大内置对象
1.JSP内置对象:就是不用自己定义,直接拿来使用的对象。
2.内置对象一共有9个,可以在web服务器解析jsp后得到的java源文件中看到。
例如,有一个jsp页面如下:
访问该jsp页面后,会生成一个java源文件,如下:
为了生成第九个内置对象,我们需要修改index.jsp:
再次查看java源文件:
注意:
(1)exception内置对象,需要在jsp文件中添加:<%@page isErrorPage="true"%>
才能在java源文件中看到它。
(2)这9大内置对象,只能在jsp页面中使用。
(3)在jsp文件的第一行所写的代码,会出现在java源文件的内置对象定义之后,所以整个jsp页面,都能访问任何内置对象。
3.JSP九大内置对象:
pageContext
request
session
application
response
out
exception
page
config
request内置对象
1.通过http协议我们可以知道一个浏览器向服务器发起请求的时候,一共会发出以下信息:
(1)请求行
(2)请求头
(3)请求体
a)如果请求方式是post,且有参数,那么参数就在请求体里面。
地址栏上看不见参数
b)如果请求方式是get,且有参数,那么参数就是url后面,用?隔开。
例如:http://localhost:8080/kk/index.jsp?a=111&b=222
2.客户端发送给服务器的所有数据,所有信息,都会被封装在request内置对象中,也就是说,请求行+请求头+请求体–>request。
3.学习request就是学习HttpServletRequest类的方法:
4.编码和解码复习:
编码:字符–>对应的数字
解码:数字–>对应的字符
5.有的时候,jsp提交的中文,在request获取以后,变成乱码了:
(1)当客户端提交表单数据的时候,不是直接把input框中的字符轮廓发送给服务器,而是把input框中的字符编码成对应的数字,浏览器在对input框中的字符编码时,查询的是当时设置里选中的那个码表utf-8。
(2)服务器在接收到客户端传来的数字后,就会解码,在request.getParameter("name");
这个方法的内部,就会自动解码,request的码表如果没有设置,就是null,则web服务器会默认使用iso-8859-1码表来解码。此时编码用的是utf-8,解码用的是iso-8859-1,所以得到的就是乱码。
6.解决中文乱码问题方法1:
解决中文乱码问题方法2:
方法2结论:
(1)表单提交方式必须是post;
(2)request.setCharacterEncoding("编码表名");
第二种用的比较多,因为方便。
以后制作表单,method必须给成post。
解决中文乱码问题用到了request的两个方法:
request.setCharacterEncoding();
request.getCharacterEncoding();
7.request获取所有请求参数的名字集合的方法:
8.request的方法:
request.setAttribute(String key,Object value)在request范围中设置一个属性
request.getAttribute(String key)从request范围中获取一个属性。
(request范围参见后面重定向部分request生命周期图)
注意:
在一个请求范围内设置的属性,在同一个请求范围内能获取,在另外一个新请求范围中不能获取。
response内置对象
1.response内置对象:响应内置对象。
2.我们知道,客户端传递给服务器的数据,都被封装进request内置对象中了;反过来,服务器发送给客户端的所有数据,都会被先封装进response对象中,再从response中取出来,制作一个http响应。
3.response的方法: getWriter();
用于获取字符输出流,该流的起点是服务器,终点是客户端。
getOutputStream();
用于获取字节输出流。
字节流可以操作任何文件(文本文件、图片、视频、音频,任何文件)
字符流只能操作文本文件(只要记事本方式能打开的,看不到乱码的就是文本文件)
4.out内置对象是一个字符输出流,getOutputStream()获取的是一个字节输出流,这两个流都能向客户端浏览器发送数据,方向是一致的,所以它们两个的关系是互斥的,不能同事使用out和getOutputStream()。
5.如果非要使用response.getOutputStream()获取字节流,必须让out失效。
使用response.getOutputStream()目的就是为了给客户端发送2进制数据,而不是发送html字符串。
session内置对象
1.在jsp技术中,会话特指:一个用户从打开一个网站的任何一个页面开始,到关闭了该网站的所有页面为止,算一次jsp中的会话。会话就是一段有开始有结束的过程。
2.例如:
打电话:从双方接通开始,持续到任何一方挂断为止,算一次电话会话。
会议:从开会开始,到散会结束,算一次会议会话。
3.给会话范围设置的属性,只要在一次会话范围中,都能获取。
4.session的方法: setAttribute()
在会话范围中设置属性 getAttribute()
从会话范围中获取属性 removeAttribute()
从会话范围中删除指定的属性
5.session的其他方法:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><h2>c.jsp</h2><table> <tr> <td>新会话?</td> <td><%=session.isNew() %></td> </tr> <tr> <td>会话id</td> <td><%=session.getId() %></td> </tr> <tr> <td>会话创建时间</td> <td><%=session.getCreationTime() %></td> </tr> <tr> <td>上次会话访问</td> <td><%=session.getLastAccessedTime() %></td> </tr> <tr> <td>当前系统时间</td> <td><%=System.currentTimeMillis() %></td> </tr> <tr> <td>会话闲置时间</td> <td> <%=System.currentTimeMillis() - session.getLastAccessedTime() %> </td> </tr> <tr> <td>让会话失效</td> <td> <% //session.invalidate(); %> </td> </tr></table><a href="a.jsp">go to a.jsp</a>
application内置对象
1.application:应用对象,应用范围。从部署web应用开始,到卸载web应用为止,算一次应用范围。只有重新部署web应用,或者直接重启tomcat服务器,才能销毁application范围。
2.application的方法: setAttribute()
在应用范围中设置属性 getAttribute()
从应用范围中获取属性 removeAttribute()
从应用范围中删除指定的属性
3.一个web应用描述符:WebRoot/WEB-INF/web.xml文件。对一个web应用的任何配置,都应该在web.xml中进行配置。
例如:通过该文件配置一个web应用的欢迎界面:
注意:每次修改完web.xml必须保存,并且保存以后,还需要重新部署web应用。
4.application.getInitParameter()获取初始化参数:
步骤一:在web.xml中,配置初始化参数。
步骤二:在任何一个jsp页面上使用application.getInitParameter(初始化参数的名字)就可以了。
当web应用被部署的时候,tomcat会自动读取web应用的web.xml配置文件,并且把所有初始化参数自动封装进application对象中。
pageContext内置对象
1.pageContext:页面范围,从进入一个jsp页面开始,到该jsp页面执行完毕,算一次页面范围。
2.pageContext的方法: setAttribute()
在页面范围中设置属性 getAttribute()
从页面范围中获取属性 removeAttribute()
从页面范围中删除指定的属性
3.通过pageContext可以获取4个范围中的数据: findAttribute()
:寻找的范围是从小到大,依次寻找,如果在小范围中已经找到数据了,就不会再继续寻找了。
对比:
(1)pageContext.getAttribute()只在页面范围找,如果找不到,就直接返回null。
(2)只有pageContext才有findAttribute()方法,其他3个范围的内置对象没有。
4.pageContext可以获取其他8个内置对象:
这个功能的价值在于,以后学习的一些技术中,需要使用jsp页面的9大内置对象,如果将9大内置对象直接传递给一个方法,那么这个方法势必要定义9个形式参数,来一个一个接收,所以不如直接传入一个pageContext就可以了 。
5.pageContext.inciude()就是Java代码版本的动态包含:
4大范围对比
1.在当前页面上,4大范围的属性,都能获取:
2.为了甩掉页面范围的值,留下request session application的值,需要转发到一个新页面,只要跳转到另外一个页面,页面范围就是一个新的(无论是转发还是重定向):
3.为了甩掉request范围的值,需要重定向,或者超链接。
4.甩掉会话范围,只要把浏览器窗口关闭完就行,会话就结束,再次打开一个新的浏览器窗口,直接访问b.jsp。
5.最后甩掉应用范围,只需要重新部署以下web应用即可。
注意:
(1)**jsp中的4大范围,从小到大,依次是pageContext < request < session < application
(2)pageContext以外,其它3个范围都可以在不同页面直接传递数据。
3个范围(request session application)都能在不同页面直接传递数据,到底应该如何选择?
选择的原则是:能用小的,就别用大的范围。 因为小范围内的数据,占用内存的少。request session application都是由web服务器创建的,占用的都是web服务器的内存,当a.jsp把参数传递给b.jsp以后,内存就应该释放。
(3)我们学习的时候,把4大范围叫做这样的名字:
页面范围,请求范围,会话范围,应用范围
也有人这样叫:
页面上下文,请求上下文,会话上下文,应用上下文
上下文,意思是:“map结构”。
out内置对象
1.out:字符输出流,起点服务器,终点客户端浏览器。out对象底层封装了套接字,能进行网络数据传输。
2.out.clearBuffer();
清空out缓冲区中的数据。
exception内置对象
1.要使用exception内置对象,必须在jsp页面上添加一个指令元素:
<%@ page isErrorPage="true"%>
2.该内置对象中,存放了上一个jsp页面抛出的异常。
还可以把错误信息打印到某个文件中,便于程序员后期维护,调试错误。
config内置对象
1.config:用于获取jsp页面的初始化参数。
2.获取初始化参数过程:
步骤一:在web.xml中为一个jsp页面配置初始化参数。
步骤二:在那个jsp页面上使用config.getInitParameter(初始化参数的名字)就可以了。
3.与以下配置不同,以下配置出来的初始化参数,可以用在任何一个jsp页面上,但必须使用application.getInitParameter()来获取。
<context-param> <param-name>qq</param-name> <param-value>nihao!!!</param-value> </context-param>
page内置对象
1.page:当前jsp页面对象本身,其实就是this。
2.获取page指令元素的info属性的内容:
JSP九大内置对象总结
1.pageContext:页面范围。通过该对象可以获取其它8个内置对象。
2.request:请求范围。从客户端发起请求开始,到服务器响应之时,算一次请求范围。所有客户端提交给服务器的数据,都全部封装在该对象中。
3.session:会话范围。从客户端浏览器访问一个web网站的任何一个页面开始,到关闭了该网站的所有页面位置,算一次会话范围。
4.application:应用范围。从部署一个web应用开始,到卸载web应用位置,算一次应用范围。
5.response: 响应对象。所有服务器响应给客户端的数据,全部都封装在该对象中。该对象还能完成重定向功能。
6.out:字符输出流。起点服务器,终点客户端,用于把服务器生成的html字符串发送给远程客户端浏览器。
7.exception:异常对象。总是存放上一个jsp页面抛出的异常信息,要使用该对象,必须添加指令: <%@ page isErrorPage=”true” %>
。
8.config:Servlet配置对象。能给某一个jsp页面配置初始化参数。
9.Page:代表当前jsp页面本身本质上就是this。唯一的作用是可以获取<%@page info=”哈哈哈” %>
中的信息。
验证码
1.为了防止机器人恶意注册,我们经常会在各种登陆注册页面看到验证码。
2.验证码实现代码(最简单的):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="java.io.PrintWriter"%><%@page import="java.io.OutputStream"%><%@page import="java.awt.image.BufferedImage"%><%@page import="javax.imageio.ImageIO"%><%@page import="com.sun.image.codec.jpeg.JPEGCodec"%><%@page import="com.sun.image.codec.jpeg.JPEGImageEncoder"%><%@page import="java.awt.Graphics"%><%@page import="java.awt.Color"%><% // 强制让out失效! out.clearBuffer(); out = pageContext.pushBody(); // 告诉浏览器,服务器给你发的是图片,别再查码表去解码了! response.setHeader("content-type","image/jpeg"); // 创建一张在内存中的图片. BufferedImage bi = new BufferedImage(100,20,BufferedImage.TYPE_INT_RGB); // 涂鸦 // 获取画笔 Graphics g = bi.getGraphics(); // g.drawString("张三到此一游!",50,50); // g.drawRect(10,10,100,100); // g.setColor(new Color(255,255,0)); // g.fillRect(10,30,50,80); // g.drawLine(100,60,30,60); // g.drawArc(0,0,100,100,0,360); String letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for(int i=1; i<=4; i++) { int idx = (int)(Math.random()*62); char c = letters.charAt(idx); g.drawString(c+"", i*17,12); } for(int i = 1; i<=4; i++) { // 干扰线 int x1 = (int)(Math.random()*101); int y1 = (int)(Math.random()*21); int x2 = (int)(Math.random()*101); int y2 = (int)(Math.random()*21); g.drawLine(x1,y1,x2,y2); } // 把图片发送给客户端 OutputStream os = response.getOutputStream(); JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os); en.encode(bi);%>
3.在其他jsp页面上使用验证码:
重定向
1.request内置对象的生命周期:
2.转发:
(1)服务器端跳转;
(2)客户端无法感知(地址栏不变);
(3)转发前后一共历经了2个页面,作为客户端一共发起1次请求,2个页面中的所有request都代表同一次请求。
转发前后的2个页面中的所有request内置对象,都代表同一次请求。
转发代码示例:
3.重定向:
4.重定向的特点:
(1)客户端跳转。在客户端浏览器请求一个jsp页面中,jsp响应了302+location响应头,浏览器就会自动再发起第2次请求,去找location指明的资源,注意,第一次请求和第二次请求都是浏览器发出的请求,所以叫客户端跳转。
(2)重定向时,客户端地址栏会发生变化。
(3)重定向前后一共发起2次请求,重定向前后的两个jsp页面中的request各不相同,所以重定向不能延长请求范围。
重定向代码示例:
- JSP(二)--九大内置对象/4大范围对比/验证码/重定向
- JSP九大内置对象_重定向转发_Cookie_Session
- jsp九大内置对象(二)
- JSP详解(二):九大内置对象
- JSP九大内置对象(二)
- JSP九大内置对象及请求转发和重定向
- (二)jsp的九大内置对象及其作用
- JSP九大内置对象详解(二)
- JavaWeb(二)jsp运行原理,九大内置对象
- JavaWeb(二)jsp运行原理,九大内置对象
- JSP九大内置对象
- JSP内置九大对象
- JSP九大内置对象
- JSP九大内置对象
- jsp 九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- 如何在禅道或者网页使用MarkDown样式
- 登录页的锚链节
- Java_基础—自定义异常概述和基本使用
- iOS多线程--彻底学会多线程之GCD
- 中企动力与泰山集团同行 强强联合加速产业布局
- JSP(二)--九大内置对象/4大范围对比/验证码/重定向
- 面试算法:如何利用堆排序实现系统的Timer机制
- 简单的实现三级联动
- 手机浏览器点击input放大问题
- 命令行输入表达式求解计算器
- C#学习记录
- spring的核心(IOC/DI)依赖注入
- 依据服务端返回结果界面到计时
- ASP.net路由原理小结