什么是JSP
JSP全名为
Java Server Pages
,中文名叫java服务器页面,其根本是一个简化的Servlet设计
第一行代码
jsp整体架构
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
书写java代码
%>
<!-- 相当于out.print() -->
<%= 2+3 %>
<!-- 这里正常书写HTML语言 -->
<!-- 表示在类中定义全局成员,和静态块。 -->
<%! %>
</body>
</html>
JSP的三个指令
page import
和java代码中的import是一样的
Include
:
静态包含:把其它资源包含到当前页面中 <%@ include file=”/include/1.jsp” %>
动态包含:编译成 .java文件 在合并 代码是逐行执行 当执行到动态包含时 才会编译被包含的页面 这样会生成两套文件
< jsp:include page=”/include/1.jsp”>< /jsp:include>
两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
taglib
标签 导入jstl核心库
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %> prefix=”c” 表示给jstl标签库中的标签 起一个别名
JSP的6个动作
< jsp:include >
动态包含
< jsp:forward>
请求转发
< jsp:param>
设置请求参数
< jsp:useBean>
创建一个对象
< jsp:setProperty>
给指定的对象属性赋值
< jsp:getProperty>
取出指定对象的属性值
< jsp:useBean>
示例:
<%
// 创建一个user对象 普通的设置获取
User user = new User();
user.setName("james");
user.setPwd("123");
out.print(user.getName());
%>
// 使用标签设置获取
<jsp:useBean id="user1" class="com.james.User" />
<jsp:setProperty property="name" name="user1" value="Tom"/>
<jsp:setProperty property="pwd" name="user1" value="456"/>
<jsp:getProperty property="name" name="user1" />
<jsp:getProperty property="pwd" name="user1" />
JSP的9个内置对象
request
response
session
application
exception
page
当前servlet实例 this
config
out
pageContext
指当前页面 域对象
pageContext
代码示例
<!-- 测试pageContext 域 -->
<%
/* 该域对象 只在本页面有效 出了页面获取不到 */
pageContext.setAttribute("page", "pageContext");
%>
<!-- 携带请求的参数 相当于在网址后面进行拼接
/2.jsp?username=james&password=123
-->
<!-- JSP动作标签--转发 -->
<!-- 注意! 不要在中间加注释 -->
<jsp:forward page="/2.jsp">
<jsp:param value="james" name="username" />
<jsp:param value="123" name="password" />
</jsp:forward>
由于pageContext域 只能作用在当前页面 因此 应用范围极其狭小 但是这个对象中的findAttribute()方法可以找到所有的域对象 搜索范围是从小域到大域
<!-- 测试 域中的查找顺序 -->
<%
/* 一般系统方法中 需要一个int参数 一般会是常量 */
/* 只要有 pageContext 就能向各个域中添加值 参数三 表示对应域的常量 */
pageContext.setAttribute("p", "pageContext", pageContext.PAGE_SCOPE);
pageContext.setAttribute("p", "request", pageContext.REQUEST_SCOPE);
pageContext.setAttribute("p", "session", pageContext.SESSION_SCOPE);
pageContext.setAttribute("p", "application", pageContext.APPLICATION_SCOPE);
%>
<!-- 从小到大找 -->
<%=pageContext.findAttribute("p") %>
<!-- 使用el表达式 获取域中数据 -->
<!-- 实际上使用pageContext.findAttribute 这个方法 -->
${p }
EL表达式
expression language
表达式语言 简化jsp中java代码开发。它不是一种开发语言,是jsp中获取数据的一种规范
代码示例:
<!-- 域中 保存对象 使用el表达式获取 -->
<%
User user = new User();
user.setUsername("james");
user.setPassword("123");
// 添加地址对象
Address address = new Address();
address.setCity("china");
user.setAddress(address);
out.print(user);
request.setAttribute("u", user);
ArrayList<String> list = new ArrayList();
list.add("james");
list.add("Tom");
list.add("Miku");
HashMap<String,Integer> map = new HashMap();
map.put("user", 123);
map.put("pass", 456);
map.put("addre", 789);
request.setAttribute("map", map);
%>
<br />
<!-- 实际上调用get方法 前提必须有get方法 -->
<!-- 如果User对象中 有个属性 也是个对象 -->
${u.username }
<!-- javaBean 导航 直接使用 -->
<br />
${u.address.city }
<!-- 使用[] 获取值-->
<br />
${u["username"] }
<br />
<!-- 注意 使用[] 要加"" 或者'' -->
${u['username'] }
// 集合获取方式
${list[0] }
// 注意!MAP集合不能使用[]
${map.user }
empty
empty
判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
<!-- 使用el 表达式 判断 empty 空值 -->
<%
String str1 = null;
request.setAttribute("str1", str1);
String str2 = "";
request.setAttribute("str2", str2);
ArrayList<String> list = new ArrayList();
list.add("james");
request.setAttribute("list", list);
ArrayList<String> list1 = new ArrayList();
request.setAttribute("list1", list1);
ArrayList<String> list2 = null;
request.setAttribute("list2", list2);
/* 测试三目运算符 */
String sex = "man";
request.setAttribute("sex", sex);
%>
<!-- 判断是否为空 只要没有值 就返回true -->
<%-- ${empty str1} ${empty str2} --%>
${empty list} ${empty list1} ${empty list2}
<!-- 支持三目运算符 -->
${empty list2 ? "我是前面的":"我是后面的" }
EL表达式的隐式对象
可以在EL表达式中直接使用的对象
示例:
pageContext.setAttribute("p", "pageContext", pageContext.PAGE_SCOPE);
${pageScope.p }
// 获取工程名
${pageContext.request.contextPath }
<!-- 取请求头 -->
${header["User-Agent"] }
<!-- 取cookie中的值 -->
${cookie.JSESSIONID.value }
JSTL
JSTL
JavaServerPages Standard Tag Library)JSP标准标签库
作用:使用JSTL实现JSP页面中逻辑处理。如判断、循环等。
使用前加入 <%@taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
框架下载地址:https://mvnrepository.com/
示例:
//声明一个变量
< c:set var="num" value="10" scope="session">< /c:set>
//输出变量:两者没有区别
<c:out value="${num }"></c:out>
${num }
<!-- 逻辑表达式 if choose -->
<c:if test="${i < 5 }">
aaaaa
</c:if>
<c:if test="${i > 5}">
bbbb
</c:if>
<c:choose>
<c:when test="${i==5 }">5</c:when>
<c:when test="${i==10 }">10</c:when>
<c:otherwise>haha</c:otherwise>
</c:choose>
如何遍历循环?
<%
ArrayList<String> list = new ArrayList();
list.add("james");
list.add("Tom");
list.add("Miku");
list.add("Hery");
request.setAttribute("list", list);
%>
<!-- 循环 step循环增量 var 表示容器中的对象-->
<c:forEach var="i" begin="0" end="${list.size()}" step="1">
${list[i] }
<br />
</c:forEach>