JSP入门知识点解析之九大内置对象

来源:互联网 发布:java线程对象锁 编辑:程序博客网 时间:2024/06/05 10:18

一,JSP简介

JSP是一种运行在服务器端的脚本语言,是用来开发动态网页的,该技术是JavaWeb程序开发的重要技术.
JSP是一种动态网页技术标准,它是在静态网页HTML代码中加入Java程序片段(Scriptlet)和JSP标签(Tag),构成JSP网页文件,该文件扩展名为:.jsp.
当客户端请求JSP文件时,服务器执行该JSP文件,然后以HTML的格式返回给客户端,及JSP程序的执行是由Web服务器来完成的.

二,JSP的作用

  • Servlet:
    • 缺点:不适合设置html响应体,需要大量的response.getWriter().print(“xxx”);
    • 优点:动态资源,可以编程.
  • html:
    • 缺点:html是静态页面,不能包含动态信息
    • 优点:不用为输出html标签而发愁
  • JSP:(Java Server Page)
    • 优点:在原有html的基础上添加java脚本,构成JSP页面.

三,JSP和Servlet的分工

  • JSP:
    • 作为请求发起页面,例如显示表单,超链接.
    • 作为请求结束页面,例如显示数据.
  • Servlet:
    • 作为请求中处理数据的环节.

四,JSP的组成

  • JSP=html+java脚本+jsp标签(指令)
  • JSP中无需常见即可使用的对象一共有九个,也就是九个JSP内置对象.例如:Request对象,out对象等
  • 3种java脚本:
    • <% … %>:java代码片段(常用),用于定义0~N条java语句;
    • <%= … %>:java表达式,用于输出(常用),用于输出一条表达式(或变量)的结果.
    • <%! … %>:声明,用来创建类的成员变量和成员方法(基本不用)
  • 基本原理:
    • 当JSP页面被第一次访问时,服务器会把JSP文件编译成java文件(就是一个Servlet类)
    • 然后在把.java文件编译成.class字节码文件
    • 执行.class文件,创建该类对象
    • 调用该对象的service()方法
    • 第二次请求同一jsp文件时(该文件未被修改过),直接调用service()放方法.

JSP流程

五,JSP语法

JSP页面主要是将JSP代码放在特定标签中,再嵌入到HTML代码中形成的.
开始标签,结束标签,元素内容三部分组成的整体,称为JSP元素.
JSP元素分为三种类型,基本元素,指令元素,动作元素.

1,基本元素

(1)JSP注释

  • 格式:<%– … –%> 当服务器把jsp编译成.java文件时,已经忽略了注释部分,也就是说jsp的注释是不会被发送到客户端浏览器上的
  • HTML的注释会被编译进.java文件中,会被发送到客户端浏览器上,只不过不显示出来.

(2)JSP声明

在JSP页面中可以声明变量和方法,声明后的变量和方法可以在本JSP页面内的任何位置使用.并在JSP页面初始化时被初始化.

<!-- 语法格式 --><%!  声明变量,方法,类      %><%!  int i = 0;  public void fun(){  }  class Fun{    public Fun(){        //TODO 构造方法    }  }%>

(3)JSP表达式

JSP表达式是由变量,常量组成的算式,它将JSP生成的数值转换成字符串嵌入HTML页面,直接显示出来.

<!-- 语法格式 --><%=表达式内容%><p>i的值为:<%=i%></p>

(4)JSP代码块

JSP代码块可以包含任意合法的Java语句.

<% 合法的Java代码%>

(5)关于成员变量与局部变量

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>演示成员变量与局部变量</title></head><body><%!    int a = 10;%><%    int a = 20;%>a的值到底是多少呢?<br/>成员a=<%=this.a%><br/>局部a=<%=a%><br/>成员a自加=<%=++this.a%><br/>局部a自加=<%=++a%></body></html>

结果:

成员变量与局部变量演示结果1

成员变量与局部变量演示结果2

结论:
- 如果不使用this指代,那么使用的就是局部变量.
- 多次访问同一个jsp页面,也就是在操作同一个对象,所以做自加操作的话该对象的成员变量才会一次次自加.而局部变量不会.

2,指令元素

JSP指令是被服务器解析并执行的,通过指令元素可以使服务器按照指令的设置执行动作或设置在整个JSP页面范围有效的属性.
JSP指令不直接产生可见输出.
指令的分类:page指令,include指令,taglib指令.
JSP指令的语法格式:
  <%@ 指令名称 属性=”属性值1” 属性2=”属性值2” …%>

(1)page指令

page指令用来定义JSP页面的全局属性,它描述了与页面相关的一些信息,其作用域为它所在的JSP文件页面.
page指令的语法规则:

<%@page    language="脚本语言"//(基本没用,指定jsp编译后的语言类型,只能编译java,默认为java)    extends="继承的父类名称"//让jsp生产的Servlet去继承该属性指定的类,(基本不用)    import="导入的Java包或类的名称"    session="true/false"//当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象    buffer="none/8kb/自定义缓冲区大小"//指定缓冲区大小,默认为8kb,通常不需要修改    autoFlush="true/false"//指定,当jsp输出流缓冲区满时,是否自动刷新(要输出的东西多了,是不是自动刷新),默认为true,如果为false,那么在缓冲区满时抛出异常.    isThreadSafe="true/false"//是否支持并发访问,默认为false(没用)    isELIgnored="true/false"//是否忽略el表达式,默认值为false,不忽略,老版本的jsp默认是true(基本看不到了),现在已经改成false了    info="页面信息"//(没用)    errorPage="当前页面若是发生错误,要转向哪个页面,就由这个属性来指定(相对路径,不包含项目名)(状态码为200)"    isErrorPage="true/false"//它指定当前页面是否为处理错误的页面(状态码为500)(只有设置这个属性为true时,才能使用九大内置对象中的exception)    pageEncoding="页面编码类型"//当Tomcat要把jsp编译成.java时,需要使用pageEncoding属性    contentType="text/html; ISO-8859-1" // 添加一个contentType="MIME类型和字符集"响应头      //等同于response.setContentType="text/html;ISO-8859-1"    //页面编码类型pageEncoding和contentType响应头,如果只设置一个为utf-8,那么另一个会默认也被设置未utf-8    //如果都不设置,则默认为iso%>
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">    <!-- 在web.html页面中设置error-page标签 -->    <error-page>      <!-- 如果错误信息为404,则跳转到error404.jsp页面 -->        <error-code>404</error-code>        <location>/jsps/error404.jsp</location>    </error-page>    <error-page>        <error-code>500</error-code>        <location>/jsps/error500.jsp</location>    </error-page>    <error-page>      <!-- 如果抛出空指针异常,则跳转到errorDemo.jsp页面 -->        <exception-type>java.lang.NullPointerException</exception-type>        <location>/jsps/errorDemo.jsp</location>    </error-page></web-app>

注:
- 一个页面可以有多个<%@page%>指令来分别描述属性.
- 在一个<%@page%>指令中,除了import属性可以被使用多次外,其他属性只能被使用一次.
- <%@page%>指令区别大小写的.
常用的使用格式:

<%@page  language="java"  <!-- 设置的是请求,服务器返回的HTML页面代码的编码 -->  contentType="text/html;charset=utf-8"  <!-- 设置JSP页面本身的编码 -->  pageEncoding="utf-8"  <!-- 当JSP页面中使用了某些java类库时需要设置下面的import属性 -->  <!-- 一般都会采用MVC设计模式,也就不需要使用import属性 -->  import="java.util.*"%>

(2)include指令(静态包含)

include指令称为文件加载指令,可以将其他的文件插入JSP网页,被插入的文件可以是JSP文件,HTML文件或者其他文本文件,必须保证插入后形成的新文件符合JSP页面的语法规则.
- 与RequestDispatcher的include()方法的功能相似!区别在于包含的时间点不同.
- <%@include%>是在jsp编译成java文件时完成的—>包含的文件与当前文件共同生成一个java(一个Servlet)文件,然后再生成一个class.
- RequestDispatcher.include()是一个方法,包含和被保护的是两个Servlet,即两个.class,他们只是把响应的内容在运行时合并了.
- 作用:将页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就可以作为一个独立的jsp存在,而我们只需要处理变化的变量.实现可重用.
include指令语法规则:

<%@include file="文件名"%>

注: 被插入的文件必须与当前JSP页面在同一Web服务目录下.

(3)taglib指令

taglib指令用来定义一个标记库以及标记的前缀,不要用jsp,jspx,java,javax,servlet,sum和sunw为自定义标签的前缀.
taglib指令语法规则:

<%@taglib uri="指定标签库所在位置" prefix="标记前缀" %><%@taglib uri="/libs/commons-dd" prefix="d" %>// 当使用commons-dd库中的text标签时的写法// 这就是d标记前缀的作用,处理名字冲突,如果多个标签库中都有text标签,就可以通过标记前缀区分<d:text>

使用JSTL核心标签库时会常用.

3,动作标签

动作标签由服务器(Tomcat)执行,在服务器端执行,一共有二十个,很少用.
html标签由浏览器来执行.
JSP动作元素是用来控制JSP引擎的行为,JSP标准动作标签均以”jsp”为前缀,主要有如下6个动作元素.
- :在页面得到请求时动态包含一个文件.
- :引导请求进入新的页面(转向到新页面)(请求转发)
- :连接客户端的Applet或Bean插件
- :应用JavaBean组件
- :设置JavaBean的属性值
- :获取JavaBean的属性值并输出

(1)动作

语法格式:

<jsp:include page="文件的名字"/>

功能:
- 当前JSP页面动态包含一个文件,即将当前JSP页面,被包含的文件各自独立编译为字节码文件.
- 执行到该动作标签处,才加载执行被包含文件的字节码.

(2)动作

语法格式:

<jsp:forward page="文件的名字"/>

功能:
- 该动作用于停止当前页面的执行,转向另一个HTML或JSP页面
- 该动作用于控制界面间的前后跳转,跳转时携带着内置对象Request中的信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>动态转发</title></head><body><h1>a.jsp</h1><%--动态转发--%><jsp:forward page="b.jsp">    <%--也可以携带参数--%>    <jsp:param name="user" value="zz"/>    <jsp:param name="password" value="123"/></jsp:forward></body></html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>b</title></head><body><h1>b.jsp</h1><%    String user = request.getParameter("user");    String password = request.getParameter("password");    out.print(user+"--"+password);%></body></html>

六,JSP内置对象

九大内置对象

主要是为了方便页面之间的数据共享,JSP专门设置了九个内置对象,这些对象不需要创建,在写代码的时候直接使用就ok.

九大内置对象

session对象

用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这一段时间成为一次会话.
session对象的生命周期就是一次会话的过程,session对象保存的信息,可以在该会话过程中的不同页面之间共享.
一般用来保存用户名和密码,在登录后的后续页面中,直接判断session中的内容即可.

pageContext对象

JSP中有四大域:
- servletContext(application)
- 整个应用程序
- session
- 整个会话(一个会话只有一个用户)
- request
- 一个请求链(可能有多个Servlet)
- pageContext
- 当前的jsp页面,这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据(当前jsp页面与当前jsp页面中使用的标签之前就属于跨域的关系)
- 域对象,可以代理其他域:
- pageContext.setAttribute(“xxx”,”XXX”,PageContext.SESSION_SCOPE);将属性保存到了session域中
- 全域查找:pageContext.findAttribute(“xxx”);该方法会在四个域中都查找,从小到大依次查找.(重要)
- 所以在设置属性名时可以给一个前缀区分:session_xxx,request_xxx等.
- 获取其它八个内置对象:pageContext.getXXX();即可