JSP文件
用于写动态页面
JSP第一次运行之前会先翻译成xx_jsp.java文件, 再编译成xx_jsp.class
-
xx_jsp.java
class xx_jsp extends HttpJspBase
class HttpJspBase extends HttpServlet -
class xx_jsp 本质就是Servlet
核心方法 _jspService - 服务方法, 功能和service方法一致
_jspService:html标签 --> out.write() -
<% 普通java代码 %> — 翻译到service方法中
<%=表达式 %> — 翻译到service方法中, out.print(表达式);
<%! 声明语句 %> — 翻译成 xx_jsp 类的成员 -
注释
<!- html注释 -->:JSP源码 java代码 前端页面(都能看见)
// Java注释:JSP源码 java代码
<%-- JSP注释 --%>:JSP源码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>第一个JSP</title>
</head>
<body>
<!-- html标签, css js -->
<h1>这是第一个JSP页面</h1>
<!-- java脚本 -->
<%-- JSP注释 --%>
<%
// java注释
int a = 10;
if (a == 1) {
System.out.println(a);
} else {
System.out.println(a + 1);
}
%>
<%
for (int i = 0; i < 10; i++) {
%>
<h2><%=i %></h2>
<%
}
%>
<%=a + 2 %>
<%! int b = 2;
public void m1() {
}
%>
</body>
</html>
-
<%@ JSP指令 %>
-
page: <%@ page 属性 %>
contentType:response.setContentType(“text/html;charset=utf-8”)
language:java语言
session:true - 默认
pageEncoding:response.setContentType(“text/html;charset=utf-8”)
buffer:out缓冲区大小, 默认8kb, 设置关闭=none
extends:继承 HttpJspBase
import:导包
isErrorPage:是否是错误页面, 默认false
errorPage:错误页面, 当前页面出现异常后转发到的页面
isELIgnored:是否忽略EL表达式, 默认"false" -
include: <%@ include%> - 静态包含
引入文件, 属性file=“不加虚拟目录uri” -
taglib: <%@ taglib%> - 标签库
uri:jar路径 prefix:前缀
-
-
JSP内置对象9个 - 在<% %>中可以直接使用的对象
- out对象
<%-- out.write("aaaaaa") --%>
aaaaaa
<%-- out.print("bbbbbb") --%>
<%="bbbbbb" %>
<%
response.getWriter().write("ccccccc");
%>
<%
out.write("ddddddddd");
%>
- pageContext对象
<%
// 1.可以获得其他八个内置对象 -- 框架设计
ServletRequest request = pageContext.getRequest();
pageContext.getResponse();
pageContext.getException();
pageContext.getSession();
// 不能这样使用
// pageContext.getRequest().getContextPath();
// 2.可以作为域对象使用, 域范围: 当前页面
pageContext.setAttribute("name", "zhangsan");
String str = (String) pageContext.getAttribute("name");
// 3.可以通过 pageContext 操作其他三个域中
%>
<%
// 向4个域中存储数据
pageContext.setAttribute("name", "zhangsan", PageContext.APPLICATION_SCOPE);
pageContext.setAttribute("name", "lisi", PageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "wangwu", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "zhaoliu", PageContext.PAGE_SCOPE);
%>
<%-- 从当前页面中取数据 --%>
<%= "application------"+pageContext.getAttribute("name", PageContext.APPLICATION_SCOPE)%><br>
<%= "session------"+pageContext.getAttribute("name", PageContext.SESSION_SCOPE)%><br>
<%= "request------"+pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%><br>
<%= "page------"+pageContext.getAttribute("name", PageContext.PAGE_SCOPE)%><br>
// pageContext.findAttribute("name")
// 从 page->request->session->application 按顺序搜索name对应的值, 直到找到为止, 并返回
<%=pageContext.findAttribute("name")%>
- JSP动态标签 - 减少java脚本的书写
<%-- 动态包含 --%>
<jsp:include page="includeB.jsp"/>
<%-- 请求转发 --%>
<jsp:forward page="includeB.jsp"/>
EL表达式
注意:是从域中取对象
expression language 对象属性导航语言 OGNL
作用:为了取代get方法
${对象.属性} — 对象.get属性()
<%
// 存储List<User>集合
List<User> userList = new ArrayList<>();
userList.add(new User(1, "aa"));
userList.add(new User(2, "bb"));
userList.add(new User(3, "cc"));
userList.add(new User(4, "dd"));
// 模拟向域中存值
request.setAttribute("userList", userList);
%>
<%-- List<User> list = pageContext.findAttribute("usrList")
User user = list.get(2)
user.getUsername()
--%>
${userList[2].username}
<%
Map<String, User> map = new HashMap<>();
map.put("a",new User(1,"aa"));
map.put("b",new User(2,"bb"));
map.put("c",new User(3,"cc"));
map.put("d",new User(4,"dd"));
request.setAttribute("username",map);
%>
${username.c.name}
<body>
<%-- pageContext获得其他8个JSP内置对象 --%>
<%-- 获得虚拟目录 --%>
${pageContext.request.contextPath}<br>
<%-- name如果找不到, 不会显示 --%>
${name}<br>
empty name: ${empty name}<br>
<%
pageContext.setAttribute("string", "");
pageContext.setAttribute("list", new ArrayList<>());
pageContext.setAttribute("number", 12);
%>
<%-- empty 表示
1. 对象为null
2. 对象没有内容
--%>
empty string: ${empty string}<br>
empty list: ${empty list}<br>
${1 + 1}
${string == "hello"}
${number + 2}
</body>
补充:路径中不加虚拟目录
- 转发
- errorPage
- include中file属性
JSTL标签
通常配合EL表达式来使用
- 使用步骤
– 导入jar包(2个)
– 引入标签库
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
– 使用标签 - <c:if>
<body>
<%
List<String> list = new ArrayList<>();
list.add("tom");
list.add("lucy");
list.add("jack");
request.setAttribute("list", list);
%>
<%-- c:if test="条件"取代
if(test中的内容) {
标签体内容
}
--%>
<c:if test="${list[1] == 'jerry'}">
jerry标签进来了
</c:if>
<c:if test="${list[1] == 'lucy'}">
lucy标签进来了
</c:if>
</body>
- <c:forEach>
<body>
<%
List<String> list = new ArrayList<>();
list.add("tom");
list.add("lucy");
list.add("jack");
request.setAttribute("list", list);
%>
<%-- for(int i = 0; i < 10; i ++){
System.out.println(i);
}
<c:forEach begin="0" end="9" var="i">
从0开始, 到9结束, 并且将中间取得的变量i
存储在了page域中
</c:forEach>
--%>
<c:forEach begin="0" end="9" var="i">
${i}<br>
</c:forEach>
<%-- for(String str : list){
System.out.println(str);
}
<c:forEach items="要迭代的集合/数组" var="str">
等同于将数组/集合中的每个元素取出, 赋值给str
并将 str 存储在page域中
</c:forEach>
--%>
<c:forEach items="${list}" var="str">
${str}<br>
</c:forEach>
</body>
<%
Map<String, User> userMap = new HashMap<>();
userMap.put("a", new User(1, "aa"));
userMap.put("b", new User(2, "bb"));
userMap.put("c", new User(3, "cc"));
request.setAttribute("userMap", userMap);
%>
<c:forEach items="${userMap}" var="entry">
${entry.key} -- ${entry.value.id} --- ${entry.value.username}<br>
</c:forEach>