JSP基础、指令、四大作用域九大隐式对象总结
(一)JSP基础
一、JSP概述
- jsp其实是java动态页面技术
- HTML可以用来组织页面但是HTML是一种静态web资源技术无法嵌入动态数据。
- Servlet是动态web资源技术 但是本质上是一段java代码 不方便在其中组织页面结构。
- 于是jsp技术被提出来 写起来就像在写一个html,但是内部可以嵌入java代码,本质上是一种动态web资源 但是可以直接写html标签 非常便于组织页面结构。
- Jsp解决了动态页面开发的问题
- 真正开发中 , 往往使用servlet来处理业务逻辑 , 将处理好的结构 带到jsp页面 由jsp页面负责展示。
二、JSP原理
- jsp会在第一次被访问时被翻译成一个Servlet , 之后对这个jsp的访问本质上都是这个servlet在执行 。
- 所以看见是一个jsp , 但是jsp本质上是一个servlet 。
三、JSP基本组成结构
- 模板元素
- 直接书写在JSP中的HTML内容 , 看起来就像写HTML一样方便 ,这些HTML内容被称为JSP模板元素
- 原理:但是最终会在被翻译成Servlet的过程中以out.write();的形式原样输出到浏览器显示 。
脚本表达式
<%= java表达式 %>
- 在JSP页面中可以通过脚本表达式来将一个java表达式的计算结果输出到页面中展示
- 原理:在被翻译成Servlet的过程中 , 直接将计算结果的值用out.write()输出
脚本片段
<% 若干java代码 %>
- 在JSP页面中可以直接通过脚本片段写入一段java代码
- 原理: 在<% %>中的内容会被原样翻译到servlet中的对应位置后执行
- 注意:在同一个JSP页面中 , 多个脚本片段的情况下 , 后面的可以直接访问之前定义的变量
- 注意:在同一JSP页面中 , 多个脚本片段的情况下 , 单个脚本片段的java语法可以不完整 , 但是要保证JSP页面翻译成servlet之后java语法是完整的 。
JSP声明
<%! %>
- 通过JSP声明来声明一个全局的变量
- 原理: 当JSP被翻译为servlet之后JSP声明中的内容将被放置到与service方法同级的位置 , 成为类的成员 。
JSP注释
<%-- 注释内容 --%>
- 可以通过JSP注释将jsp中的部分内容注释掉 , 被注释 的内容将不会被翻译到servlet中 。
注意区别:
- JSP注释中的内容不会被翻译为servlet , 更不会输出到页面中去
JSP脚本片段中的java注释的内容 , 将会被翻译到servlet中 , 但是不会执行
<% //被注释的java代码 %>
被html注释注释掉的内容 , 将会被翻译到servlet中 , 并且前后的注释标签被当做模板元素直接输出 , 但是浏览器不会显示 , 而注释中的内容仍然会执行
JSP代码 ... <% int i = 100; %> <!-- i = 0; --> <%=i %> ... 被翻译成servlet之后 ... int i = 100; out.write("<!--"); i = 0; out.write("-->"); out.write(i); ... 结果: i 为 0 。
(二)JSP指令
一、JSP指令概述
格式:
<%@ 指令名 若干属性 %>
- JSP指令不产生任何直接的输出 , 是用来控制JSP解析引擎如何解析JSP页面中的其他部分内容的
二、指令详解
page指令
<%@ page .... %>
- 声明当前JSP的基本属性 , 指挥JSP翻译引擎如何翻译JSP页面中的其他内容为servlet
page指令的属性:
- [ language=”java” ] 当前JSP使用的开发语言 , 目前也支持java
- [ extends=”package.class” ] 当前jsp翻译成servlet后要继承的类,注意此值必须是一个servlet的子类,一般情况下不要改
!![ import=”{package.class | package.*}, …” ] 导入需要使用到的包
如:java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*;
- !![ session=”true | false” ] 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在jsp中使用session隐式对象。但是这将导致一旦访问jsp就会调request.getSession()方法,可能导致不必要的空间浪费。如果确定jsp中不需要session可以设为false
- [ buffer=”none | 8kb | sizekb” ] out隐式对象所使用的缓冲区的大小
- [ autoFlush=”true | false” ] out隐式对象是否自动刷新缓冲区,默认为true,不需要更改
- !![ errorPage=”relative_url” ] 如果页面出错,将要跳转到的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用
- !![ isErrorPage=”true | false” ] 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象
- [ contentType=”mimeType [ ;charset=characterSet ]” | “text/html ; charset=ISO-8859-1” ] 和jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览器打开的编码
- !
- [ isELIgnored=”true | false” ] 当前页面是否使用el表达式,设置为false时表示启用el,j2ee4.0开始默认支持,j2ee4.0以下做开发时,如果要使用el表达式,需将此属性设置为false
注意:
指令中errorPage属性可以为当前页面制定错误提示页面 , 但是如果整个站点的jsp页面都需要配时会很繁琐 , 这时可以在web.xml文件中进行统一配置
<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error/error.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/500.jsp</location> </error-page>
如果配置全局友好错误提示页面 又为某个jsp单独指定过错误提示页面 则单独指定的起作用
include指令
<%@ include file="xxxx"%>
- 实现页面包含
taglib指令
<%@ taglib uri="" prefix="" %>
- 引入标签库
(三)四大作用域九大隐式对象总结
一、四大作用域
- 域对象: 一个对象具有一个可被看见的范围 , 并且利用该对象上的map可以在整个范围内实现资源的共享
PageContext域
- 生命周期 :
- 访问JSP页面时创建 , 访问JSP页面结束后销毁
- 作用范围
- 当前JSP界面
主要功能
在当前JSP页面中共享数据 , 在PageContext域中的属性可以被整个页面共享
设置属性 setAttribute(String name , Object value); 获取属性 getAttribute(String name); 移除属性 removeAttribute(String name);
作为入口对象操作四大作用域中的数据
向指定域中添加属性 setAttribute(String name, Object value,int scope) 获取指定域中的指定属性 getAttribute(String name,int scope) 移除制定域中的制定属性 removeAttribute(String name,int scope) 其pageContext中代表域的常量: PageContext.APPLICATION_SCOPE --> ServletContext域 PageContext.SESSION_SCOPE --> Session域 PageContext.REQUEST_SCOPE --> Request域 PageContext.PAGE_SCOPE --> PageContext域 额外提供了一个便捷的方法: //按照由小到大的顺序搜寻四大作用域 , 查找指定名称的属性 , 找到则返回对应的值 , 找不到则返回null findAttribute(String name);
提供了便捷的方法实现请求转发、包含:
pageContext.forward("/index.jsp"); pageContext.include("/index.jsp");
- 生命周期 :
request域
- 详细解析请看 :http://blog.csdn.net/chou_out_man/article/details/78700720 第七部分
- 生命周期
- 请求开始时创建 , 请求结束时死亡
- 作用范围:
- 一次请求链
主要功能:
- 在作用范围内共享数据
域对象提供的方法(可以操作map中的数据)
setAttribute(String name,Object value) :用来存储一个对象,也可以称之为存储一个域属性 getAttribute(String name); 用来获取request中的数据 removeAttribute(String name); 用来移除request中的域属性 getAttributeNames(); 获取所有域属性的名称
- Session域
- ServletContext域
- 四大作用域由小到大排序为: PageContext–>Request–>Session–>ServletContext
二、九大隐式对象
九大隐式对象概述
在JSP翻译成servlet时, JSP翻译引擎在翻译过来的servlet中 , 预先定义了一些变量 , 可以不需要再JSP中预先定义就可以直接使用 , 共9个 , 统称为JSP九大隐式对象 。 分别是:
page --- 由JSP翻译引擎翻译出的Servlet config --- ServletConfig 当前servlet的配置信息 application --- ServletContext 当前web应用 request --- HttpServletRequest请求 response --- HttpServletResponse响应 out --- response.getWriter()得到的输出流 , 可以通过他输出数据 session --- HttpSession当前会话 exception --- Excception 如果将isErrorPage设置为true , 才会有一个代表当前页面异常的对象 pageContext --- 代表当前JSP页面
- 其中七大对象已经做过详解
- page 、request http://blog.csdn.net/chou_out_man/article/details/78700720
- application、 config 、 response http://blog.csdn.net/chou_out_man/article/details/78705014
- session http://blog.csdn.net/chou_out_man/article/details/78725938
- out对象
- 可以将他理解成response.getWriter()获得的PrintWriter.
- 它自带一个缓冲区,其大小收page指令中的buffer的设定限制。当缓冲区满或缓冲区被关闭或当前jsp页面结束,则此缓冲区中的内容将被刷新到response.getWriter()的缓冲区中。
pageContext对象
作为入口对象获取其他八大隐式对象
getException方法返回exception隐式对象 getPage方法返回page隐式对象 getRequest方法返回request隐式对象 getResponse方法返回response隐式对象 getServletConfig方法返回config隐式对象 getServletContext方法返回application隐式对象 getSession方法返回session隐式对象 getOut方法返回out隐式对象
获取其他域中的数据
pageContext操作所有域中属性的方法 getAttribute(String name,int scope) setAttribute(String name, Object value,int scope) removeAttribute(String name,int scope) 其中pageContext中代表域的常量: PageContext.APPLICATION_SCOPE PageContext.SESSION_SCOPE PageContext.REQUEST_SCOPE PageContext.PAGE_SCOPE findAttribute方法: 在四大域中搜寻属性,搜寻的顺序是page域、request域、session域、application域,从小域到大域开始搜索,如果搜索到就直接获取该值,如果所有域中都找不到,返回一个null
- 作为域对象使用
- 跳转到其他资源
- 它的身上提供了forward方法和include方法 。