1.内置对象简介
1.1内置对象的简介
JSP内置对是Web容器创建的一组对象,不适用new关键字就可以使用的内置对象
Tips:如下代码中的out就是内置对象
<%
int[] value={60,70,80};
for(int i:value) {
out.print(i)
}
%>
1.2 JSP九大内置对象
- out对象
- request对象
- response对象
- session对象
- application对象
- Page、pageContext、exception对象、config对象
2.四种作用域范围
>
名称 | 作用域 |
---|---|
Page | 当前页面有效 |
request | 当前请求中有效 |
session | 当前回话中有效 |
application | 在所有应用程序中有效 |
Tips:
1.Page
在当前页面有效,即用户请求的页面有效,当当前页面关闭时,page对象将相应回馈给客户端后释放
2.request
一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。
3.session
session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。
4.application
如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
3.out对象
3.1 什么是缓冲区
缓冲区(Buffer)就是内存的一块区域用来保存临时数据
3.2 Out对象
Out对象是JspWriter类的实例,是向客户端输出内容的对象
常用方法如下:
* 1.void println() 向客户端打印字符串
* 2.void clear() 清除缓冲区中的内容,如果在flush之后会抛出异常
* 3.void clearBuffer() 清空缓冲区的内容,在flush之后不会抛出异常
* 4.void flush() 将缓冲区内容输出到客户端
* 5.int getBufferSize() 返回缓冲区字节大小,如不设置缓冲区则为0
* 6.int getRemaining() 返回缓冲区还剩余多少可用
* 7.boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
* 8.void close() 关闭输出流
案例演示:
<body>
<%
out.println("<h2>静夜思</h2>");
out.println("床前明月光,<br>");
out.println("疑是地上霜。<br>");
out.flush(); //将缓冲区中的内容输出到客户端
out.println("举头望明月,<br>");
out.println("低头思故乡。<br>");
out.getRemaining(); //获取缓冲区剩余字符大小
%>
<!-- 获取缓冲区字符大小 -->
缓冲区中字符大小:<%=out.getBufferSize() %> byte<br>
缓冲区剩余容量大小:<%=out.getRemaining() %> byte<br>
</body>
演示结果
静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
缓冲区中字符大小:8192 byte
缓冲区剩余容量大小:8112 byte
4.request对象
表单提交的两种方式:get和post
4.1 get和post区别
<form name="regForm" action="动作" method="提交方式"></form>
1.get:
以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2kb。安全性低,但效率比post方式高。适合提交数据量不大,安全性不高的数据。比如:搜索、查询等功能。
2.post
将用户提交的信息HTML HEADER内。适合提交数据量大,安全性高的影虎信息。比如:注册、修改、上传等功能。
案例演示
1.get提交方式
<form action="doLogin.jsp" name="loginForm" method="get">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit" name="login"></td>
</tr>
</table>
</form>
浏览器地址栏:
http://localhost:8080/web/doLogin.jsp?userName=%E5%BC%A0%E4%B8%89&password=123456&login=%E6%8F%90%E4%BA%A4
2.post提交方式
Tips:
地址栏不会显示用户提交的信息
http://localhost:8080/web/doLogin.jsp
4.2 request对象
客户端的请求信息被封存在request对象中,通过它才能了解到客户的需求。requset对象是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
4.2.1 requset对象常用的方法
方法 | 功能 |
---|---|
String getParameter(String name) | 返回name属性指定参数的参数值 |
String[] getParameterValue(String name) | 返回包含参数name的所有值的数组 |
void setAttribute(String,Object) | 存储此请求中的属性 |
Object getAttribute(String name) | 返回指定属性的属性值 |
String getContentType() | 得到请求的MIME类型 |
String getProtocol() | 返回请求用的协议类型和版本号 |
String getServerName() | 返回接受请求的服务器主机名 |
int getServerPort() | 返回服务器接受此请求所用的端口号 |
String getCharacterEncoding() | 返回字符编码方式 |
void setCharacterEncoding() | 设置请求的字符编码方式 |
int getContentLength() | 返回请求题的长度(以字节数) |
Stirng getRemoteAddr() | 返回发送此请求的客户端IP地址 |
String getRealPath(String path) | 返回一虚拟路径的真实路径 |
String request.getContexPath() | 返回上下文路径 |
4.2.2 案例演示:
发送端jsp页面表单
1.首先创建一个jsp页面,命名为:request.jsp
<form action="doRequest.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="checkbox" name="favourite" value="read">读书
<input type="checkbox" name="favourite" value="music">音乐
</td>
<td>
<input type="checkbox" name="favourite" value="running">跑步
<input type="checkbox" name="favourite" value="swimming">游泳
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="login"></td>
</tr>
</table>
</form>
接收端jsp页面代码:
2.创建一个jsp页面,命名为:doRequest.jsp,这个页面的作用是接收从requset页面传递的参数。
<body>
<lable>用户名: <%=request.getParameter("userName") %></lable><br>
<lable>密码: <%=request.getParameter("password") %></lable><br>
<lable>兴趣爱好:
<%
//getParameterValues()返回一个组名称相同的集合的值
String [] str=request.getParameterValues("favourite");
if(str!=null) {
for(String s:str) {
out.println(s+" ");
}
}
%>
</lable>
</body>
浏览器运行效果:
用户名: sdfsd
密码: asdfa
兴趣爱好: read music running swimming
当在表单中输入汉字的时候,接收端的jsp页面显示的是乱码,这是因为,request对象接收和提取参数的默认编码方式为”iso-8859-1”,所以需要在提取参数之前修改编码方式为”utf-8”
<%
//设置request对象接收参数以"utf-8"编码提取,默认的编码为"iso-8859-1"
request.setCharacterEncoding("utf-8");
%>
其他常用方法代码
<div>
得到请求的MIME类型: <%=request.getContentType() %><br>
返回请求用的协议类型和版本号 <%=request.getProtocol() %><br>
返回接受请求的服务器主机名: <%=request.getServerName() %><br>
返回服务器接受此请求所用的端口号:<%=request.getServerPort() %><br>
返回字符编码方式 <%=request.getCharacterEncoding() %><br>
返回请求题的长度(以字节数) <%=request.getContentLength() %><br>
返回发送此请求的客户端IP地址: <%=request.getRemoteAddr() %><br>
返回一虚拟路径的真实路径: <%=request.getRealPath("request.jsp") %><br>
返回上下文路径: <%=request.getContextPath() %>
</div>
用户名: 张三
密码: 1234567
兴趣爱好: read music running swimming
得到请求的MIME类型: application/x-www-form-urlencoded
返回请求用的协议类型和版本号 HTTP/1.1
返回接受请求的服务器主机名: localhost
返回服务器接受此请求所用的端口号:8080
返回字符编码方式 utf-8
返回请求题的长度(以字节数) 137
返回发送此请求的客户端IP地址: 0:0:0:0:0:0:0:1
返回一虚拟路径的真实路径: D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\web\request.jsp
返回上下文路径: /web
Tips:
调用request对象的getRemoteAdrr()方法,显示的ip地址错误,原因是该方法只能获取静态的ip地址,如果是都动态IP则获取不到
5.response对象
5.1 response对象简介
reponse对象包含了响应客户请求的有关信息,但在JSP中很少使用 它。它是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其他页面的response对象对当前页面无效。
5.2 response对象的常用方法
方法 | 作用 |
---|---|
String getCharacterEncoding() | 返回响应的是何种字符编码 |
void setContentType(String tyoe) | 设置响应的MIME类型 |
PrintWriter getWriter() | 返回可以像客户端输出字符的一个对象(获得输出流对象,区别于内置对象out) |
sendRedirect(java.lang.String location) | 重新定向客户端的请求 |
5.3 案例演示
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import=" java.io.*"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
response.setContentType("text/html;charset=UTF-8"); //设置响应的MIME类型
out.println("response对象"+"<br>");
PrintWriter outer=response.getWriter(); //获取输出流对象
outer.println("我是response对象的outer对象"+"<br>");
out.println(response.getCharacterEncoding()); //打印response对象返回的字符集编码方式
%>
Tips:
注意都outer对象输出的内容在内置对象out对象的前面显示,这是out对象和PrintWriter类对象outer对象的区别,outer的内容总是先于out对象显示。解决办法是在out对象输出的内容后加上out.flush(),强制清空输出out中的内容。
我是response对象的outer对象
response对象
UTF-8
请求重定向
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import=" java.io.*"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
response.setContentType("text/html;charset=UTF-8"); //设置响应的MIME类型
out.println("response对象"+"<br>");
PrintWriter outer=response.getWriter(); //获取输出流对象
outer.println("我是response对象的outer对象"+"<br>");
out.println(response.getCharacterEncoding()); //打印response对象返回的字符集编码方式
response.sendRedirect("MutipfyTable.jsp"); //请求重定向
%>
Tips:
response对象最后一行代码请求重定向到MutipfyTable.jsp页面,该页面输出一个九九乘法表。
九九乘法口诀表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
5.4 请求转发和请求重定向的区别
方式 | 区别 |
---|---|
请求重定向 | 客户端行为,response.sendRedirect(),从本质上讲是两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。 |
请求转发 | 服务器行为,requset.getRequestDispatch().forward(req,resp); 是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。 |
6.session对象
6.1 什么是session
- session表示客户端与服务器的一次会话
- Web中的session指的是用户在浏览某个网站的时,从进入网站到浏览器关闭所经过的这段时间,也就是用户刘侃这个网站所花费的时间,我们说是一个session
- 综上所述,session实际上是一个特点的时间概念
- session保存在服务器的内存当中,每一个用户在服务器中保存不同的session
6.2 session对象
- session对象是一个JSP内置对象
- session对象在第一个JSP也变被加载时自动创建,完成会话期管理
- 从一个客户打开浏览器并连接到服务器开始,到用户关闭浏览器离开这个服务器结束,被称为一个会话
- 当一个客户访问一个服务器的时候,可能会在服务器几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象
- session对象是HttpSession类的实例
6.3 session对象常用方法
方法 | 作用 |
---|---|
long getCreationTime() | 返回session创建的时间(毫秒值) |
public String getId() | 返回session创建时JSP引擎为它设的唯一ID号 |
public void setAttribute(String name,Object value) | 以键值对的方式将对象绑定到此会话 |
public Object getAttribute(String name) | 返回此会话中指定名称绑定在一起的对象,如果没有对象绑定到该名称下。则返回null |
String [] getValueNames() | 返回一个包含此session中所有可用属性的数组 |
int getMaxInactivInterval() | 返回凉席请求间隔多长时间次session对象被撤销(单位秒) |
void setMaxInactiveInterval() | 设置此session对象存活的最大时间(单位秒) |
6.4 实例演示
(1) session_page1.jsp
<title>session_page1</title>
</head>
<body>
<h1>session对象</h1>
<hr>
<%
SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date=new Date(session.getCreationTime());
%>
session对象创建的时间:<%=sdf.format(date)%><br>
<!-- 在session中绑定对象 -->
<%
session.setAttribute("userName", "admin");
//设置session的最大有效时间(秒)
session.setMaxInactiveInterval(10); //10秒
%>
获取session中绑定的对象值: <%=session.getAttribute("userName") %><br>
获取session在的唯一ID号: <%=session.getId() %>
<br>
<a href="session_page2.jsp">跳转到session_page2</a>
</body>
</html>
session对象
session对象创建的时间:2017年10月08日 14:09:48
获取session中绑定的对象值: admin
获取session在的唯一ID号: 2EB26E0373352B2246D386C98833B0F8
跳转到session_page2
(2) session_page2.jsp
<body>
<%
SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date=new Date(session.getCreationTime());
%>
session的id号为:<%=session.getId() %><br>
session中绑定的用户名:<%=session.getAttribute("userName") %><br>
session创建的时间:<%=sdf.format(date) %>
<br>
session中保存的属性:<%
String[] str=session.getValueNames(); //获取session中所用可用属性的数组
for(int i=0;i<str.length;i++) {
out.println(str[i]+" ");
}
%>
</body>
session的id号为:2EB26E0373352B2246D386C98833B0F8
session中绑定的用户名:admin
session创建的时间:2017年10月08日 14:09:48
session中保存的属性:userName
Tips:
如果在session_page1.jsp页面停留的时间超过10秒。那么跳转到session_page2.jsp显示的页面如下所示
session的id号为:608B069F812CA0AA8E493B4D9D4A63D3
session中绑定的用户名:null
session创建的时间:2017年10月08日 15:05:48
session中保存的属性:
因为session设置的有效时间为10秒,过了10秒之后再跳转页面。之前的session就不存在了。所以session_page2页面的session对象的id也发生了变化。
6.4 Session的生命周期
session的生命周期要经历三个阶段,创建——>活动——>销毁
创建
当客户端第一次访问某个jsp或者servlet时候,服务器会问当前会换创建一个sessionID,每次客户端向服务器发送请求时,都会将此sessionID携带过去,服务器会对此sessionID进行检验。判断是否属于同一词会话。
活动
- 某次会话当中,通过超链接打开的新的页面属于同一次会话
- 只要当前会话的页面没有全部关闭,重新单打开的浏览器窗口访问同一个项目资源时属于同一次会话。
- 除非本次会话的所有页面都关闭再重新访问某个jsp页面或者Servlet将会创建新的会话注意:原有的会话还存在,只是这个旧的sessionid仍然存在于服务端,只是再也不会有客户端携带它然后交个服务端校验
销毁
session销毁的三种方式
- 调用session.invalidate()方法
- session过期(超时)
- 服务器重新启动
7.application对象
7.1application对象简介
- application对象实现了用户间数据的共享,可存放全局变量
- application开始于服务器启动,终止于服务器关闭
- 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作
*application对象属于服务器,而不属于某个对象,也就是说,在任何地方对application对象的属性的操作,都将影响到其他用户对此的访问。- 服务器的启动和关闭,决定了application对象的生命。
- application对象是ServletContext类的实例
7.2 常用方法
方法 | 作用 |
---|---|
public void setAttribute(String name , Object value) | 使用指定名称将对象绑定到此会话 |
public Object getAttribute(String name) | 返回此会话中的指定名称绑定到一起的对象,如果没有对象绑定在改名称下,则换回null |
Enumeration getAttributeNames() | 返回所用可用属性的枚举 |
String getServerInfo() | 返回JSP(SERVLET)引擎及版本号 |
7.3 案例演示
<h1>application内置对象</h1>
<%
application.setAttribute("city", "北京");
application.setAttribute("position", "01");
application.setAttribute("emain", "1540433618@qq.com");
%>
<%=application.getAttribute("city") %>
<%
Enumeration attributes=application.getAttributeNames();
while(attributes.hasMoreElements()) {
out.println(attributes.nextElement()+"nbsp;nbsp;");
}
%>
<br>
JSP(SERVLET)引擎及版本号为:<%=application.getServerInfo() %>
application内置对象
北京 javax.servlet.context.tempdirnbsp;nbsp; org.apache.catalina.resourcesnbsp;nbsp; org.apache.tomcat.util.scan.MergedWebXmlnbsp;nbsp; citynbsp;nbsp; org.apache.tomcat.InstanceManagernbsp;nbsp; org.apache.catalina.jsp_classpathnbsp;nbsp; org.apache.jasper.compiler.ELInterpreternbsp;nbsp; org.apache.jasper.compiler.TldLocationsCachenbsp;nbsp; org.apache.tomcat.JarScannernbsp;nbsp; javax.websocket.server.ServerContainernbsp;nbsp; positionnbsp;nbsp; emainnbsp;nbsp; org.apache.jasper.runtime.JspApplicationContextImplnbsp;nbsp;
JSP(SERVLET)引擎及版本号为:Apache Tomcat/7.0.81
8.page对象
8.1 page对象简介
page页面就是指向当前页面本身,类比于this指针,他是java.lang.Object类的实例
8.2 常用方法
参照JDK文档的Object类的肠炎方法
9.pageContext对象
9.1 pageContext简介
- pageContext对象提供了对JSP页面内所用的对象及名字空间的访问
- pageContext对象可以访问本页所有的session,也可以取本页所在application的某一属性值
- pageContext对象相当于页面中所有功能的集大成者
- pageContext对象的本类名为pageContext
9.2 pageContext对象的常用方法
方法 | 作用 |
---|---|
JspWriter getOut() | 返回当前客户端响应被使用的JspWriter流(out) |
HttpSession getSession() | 返回当前页面的session |
Object getPage() | 返回当前页面的page对象 |
ServletRequest getRequest() | 返回当前页面的request |
ServletResponse getResponse() | 返回当前页面的response |
void setAttribute(String name, Object attribute) | 设置属性及属性值 |
Object getAttribute(String name , int scope) | 在指定范围内取属性的值 |
int getAttributeScope(String name ) | 返回某属性的作用范围 |
void forward(Stirng relativeUrlPath) | 使得当前页面重导到另一页面、 |
void include(Strng relativeUrlPath) | 在当前文件包含领一文件 |
10.Config对象
10.1 Config对象简介
config对象是一个在Servlet初始化时,JSP引擎想它传递信息用的,此信息包括Servlet初始化时所要用的参数(通过键值对的方式构成)以及服务器的有关信息(通过传递一个ServletContext对象)
10.2 常用方法
方法 | 功能 |
---|---|
ServletContext getServletContext() | 返回包含服务器相关信息的ServletContext对象 |
String getInitParameter(String name) | 返回初始化参数的值 |
Enumeration getInitParameterNames() | 返回Servlet初始化所需要的所有参数的枚举 |
10 exception对象
10.1 exception对象简介
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面应用此对象,就必须吧isErrorPage设为True,否则无法编译。exception对象实际上是java.lang.Throwable对象
10.2 常用方法如下
方法 | 功能 |
---|---|
String getMessage() | 描述异常的信息 |
String toString() | 返回关于异常的剪短描述信息 |
void printStackTrace() | 显示异常及其轨迹 |
Throwable FillInStackTrace() | 重写异常的执行轨迹 |
10.3 案例演示
(1) exception.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="doexception.jsp" %>
<!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>exception</title>
</head>
<body>
<h1>测试异常的页面</h1>
<%
System.out.println(1/0);
%>
</body>
</html>
(2) doexception.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">
<!--下边是嵌入的java代码-->
<%
Date myday=new Date(); // 获取系统时间
SimpleDateFormat format =new SimpleDateFormat("yyyy-MM-dd-HH-mm:ss"); //定义日期输出格式
String time =format.format(myday); //按照定义的格式输出时间
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>doException</title>
</head>
<body>
<h1>处理exception页面异常</h1>
<%=exception.getMessage() %><br>
<%=exception.toString() %><br>
<%=exception.getStackTrace() %>
</body>
</html>
处理exception页面异常
/ by zero
java.lang.ArithmeticException: / by zero
[Ljava.lang.StackTraceElement;@750ae
Tips
exception.jsp页面中的errorPage属性:errorPage=”doexception.jsp”
doexception.jsp 中的属性isErrorPage=”true”,否则页面将会报错。