1. JSP的特点:
概念
JSP:Java Server Page (Java服务器端的页面,运行在服务器上的页面)
用户在浏览器端看到的页面,其实是JSP运行的结果。
特点
JSP上可以同时编写:HTML Java代码
Java代码写以下格式中: <% %>
在浏览器上能否看到Java代码?
不能,在浏览器上看到的只是JSP运行的结果
2. JSP与Servlet之间的关系
JSP的执行过程
- JSP代码由Tomcat翻译成Servlet
- 由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个功能:
- 是一个作用域对象
- 通过它可以获取其它的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指令概述
- 作用:设置JSP页面上功能,告诉tomcat将JSP翻译成Servlet的时候有哪些限制
- 位置:通常放在页面的最前面,但其实可以放在页面的任意位置
导包的属性
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:包含
- 作用:用来包含另一个JSP页面或Servlet
- 语法:<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:
- forward作用:实现转发的功能
- 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>