JSP 简介
JSP 全称是 Java Server Pages,它和 servle 技术一样,都是 SUN 公司定义的一种用于开发动态web资源的技术
JSP 这门技术的最大的特点在于,写 jsp 就像在写 html,但它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套java代码,为用户提供动态数据
JSP 加载流程
当客户端浏览器向服务器请求一个 JSP 页面时,服务器收到该请求后,首先检查所请求的这个 JSP 文件内容(代码)是否已经被更新或者第一次被访问:
如果是,JSP 引擎将文件转化为 Servlet类(硬盘上),接着,这个 Servlet 类会被 JVM 编译成字节码文件并装载解释执行。剩下的就等同于 Servlet 的处理过程了;
如果不是,那么它的处理过程也等同于一个 Servlet 的处理过程,即直接由服务器检索出与之对应的 Servlet 实例来处理。
注:
JSP 在被客户端访问的时候才可能发生转换的,不是在服务器启动的时候转换成 Servlet 类的
JSP 元素
scriptlet: <% %> 指令: <%@ %> 表达式: <%= %> 声明: <%! %> 注释: <%-- --%>
脚本片段
scriptlet 中写的是 Java 代码,每个语句必须以分号结尾
表达式
表达式中所写的,最终会作为方法 out.print() 参数,故不能加分号。默认不换行
指令
page指令、Include指令、taglib指令
// 使用 page 指令导入类时,使用逗号进行分割 <%@ page import="java.util.*,demo.*" language="java" pageEncoding="UTF-8"%>
声明
需要声明成员变量(非局部变量)时候用
注:
所有的 scriptlet 和表达式都放会 service() 方法中,所以 scriptlet 中声明的变量总是局部变量。具体可查看 tomcat/work/../../jsp/ 文件夹下的 .java 文件
JSP 域和隐式对象
四大作用域
page 域指的是 pageContext. request 域指的是 request HttpServletRequest session 域指的是 session HTTPSession application 域指的是 application ServletContext
1. 什么是域?
均内置了 map 集合,都有 setAttribute()、getAttribute() 方法,均有固定的生命周期和作用域
2. 生命周期?
- page:从 jsp 页面被执行开始,到 jsp 页面执行完毕结束
 - request:从用户请求开始,到服务器响应结束
 - session:用户打开浏览器访问,属于此次会话的 session 被创建,当 session 超时或被声明失效,此 session 生命周期结束
 - application:Web 应用加载的时候被创建,Web 应用被移除或服务器关闭时被销毁
 
九大隐式对象
request: 包含了有关浏览器请求的信息.通过该对象可以获得请求中的头信息、Cookie 和请求参数。
response: 作为JSP页面处理结果返回给用户的响应存储在该对象中。并提供了设置响应内容、响应头以及重定向的方法(如cookies,头信息等)
out: 用于将内容写入 JSP 页面实例的输出流中,提供了几个方法使你能用于向浏览器回送输出结果。
pageContext: 描述了当前JSP页面的运行环境。可以返回JSP页面的其他隐式对象及其属性的访问,另外,它还实现将控制权从当前页面传输至其他页面的方法。
自动在四个域中搜索数据:pageContext.findAttribute("name")
顺序: page域 -> request域 -> session域 -> context域(application域)
session: 会话对象存储有关此会话的信息,也可以将属性赋给一个会话,每个属性都有名称和值。会话对象主要用于存储和检索属性值。
application: 存储了运行 JSP 页面的 servlet 以及在同一应用程序中的任何 Web 组件的上下文信息。
page: 表示当前 JSP 页面的 servlet 实例
config: 该对象用于存取 servlet 实例的初始化参数
exception: 在某个页面抛出异常时,将转发至JSP错误页面,提供此对象是为了在JSP中处理错误。只有在错误页面中才可使用 <%@page isErrorPage="true"%>
问题
1. jsp 中循环出 List
<% for (String item : list) { %>
<ul> 
<li> <% out.println(item); %> </li>
</ul>
<% } %> 
2. 当 JSP 和 JavaScript 代码共存时的加载流程 
JSP 中的 Java 代码在服务器运行,JavaScript 代码在客户端浏览器运行。当在操作客户端时,服务器总是优先运行,所以当有 JavaScript 在页面加载时,访问域中数据时,不会出现 null 值状况,除非此键值对不存在
参考: 
《Head First Servlets & JSP》 
博客园某博客 
博客园某博客
