JSP
JSP简介
JSP(全称JavaServer Pages)java服务器页面。 是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
SP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求,是简化版的Servlet。
执行的过程为 xxx.jsp 转化-->xxx.java 编译-->xxx.class
使用策略
纯粹的HTML使用
- 语法和使用HTML用法完全一样,可以包含css,javaScript,Jquery等
纯粹的Servlet使用
- 以<% java代码片段 %>写法显示在jsp页面,相当于Servlet中的service方法。
HTML+Servlet使用
JSP核心
Jsp的内容包含除了以上的html,css,js,jquery,java代码外,还可以包含JSP相关指令,主要作用用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
jsp中java代码三种方式
-
脚本标签
- <% java代码 %>
-
声明变量和方法
- <%!变量和方法%>
成员变量和成员方法
- <%!变量和方法%>
-
输出标签
- <%=变量%>
三大指令
-
page指令
- <%@page 属性名="值" 属性名="值" %> 控制整个jsp页面的配置信息
- language="java" 支持的语言
- contentType="text/html; charset=UTF-8" 返回的内容类型
- pageEncoding="UTF-8" 页面的编码格式
- import="java.util.List,java.util.ArrayList" 导入jar
- errorPage="跳转的页面" 如果当前页面抛异常 跳转指定页面(这样用户就看不到我们程序报错信息、增强用户体验)
- session="true" 当前页面中可以直接使用该对象
- isELIgnored="true" 是否可以使用el表达式
-
include指令
- 一个页面可以包含另一个页面
- 作用:可以将页面公共的部分提取出来,让每个页面包含这个公共的页面,一是为了减少代码量,二是易于代码的维护。
- 语法:<%@include file="被包含页面名称"%>
-
taglib指令
- 语法:<%@taglib prefix="前缀" uri="引入外部标签库的路径"%>
五大动作
-
作用
- JSP动作标签利用XML语法格式的标记来控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。(取代或者简化jsp写java代码)
-
完全转发
- 语法:<jsp:forward page="转发的指定页面.jsp">
-
动态包含
-
静态包含:<%@include file="被包含的页面.jsp"%>
-
动态包含:<jsp:include page="被包含的页面.jsp">
-
传参:<jsp:param name="username" value="sunwukong"/>
-
区别
- 效率上:静态包含效率远高于动态包含效率
- 生成servlet个数:动态包含会将每一个页面都生成一个servlet,静态包含最终只会生成一个servlet
- 参数传递上:动态包含允许向被包含页面传递参数,而静态包含不允许
-
-
创建实体类对象
- <jsp:useBean id="对象名" class="类">
-
设置与获取对象中的属性值
- 设置:<jsp:setProperty name="对象名" property="属性名" value="属性值"></jsp:setProperty>
- 获取:<jsp:getProperty name="对象名" property="属性名"/>
九大内置对象
-
内置对象
-
也称隐式对象,在jsp中,已经初始化好并且给我们封装好了,不需要程序员创建,可以直接使用的对象就是内置对象
对象名 功能 类型 out 页面输出对象 JspWriter Exception 异常处理对象 Throwable Page 描述页面的对象 Object PageContext 页面的全局对象【作用域】 PageContext Request 请求对象【作用域】 HttpServletRequest Application 服务器对象【作用域】 HttpServletResponse Response 响应对象 HttpSession Config 配置 ServletConfig Session 会话对象【作用域】 ServletContext
-
-
默认能显示的内置对象共8个,还有一个特殊的对象Exception关于异常的,只有在page指令中设置isErrorPage="true"时才会显示。
pageContext.getException() //获取异常对象 -
对象详解
-
application
- 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。该对象的类型是SevletContext类型,它的生命周期在tomcat服务器启动时创建,关闭时销毁。其作用范围为整个Web应用。
-
request
- 对象是javax.servlet.HttpServletRequest类型的对象,该对象代表了客户端的请求信息,主要用于接收通过HTTP协议传送到服务器的数据,request对象的作用域为一次请求
-
response
- 对象是javax.servlet.HttpServletRsponse类型的对象,该对象代表客户端的响应信息,主要是将JSP容器处理过的对象信息发回到客户端
-
config
- 对象主要租用是取得服务器的配置信息,通过pageConext对象的getServletConfig() 方法可以获取一个config对象,当Servlet初始化时,容器把某些信息通过config对象传递给Servlet。开发者可以在web.xml文件中应用程序环境中的Servlet程序和JSP页面提供初始化参数
-
page
- 当前jsp页面的示例,相当于this关键字
-
session
- 会话对象,session对象是由服务器自动创建与用户请求相关的对象,服务器为每一个用户都生成一个session对象,用于保存该用户信息,跟踪用户的操作状态,其作用范围为一次会话
-
exception
- 对象的作用是显示异常信息,只有在包含isErrorPage="true" 的页面中才可以被使用
-
out
- 对象用于在web浏览器内输出信息,并且管理应用服务器上的输出缓存区,JSP中的out对象是JspWrite
-
pageContext
- 对象的作用是取得任何范围的参数,通过它可以获取JSP页面的out、request、response、session、application等对象。pageContext对象的创建和初始化都是由容器来完成的,可以获取项目的根目录,还可通过getXXX()获取其他内置对象
-
-
四大作用域
-
作用
- 实现不同组件之间的数据共享、servlet与servlet之间、servlet与jsp之间的数据共享
-
API
- setAttribute("str",object) 向域对象中存值
- getAttribute("str") 获取域对象中值
- removeAttribute("str") 移除域对象中的值
-
作用域详解
- pageContext页面域:当前域对象中的值只能在当前这个页面使用
- request请求域:一次请求结束域对象就消失
- session会话域:浏览不关闭数据就不消失(30分钟后浏览器不关闭也会消失)
- application应用域:服务器关闭域对象消失、数据消失
在tomcat/conf/context.xml中添加如下内容:让session在服务器关闭的时候将session信息写到硬盘中、当服务器再次启动的时候再读取硬盘中的session文件将session活化到内存中 <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"> <Store className="org.apache.catalina.session.FileStore" directory="D:\apache-tomcat-8.5.68\temp"/> </Manager>
-
EL表达式
-
简介
- EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath(对XML解析dom4j) 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
-
作用
- 主要作用就是用于获取域对象中保存的数据
-
语法
-
$
-
如果不同的域对象出现了相同的key,el表达式默认从最小域中获取内容 如果想从指定域获取
pageScope.key requestScope.key sessionScope.key applicationScope.key
<%-- Created by IntelliJ IDEA. User: ChengLong Date: 2021/8/18 Time: 14:16 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% pageContext.setAttribute("msg","君问归期未有期,巴山夜雨涨秋池"); request.setAttribute("msg","夜雨剪春韭,新炊间黄粱"); session.setAttribute("msg","数点雨声风约住。朦胧淡月云来去"); %> <%--<%el:表达式${域对象的key}%>--%> <%-- 如果不同的域对象,相同key, el表达式默认从最小域获取内容 若指定域获取 pageScope.key requestScope.key sessionScope.key applicationScope.key --%> ${msg}<br> ${pageScope.msg}<br> ${requestScope.msg}<br> ${sessionScope.msg}<br> </body> </html>
-
-
获取javaBean,javaBean属性,Map值,List,数组类型的值
- 获取字符串:$
- 获取对象:$
- 获取map值:$
- 获取集合值:${域对象key[索引]} | $
- 获取数组值:$
<%@ page import="entity.User" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.ArrayList" %><%-- Created by IntelliJ IDEA. User: ChengLong Date: 2021/8/18 Time: 14:29 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%pageContext.setAttribute("msg","钟山风雨其苍皇,百万雄师过大江"); User user = new User(1, "admin", "123", "男", "喝酒", "正在喝酒", "喜欢喝酒"); request.setAttribute("msg1",user); HashMap<String,String> map = new HashMap<>(); map.put("ja","java"); map.put("da","大数据"); session.setAttribute("msg2",map); ArrayList<String> list = new ArrayList<>(); list.add("大官人"); list.add("罗志祥"); list.add("霍尊"); list.add("吴亦凡"); application.setAttribute("msg3",list); Object[] arr = {"李小璐","白百合","潘金莲"}; pageContext.setAttribute("msg4",arr); %> <%-- 获取字符串--%> ${msg}<br> <%--获取对象--%> ${msg1.work} ${msg1.grjj} <%--获取map值--%> ${msg2.ja} <%--获取集合--%> ${msg3.get(2)} ${msg3[0]} <%--获取数组值--%> ${msg4[2]} <%--集合存储对象--%> <%--${域对象的key}[索引].属性--%> </body> </html>
-
el表达式简单运算
<%@ page import="java.util.ArrayList" %><%-- Created by IntelliJ IDEA. User: ChengLong Date: 2021/8/18 Time: 14:40 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%pageContext.setAttribute("msg",10); ArrayList<String> list = null; pageContext.setAttribute("list",list); %> <%--算术运算符--%> ${msg+10}<br> ${msg-10}<br> ${msg*10}<br> <%-- 除--%> ${msg/10} ${msg div 10}<br> <%-- 取模--%> ${msg%10} ${msg mod 10}<br> <%--逻辑运算符--%> ${msg>10 && msg <=20} ${msg>10 and msg <=20}<br> <%--false--%> ${msg>10 || msg<20} ${msg>10 or msg<20}<br><%--true--%> ${!(msg>10)} ${not(msg>10)}<br> <%--true--%> <%--关系运算符--%> ${msg>10} ${msg gt 10} <br> ${msg<10} ${msg lt 10}<br> ${msg>=10} ${msg ge 10}<br> ${msg<=10} ${msg le 10}<br> ${msg!=10} ${msg ne 10}<br> ${msg==10} ${msg eq 10}<br> <%--判空--%> ${list==null} ${empty list}<br> ${list!=null} ${not empty list}<br> <%--条件--%> ${msg>10?"大于":"小于或等于"} </body> </html>
-
原理
-
依次从四大作用域对象检索对应的绑定名,如果在某一个对象中获取到了,则不再去其他对象检索,否则继续检索,如果都没有查找到则返回的是一个空字符串,而不是null
-
如果如下操作时:以表达式${user.name}为例
EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找到与之匹配的方法,El表达式就会认为这就是要访问的属性,并返回属性的值。 -
所以,想要通过EL表达式获取对象属性的值,那么这个属性就必须有与之对应的get方法。
-
可以通过指定检索四大作用域对象来提升检索速度
- ${pageScope.user} 表示直接去pageContext对象中获取user绑定名对应的值
- ${requestScope.user} 表示直接去request对象中获取user绑定名对应的值
- ${sessionScope.user} 表示直接去session对象中获取user绑定名对应的值
- ${applicationScope.user} 表示直接去application对象中获取user绑定名对应的值
-
JSTL标签库
-
简介
- JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
- 需要注意的是:jstl中需要获取值的地方一般都要配合EL表达式去使用
jstl和el配合才能完成页面数据展示
-
使用
-
导入jstl核心jar包
-
将标签引入页面中
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -
常用标签
-
set标签:向域对象中存值
-
out标签:输出标签
-
-
<%--
Created by IntelliJ IDEA.
User: ChengLong
Date: 2021/8/18
Time: 15:19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<%pageContext.setAttribute("msg",10);%>--%>
<c:set scope="page" var="msg" value="10"></c:set>
<%--<%pageContext.getAttribute("msg");%>--%>
<c:out value="${msg}"></c:out> ${msg}
<c:remove var="msg"></c:remove>
</body>
</html>
-
remove标签:移除域对象值
-
if标签 判断标签
<%--
Created by IntelliJ IDEA.
User: ChengLong
Date: 2021/8/18
Time: 15:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:set scope="page" var="score" value="80"></c:set>
<%--
test:判断表达式是否成立
--%>
<c:if test="${score>=90 && score<=100}">
优秀
</c:if>
<c:if test="${score>=80 && score<90}">
良好
</c:if>
<c:if test="${score>=60 && score<80}">
中
</c:if>
<c:if test="${score<60}">
不及格
</c:if>
</body>
</html>
-
choose 判断标签
-
when标签
-
otherwise标签
<%--
Created by IntelliJ IDEA.
User: ChengLong
Date: 2021/8/18
Time: 15:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:set scope="page" var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 && score<=100}">
优秀
</c:when>
<c:when test="${score>=80 && score<90}">
良好
</c:when>
<c:when test="${score>=60 && score<80}">
良
</c:when>
<c:when test="${score<60}">
不及格
</c:when>
<c:otherwise>
输入不对
</c:otherwise>
</c:choose>
</body>
</html>
- forEach标签 循环标签
<%@ page import="com.ujiuye.entity.User" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: 32714
Date: 2021/8/18
Time: 15:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table width="900px" height="300px" cellspacing="0px" cellpadding="7px" border="1px" align="center">
<tr>
<th>索引</th>
<th>编号</th>
<th>用户名</th>
<th>密码</th>
<th>性别</th>
<th>爱好</th>
<th>工作</th>
<th>个人介绍</th>
</tr>
<%--
for (User user : list) {
}
itesm:要遍历的对象
var:从集合中获取到每一个对象
begin:起始索引
end:结束索引
step:迭代增量 默认是1
varStatus:循环的状态
index:循环的索引
count:循环的序号
--%>
<c:forEach var="user" items="${list}" varStatus="p">
<tr>
<td>${p.count}</td>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td>${user.sex}</td>
<td>${user.hobby}</td>
<td>${user.work}</td>
<td>${user.sdesc}</td>
</tr>
</c:forEach>
<%-- <%ArrayList<User> list =(ArrayList<User>) request.getAttribute("list");
for (User user : list) {%>
<tr>
<td><%=user.getId()%></td>
<td><%=user.getUsername()%></td>
<td><%=user.getPassword()%></td>
<td><%=user.getSex()%></td>
<td><%=user.getHobby()%></td>
<td><%=user.getWork()%></td>
<td><%=user.getSdesc()%></td>
</tr>
<%}%>--%>
<%--<tr>
<td>${list[0].id}</td>
<td>${list[0].username}</td>
<td>${list[0].password}</td>
<td>${list[0].sex}</td>
<td>${list[0].hobby}</td>
<td>${list[0].work}</td>
<td>${list[0].sdesc}</td>
</tr>
<tr>
<td>${list[1].id}</td>
<td>${list[1].username}</td>
<td>${list[1].password}</td>
<td>${list[1].sex}</td>
<td>${list[1].hobby}</td>
<td>${list[1].work}</td>
<td>${list[1].sdesc}</td>
</tr>
<tr>
<td>${list[2].id}</td>
<td>${list[2].username}</td>
<td>${list[2].password}</td>
<td>${list[2].sex}</td>
<td>${list[2].hobby}</td>
<td>${list[2].work}</td>
<td>${list[2].sdesc}</td>
</tr>
<tr>
<td>${list[3].id}</td>
<td>${list[3].username}</td>
<td>${list[3].password}</td>
<td>${list[3].sex}</td>
<td>${list[3].hobby}</td>
<td>${list[3].work}</td>
<td>${list[3].sdesc}</td>
</tr>--%>
</table>
</body>
</html>