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

一、什么是内置对象

1.1 内置对象的来源
	
	为了开发者方便使用,JSP中预先定义了9个内置对象,
	由容器为用户进行实例化,用户直接使用即可。

	
	举例:
	servlet: 
			HttpSession session = request.getSession(true); (需要开发者做)

	jsp:
		tomcat服务器:	HttpSession session = request.getSession(true);(不需要开发者做)
		开发者做的:     session.getId();

1.2 内置对象来源解析
1.2.1 示例
  1. 首先,我在web工程里面添加一个nzdx.jsp页面
    在这里插入图片描述

  2. 然后我用SearchEverything去搜索,nzdx_jsp.java和nzdx_jsp.class文件,发现没有这两个文件,如图:

在这里插入图片描述

3.然后,我启动tomcat,并用浏览器访问该页面,且用SearchEverything搜索jsp转换成java和class的文件,得到下图:

在这里插入图片描述

4.我们发现,我们的jsp页面转换成了java文件和class文件,这个过程是怎么进行的呢?下面上个图,来解释该过程(图是盗的,对不起原作者,嘿嘿)
在这里插入图片描述
5.接下来看一下,生成的java文件,了解一下其中内容:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.0.15
 * Generated at: 2017-07-19 02:26:31 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;
 
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
 
public final class nzdx_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {
 
  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();
 
  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
 
  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;
 
  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }
 
  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }
 
  public void _jspDestroy() {
  }
 
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {
 
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
 
    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    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");
      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("<html>\r\n");
      out.write("<body>\r\n");
      out.write("<h2>å†
置对象</h2>\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
1.2.2 分析
>>>>>> JSP翻译编译过程
代码中可以看到web容器(tomcat)帮我们将JSP转换成Servlet,再将Servlet转换成java文件。

转换成的java文件中存在init、Destory、Service这三个方法,你是否想起来我们学习Servlet里面的方法呢,这三个方法是不是和那三个方法相同?

你猜的没错,就是相同的。
>>>>>> 内置对象的实例过程

1) pageContext,session,application,config,out,page的初始化

	
	下面的代码就是从上面生成的代码中截取的,
	我们所要知道的内置对象就是在这个时候被声明的,
	他们是9个内置对象中的6个:
	 			pageContext,session,application,config,out,page(红色代码块)
	 			
 
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;

在上述代码中可以看到,接下来的try语句块里面对其进行了赋值


pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
final java.lang.Object page = this;

2)HttpServletRequest和HttpServletResponse初始化

HttpServletRequest和HttpServletResponse,这2个是final声明的形参,他们由方法传入。

  public void _jspService(final javax.servlet.http.HttpServletRequest 
  	request, final javax.servlet.http.HttpServletResponse response)

2)exception初始化

	exception这个对象,
	我们必须将jsp文件的page中指定isErrorPage为true时,才可以使用。

	isErrorPage=false,不会生成exception对象。
	isErrorPage=true,才会生成exception对象。

jsp代码如下:
在这里插入图片描述

再看生成的java文件,我将其和之前生成的nzdx_jsp.java进行对比:

在这里插入图片描述
我们发现,多出来了一个exception对象,

二、九大内置对象

2.1 内置对象(九大内置对象)
		内置对象名          类型
		
		request	        HttpServletRequest
		response        HttpServletResponse
		config          ServletConfig
		application     ServletContext
		session         HttpSession
		exception       Throwable
		page            Object(this)
		out             JspWriter
		pageContext     PageContext    ---page的上下文对象


	请求响应会话
	服务页面配置
	输出页面上下文 异常



	在Jsp开发中,Jsp提供了9个内置对象,
	这些内置对象将由容器为用户进行实例化,用户直接使用即可。


	
2.2 内置对象的原理

	服务器在执行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.3 内置对象的创建时间

	jsp一旦被访问,这九大内置对象就会被创建。
	包含创建session对象。

三、九大内置对象(一)-- request对象

	request对象 javax.servlet.http.HttpServletRequest
				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获取值
			 req.getHeaders("keys")      获取指定名字报头的所有值,一个枚举
			 Enumeration<String> en = req.getHeaderNames();  获取所有请求头
		 
		### 实体内容【只有post提交的才有实体内容】			
			  req.getInputStream();  获取实体内容
		
		### 获取请求参数			
			  GET方式:请求参数放在URI的后面
		  			 req.getQueryString(); 			获取GET方式参数(?后面的键值对)
			
			  POST方式:请求参数放在实体内容中	
					 req.getInputStream();	获取POST方式参数

			  		 ===》问题:由于以上两种不通用,而且获取到的参数还需要进一步地解析。	 =====》所以可以使用统一方便的获取参数的方式。

			  统一方便的获取参数:
						request.getParameter("参数名");  根据参数名获取参数值(注意,只能获取一个值的参数)
						request.getParameterValues("参数") ;根据参数名获取参数值(可以获取多个值的参数--复选框有多个值)
						request.getParameterNames();   获取所有参数名称列表  
		 
		 
	    ### 其他
			    request.getCookies() 获取所有Cookie对象

			    request.setCharacterEncoding("utf-8") 设置获取请求数据的编码集
			    request.getCharacterEncoding() 返回字符编码方式
			    
		    	request.getContextPath(); /项目名
		    	request.getRequestDispatcher(“要跳转到的页面”).forward(request, response):服务器跳转页面
				
				request.getContextPath():当前项目名
				request.getScheme():传输协议
				request.getServerName():返回接受请求的服务器主机名

				request.getServerPort():端口号
				request.getRemoteAddr()  返回发送此请求的客户端IP地址
				request.getRemoteHost()   返回发送此请求的客户端主机名




四、九大内置对象(二)-- response对象

	response对象 javax.servlet.http.HttpServletResponse
		response 代表的是对客户端的响应,封装了服务器的响应信息。
	resp.addCookie("","")  添加一个Cookie对象
	resp.addHeader("","")  添加Http文件指定名字头信息
	resp.containsHeader("")  判断指定名字Http文件头信息是否存在

   resp.getCharacterEncoding()    返回响应用的是何种字符编码
   resp.getOutputStream()   返回响应的一个二进制输出流
   resp.getWriter()   返回可以向客户端输出字符的一个对象
   resp.setContentLength(int len)   设置响应头长度
   resp.setContentType(String type)   设置响应的MIME类型
   resp.sendRedirect(java.lang.String location)   重新定向客户端的请求
   resp.setCharacterEncoding(“gb2312”)   设置响应头的字符集

五、九大内置对象(三)-- session对象

	
	session是javax.servlet.http.HttpSession类的实例。
	session与cookie是记录客户访问信息的两种机制,session是用于服务器端保存用户信息,cookie用于在客户端保存用户信息。
		
	Servlet中通过request.getSession()来获取session对象,
	而JSP中可以直接使用。session对象是由服务器自动创建的。服务器为每个用户都生成一个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里客户端最近一次请求时间
					getId() 返回Session创建时JSP引擎为它设的唯一ID号
					getLastAccessedTime() 返回此Session里客户端最近一次请求时间
					getMaxInactiveInterval()返回两次请求间隔多长时间此Session被取消(ms)
					getValueNames() 返回一个包含此Session中所有可用属性的数组
					
		特性:
		只能在一次会话中传值,多次会话无效。会话指的就是浏览器是否关闭
		session数据有默认销毁时间,是30分钟。

五、九大内置对象(四)-- application对象

		
		application是javax.servlet.ServletContext类的对象。
				application 对象可将信息保存在服务器中,直到服务器关闭,

		Servlet中application对象需要通过ServletConfig.getServletContext()来获取。
		整个Web应用程序对应一个application对象。
  void setAttribute(String name,Object value)  设置application属性
	Object getAttribute(String name)  返回application中属性为name的对象
  Enumeration getAttributeNames()   返回application中的所有属性名

  void removeAttribute(String name)   移除application属性
 	String getInitParameter(String name)  返回全局初始话函数
  Enumeration getInitParameterNames()  返回所有的全局初始话参数
  String getMimeType(String filename)  返回文件的文档类型,例如getMimeType(“abc.html”)将返回“text.html”
  String getRealPath(String relativePath)  返回Web应用程序内相对网址对应的绝对路径

在这里插入图片描述

六、九大内置对象(五)-- page对象


	page是javax.servlet.jsp.HttpJspPage类的实例。
			page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。
			page想当于Java类中的关键字this

七、九大内置对象(六)-- config对象

7.1 config对象的作用
	
	config是javax.servlet.ServletConfig类的实例。
		config对象是ServletConfig的实例。在servlet中通常用于获取servlet在web.xml中的配置信息。
		由于jsp页面通常不用在web.xml中配置,所以该对象也很少使用。

7.2 config.getServletName()方法。获取Servlet的名字都为jsp
    <%@ page language="java" contentType="text/html; charset=gb2132"  
        pageEncoding="ISO-8859-1"%>  
    <!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=ISO-8859-1">  
    <title>测试config内置对象</title>  
    </head>  
    <body>  
    <!-- 直接输出config的getServletName的值 -->  
    <%=config.getServletName()%>  
    </body>  
    </html>  
	上面程序的第11行代码输出了config的getServletName()的返回值,
	所有的JSP都有相同的名字:jsp,所以此行代码将输出jsp。
7.3 config对象用于获取jsp在web.xml中的配置信息
	config对象用于获取jsp在web。xml中的配置信息。
	由于jsp通常不会在web.xml中配置。所以一般也不会使用该对象。
7.4 在web.xml中配置jsp(特殊用法)

注意:如果希望JSP页面可以获取web.xml配置文件中的配置信息就必须通过为该JSP页面在web.xml文件中分配的路径来访问页面,因为只有这样访问JSP页面才会让配置文件起作用。

	把servlet当成jsp,在web.xml中配置
	
>>>>>> web.xml
	<servlet>    
        <!--指定servlet的名字-->  
        <servlet-name>config</servlet-name>    
        <!--指定哪一个JSP页面配置成Servlet-->  
        <jsp-file>/configTest2.jsp</jsp-file>  
        <!--配置名为name的参数,值为yeeku-->  
        <init-param>    
            <param-name>name</param-name>    
            <param-value>yeeku</param-value>    
        </init-param>    
        <!--配置名为age的参数,值为30-->  
        <init-param>    
            <param-name>age</param-name>    
            <param-value>30</param-value>    
        </init-param>    
    </servlet>    
	<servlet-mapping>   
        <!--指定将config Servlet配置到/config路径-->   
        <servlet-name>config</servlet-name>    
        <url-pattern>/config</url-pattern>
	</servlet-mapping> 
	
>>>>>> index.jsp
    <%@ page language="java" contentType="text/html; charset=gb2132"  
        pageEncoding="ISO-8859-1"%>  
    <!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=ISO-8859-1">  
    <title>测试config内置对象</title>  
    </head>  
    <body>  
    <!-- 输出该JSP中名为name的参数配置信息 -->  
    name配置参数的值:<%=config.getInitParameter("name")%><br/>  
    <!-- 输出该JSP中名为age的参数配置信息 -->  
    age配置参数的值:<%=config.getInitParameter("age")%>  
    </body>  
    </html> 
>>>>>> 访问`
	localost:8080/hlp/config

七、九大内置对象(七) – out对象

3.1 out对象的作用
	out对象类型,JspWriter类,相当于带缓存的PrintWriter.
		out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
	
	在Servlet中,我们使用resp.getWriter() 获取PrintWriter类对象输出内容。
	在jsp中,我们使用out内置对象(JspWriter类)输出内容
	

	## PrintWriter: (不带缓冲区,直接输出内容到浏览器)
					PrintWriter writer=response.getWriter()
					writer.wrier(内容): 直接向浏览器写出内容。
	
	## JspWriter:(带缓冲区,会直接输出内容到缓冲区)
					
					writer(内容): 向jsp缓冲区写出内容
					当满足以下条件之一,缓冲区内容写出:
							1)缓冲区满了
							2)刷新缓存区
							3)关闭缓存区
						    4)执行完毕jsp页面		
						    	
3.2 jsp页面的缓存机制

在这里插入图片描述

3.2.1 PrinterWriter类对象
		resp.getWriter().write("test")

		1.在Servlet中使用,直接输出内容到浏览器,不带缓冲区
3.2.2 JspWriter 类对象
		out.write("test")
		
		1.out对象类型,JspWriter类,相当于带缓存的PrintWriter
		2.直接输出内容到缓冲区,缓冲区就像一个存储数据的集合。
		  当满足特定条件时,才会把缓冲区的内容传送给PrinteWriter
		  对象,再由PrinteWriter对象输出到浏览器。
		
>>>>>> 什么情况下,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>
	
	<%
	    int totalbuffer=out.getBufferSize();  // 获取总缓冲区的大小	
	    int available=out.getRemaining(); // 获取未使用的缓冲区的大小
	    int user=totalbuffer-available;  // 获取使用的缓冲区大小
	
	    out.println("总共缓冲区的大小:"+totalbuffer);
	
	    out.println("未使用的缓冲区的大小:"+available);
	
	    out.println("使用的缓冲区大小:"+user);
	%>
</body>
</html>
3.2.3 JSP缓冲区先关案例
		实例:使用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对象频繁使用到!!!
	pageContext 内置对象是一个比较特殊的对象。
	它相当于页面中所有对象功能的集合,即使用它可以访问到本页面中所有对象。
4.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.2 作为域对象
4.2.1 API
	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域
	   

4.2.2 案例
>>>>>> 保存到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>

七、九大内置对象(九) – exception对象

	exception为java.lang.Exception类的对象。
	exception封装了JSP中抛出的异常信息。

		要使用exception隐藏对象,
			需要设置<%@page isErrorPage”true”%>。隐藏对象exception通常被用来处理错误页面

八、Jsp 四大作用域

页面范围, 请求范围, 会话范围, 应用范围,也有人叫:页面上下文, 请求上下文, 会话上下文, 应用上下文,上下文,意思是:“map结构”


	page 当前页面有效时间最短(页面执行期)
	request HTTP请求开始到结束这段时间
	session HTTP会话开始到结束这段时间(浏览器的打开到关闭)
	application 服务器启动到停止这段时间
request           请求对象             类型 javax.servlet.ServletRequest        作用域 Request

response          响应对象              类型 javax.servlet.ServletResponse        作用域 Page

pageContext       页面上下文对象        类型 javax.servlet.jsp.PageContext       作用域 Page

session           会话对象              类型 javax.servlet.http.HttpSession      作用域 Session

application       应用程序对象          类型 javax.servlet.ServletContext        作用域 Application

out               输出对象              类型 javax.servlet.jsp.JspWriter         作用域 Page

config            配置对象              类型 javax.servlet.ServletConfig         作用域 Page

page              页面对象              类型 java.lang.Object                   作用域 Page

exception         例外对象              类型 java.lang.Throwable                作用域 page



3.1 Page
Page 范围:
	 只在一个页面中保存数据; javax.servlet.jsp.PageContext(抽象类)
<body>

<%

    // 设置两个page范围的数据 key->value

    pageContext.setAttribute("name","page王二小");

    pageContext.setAttribute("age",12);

%>

<%

    // 取值

    String name=(String)pageContext.getAttribute("name");

    int age=(Integer)pageContext.getAttribute("age");

%>

<font>姓名:<%=name %></font>

<font>年龄:<%=age %></font>

在这里插入图片描述

3.2 request
Request 范围:
		只在一个请求中保存数据; javax.servlet.http.HttpServletRequest(接口)
>>>>>> RequestScope.jsp

<body>

<%

    // 设置两个request范围的数据 key-> value

    request.setAttribute("name","request王二小");

    request.setAttribute("age",12);

%>

<jsp:forward page="requestTarget.jsp"></jsp:forward>

</body>
>>>>>> RequestTarget.jsp

<body>

<%

    // 取值

    String name=(String)request.getAttribute("name");

    int age=(Integer)request.getAttribute("age");

%>

<font>姓名:<%=name %></font>

<font>年龄:<%=age %></font>

</body>
3.3 session

Session 范围:
	在一次会话范围中保存数据,仅供单个用户使用;
					javax.servlet.http.HttpSession(接口)

>>>>>> sessionScope.jsp


<body>

<%

    // 设置两个session范围的数据 key-> value

    session.setAttribute("name","session王二小");

    session.setAttribute("age",12);

%>

<h1>session值设置完毕!</h1>

</body>
>>>>>> sessionTarget.jsp

<%

    // 取值

    String name=(String)session.getAttribute("name");

    int age=(Integer)session.getAttribute("age");

%>

<font>姓名:<%=name %></font>

<font>年龄:<%=age %></font>
2.4 Application
	在整个服务器上保存数据,所有用户共享;javax.servlet.ServletContext(接口)
>>>>>> applicationScope.jsp


<body>

<%

    // 设置两个application范围的数据 key-> value

    application.setAttribute("name","application王二小");

    application.setAttribute("age",12);

%>

<h1>application值设置完毕!</h1>

</body>

>>>>>> applicationTarget.jsp


<body>

<%

    // 取值

    String name=(String)application.getAttribute("name");

    int age=(Integer)application.getAttribute("age");

%>

<font>姓名:<%=name %></font>

<font>年龄:<%=age %></font>

</body>

九、总结

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSPJava Server Pages)是一种动态网页技术,它可以将Java代码嵌入到HTML页面,实现动态页面的生成。JSP技术在Web开发使用非常广泛,下面将介绍JSPWeb开发的基础知识。 一、JSP基础语法 JSP页面的基本语法是HTML语法,但是在HTML页面可以嵌入Java代码。JSP页面使用<% %>标签来包含Java代码,使用<%= %>标签来输出Java代码生成的结果。例如: ``` <html> <head> <title>JSP页面</title> </head> <body> <% String message = "Hello, JSP!"; out.println(message); %> </body> </html> ``` 在上面的例子,我们定义了一个message变量,并且使用out.println()方法将其输出到页面上。 JSP内置对象 JSP页面有一些内置对象,这些对象可以帮助我们快速开发Web应用程序。常用的JSP内置对象包括: 1. request对象:代表HTTP请求,可以获取请求参数和请求头等信息。 2. response对象:代表HTTP响应,可以设置响应头和响应体等信息。 3. session对象:代表用户会话,可以存储用户信息和状态等。 4. application对象:代表Web应用程序,可以获取应用程序级别的信息和状态等。 5. pageContext对象:代表JSP页面上下文,可以获取页面级别的信息和状态等。 6. out对象:代表JSP页面的输出流,可以将数据输出到页面上。 三、JSP标签库 JSP标签库是一组自定义标签,用于实现复杂的业务逻辑和页面效果。JSP标签库通常通过标签文件或Java类的形式来实现。在JSP页面,我们可以使用标签库来实现模板化的页面设计,例如: ``` <%@ taglib prefix="my" uri="http://www.example.com/mytags" %> <html> <head> <title>JSP页面</title> </head> <body> <my:hello name="JSP" /> </body> </html> ``` 在上面的例子,我们使用my:hello标签来输出“Hello, JSP!”这个字符串。 四、JSP的EL表达式 EL(Expression Language)表达式是一种简化的表达式语言,用于获取和操作页面的数据。EL表达式通常使用${ }标签来包含,例如: ``` <html> <head> <title>JSP页面</title> </head> <body> ${1+1} </body> </html> ``` 在上面的例子,我们使用EL表达式输出了2这个结果。 五、JSP的MVC架构 MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序分为三个部分:模型、视图和控制器。在JSPWeb开发,通常会使用MVC架构来实现应用程序的开发。例如: 1. 模型:使用JavaBean来表示业务逻辑和数据操作。 2. 视图:使用JSP页面来表示用户界面和页面效果。 3. 控制器:使用Servlet来实现请求的转发和业务逻辑的控制。 在MVC架构,模型、视图和控制器之间通过请求和响应来进行交互,这样可以将应用程序分离为三个独立的部分,便于开发和维护。 总之,JSPWeb开发是一种非常重要的技能,它可以帮助我们快速搭建Web应用程序,并且可以大大提高应用程序的开发效率和质量。希望这些信息对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值