文章目录
- JSP & EL & JSTL
- JSP基础知识
- 三大JSP指令
- 七大JSP 动作标签
- JSP九大内置对象
- pageContext 【javax.servlet.jsp.PageContext】
- request 【javax.servlet.http.HttpServletRequest】
- session 【javax.servlet.http.HttpSession】
- application 【javax.servlet.ServletContext】
- out 【javax.servlet.jsp.JspWriter】
- response 【javax.servlet.http.HttpServletResponse】
- exception 【java.lang.Throwable】
- page 【java.lang.Object】
- config 【javax.servlet.ServletConfig】
- 四个作用域
- EL表达式
- EL表达式 的11个内置对象。
- JSTL
JSP & EL & JSTL
JSP基础知识
JSP全称Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。
- 什么是jsp
从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了servlet,所以可以直接说jsp 就是一个Servlet.
- 为什么会有jsp?
html 多数情况下用来显示静态内容 , 一成不变的。 但是有时候我们需要在网页上显示一些动态数据, 比如: 查询所有的学生信息, 根据姓名去查询具体某个学生。 这些动作都需要去查询数据库,然后在网页上显示。 html是不支持写java代码 , jsp里面可以写java代码。
- 动态网页
所谓的动态网页,是指跟静态网页相对的一种网页编程技术。静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。
不要将动态网页和页面内容是否有动感混为一谈。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术生成的网页都可以称为动态网页。
页面结构
JSP声明变量、方法
<%!
private int age = 0;
public void sayHello() {
out.println("Hello World!");
}
%>
JSP表达式
<%=age %>
Java代码片段
<%
age = age + 10;
sayHello();
%>
JSP注释
语法 | 描述 |
---|---|
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
HTML注释,通过浏览器查看网页源代码时可以看见注释内容 | |
<% | 代表静态 <%常量 |
%\> | 代表静态 %> 常量 |
\’ | 在属性中使用的单引号 |
\" | 在属性中使用的双引号 |
JSP生命周期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1LnRTEzp-1571927523155)(/Volumes/JOHN/JavaWeb/JSP&JSTL&EL/源码笔记/code&资料/笔记/img/jsp_life_cycle.jpg)]
-
编译阶段
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
- 解析JSP文件
- 将JSP文件转为Servlet
- 编译Servlet文件
-
初始化阶段
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
// 可以重写此方法,添加初始化逻辑 public void _jspInit() { }
-
执行阶段
调用与JSP对应的servlet实例的服务方法
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException { // 分发请求 // doGet // doPost }
-
销毁阶段
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
// 可以重写此方法,添加销毁操作 public void _jspDestroy() { }
三大JSP指令
指令写法
<%@ 指令名字 属性名=“属性值” %>
page指令
- language
表明jsp页面中可以写java代码
- contentType
其实即使说这个文件是什么类型,告诉浏览器我是什么内容类型,以及使用什么编码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
pageEncoding jsp内容编码
-
extends 用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改。
-
import 导包使用的,一般不用手写。
-
session
值可选的有true or false .
用于控制在这个jsp页面里面,能够直接使用session对象。
具体的区别是,请看翻译后的java文件 如果该值是true , 那么在代码里面会有getSession()的调用,如果是false : 那么就不会有该方法调用,也就是没有session对象了。在页面上自然也就不能使用session了。
- errorPage
指的是错误的页面, 值需要给错误的页面路径
- isErrorPage
上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。
include指令
包含另外一个jsp的内容进来。
<%@ include file="other02.jsp"%>
- 背后细节:
把另外一个页面的所有内容拿过来一起输出。 所有的标签元素都包含进来。
taglib
作用:用于引入标签库
语法:<%@ taglib prefix="" uri=""%>
uri: 标签库路径
prefix : 标签库的别名
七大JSP 动作标签
jsp:include
<jsp:include page="other02.jsp"></jsp:include>
包含指定的页面, 这里是动态包含。 也就是不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来。
jsp:forward
<!-- 不带参数跳转 -->
<jsp:forward page="test.jsp"></jsp:forward>
<jsp:forward page="test.jsp" />
<!-- 带参数跳转 -->
<!-- 中文参数会出现乱码,因为底层是通过URIEncoding来编码的,默认取的是request.getCharsetEncoding() , 要解决此乱码问题,我们需要再跳转前设置 request.setCharsetEncoding("UTF-8");
-->
<% request.setCharsetEncoding("UTF-8"); %>
<jsp:forward page="test.jsp">
<jsp:param name="sname" value="zhangsan" />
</jsp:forward>
<!-- 如果这样写,中间必须加上param子标签 -->
<jsp:forward page="test.jsp">
</jsp:forward>
前往哪一个页面。
jsp:param
意思是: 在包含某个页面的时候,或者在跳转某个页面的时候,加入这个参数。
<jsp:forward page="other02.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
在other02.jsp中获取参数
<br>收到的参数是:<br>
<%= request.getParameter("address")%>
jsp:useBean&jsp:setProperty&jsp:getProperty
这组动作标签用于实例化JavaBean,并且设置、获取属性
<jsp:useBean id="stu" class="com.lanou3g.demo.bean.Student" />
<jsp:setProperty name="stu" property="sname" value="张三" />
<jsp:getProperty property="sname" name="stu"/>
jsp:plugin
用于在浏览器中播放或者显示一个对象,使用这个动作能插入所需的特定的浏览器的OBJECT或者EMBED元素来制定浏览器运行一个Java Applet所需的插件,实例如下:
<jsp:plugin type="applet" codebase="/ch5" code="Hello.class" height="40" width="320">
JSP九大内置对象
所谓内置对象,就是我们可以直接在jsp页面中使用这些对象。 不用创建。
pageContext 【javax.servlet.jsp.PageContext】
作用:为JSP页面包装页面的上下文。
方法名 | 说明 |
---|---|
forward | 重定向到另一页面或Servlet组件 |
getAttribute | 获取某范围中指定名字的属性值 |
findAttribute | 按范围搜索指定名字的属性 |
removeAttribute | 删除某范围中指定名字的属性 |
setAttribute | 设定某范围中指定名字的属性值 |
getException | 返回当前异常对象 |
getRequest | 返回当前请求对象 |
getResponse | 返回当前响应对象 |
getServletConfig | 返回当前页面的ServletConfig对象 |
getServletContext | 返回所有页面共享的ServletContext对象 |
getSession | 返回当前页面的会话对象 |
request 【javax.servlet.http.HttpServletRequest】
作用:向服务端请求数据
方法名 | 说明 |
---|---|
isUserInRole | 判断认证后的用户是否属于某一成员组 |
getAttribute | 获取指定属性的值,如该属性值不存在返回Null |
getAttributeNames | 获取所有属性名的集合 |
getCookies | 获取所有Cookie对象 |
getCharacterEncoding | 获取请求的字符编码方式 |
getContentLength | 返回请求正文的长度,如不确定返回-1 |
getHeader | 获取指定名字报头值 |
getHeaders | 获取指定名字报头的所有值,一个枚举 |
getHeaderNames | 获取所有报头的名字,一个枚举 |
getInputStream | 返回请求输入流,获取请求中的数据 |
getMethod | 获取客户端向服务器端传送数据的方法 |
getParameter | 获取指定名字参数值 |
getParameterNames | 获取所有参数的名字,一个枚举 |
getParameterValues | 获取指定名字参数的所有值 |
getProtocol | 获取客户端向服务器端传送数据的协议名称 |
getQueryString | 获取以get方法向服务器传送的查询字符串 |
getRequestURI | 获取发出请求字符串的客户端地址 |
getRemoteAddr | 获取客户端的IP地址 |
getRemoteHost | 获取客户端的名字 |
getSession | 获取和请求相关的会话 |
getServerName | 获取服务器的名字 |
getServerPath | 获取客户端请求文件的路径 |
getServerPort | 获取服务器的端口号 |
removeAttribute | 删除请求中的一个属性 |
setAttribute | 设置指定名字参数值 |
session 【javax.servlet.http.HttpSession】
作用:用来保存每个用户的信息,以便跟踪每个用户的操作状态
方法名 | 说明 |
---|---|
getAttribute | 获取指定名字的属性 |
getAttributeNames | 获取session中全部属性名字,一个枚举 |
getCreationTime | 返回session的创建时间 |
getId | 获取会话标识符 |
getLastAccessedTime | 返回最后发送请求的时间 |
getMaxInactiveInterval | 返回session对象的生存时间单位千分之一秒 |
invalidate | 销毁session对象 |
isNew | 每个请求是否会产生新的session对象 |
removeAttribute | 删除指定名字的属性 |
setAttribute | 设定指定名字的属性值 |
application 【javax.servlet.ServletContext】
作用:对应ServletContext对象, 在整个应用的生命周期内共享数据
方法名 | 说明 |
---|---|
getAttribute | 获取应用对象中指定名字的属性值 |
getAttributeNames | 获取应用对象中所有属性的名字,一个枚举 |
getInitParameter | 返回应用对象中指定名字的初始参数值 |
getServletInfo | 返回Servlet编译器中当前版本信息 |
setAttribute | 设置应用对象中指定名字的属性值 |
out 【javax.servlet.jsp.JspWriter】
作用:向客户端输出数据
方法名 | 说明 |
---|---|
print或println | 输出数据 |
newLine | 输出换行字符 |
flush | 输出缓冲区数据 |
close | 关闭输出流 |
clear | 清除缓冲区中数据,但不输出到客户端 |
clearBuffer | 清除缓冲区中数据,输出到客户端 |
getBufferSize | 获得缓冲区大小 |
getRemaining | 获得缓冲区中没有被占用的空间 |
isAutoFlush | 是否为自动输出 |
response 【javax.servlet.http.HttpServletResponse】
作用:封装了jsp产生的响应,然后被发送到客户端以响应客户的请求
方法名 | 说明 |
---|---|
addCookie | 添加一个Cookie对象 |
addHeader | 添加Http文件指定名字头信息 |
containsHeader | 判断指定名字Http文件头信息是否存在 |
encodeURL | 使用sessionid封装URL |
flushBuffer | 强制把当前缓冲区内容发送到客户端 |
getBufferSize | 返回缓冲区大小 |
getOutputStream | 返回到客户端的输出流对象 |
sendError | 向客户端发送错误信息 |
sendRedirect | 把响应发送到另一个位置进行处理 |
setContentType | 设置响应的MIME类型 |
setHeader | 设置指定名字的Http文件头信息 |
exception 【java.lang.Throwable】
被调用的错误页面的结果,只有在错误页面中才可使用,
即在页面指令中设置:<%@page isErrorPage=“true”%>
page 【java.lang.Object】
它代表JSP被编译成Servlet,可以使用它来调用Servlet类中所定义的方法
config 【javax.servlet.ServletConfig】
作用:表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet
方法名 | 说明 |
---|---|
getServletContext | 返回所执行的Servlet的环境对象 |
getServletName | 返回所执行的Servlet的名字 |
getInitParameter | 返回指定名字的初始参数值 |
getInitParameterNames | 返回该JSP中所有的初始参数名,一个枚举 |
四个作用域
表示这些对象可以存值,他们的取值范围有限定。 setAttribute 和 getAttribute
使用作用域来存储数据
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
取出四个作用域中的值
<%=pageContext.getAttribute("name")%>
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>
作用域范围大小:
pageContext – request — session – application
四个作用域的区别
- pageContext 【PageContext】
作用域仅限于当前的页面。
除了可以存储数据, 还可以获取其他8个内置对象
- request 【HttpServletRequest】
作用域仅限于一次请求, 只要服务器对该请求做出了响应。 这个域中存的值就没有了。
- session 【HttpSession】
作用域限于一次会话(多次请求与响应) 当中。
- application 【ServletContext】
整个工程都可以访问, 服务器关闭后就不能访问了。
EL表达式
是为了简化咱们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码。
-
语法结构
${expression }
-
从指定的作用域取参数
${requestScope.表达式}
如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取。 一直把四个作用域取完都没有, 就没有显示。
如何使用
- 取出4个作用域中存放的值。
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
按普通手段取值<br>
<%= pageContext.getAttribute("name")%>
<%= request.getAttribute("name")%>
<%= session.getAttribute("name")%>
<%= application.getAttribute("name")%>
<br>使用EL表达式取出作用域中的值<br>
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
- 如果域中所存的是数组
<%
String [] a = {"aa","bb","cc","dd"};
pageContext.setAttribute("array", a);
%>
使用EL表达式取出作用域中数组的值<br>
${array[0] } , ${array[1] },${array[2] },${array[3] }
- 如果域中所存的是集合
<%
String[] a = {"a","b","c","d","f"};
pageContext.setAttribute("array",a);
List<String> b = new ArrayList<>();
b.add("aa");
b.add("bb");
b.add("cc");
b.add("dd");
b.add("ff");
pageContext.setAttribute("li",b);
%>
使用EL表达式取出作用域中集合的值<br>
${li[0] } , ${li[1] },${li[2] },${li[3] },${li[4] }
- 取出Map集合的值
<%
Map map = new HashMap();
map.put("name", "zhangsna");
map.put("age",18);
map.put("address","北京..");
map.put("address.aa","深圳..");
pageContext.setAttribute("map", map);
%>
使用EL表达式取出作用域中Map的值<br>
${map.name } , ${map.age } , ${map.address } , ${map["address.aa"] }
EL表达式 的11个内置对象。
${ 对象名.成员 }
- pageContext
作用域相关对象
- pageScope
- requestScope
- sessionScope
- applicationScope
头信息相关对象
- header
- headerValues
参数信息相关对象
-
param
-
paramValues
-
cookie
全局初始化参数 -
initParam
JSTL
全称 : JSP Standard Tag Library jsp标准标签库
简化jsp的代码编写。 替换 <%%> 写法。 一般与EL表达式配合
怎么使用
-
导入jar文件到工程的WebContent/Web-Inf/lib jstl.jar standard.jar
-
在jsp页面上,使用taglib 指令,来引入标签库
比如引入JSTL核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 注意: 如果想支持 EL表达式,那么引入的标签库必须选择1.1以上的版本,1.0的版本不支持EL表达式。
JSTL标签分类
核心标签(最核心、最重用)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
表达式控制标签
- out
属性名 含义 是否必须 value 输出值,如果是常量直接赋值, 如果是变量需要通过EL表达式取值 是 default 当value为null时, 输出default属性配置的值 否 escapeXml 是否转义XML特殊字符,取值true/false, 默认是true 否 - set
属性名 含义 是否必须 value 搭配var属性使用,设置变量的值;搭配property和target使用,设置javabean属性的值 是 var 定义的变量名称 否 scope 变量保存到的作用域,默认是pageContext 否 target 给javabean设置属性,指定那个javabean。需配合<jsp:useBean>标签和property、value属性使用 否 property 设置javabean的哪个属性的值 否 - remove
属性名 含义 是否必须 var 删除指定的变量,只能删除变量,不能删除javabean的属性 是 - catch
属性名 含义 是否必须 var 存储错误信息 是 <%-- <c:catch>用于包裹其他容易出错的标签,比如 --%> <c:catch var="error"> <!-- aa为没有实例化的javabean --> <c:set target="aa" property="name" value="zhangsan" /> </c:catch> <c:out value="${error}" />
-
流程控制标签
- if
<c:if test="${income > 8000}"> <p>My income is: <c:out value="${income}"/><p> </c:if>
- choose&when&otherwise
<c:choose> <c:when test="${income <= 1000}"> Income is not good. </c:when> <c:when test="${income > 10000}"> Income is very good. </c:when> <c:otherwise> Income is undetermined... </c:otherwise> </c:choose>
- forEach
<% List<String> students = new ArrayList<>(); students.add("张三"); students.add("李四"); students.add("王五"); students.add("赵六"); request.setAttribute("stus", students); %> <!-- forEach遍历全部元素 --> <c:forEach var="stu" items="${stus}"> <c:out value="${stu}" /> <br /> </c:forEach> <!-- forEach遍历部分元素 --> <c:forEach var="stu" items="${stus}" begin="1" end="3"> <c:out value="${stu}" /> <br /> </c:forEach> <!-- forEach遍历部分元素,指定步长; step属性表示输出的间隔;--> <c:forEach var="stu" items="${stus}" begin="1" step="2"> <c:out value="${stu}" /> <br /> </c:forEach> <!-- 用法四:部分遍历并带状态 --> <c:forEach var="stu" items="${stus}" begin="1" end="3" varStatus="status"> <c:out value="${stu}——四个属性:"></c:out><br> <c:out value="index属性:${status.index}"></c:out><br> <c:out value="count属性:${status.count}"></c:out><br> <c:out value="first属性:${status.first}"></c:out><br> <c:out value="last属性:${status.last}"></c:out><br> <c:out value="----------"></c:out><br> </c:forEach> <!-- varStatus变量的几个属性:index从0开始;count从1开始;first是否第一个(boolean);last是否最后一个(boolean)。 --> <!-- items属性表示输出的集合-->
- forTokens
<c:forTokens items="zhangsan,lisi,wangwu" delims="," var="item"> <c:out value="${item}" /> <br /> </c:forTokens> <!-- items属性表示字符串;delims表示分隔符;--> <!-- 另外forTokens也支持begin、end、step、var、Status几个属性,用法和forEach一样 -->
-
URL操作标签
- url
<c:url value="http://localhost:8080/Test/index.jsp" var="newUrl" scope="session"> <c:param name="username">zhangsan</c:param> <c:param name="password">a123456</c:param> </c:url> <a href="${newUrl}">New URL</a>
- redirect
<c:redirect url="www.baidu.com"> <c:param name="username">zhangsan</c:param> <c:param name="password">a123456</c:param> </c:redirect>
- param
一般作为其他标签的子标签使用,为其附加参数
格式化标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- 格式化时间
<%
Date date = new Date();
pageContext.setAttribute("d", date);
%>
<fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss"/>
- 格式化数字
<%
double d1 = 3.5;
double d2 = 4.4;
pageContext.setAttribute("d1", d1);
pageContext.setAttribute("d2", d2);
%>
<fmt:formatNumber value="${d1 }" pattern="0.00"/><br/>
<fmt:formatNumber value="${d2 }" pattern="#.##"/>
SQL标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
- setDataSource
<sql:setDataSource var="db" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/test"
user="root" password="1234"/>
- query
<sql:query dataSource="${db}" var="rs" startRow="" maxRows="" sql="">
SELECT * from Students;
</sql:query>
<!--
var中的result存放了结果,查询后怎么显示呢?
startRow表示开始显示的是第几行。
maxRows表示一页能够显示的行数。
因此这个标签可以用于分页。 -->
<c:forEach items="${result.rows}" var="iter">
${iter.name}
${iter.age}
</c:forEach>
<!-- ${result.rowCount}返回行数; -->
- update
<sql:update dataSource="${db}" var="count">
INSERT INTO Students VALUES (154,'Nasreen', 'jaha', 25);
</sql:update>
- param & dateParam
<%
Date DoB = new Date("2000/10/16");
int studentId = 151;
%>
<sql:update dataSource="${db}" var="count">
UPDATE Student SET dob = ? WHERE Id = ?
<sql:dateParam value="<%=DoB%>" type="DATE" />
<sql:param value="<%=studentId%>" />
</sql:update>
- transaction
<sql:transaction dataSource="${db}">
<sql:update var="count">
UPDATE Student SET First_Name = 'Suraj' WHERE Id = 150
</sql:update>
<sql:update var="count">
UPDATE Student SET Last_Name= 'Saifi' WHERE Id = 153
</sql:update>
<sql:update var="count">
INSERT INTO Student
VALUES (154,'Supriya', 'Jaiswal', '1995/10/6');
</sql:update>
</sql:transaction>
XML标签
用的不多,这里不在列举
ps: 更多详细内容,参见:https://www.javatpoint.com/jstl