七、jsp基础(二)- 内置对象

一、什么是内置对象?

内置对象的来源?

	在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>    使用域对象 共享数据

发布了94 篇原创文章 · 获赞 0 · 访问量 655

猜你喜欢

转载自blog.csdn.net/weixin_45602227/article/details/103917376