一、什么是JSP
JSP 全称是 Java Server Pages,是一种开发动态web资源的技术
jsp = html + java代码 +jsp标签
二、JSP的原理
JSP基本原理:
JSP本身是一个特殊的Servlet(类,即万物皆对象)
JSP第一次被访问时,服务器会编译成JAVA文件(这个JAVA其实是Servlet类)
然后创建对象
调用对象的service()方法
(第一次惩罚,第一次会慢一点)
在tomcat的work的的对应jsp的.java文件(out.write(),java代码原封不动
JSP的真身实际上是 Servlet,我们访问 index.jsp 时,实际上是访问它的真身 index_jsp 这个 Servlet
并且是通过_jspService()这个方法处理请求,这个方法中放了 html 和 java 代码,所有java代码原样翻译过来,
html 代码使用out.write("<标签>"\r\n)向页面输出给浏览器
简单的流程可以概述为
找到.jsp文件 ——> 转换为 .java文件 ——> 编译为 .class文件 ——> 服务器执行之
若是第二次访问则直接找.class文件即可,若是进行了修改,则需要重新编译
三、基本语法
HTML代码称之为模板元素,也就是网页的骨架和布局
jsp3种java脚本
<%...%>【尽量不要使用】
JAVA代码片段(方法内可以写的它都可以写,例如调用方法等,但不能定义方法)
一个代码段中声明的变量,其它片段可以用
<%=...%>(out.print())
JAVA表达式 (常用于输出)response.writer.print()里面能放的,他都能放。注意不能输出多个,即不能有分号
<%!...%>
声明(作了解) 基本不用,但会被考虑到(类体中可以放什么,这里就可以放什么)
jsp的注释
<%-- --%>(编译成java文件时自动忽略.java .class都没有,客户端看不见) ——jsp的注释
<!-- -->(HTML的注释,右键查看源代码可以看到)——HTML的注释
// /**/ java的注释,此注释也是隐式的 ——JAVA的注释
四、JSP指令
JSP指令(derictive)是用来告知引擎如何执行处理页面的
JSP三大指令:
1.page指令:最复杂,可以存在任意个指令
2.include指令:静态包含
3.taglib指令:导入标签库
指令的格式:<%@ 指令 key="value" %>
一、page指令:一般放在第一行,定义了整个页面的属性
常用属性:
pageEncoding:指定当前jsp页面编码,在服务器要把JSP编译成.java时用到
contentType:相当于添加响应头:两人关系出现一个另外一个也相同。同时没有默认ISO
import:用来导包的,可以出现多次
errorPage和isErrorPage
如果没有设置isErrorPage="true",那么在jsp页面中是无法使用exception对象的
前者:页面出错要转到哪个页面去
后者:当前页面为处理错误页面(500)
<!-- 默认的错误处理页面 -->
例如:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
可以在web.xml中为整个项目配置
<error-page>
<error-code>403</error-code>
<location>/403.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<!-- 仅仅在调试的时候注视掉,在正式部署的时候不能注释 -->
<!-- 这样配置也是可以的,表示发生500错误的时候,转到500.jsp页面处理。 -->
<error-page>
<error-code>500</error-code>
<location>/500.html</location>
</error-page>
<!-- 这样的配置表示如果jsp页面或者servlet发生java.lang.Exception类型(当然包含子类)的异常就会转到500.jsp页面处理。 -->
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/500.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/500.jsp</location>
</error-page>
<!--
当error-code和exception-type都配置时,exception-type配置的页面优先级高
及出现500错误,发生异常Exception时会跳转到500.jsp
-->
二、include指令
两种形式:
1.@include 静态包含
与转发的包含类似{时间点不同} <%@include file="" %>,在生成.java时就包含了
两页面合体了。作用主要是页面分解,将变量分离。以及实现可重用。建议包含的文件拓展名为 .jspf
2.<jsp:inlcude> 动态包含
先处理结果后包含,推荐的方式: <jsp:include page="top.jsp"></jsp:include>
三、taglib指令
两个属性:prefix:指定本页面标签前缀 <pre:text>指定了前缀
uri:指定标签库位置
例如:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
五、JSP九大内置对象
九大内置对象由JSP引擎负责创建于传递(在调用相应的_jspServlet时)
九大内置详细对象见下表:
request | 请求对象 | 类型 javax.servlet.ServletRequest | 作用域 Request |
response | 响应对象 | 类型 javax.servlet.SrvletResponse | 作用域 Page |
pageContext | 页面上下文对象(1顶9) | 类型 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 | 页面对象(this) | 类型 javax.lang.Object | 作用域 Page |
exception | 例外对象 | 类型 javax.lang.Throwable | 作用域 Page |
重点: >pageContext:1个顶9个,Servlet中有三大域对象,而JSP中有四大域对象,它就是最后一个。
域对象它就有域对象的方法。
- getException方法返回exception隐式对象
- getPage方法返回page隐式对象
- getRequest方法返回request隐式对象
- getResponse方法返回response隐式对象
- getServletConfig方法返回config隐式对象
- getServletContext方法返回application隐式对象
- getSession方法返回session隐式对象
- getOut方法返回out隐式对象
>ServletContext:整个应用程序
>session:整个会话(锁定一个用户)
>request:一个请求链中
>pageContext:一个JSP页面(页面标签中共享数据)
作为域对象,作为代理,获取其它内置对象,全域查找(从小到大)
pageContext.setAttribute("aaa", "AAA", PageContext.SESSION_SCOPE);
域对象:
pageContext:page作用范围
作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。
request:
作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,
由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。
session:例如购物车数据
session的作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。
application:例如聊天数据
作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。
六、JSP标签(JSP动作)
JSP动作标签:
与HTML提供的标签有本质的区别,是由服务器来解释执行。在服务器端执行
<jsp:forward /> 转发,与servlet中转发作用类似
例如:<jsp:forward page="/forwarddemo02.jsp"/>
<jsp:include /> 包含,与RequestDispecher.include()类似
例如:<jsp:include page="/jspfragments/head.jsp"/>
对比:<%@include file="/jspfragments/demo.jsp"%>
演示小案例
<jsp:param>作为forward和include的子标签,作为传参标签。
例如:
<jsp:include page="/jspfragments/Inc.jsp">
<jsp:param name="parm1" value="hello" />
<jsp:param name="parm2" value="gacl" />
</jsp:include>