JSP九大内置对象总结(三)

距离上一篇博文的时间相差近一个月,这期间由于自己的一些问题,没有坚持发文章,这里要做个自我批评,以后一定要给自己一些计划,坚持一周至少两篇。

 

好了,言归正传,前两篇遗留下了两个问题,第一个是九大内置对象中还有session和pageContext没有做介绍,第二个就是为什么这些对象可以不用声明直接使用呢?接下来我们一一来解决吧。

 

一、session对象

1、作用范围:会话期间,也就是session scope。

2、说明:

(1)session对象用于存储一个用户的会话状态,也就是说,session对象是对某个用户的会话过程中的信息存储;

(2)例如:购物车常使用session 的概念来实现,当用户把物品放入购物车时,他不须重复做身份确认的动作(如:Login),就能把物品放入用户的购物车。但服务器利用session 对象,就能确认用户是谁,把它的物品放在属于用户的购物车,而不会将物品放错到别人的购物车。

3、实例

(1)获取会话消息

<%@ page contentType="text/html;charset=GB2312" import="java.util.*" %>
<html>
<head>
<title>session对象方法</title>
</head>
<body><b>
会话ID : <%= session.getId() %><br/>
是否新会话: <%= session.isNew() %><br/>
设置和获取属性对象:用户名=
<% session.setAttribute("用户名","Bill56");%>
<%=session.getAttribute("用户名")%><br/>
<%
Date creationTime = new Date(session.getCreationTime());
Date accessedTime = new Date(session.getLastAccessedTime());
%>
会话创建时间:<%= creationTime%><br/>
上次访问时间:<%= accessedTime%><br/>

会话持续时间(s):<%= session.getMaxInactiveInterval()%><br/>
</body>
</html>

 演示时可以使用不同的浏览器,例如IE,FireFox,证明不同的用户使用的不同的session。

用谷歌浏览器打开:


 用IE浏览器打开:


 可以发现,不同的浏览器对应的会话ID不一样,SessionID是服务器用来标识是否是同一个会话的信息。

(2)模拟一个自动登录效果

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<html>
  <head><title>MyJsp.jsp</title></head>
  <body>
    <form action="treat.jsp" method="post" >
      用户名:<input type="text" name="name" />
	  密  码:<input type="password" name="password" />
	   <input type=“submit” value=“登陆” />
	  <a href="1.jsp">需要登录的页面</a>
	  <a href="2.jsp">不需要登录的页面</a>
    </form>
  </table>
  </body>
</html>

 treat.jsp

treat.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
  <title></title>
</head>
<body>
<%
String name = request.getParameter("name");  
String password = request.getParameter("password");  
if(name.equals("wgw")&&password.equals("123")){
	session.setAttribute("userName", name );
%>
    您好,已经登录!<br />
    <a href="http://localhost:8080/try/index.jsp">点击返回主页</a>
<%
	}
	else {
%>
    用户名和秘密不正确<br />
<%}
%>
</body>
</html>

 1.jsp:需要登录访问的网页

1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<html>
<head>
<title>response应用</title>
</head>
<body>
<%
    String userName= (String)session.getAttribute("userName");
	if(userName == null ){
%>
      请先登录
<%   }else{%>
      您好<%= userName%>
   <%}%>
</body>
</html>

 2.jsp:无需登录即可访问的网页

2.jsp
<%@page import="java.util.*"%>
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<html>
    <head>
        <title>无须登陆便可访问</title>
    </head>
    <body>
           您好!
    </body>
</html>

 

二、pageContext对象

1、作用范围:page scope,即本页面有效

2、说明:pageContext对象能够存取其他隐含对象。

3、注意:

当隐含对象本身也支持属性时,pageContext对象也提供存取那些属性的方法。不过在使用下列方法时,需要指定范围的参数:

void setAttribute(String name, Object value, int scope)

Object getAttribute(String name, int scope)

void removeAttribute(String name, int scope)

Enumeration getAttributeNamesInScope(int scope)

范围参数有四个常数,分别代表四种范围:PAGE_SCOPE 代表Page范围,REQUEST_SCOPE代表Request范围,SESSION_SCOPE 代表Session 范围,最后APPLICATION_SCOPE 代表Application 范围。分别对应整数“1”、“2”、“3”、“4”表示。 

4、例子

<html>
<head><title>pagecontext应用</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body >
<p>设置4个对象的username属性!</p>
<p>&nbsp; 
  <%
pageContext.setAttribute("username","L.Q.Y");
request.setAttribute("username","Bill56");
session.setAttribute("username","Liuqingyong");
application.setAttribute("username","newjohn");
%>
</p>
<p>“1”page scope范围内的username是:
 <%=pageContext.getAttribute("username",1)%> 
</p>
<p>“2”request scope范围内的username是:
 <%=pageContext.getAttribute("username",2)%> 
</p>
<p>“3”session scope范围内的username是:
 <%=pageContext.getAttribute("username",3)%> 
</p>
<p>“4”application scope范围内的username是:
<%=pageContext.getAttribute("username",4)%> 
</p>
</body>
</html>

 

三、JSP运行原理

1、原理:首先由浏览器向Web服务器提出访问JSP页面的请求(Request),然后由JSP容器负责将JSP转换成Servlet,产生的Servlet经过编译后生成类文件,然后再把类文件加载到内存进行执行。最后由Web服务器将执行结果响应(Response)给客户端浏览器。 如下图所示:

 

从图中,我们可以得到一个很重要的线索,就是jsp文件最终会变成一个Java类文件,进而编译生成可执行的字节码文件,那么JSP转换成的java文件在哪呢?

2、JSP.Java文件的位置

如果你使用的是Tomcat作为开发的服务器环境,那么可以在Tomcat的主目录下的 “Tomcat存放路径\work\Catalina\localhost”下发现,有我们之前创建的Web网站项目,打开刚刚例子下的Demo,一直点可以看到两个文件:index_jsp.java和index_jsp.class,打开.java文件,可以看到如下代码,这就是JSP经过服务器处理后形成的对应的Java文件。

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.0.27
 * Generated at: 2016-03-26 07:40:41 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.*;
import java.util.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  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 static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("java.util");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  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;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("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<title>session对象方法</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body><b>\r\n");
      out.write("会话ID : ");
      out.print( session.getId() );
      out.write("<br/>\r\n");
      out.write("是否新会话: ");
      out.print( session.isNew() );
      out.write("<br/>\r\n");
      out.write("设置和获取属性对象:用户名=\r\n");
 session.setAttribute("用户名","Bill56");
      out.write('\r');
      out.write('\n');
      out.print(session.getAttribute("用户名"));
      out.write("<br/>\r\n");

Date creationTime = new Date(session.getCreationTime());
Date accessedTime = new Date(session.getLastAccessedTime());

      out.write("\r\n");
      out.write("会话创建时间:");
      out.print( creationTime);
      out.write("<br/>\r\n");
      out.write("上次访问时间:");
      out.print( accessedTime);
      out.write("<br/>\r\n");
      out.write("\r\n");
      out.write("会话持续时间(s):");
      out.print( session.getMaxInactiveInterval());
      out.write("<br/>\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
      out.write("\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);
    }
  }
}

 3、分析代码

阅读上述代码,可以发现index_jsp.java这个类中有如下成员变量的定义:

    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;

是不是发现刚好有熟悉的东西呢?没错,pageContext,session,application,config,out,page这6个JSP的内置对象的定义都在这里,并且还可以知道它们所属的类,那么问题来了?还有三个内置对象呢?request,response和exception去哪了呢?

仔细阅读代码,会发现,有一个这样的方法:

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

        throws java.io.IOException, javax.servlet.ServletException;

这个方法的参数中又有了熟悉的request和response了,并且可以知道它们分别属于HttpServletRequest类和HttpServletResponse类,至于exception这个对象,因为,前面说过,必须把jsp文件的page中指定isErrorPage为true时,才可以使用,也就意味着没有指定这个属性的jsp页面在转换成java文件时不会自动为我们定义exception这个对象,大家可以自定义个jsp文件,将其errorPage指定为true,再找到对应的java文件,便可以发现exception这个对象了。

 

好了,关于JSP内置对象的介绍就到这了,让我想想下个礼拜要更新点什么呢,嘻嘻~~~

 

 谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~微笑微笑微笑

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值