1. JSP的特点:

概念

JSP:Java Server Page (Java服务器端的页面,运行在服务器上的页面)

用户在浏览器端看到的页面,其实是JSP运行的结果。

特点

JSP上可以同时编写:HTML Java代码

Java代码写以下格式中: <% %>

在浏览器上能否看到Java代码?

不能,在浏览器上看到的只是JSP运行的结果

2. JSP与Servlet之间的关系

JSP的执行过程

  1. JSP代码由Tomcat翻译成Servlet
  2. 由JVM将Servlet编译成字节码文件,再运行

运行jsp文件控制台输出的路径:Using CATALINA_BASE: "C:\Users\就一夹心怎么了\.IntelliJIdea2019.1\system\tomcat\Tomcat_8_5_51_Heima143_JavaWeb_14"中的work一直点进去
最后路径就是:C:\Users\就一夹心怎么了\.IntelliJIdea2019.1\system\tomcat\Tomcat_8_5_51_Heima143_JavaWeb_14\work\Catalina\localhost\day30_01_jsp_war_exploded\org\apache\jsp
有个.java 和.class文件,打开java文件可以看到

public final class demo1_jsp extends org.apache.jasper.runtime.HttpJspBase
其实也就是 public abstract class HttpJspBase extends HttpServlet  
由此可以知道 JSP本质上就是一个Servlet 

3.JSP的3种脚本元素

代码片段、表达式、声明

在JSP页面中编写Java代码的方式,不建议在JSP上写过多的Java代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP的三种脚本元素</title>
</head>
<body>

<h1>表达式</h1>
<%--
语法: <%=变量名%>
作用:在页面上输出变量的值,本质上相当于这句话:out.print(变量名)
--%>

<%
    //定义一个变量
    String name = "武松";
%>
姓名: <%=name%>
<h1>代码片段</h1>
<%--
语法:<% Java代码 %>
作用:在JSP中编写任何的Java代码,只要符合Java语法规则都可以
--%>
<%
    //注释:符合Java的语法规则
    for (int i = 0; i < 5; i++) {
        out.print("Hello JSP <br/>");
    }
%>
<h1>声明</h1>
<%--
语法: <%! 声明变量或方法 %>
作用: 在JSP中声明全局变量,本质上是一个类中成员变量
--%>

<%!
    String name = "武大";
%>

输出局部变量: <%=name%> <br/>
输出全局变量: <%=this.name%> <br/>

</body>
</html>

4. JSP中九个内置对象

JSP本质上就是一个Servlet,在Servlet中常用的一些对象可以直接在JSP上使用,不需要自己去创建。这些对象称为内置对象。

对象名

对应的类型

功能描述

request

HttpServletRequest

请求对象

response

HttpServletResponse

响应对象

pageContext

PageContext

页面上下文

session

HttpSession

会话对象

application

ServletContext

上下文对象

config

ServletConfig

读取web.xml中init-param配置参数

out

JspWriter

类似于PrintWriter,带缓存的,速度更快

page

Object

表示this,代表当前JSP生成的Servlet对象

exception

Throwable

出现在异常的页面中,表示异常对象

5. PageContext对象的作用

页面上下文,也是一个作用域,它的作用范围是:只在当前JSP页面起作用

总共有4个作用域,页面域中在JSP中才有用,Servlet中没有页面域这个对象

作用域大小比较:页面域 < 请求域 < 会话域 < 上下文域
所有的作用域,它的底层数据结构都是Map结构

作用域有关的方法

“键”为String类型

void setAttribute("键",Object 值) 

向作用域中添加键和值,如果键存在就是修改

Object getAttribute("键")

通过键从作用域中获取值

void removeAttribute("键")

通过键删除键和值

页面域的特有方法  

removeAttribute("键")

 删除所有四个作用域中键和值

findAttribute("键")

通过键按从小到大的顺序去查找每个使用域的值


 

PageContext主要有2个功能:

 

  1. 是一个作用域对象
  2. 通过它可以获取其它的8个内置对象 

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>页面上下文PageContext的方法</title>
</head>
<body>
<h2>页面上下文PageContext的方法</h2>
<h3>作用一:页面上下文是一个作用域对象</h3>
<%
    //向页面域添加键和值
    pageContext.setAttribute("name", "牛魔王");
    //向请求域添加键和值
    request.setAttribute("name", "红孩儿");
    //向会话域添加键和值
    session.setAttribute("name", "铁扇公主");
    //向上下文域添加键和值
    application.setAttribute("name", "太上老君");

    //删除四个作用域中同名的键和值
    //pageContext.removeAttribute("name");

    //只删除其中一个作用域的键和值
    //PageContext.PAGE_SCOPE = 1 页面域
    //PageContext.REQUEST_SCOPE = 2 请求域
    //PageContext.SESSION_SCOPE = 3 会话域
    //PageContext.APPLICATION_SCOPE = 4 上下文域
    pageContext.removeAttribute("name", PageContext.PAGE_SCOPE);
%>

页面域 :<%=pageContext.getAttribute("name")%> <br/>
请求域 :<%=request.getAttribute("name")%> <br/>
会话域 :<%=session.getAttribute("name")%> <br/>
上下文域 :<%=application.getAttribute("name")%> <hr/>
自动查找作用域 :<%=pageContext.findAttribute("name")%> <br/>


<h3>作用二:可以获取其它8个内置对象</h3>
<%--只要有这个对象,就可以得到页面上所有的内置对象了--%>
请求对象: <%=pageContext.getRequest()%><br/>
会话对象: <%=pageContext.getSession()%><br/>
上下文对象: <%=pageContext.getServletContext()%><br/>
</body>
</html>

 

6. JSP的指令:include

三大指令是

include

用来包含另一个页面

page 

指定JSP页面的属性

taglib 

导入第三方标签库

 

 

指令的格式

<%@指令名 属性名="属性值"%>

include指令语法

<%@include file="被包含的页面"%>

<div id="header">
    <%--相当于把header.jsp中原代码复制到这个位置--%>
    <%@include file="header.jsp"%>
</div>

7. JSP的指令:page

page指令概述

  1. 作用:设置JSP页面上功能,告诉tomcat将JSP翻译成Servlet的时候有哪些限制
  2. 位置:通常放在页面的最前面,但其实可以放在页面的任意位置

导包的属性

language="java" 指JSP页面上使用的编程语言,默认是Java
import="java.util.*"
如果JSP页面上使用了其它的类,需要导入包,使用这个属性导包,有两种格式:
1. 每个import属性导入一个包   

如:<%@ page import="java.util.Date" %>   

       <%@ page import="java.text.SimpleDateFormat" %>

2. 一个import属性导入多个包,使用逗号隔开  

如:<%@ page import="java.util.Date,java.text.SimpleDateFormat" %>

与编码相关的属性

contentType="text/html; charset=utf-8"
相当于servlet中这句话:
response.setContentType("text/html; charset=utf-8");
JSP页面上必须加上这句话,如果没有的话,整个页面是欧洲码表(即iso-8859-1)

是否会创建会话

session="true|false"
默认是true,如果设置为false,在页面上就不能使用会话对象。

是否可以使用EL

isELIgnored="true|false"
在JSP页面上默认是可以使用EL表达式语言,默认是false
如果设置为true,页面禁用表达式语言,EL表达式会原样输出。

8. JSP的三个动作:include、forward和param

include:包含

  1. 作用:用来包含另一个JSP页面或Servlet
  2. 语法:<jsp:include page="被包含的页面"/>

include动作与指令的区别

 

静态包含

动态包含

语法格式

<%@include file="被包含的页面"%>

<jsp:include page="被包含的页面"/>

包含的方式

如果A页面包含了B页面,相当于把B页面的代码先复制到A页面中,再去翻译成Servlet

如果A页面包含了B页面,先将B页面翻译成Servlet执行,A页面包含的是B页面执行的结果

生成Servlet个数

最终只会生成1个Servlet

最终会生成2个Servlet

 

注意:使用静态包含,A和B页面中不能出现同名的变量定义

forward和param:

  1. forward作用:实现转发的功能
  2. param的功能:转发的时候带参数

转发前

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>forward动作</h2>
<%--
作用:相当于转发
    转发的同时还可以带参数
    使用jsp:param这个标签来指定参数,可以带多个参数
        name参数名
        value参数值
--%>

<%
    //设置请求的编码,而且放在转发前的页面上
    request.setCharacterEncoding("utf-8");
%>
<jsp:forward page="demo2_result.jsp">
    <jsp:param name="user" value="Yblue"/>
    <jsp:param name="age" value="24"/>
    <jsp:param name="job" value="种田"/>
</jsp:forward>
</body>
</html>

转发后

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
转发到的demo2<hr/>
接收传递过来的参数:<br/>
<%=request.getParameter("user")%><br/>
<%=request.getParameter("age")%><br/>
<%=request.getParameter("job")%><br/>
</body>
</html>