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各不相同,所以重定向不能延长请求范围。
重定向代码示例

这里写图片描述