文章目录
前言
JSP是什么
JSP: Java Server Pages Java服务器端页面。
JSP就是HTML+Java代码+JSP自身东西。
JSP在执行时,会被服务器翻译为servlet编译执行,JSP就是一个 Servlet。
脚本元素:
<%! %> : JSP声明翻译成 Servlet成员部分的内容。声明变量,方法,内部类。
<%= %> : 翻译out.print(),在service方法内部。用于生成HTML页面源码。
<% %> : 嵌入Java代码,翻译成service方法内部的代码块。声明变量,内部类。
JSP注释
JSP支持3种注释
HTML的注释: <!-- -->
存在时机:
存在JSP的源码中,翻译成Servlet后这个注释也存在,在生成HTML响应到页面的时候这个注释也会存在。
JAVA的注释:
<% //单行注释
/*多行注释*/
/**文档注释*/
%>
存在时机:
存在JSP的源码中,翻译成servlet后Java 代码的注释也会存在,但是生成HTML响应到页面后,这种注释就消失了。
JSP自身注释:<%--JSP的注释--%>
存在时机:
存在JSP的源码中,翻译Servlet 后注释就没有了。
注意:注意 :Java代码注释的话不要使用HTIML的注释!!!
一、JSP指令元素
指令元素概述
用于指示JSP执行的某些步骤
用于指示JSP变现特定行为
语法: <%@ 指令名称 属性名称=属性的值 属性名称=属性的值 %>
分类:
page指令 : 指示JSP的页面设置属性和行为
include指令 : 指示JSP包含哪些其他页面
taglib指令 : 指示JSP页面包含哪些标签库
page指令
语法: <%@ page 属性名=属性值 %>
Page指令用来定义JSP文件的全局属性。
这些属性可以单独使用,也可以几个或多个同时使用。
在JSP页面中,只有import 属性可以出现多次,其他属性都只能出现一次。
属性:
language属性: 声明使用脚本的语言。只能是java。
extends属性 : 标明JSP编译成servlet 的时候继承的类。默认值:HttplspBase。
session属性: 标明JSP中是否可以直接使用session对象。默认值是true。
buffer属性: 标明JSP对客户端输出缓冲区大小。默认值8kb。
autoFlush属性: 如果缓冲区大小溢出,是否自动刷出。默认 true。
import属性: 用于导入Java包或类。
contentType属性: 标明JSP被浏览器解析和打开的时候采用的黑认的字符集。
pageEncoding属性: JSP文件及JSP翻译后的Servlet保存到硬盘上采用字符集。
isErrorPage属性: 处理JSP页面异常。
errorPage属性: 处理JSP页面异常。
isELIgnored属性: 通知JSP是否忽略EL表达式。
include指令
语法: <%@ include 属性名=属性值 %>
在JSP页面中静态包含一个文件,同时由该JSP解析包含的文件内容。
属性:
file属性: 指示JSP页面包含页面路径。
应该将被包含的页面的结构去掉。
在被包含的页面中定义变量,在包含的页面中还可以使用。
举个例子:
demo1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>上面定义变量</h1>
<%
int i = 3;
%>
demo2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="demo1.jsp" %>
<%= i %>
<%@ include file="demo3.jsp" %>
</body>
</html>
demo3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>下面的copy</h1>
运行后,如下图:
原理:
taglib指令
用于在JSP页面中引入标签库。
语法: <%@ include 属性名=属性值 %>
属性:
uri属性 : 引入的标签库的路径
prefix属性 : 引入标签库的别名
二、内置对象
JSP的内置对象:指的是可以直接在JSP页面中使用的对象。
九大内置对象:
request : 从客户端向服务器发送的请求对象 HttpServletRequest
response : 从服务器端向客户端作出响应对象 HttpServletResponse
session : 服务器为客户端创建会话对象 HttpSession
application : 代表应用。获得的servletContext对象。 ServletContext
out : 向输出流写入内容的对象。 servletConfig
page : 当前的JSP翻译成 Servlet后的对象的引用。 Objecte
pageContext : 本JSP的页面的上下文对象。 PageContext
config : 本JSP的Servletconfig对象。 JspWriter
exception : 表示JSP页面运行时产生的异常对象。 Throwable
pageContext
pageContext 对象直接翻译为“页面上下文”对象,代表的是当前页面运行的一些属性。它是javax.servlet.jsp.pageContext类的实例对象。
提供了page范围的数据存取的方法:
向page范围中存入数据 :
pageContext.getAttribute(arg0)
pageContext.setAttribute(name, value)
pageContext.removeAttribute(name)
通过这个对象获得其他的8个内置对象: getXxx 方法。
JSP四个作用范围
PageScope : 页面范围。
页面范围指的是在当前的页面内有效,出了这个页面,用pageContext保存的数据就无效了。
RequestScope : 请求范围。
从客户端向服务器发送一次请求,服务器对这次请求作出了响应之后,用request保存的数据就无效了。
SessionScope : 会话范围。
每个浏览器向服务器发送请求(多次请求)。将该会话结束。
ApplicationScope :应用范围。
在整个应用中任意的地方都可以获取。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>JSP的四个作用范围</h1>
<h3>page范围(pageContext)</h3>
<%
pageContext.setAttribute("name", "张三");
//可以使用pageContext去存数据
pageContext.setAttribute("name", "李四", pageContext.REQUEST_SCOPE);
//request.setAttribute("name", "李四");
pageContext.setAttribute("name", "王五", pageContext.SESSION_SCOPE);
//session.setAttribute("name", "王五");
pageContext.setAttribute("name", "赵六", pageContext.APPLICATION_SCOPE);
//application.setAttribute("name", "赵六");
%>
<h1>当前页面获取值</h1>
<%= pageContext.getAttribute("name") %>
<%= request.getAttribute("name") %>-<%= pageContext.getAttribute("name", pageContext.REQUEST_SCOPE) %>
<%= session.getAttribute("name") %> <%--方法同上,修改scope即可--%>
<%= application.getAttribute("name") %>
<h1>findAttribute方法</h1>
<%= pageContext.findAttribute("name") %><br/>
</body>
</html>
findAttribute方法
查找属性方法:先根据小范围的名称进行查找,如果找到了就返回,如果没有找到就会去比其大一个域的范围进行查找。
三、JSP的动作标签
JSP的动作标签用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码,造成JSP页面难以维护。
<jsp:forward/> :请求转发。
例子:demo1中有 :<jsp:forward page="web_test/demo2.jsp"></jsp:forward>
效果 : 地址栏是demo1内容是demo2
<isp:include/>:包含(动态包含)。
例子:demo1中有 : <jsp:include page=" /web_test/demo2.jsp"></jsp:include>
效果 : demo1中引用了demo2的内容
<isp:param/>:传递参数。存值取值一般被request.getAttribute("name")取代
动态包含原理: