一、什么是内置对象?
内置对象的来源?
在jsp开发中,会频繁使用到一些对象。例如
HttpSession,ServletContext,
ServletContext,HttpServletRequet。
如果我们每次要使用这些对象都去创建这些对象就显示非常麻烦。
所以Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发
者创建好这些对象,而开发者只需要直接使用这些对象调用方法即
可!,这些创建好的对象就叫内置对象!!!!
举例:
servlet:
HttpSession session = request.getSession(true); (需要开发者做)
jsp:
tomcat服务器: HttpSession session = request.getSession(true);(不需要开发者做)
开发者做的: session.getId();
内置对象
请求响应会话
服务页面配置
输出页面上下文 异常
JSP内置对象就是新建JSP时,JSP已经为开发者创建好的对象,可以直接拿过来用,不需要自己创建。
JSP共有九个内置对象。
二、9大内置对象
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext ---page的上下文对象
2.1 内置对象的原理
服务器在执行jsp翻译时,会自动生成创建这些内置对象的代码,我们只需要使用
对象名称调用方法即可。
实例:
以下代码是jsp翻译后的java源文件,类中的_jspService()方法。
该方法中自动生成了九大内置对象
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=utf-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"utf-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\t\r\n");
out.write("\t");
...
}
2.2 jsp中的内置对象创建时间
jsp一旦被访问,这九大内置对象就会被创建。
创建session对象。
三、out对象
## out对象类型,JspWriter类,相当于带缓存的PrintWriter
## 在Servlet中,我们使用resp.getWriter() 获取PrintWriter类对象输出内容。
在jsp中,我们使用out内置对象(JspWriter类)输出内容
## PrintWriter: (不带缓冲区,直接输出内容到浏览器)
PrintWriter writer=response.getWriter()
writer.wrier(内容): 直接向浏览器写出内容。
## JspWriter:(带缓冲区,会直接输出内容到缓冲区)
writer(内容): 向jsp缓冲区写出内容
当满足以下条件之一,缓冲区内容写出:
1)缓冲区满了
2)刷新缓存区
3)关闭缓存区
4)执行完毕jsp页面
3.1 jsp页面的缓存机制
3.1.1 PrinterWriter类对象
resp.getWriter().write("test")
1.在Servlet中使用,直接输出内容到浏览器,不带缓冲区
3.1.2 JspWriter 类对象
out.write("test")
1.out对象类型,JspWriter类,相当于带缓存的PrintWriter
2.直接输出内容到缓冲区,缓冲区就像一个存储数据的集合。
当满足特定条件时,才会把缓冲区的内容传送给PrinteWriter
对象,再由PrinteWriter对象输出到浏览器。
3.1.3 什么情况下,jsp缓冲区的内容往外写出
1)缓存区满了
2)手动刷新缓存区
3)关闭缓冲区
4)执行完jsp页面
缓冲区
##缓冲区的大小默认为8kb。
##手动指定缓冲区大小:
<%@ page
language="java"
pageEncoding="utf-8"
buffer="8kb" 手动指定缓冲区大小
%>
##关闭缓冲区
<%@ page
language="java"
pageEncoding="utf-8"
buffer="0kb" 指定缓冲区大小为0
%>
## 手动刷新缓存区
out.write("123");
out.flush();
## 执行完jsp页面
执行完jsp页面,缓冲区的内容自动传送给PrintWriter对象,
然后由PrintWriter对象输出内容到浏览器。
缓冲区相关API
<%@ page language="java"
pageEncoding="utf-8"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
out.write("缓冲区大小:"+out.getBufferSize());
out.write("缓冲区剩余的大小:"+out.getRemaining());
%>
</body>
</html>
实例
实例:使用out写出test,再使用printWriter写出123。
jsp代码:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
out.write("test");
response.getWriter().write("123");
%>
</body>
</html>
浏览器
分析:
问题:
由代码可知,我们预想浏览器输出内容是 【test 123】,
而浏览器展示的结果却是【123 test】,为什么输出的结果和我们预期不一致?
原因分析:
out.write("test");
response.getWriter().write("123");
首先使用out写出内容到缓冲区,然后使用PrintWriter输出内容直接到浏览
器。由于缓冲区的内容只有在jsp加载完毕后,才输出到浏览器,所以会先输
出123 ,然后又输出test
四、pageContext对象(page的上写文对象)
pageContext对象
作用:
1.可以通过该对象获取其他八个内置对象。更方便使用。
2.作为域对象
使用场景: 在自定义标签的时候,PageContext对象频繁使用到!!!
4.1 pageContext的作用
4.1.1 获取其他八大内置对象
//requets
HttpServletRequest req=(HttpServletRequest)pageContext.getRequest();
//response
HttpServletResponse resp=(HttpServletResponse)pageContext.getResponse();
//out
JspWriter out=pageContext.getOut();
//application
ServletContext application = pageContext.getServletContext();
//servletConfig
ServletConfig servletConfig = pageContext.getServletConfig();
//this
Object this_obj = pageContext.getPage();
//session
HttpSession sesison = pageContext.getSession();
//exception
Exception exception = pageContext.getException();
//writer
PrintWriter writer = resp.getWriter();
<%@ page language="java"
pageEncoding="utf-8"
isErrorPage="true"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.getServletConfig();
pageContext.getRequest();
%>
</body>
</html>
4.1.2 作为域对象
pageContext作为域对象,只在当前jsp中有效。
相关API:
##保存数据
1.默认情况下,保存数据到pageContext域中,pageContext域中的数据只在当前jsp有效
pageContext.setAttribute("name","test");
2.可以向四个域对象中保存数据
pageContext.setAttribute("name","test",PageContext.REQUEST_SCOPE);
域范围常量:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
##从域中读取数据
1.默认情况下,从page域中获取数据
pageContext.getAttribute("name")
2.从指定的域中获取数据
pageContext.getAttribute("name",PageContext.REQUEST_SCOPE)
3.在四个域中自动搜索获取数据,找到即可。
pageContext.findAttribute("name")
顺序:page域-》request域-》session域-》context域
保存到pageContext域中
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("test", "123");
%>
11111
<%=pageContext.getAttribute("test")%>
</body>
</html>
保存到其他域中
<%@ page language="java"
pageEncoding="utf-8"
isErrorPage="true"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<!-- 保存到page域中 -->
<%
pageContext.setAttribute("test", "123");
%>
11111
<%=pageContext.getAttribute("test")%>
<!-- 保存到其他域中 -->
<%
pageContext.setAttribute("test", "request-123", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("test", "session-123",PageContext.SESSION_SCOPE);
pageContext.setAttribute("test", "context-123",PageContext.APPLICATION_SCOPE);
%>
请求域:
<%=pageContext.getAttribute("test",PageContext.REQUEST_SCOPE)%>
session域:
<%=pageContext.getAttribute("test",PageContext.SESSION_SCOPE)%>
context域:
<%=pageContext.getAttribute("test",PageContext.APPLICATION_SCOPE)%>
</body>
</html>
五、page对象
Page:代表了正在运行的由JSP文件产生的类对象。即在jsp翻译后的java类生成的对象,即servlet对象。
六、request对象
### 请求行
req.getMethod() 获取请求的方式 GET/POST/DELETE ...
req.getRequestURI() 获取资源标识 /demo/hello
req.getRequestURL() 获取资源定位 http://localhost:8080/ demo/hello
req.getProtocol() 获取HTTP请求协议 HTTP/1.1 或 HTTP/1.0
###请求头
req.getHeader("key") 根据请求头的key获取值
Enumeration<String> en = req.getHeaderNames(); 获取所有请求头
### 实体内容【只有post提交的才有实体内容】
req.getInputStream(); 获取实体内容
### 获取请求参数
GET方式:请求参数放在URI的后面
req.getQueryString(); 获取GET方式参数(?后面的键值对)
POST方式:请求参数放在实体内容中
req.getInputStream(); 获取POST方式参数
===》问题:由于以上两种不通用,而且获取到的参数还需要进一步地解析。 =====》所以可以使用统一方便的获取参数的方式。
统一方便的获取参数:
核心的API:
request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数)
request.getParameterValues("参数名“);根据参数名获取参数值(可以获取多个值的参数--复选框有多个值)
request.getParameterNames(); 获取所有参数名称列表
###其他
request.setCharacterEncoding("utf-8") 设置获取请求数据的编码集
request.getContextPath(); /项目名
getRequestDispatcher(“要跳转到的页面”).forward(request, response):服务器跳转页面
setCharacterEncoding(编码集):设置请求的编码集,解决参数乱码问题(post请求适用)
getContextPath():当前项目名
getScheme():传输协议
getServerName():主机IP地址
getServerPort():端口号
七、session对象
HttpSession类:用于保存会话数据
1)创建或得到session对象
HttpSession getSession()
HttpSession getSession(boolean create)
2)设置session对象
void setMaxInactiveInterval(int interval) : 设置session的有效时间,单位为秒
void invalidate() : 销毁session对象
java.lang.String getId() : 得到session编号
3)保存会话数据到session对象
void setAttribute(String name,Object value) : 保存数据
Object getAttribute(String name) : 获取数据
void removeAttribute(String name) : 清除数据
getCreationTime:创建时间
getLastAccessedTime:最后一次访问时间
特性:
只能在一次会话中传值,多次会话无效。会话指的就是浏览器是否关闭
session数据有默认销毁时间,是30分钟。
总结
Jsp的内置对象(重点)
2.1 什么是内置对象?
在jsp开发中,会频繁使用到一些对象
。例如HttpSession,ServletContext,ServletContext,HttpServletRequet。如果我们每次要使用这些对象都去创建这些对象就显示非常麻烦。所以Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象,而开发者只需要直接使用这些对象调用方法即可!,这些创建好的对象就叫内置对象!!!!
举例:
servlet:
HttpSession session = request.getSession(true); (需要开发者做)
jsp:
tomcat服务器: HttpSession session = request.getSession(true);(不需要开发者做)
开发者做的: session.getId();
2.2 9大内置对象
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
2.3 Out对象
out对象类型,JspWriter类,相当于带缓存的PrintWriter
PrintWriter:
wrier(内容): 直接向浏览器写出内容。
JspWriter
writer(内容): 向jsp缓冲区写出内容
当满足以下条件之一,缓冲区内容写出:
1)缓冲区满了
2)刷新缓存区
3)关闭缓存区
4)执行完毕jsp页面
2.4 pageContext对象
pageContext对象的类型是PageContext,叫jsp的上下文对象
1)可以获取其他八个内置对象
public class 01_hello_jsp {
public void _jspService(request,response){
创建内置对象
HttpSession session =....;
ServletConfig config = ....;
把8个经常使用的内置对象封装到PageContext对象中
PageContext pageContext = 封装;
调用method1方法
method1(pageContext);
}
public void method1(PageContext pageContext){
希望使用内置对象
从PageContext对象中获取其他8个内置对象
JspWriter out =pageContext.getOut();
HttpServletRequest rquest = pageContext.getRequest();
........
}
}
使用场景: 在自定义标签的时候,PageContext对象频繁使用到!!!
2)本身是一个域对象
ServletContext context域
HttpServletRequet request域
HttpSession session域 --Servlet学习的
PageContext page域 --jsp学习的
作用: 保存数据和获取数据,用于共享数据
#保存数据
1)默认情况下,保存到page域
pageContext.setAttribute("name");
2)可以向四个域对象保存数据
pageContext.setAttribute("name",域范围常量)
#获取数据
1)默认情况下,从page域获取
pageContext.getAttribute("name")
2)可以从四个域中获取数据
pageContext.getAttribute("name",域范围常量)
域范围常量:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
3)自动在四个域中搜索数据
pageContext.findAttribute("name");
顺序: page域 -> request域 -> session域- > context域(application域)
3 Jsp中的四个域对象
四个域对象:
pageContext page域
request request域
session session域
application context域
1)域对象作用:
保存数据 和 获取数据 ,用于数据共享。
2)域对象方法:
setAttribute("name",Object) 保存数据
getAttribute("name") 获取数据
removeAttribute("name") 清除数据
3)域对象作用范围:
page域: 只能在当前jsp页面中使用(当前页面)
request域: 只能在同一个请求中使用(转发)
session域: 只能在同一个会话(session对象)中使用(私有的)
context域: 只能在同一个web应用中使用。(全局的)
4 Jsp的最佳实践
Servlet技术: 开发动态资源。是一个java类,最擅长写java代码
jsp技术: 开发动态资源。通过java代码最擅长输出html代码。
各取所长:
在web项目中涉及到逻辑:
1)接收参数 servlet做
2)处理业务逻辑,返回结果 servlet做
3)显示数据到浏览器 jsp做
4)跳转到其他页面 servlet做
servlet+jsp模式
servlet:
1)接收参数
2)处理业务逻辑
3)把结果保存到域对象中
4)跳转到jsp页面
Jsp:
1)从域对象取出数据
2)把数据显示到浏览器
servlet的数据 -> jsp页面
List<Contact> 使用域对象 共享数据