一.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>