JSP
概念
- 简化Servlet的设计,整合servlet和html,高效开发动态网页技术。
作用
- 用于显示数据,提供与用户交互的视图。
九大内置对象
- request : 请求对象,用于接收数据等,一次请求有效。
- respone: 响应对象,用于响应数据给客户端。
- application:上下文,用于保存多个用户公用的数据到服务器,即共同拥有一个application对象。
- session: session对象,用于保存数据,一次会话有效,由session=“true”开关
- pageContext:用于获取 out ,requuest,respone,application对象。
- config:用于获取服务器的配置信息,在servlet初始化的时候,web容器通过config把配置信息传给servlet 。
- page: 表示当前jsp对象,在当前页响应后销毁。
- out :用户打印数据到客户端页面。
- exception :用于响应异常数据,由isErrorPage=“false”开关。
四大域对象
- request:一次请求有效。
- pageContext:当前页面有效。
- seesion:一次会话有效。
- application:整个web应用有效。
jsp指令
-
<%@page …%>:定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等.
-
<%@ include … %> : 包含其他文件,静态包含。
-
<%@ taglib … %>:引入标签库的定义,可以是自定义标签。
page指令
- 语法:<%@ page attribute1=“value1” attribute2=“value2” %>.
- Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
include指令
- 语法:<%@ include file = “被包含的JSP路径”%>
- 通过include指令来包含其他文件。
- 被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是当前JSP文件的一部分,会被同时编译执行(静态包含)。
在这里插入代码片
<%@ include file=“header.jsp”%>
…
…
<%@ include file=“footer.jsp” %>- 注意:可能会有重名的冲突问题,不建议使用。
taglib指令
- 语法:<%@ taglib uri=“外部标签库路径” prefix=“前缀” %>
- 引入JSP的标准标签库
在这里插入代码片
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
动作标签
-
语法:<jsp:action_name attribute=“value” />
-
动作标签指的是JSP页面在运行期间的命令
include- 语法:<jsp:include page=“相对 URL 地址” />
- <jsp:include >动作元素会将外部文件输出结果包含在JSP中(动态包含)。
<jsp:include page="index.jsp"/>
useBean
- 语法:<jsp:useBean id=“name” class=“package.className” />
- jsp:useBean 动作用来加载一个将在JSP页面中使用的JavaBean。
<jsp:useBean id="user" class="com.qf.entity.User"/>
- 在类载入后,我们可以通过 jsp:setProperty 和 jsp:getProperty 动作来修改和获取bean的属性。
setProperty
- 可以在jsp:useBean元素之后使用jsp:setProperty进行属性的赋值
<jsp:useBean id="user" class="com.qf.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" />-
进行赋值
getProperty
- jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。
<jsp:useBean id="user" class="com.qf.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" />
<jsp:getProperty name="user" property="name" />
- 进行取值
脚本
普通脚本
- 语法:<% Java代码 %>
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
//jsp中,使用小脚本嵌入java代码!
out.println("hi");//打印内容在客户端页面
System.out.println("hi");//打印内容在控制台
%>
</body>
</html>
声明脚本
- 语法:<%! 定义变量、函数 %>
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Object object = new Object(); %>
<%!
//定义方法
public void m1(){
System.out.println("你好");
}
%>
输出脚本
- 语法:<%=Java表达式 %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp基本使用</title>
</head>
<body>
<p>
今天的日期是: <%= new java.util.Date() %>
</p>
</body>
</html>
EL表达式(Expression Language)
概念
- EL使JSP写起来更简单、简洁。主要用于获取作用域中的数据
作用
- 用于替换作用域对象.getAttribute(“name”);
EL的应用(获取基本类型、字符串)
- ${scope.name} 获取具体某个作用域中的数据
- ${name} 获取作用域中的数据,逐级查找(pageContext、request、session、application)
EL应用案例
<%
//存储在request作用域
request.setAttribute("name","tom");
request.setAttribute("age",18);
%>
${requestScope.name} <%--获取request作用域中name对应的值,找到就返回,没找到返回"" --%>
${name}<%--从最小作用域逐级查找name对应的值,找到就返回,没找到返回"" --%>
EL和JSP脚本的区别
- <%=request.getAttribute() %> 没有找到返回null 。
- ${requestScope.name} 没找到返回""
EL的应用(获取引用类型)
- 使用EL获取作用域中的对象调用属性时,只能访问对象的get方法,必须遵守命名规范定义
<%
Emp e = new Emp();
e.setName("gavin");
e.setAge(19);
request.setAttribute("e",e);
%>
${requestScope.e.name}<%-- 调用getName()方法 --%>
EL的应用(获取数组、集合的元素)
- EL可以获取Array、List、Map中的元素,Set由于没下标,无法直接访问元素,后续可遍历
<%
int[] array = new int[]{1,2,3,4,5};
request.setAttribute("array",array);
List<Emp> emps = new ArrayList<>();
emps.add(new Emp(1,"gavin",2000,19));
emps.add(new Emp(2,"marry",3000,29));
emps.add(new Emp(3,"jack",4000,39));
request.setAttribute("emps",emps);
Map<String,String> maps = new HashMap<>();
maps.put("CN","中国");
maps.put("FK","法国");
maps.put("US","美国");
request.setAttribute("maps",maps);
%>
${requestScope.array[0]}
${requestScope.emps[0]} <%-- 也可以用 ${requestScope.emps.get(0)} --%>
${requestScope.maps.CN} <%-- 也可以用 ${requestScope.maps["US"]} -->
获得应用上下文
<%=request.getContextPath() %>
${pageContext.request.contextPath}
JSTL标准标签库
现有问题
- EL主要是用于作用域获取数据,虽然可以做运算判断,但是得到的都是一个结果,做展示。
- EL不存在流程控制。比如判断。
- EL对于集合只能做单点访问,不能实现遍历操作。比如循环。
什么是 JSTL?
- JSTL:全称Java Server Pages Standard Tag Library
- JSP标准标签库(JSTL)是一个JSP标签集合。
JSTL的作用
- 可对EL获取到的数据进行逻辑操作。
- 与EL合作完成数据的展示。
JSTL使用
- 导入两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下
- 在JSP页面引入标签库<% @taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”>
核心标签
条件标签if判断
- 语法:<c:if test =“条件”> < /c:if>
<!-- test属性中是条件,但是条件需要使用EL表达式来书写 -->
<h3>条件标签:if</h3>
<c:if test="${8>2 }">
8大于2是成立的
</c:if>
<c:if test="${8<2 }">
8小于2是成立的
</c:if>
多条件choose判断
语法:<c:choose >
<c:when test="条件1">结果1< /c:when>
<c:when test="条件2">结果2< /c:when>
<c:when test="条件3">结果3< /c:when>
<c:otherwise >结果4< /c:otherwise>
< /c:choose>
<h3>条件标签:choose(等价于java中多重if)</h3>
<%-- 测试成绩等级 >90 优秀 >80 良好 >70 中等 >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
迭代foreach标签
语法
<c:foreach
var="变量名"
items="集合"
begin="起始下标"
end="结束下标"
step="间隔长度"
varstatus="遍历状态">
< /c:foreach>
<h3>测试list集合遍历获取学生列表</h3>
<table border="1" width="80%" bordercolor="red" cellspacing="0"
align="center">
<tr>
<th>学号</th>
<th>姓名</th>
<th>成绩</th>
<th>班级</th>
<th>是否是第一个</th>
<th>是否是最后一个</th>
<th>计数count</th>
<th>索引index</th>
</tr>
<!-- varStatus:变量状态:遍历出的每一项内容的状态:
first 是否是第一行
last 是否是最后一行
count 当前行数
index 当前元素的下标
-->
<!-- var :遍历出的每一项使用变量先存储
items:集合(使用El表达式)
-->
<c:forEach var="stu" items="${students}" varStatus="vs">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.score}</td>
<td>${stu.classes}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${vs.count}</td>
<td>${vs.index}</td>
</tr>
</c:forEach>
</table>