JSP:Java Server Page
概念
JSP:Java Server Page (Java服务器端的页面,运行在服务器上的页面)
特点
Java代码写以下格式中: <% %>
在浏览器上能否看到Java代码?
不能,在浏览器上看到的只是JSP运行的结果
运行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
<%@ 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>
对象名 | 对应的类型 | 功能描述 |
---|---|---|
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 | 出现在异常的页面中,表示异常对象 |
页面上下文,也是一个作用域,它的作用范围是:只在当前JSP页面起作用。
总共有4个作用域,页面域中在JSP中才有用,Servlet中没有页面域这个对象。
页面域 < 请求域 < 会话域 < 上下文域
所有的作用域,它的底层数据结构都是Map结构
“键”为String类型
void setAttribute("键",Object 值) | 向作用域中添加键和值,如果键存在就是修改 |
Object getAttribute("键") | 通过键从作用域中获取值 |
void removeAttribute("键") | 通过键删除键和值 |
页面域的特有方法
removeAttribute("键") | 删除所有四个作用域中键和值 |
findAttribute("键") | 通过键按从小到大的顺序去查找每个使用域的值 |
-
是一个作用域对象
-
通过它可以获取其它的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>
include | 用来包含另一个页面 |
page | 指定JSP页面的属性 |
taglib | 导入第三方标签库 |
<div id="header"> <%--相当于把header.jsp中原代码复制到这个位置--%> <%@include file="header.jsp"%> </div>
page指令概述
-
-
位置:通常放在页面的最前面,但其实可以放在页面的任意位置
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,在页面上就不能使用会话对象。
isELIgnored="true|false"
在JSP页面上默认是可以使用EL表达式语言,默认是false
如果设置为true,页面禁用表达式语言,EL表达式会原样输出。
-
-
语法:<jsp:include page="被包含的页面"/>
静态包含 | 动态包含 | |
---|---|---|
语法格式 | <%@include file="被包含的页面"%> | <jsp:include page="被包含的页面"/> |
包含的方式 | 如果A页面包含了B页面,相当于把B页面的代码先复制到A页面中,再去翻译成Servlet | 如果A页面包含了B页面,先将B页面翻译成Servlet执行,A页面包含的是B页面执行的结果 |
生成Servlet个数 | 最终会生成2个Servlet |
注意:使用静态包含,A和B页面中不能出现同名的变量定义
-
-
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>
想看更多精彩内容,可以关注我的CSDN