一.jsp技术
1.作用:
将内容的生成和显示进行分离
用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容
2.jsp脚本:
<%java代码%>:翻译到servlet中service方法中
<%=变量/表达式%>:翻译到servlet中service方法中的out.print();
<%!java代码%>:翻译成servlet中的全局部分
3.jsp注释:
html注释:<!-- 注释内容 --> 可见范围:jsp源码----翻译后的servlet----页面源码 都可见
java注释:在脚本中 // /**/ /***/ 可见范围:jsp源码 ---- 翻译后是servlet
jsp注释:<%-- jsp注释 --%> 可见范围:jsp源码
4.jsp的指令
三种jsp的指令 page taglib include
<%@ page %> 决定jsp的一些属性
language 页面使用的语言
import 导包
pageEncoding/content-type 决定页面编码
isErrorPage 可以获得页面的Exception对象
<%@ include %> 静态包含 , 两个页面会生成一个Java文件. 两个页面可以共享代码.
file 指定需要包含的页面路径
<%@ include file=""%>
<%@ taglib %> 引入EL函数库 或 JSTL标签库
prefix 前缀
uri 导包
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 引入JSTL函数库
5.JSP的九个内置对象
内置对象 类型
request HttpServerletRequest
response HttpServerletResponse
session HttpSession
exception Throwable
application ServletContext
config ServletConfig
page Object
out JspWriter
pageContext PageContext(可见范围:就在该jsp中)
1> 本身是一个域对象
2> 还可以控制其他3个域
3> 引用了其他8个内置对象
pageContext的findAttribute(name) ---- 从四个域中寻找 顺序:page域--->request域--->session域--->application域
内置对象out与response的getWriter流的区别
out会在代码编写的地方输出
response流会在html标签之前进行输出
<%
response.getWriter().write("a");
out.print("b");
response.getWriter().write("c");
out.print("d");
%>
输出结果:ac bd
6. 域
是用来存放数据
不同域: 共享数据的范围不同
request: 一次请求范围内共享数据
session: 一次会话范围内
application: 整个项目内
pageContext:当前页面中,页面对应的的servlet的service方法中
域的本质: 本质就是Map.不同的域无非就是在不同的对象中放置的map.
page域
page域: 用来存放共享数据
范围: 当前页面中.页面对应的servlet的service方法中.
本质: pageContext对象的一个map.
1>. 操作:
//设置域
pageContext.setAttribute("name", "tom");
//获得域
pageContext.getAttribute("name");
//删除域
pageContext.removeAttribute("name");
2.> page域可以操作其他三个域
可以利用pageContext对象向request、session、application域中存取数据
通过pageContext操作request域向其中添加2个键值对
<%
pageContext.setAttribute("name", "Tom", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name02", "Sony", pageContext.REQUEST_SCOPE);
%>
//获取request域中键为name的value值
<%=pageContext.getAttribute("name",PageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("name02",pageContext.REQUEST_SCOPE) %>
//获取request域中所有的键
<%=pageContext.getAttributeNamesInScope(pageContext.REQUEST_SCOPE) %>
//删除request域中的键值对
<% pageContext.removeAttribute("name", pageContext.REQUEST_SCOPE); %>
3.>
pageContext引用了其他八个内置对象
<%
pageContext.getRequest();
pageContext.getResponse();
pageContext.getSession();
pageContext.getServletContext();
pageContext.getServletConfig();
pageContext.getOut();
pageContext.getPage();
pageContext.getException();
%>
7. jsp动作标签
什么是标签及其作用
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
Jsp中常用动作标签
jsp:forward
<jsp:forward>标签是用来做请求转发,它与RequestDispatcher接口的forward()方法一样,唯一不同的是它是在jsp页面中使用。
jsp:include
<jsp:include>标签的作用使用来包含其他jsp页面,之前学习的include指令属于静态包含,而include动作标签是动态包含,它和RequestDispatcher接口的include()方法一样,是运行级别的包含
jsp:param
<jsp:param>标签作为<jsp:forward>标签和<jsp:include>标签的子标签,用来给转发或包含的页面传递数据。
包含:
<jsp:include page="/index.jsp"></jsp:include>
<%
//request.getRequestDispatcher("").include(request, response);
%>
转发:
<jsp:forward page="/page01/demo02.jsp"></jsp:forward>
<%
//request.getRequestDispatcher("/index.jsp").forward(request, response);
%>
二.EL表达式
EL表达式的作用:
1.取得域中的数据.
2.EL表达式中内置了11个对象
3.EL表达式支持的简单运算
EL的语法: ${表达式内容}
<%
//准备数据
request.setAttribute("name", "requestTom");
session.setAttribute("name", "sessionTom");
application.setAttribute("name", "applicationTom");
pageContext.setAttribute("name", "pageTom");
%>
EL的从域中取值:<br>
request域:${requestScope.name}<br>
session域:${sessionScope.name}<br>
application域:${applicationScope.name}<br>
page域:${pageScope.name}<br>
从小域到大域自动查找名为name的键值对:${name}<br>
从小域到大域自动查找名为name的键值对:<%=pageContext.findAttribute("name") %>
<hr>
使用EL表达式.如果取到的值为null,那么不输出: ${abc}<br>
<%=request.getAttribute("abc") %><br>
<%
Cookie cookie = new Cookie("name","cookieTom");
response.addCookie(cookie);
%>
5>pageContext: ${pageContext.request.contextPath} <br/>
6>cookie代表浏览器发送的Cookie: ${cookie.name.value} <br/>
//------以下不常用------- <br/>
7>param 代表浏览器发送的参数 :${param.name}<br/>
8>paramValues 代表浏览器发送的参数 :${paramValues.name[0]} <br/>
9>header 代表浏览器请求头 :${header.Cookie} <br/>
10>headerValues 代表浏览器请求头 :${headerValues.Cookie[0]} <br/>
11>initParam 代表项目中的context-param参数 : ${initParam.name}<br/>
EL函数:
el可以调用java方法 ---- el函数库
jstl函数库中的函数
步骤:
(1) 在jsp中使用taglib指令引入el函数库
(2) 使用函数库
语法:${前缀:函数}
el常用函数示例:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'demo05.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
fn:contanins:查看input中是否包含substring,包 含返回true,否则返回false;<br/>
${fn:contains("Java","J")} <br/>
<hr/>
fn:escapeXml:把input中“<”、“>“、”&“、”'“、“"”进行转义<br/>
${fn:escapeXml("<hr>")}<br/>
<hr/>
fn:indexOf:返回input中substring出现的索引位置;<br/>
${fn:indexOf("Swift","i") }<br/>
<hr/>
fn:containsIgnoreCase:忽略大小写的情况下,判断"Java"中是否包含"A"<br/>
${fn:containsIgnoreCase("Java","A") }<br/>
<hr/>
fn:endsWith:判断test.bak是否以.bak结束<br/>
${fn:endsWith("test.bak",".bak") }<br/>
<hr/>
<%
String[] arr={"Java","PHP","Python","Swift","Go"};
request.setAttribute("array", arr);
%>
fn:join:将arr数组中的元素以“-”连接,并返回<br/>
${fn:join(array,"-") }<br/>
<hr/>
fn:length:最终是将数组的元素以“-”连接,并返回<br/>
${fn:length(array) }<br/>
</body>
</html>
三.JSTL
jstl标准标签库
主要使用core: 核心库和fmt: 格式化库
core:
if
choose
when
otherwise
foreach
url
param
redirect
param
fmt:
formatdate
formatnumber
主要JSTL用法
foreach:
<body>
<!--
JSTL标签库:
步骤:
1.在页面导入标签库<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.在页面使用
core 核心库:
-->
<%-- c:foreach 页面遍历标签
items属性: 填写需要遍历的集合&数组
var属性: 每次遍历,会将当前遍历的对象使用var属性值作为键放入page域
--%>
<%
List list = new ArrayList();
list.add("tom");
list.add("jerry");
list.add("jack");
list.add("rose");
request.setAttribute("list", list);
%>
<table border="1" >
<tr>
<th>姓名</th>
<th>索引</th>
<th>计数</th>
<th>当前是否是第一个元素</th>
<th>当前是否是最后一个元素</th>
</tr>
<c:forEach items="${list}" var="name" varStatus="st" >
<tr class="${pageScope.st.index%2==0?"even":"odd"}" >
<td>${pageScope.name}</td>
<td>${pageScope.st.index}</td>
<td>${pageScope.st.count}</td>
<td>${pageScope.st.first}</td>
<td>${pageScope.st.last}</td>
</tr>
</c:forEach>
</table>
<hr>
<%-- c:foreach 页面数数
begin : 开始数数的位置
end: 数数结束的位置
step: 步长
--%>
<a href="#">上一页</a>
<c:forEach begin="1" end="10" step="1" var="num" >
${pageScope.num}
</c:forEach>
<a href="#">下一页</a>
</body>
if与choose用法
<body>
<%
request.setAttribute("num01", 10);
request.setAttribute("num02", 5);
%>
<%-- <c:if> 判断标签 --%>
<!-- <c:if test="${requestScope.num01>requestScope.num02}">
num01>num02
</c:if>
-->
<br/>
<c:choose>
<c:when test="${num01>num02}">num1大!</c:when>
<c:when test="${num01==num02}">一样大!</c:when>
<c:otherwise>num2大!</c:otherwise>
</c:choose>
</body>