JSP和JSTL
一.JSP
1.注释
-
显式注释:从HTMl风格继承而来
<!-- 显式注释:可以在浏览器的源码中看到--> -
隐式注释:从java风格继承而来,JSP自己的注释
<%--这两种注释都不能被查看源码所看见--%> <% //隐式注释,java风格,只能在java代码框中使用 %> <%--jsp注释 --%>
2.Scriptlet:脚本小程序
-
<% %>:java脚本段,可以定义局部变量、编写语句
-
<%! %>:声明,可以定义全局变量、方法、类
-
<%= %>:表达式,数据一个变量或具体内容
<% String str = "Hello JSP"; System.out.println(str); response.getWriter().write(str); %> <%!String memberStr = "a member String";%> <%=memberStr%> <h1>This is a JSP page!!</h1>
3.JSP指令标签
-
page指令:page指令常用的属性contentType、pageEncoding和import。分别用来指定MIME类型、编码格式和导包。
<!--可以使用pageEncoding来指定编码,charset也可以--> <%@page contentType="text/html;charset=UTF-8"> <%@page contentType="text/html" pageEncoding="UTF-8"> <!--import--> <%@page import="java.util.*,java.io.*" > -
include静态包含
<!--静态资源--> <%@include file="index.jsp"> -
taglib导入标签库
<!-- uri指定地址、prefix指定标签库别名(程序员惯例将core库称为c) --> <%@taglib uri="http://java.sun.com.jsp.jstl.core" prefix="c"> -
include动态包含(动作标签)
动作标签是由tomcat服务器来解释执行的,与java代码一样,都是在服务器端执行,而html是由浏览器来解析并执行。
<jsp:include page="index.jsp"></jsp:include>jsp:include> <!--传参--> <% String a = "hello jsp"; %> <jsp:include page="<%=a%>"></jsp:include> <!--页面传参--> <jsp:include page="hello.jsp" flush="true"> <jsp:param name="school" value="shsxt"/> </jsp:include> <%=request.getParameter("school")%>注意:动态包含中,标签中间不要添加任何内容,包括空格,除非是确认要使用参数,否则就会报错!
3.内置对象
内置对象:自带的对象,不需要自己new的对象
-
out:输出对象
-
request:请求对象,存储“客户端向服务端发送的请求信息”
request对象的常见方法:
-
String getParameter(String name):根据请求对象的属性返回请求对象属性值
-
String[] getParameterValues(String name):根据请求的字段名key,返回多个字段值value
-
void setCharacterEncoding(“utf-8”):设置请求编码
-
getRequestDispatcher().forword():利用请求转发来跳转页面
-
ServletContext getServerContext:获取项目的ServletContext对象
-
-
response:响应对象
常用的方法:
-
void addCookie(Cookie cookie):服务端向客户端增加cookie对象
-
void sendRedirect(String location) throws IOException:重定向,页面跳转的另一种方式
-
void setContentType(Stiring type):设置服务端响应代码的编码
-
-
session:会话对象
客户端第一次请求服务端时,服务端会产生一个session对象(用于保存该客户的信息);并且每一个session对象都会有一个唯一的sessionID(用于区分其他session);服务端又会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionId的值;然后,服务端会在响应客户端的同时,将该cookie发送给客户端,至此,客户端就有了一个cookie(JSESSIONID);因此.客户端的cookie就可以和服务端的session一一对应(即JSESSIONID与sessionID进行对应).
客户端第二次或第n次请求服务端时,服务端会先根据客户端cookie中的JSESSIONID去和服务端的session中的sessionID进行匹配,如果匹配成功,说明用户登陆过,则无需登录.
session的特点:
-
session存储在服务端
-
session在同一用户请求时共享(即用户可以不限量的访问它)
-
实现机制:第一次客户请求时,产生一个sessionID并赋值给cookie的JSESSIONID,然后发送给客户端.(主要就是利用sessionID与JSESSIONID的对应关系)
-
session对象内部使用Map类来保存数据,因此保存的数据的格式是键值对,session对象的value可以是复杂的对象类型,而不仅仅是字符串类型
session中常用的方法:
-
String getID():获取sessionID的值
-
boolean isNew():判断是否是新用户(第一次访问)
-
void invalidate():使session失效(退出,注销时使用)
-
void setAttribute():设置session的属性
-
Object getAttribute():获取session的属性
-
void getMaxInactiveInterval(秒):获取最长有效时间,非活动时间
-
void setMaxInactiveInterval(秒):设置最长有效时间,非活动时间
cookie与session的区别:
Session Cookie 保存的位置 服务端 客户端 安全性 较安全 较不安全 保存的内容 Object String -
-
application:全局对象
常用的方法:
String getContextPath():相对路径
String getRealPath():绝对路径
-
pageContext:Jsp页面容器
pageContext对象的作用是取得任何范围的参数,通过他可以获取JSP页面的out、request、response、session、application等对象。
pageContext的创建于初始化都是由容器来完成的,在jsp页面中可以直接使用pageContext对象。
-
config:配置对象
config对象的主要作用是取得服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获取一个config对象。
当一个Servlet初始化时,容器吧某些信息通过config对象传递给这个servlet。开发者可以在web.xml文件中为应用程序环境中的servlet程序和jsp页面提供初始化参数。
-
page:当前JSP页面对象
page对象代表jsp本身,只有在jsp页面内才是合法的,类似于this指针。
-
exception:异常对象
exception对象是一个特殊的对象,只有在当前页面为错误页面时,这个对象才能使用。
<%@page isErrorPage="true" %>如果在jsp对象中出现没有捕获到的异常,就会生成exception对象,并把exception对象传送到page指令中设定的错误页面中,然后错误页面中处理相应的exception对象。
二.EL表达式
1.EL语法
EL表达式一般操作的就是域对象中的数据,操作不了局部变量。当需要指定某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope、requestScope、sessionScope和applicationScope。
语法:
<!--获取域对象中的值-->
${request.user.id}
2.EL运算
-
List遍历
<% List<Integer> scores = new ArrayList(); scores.add(18); scores.add(19); scores.add(23); request.setAttribute("score", scores); %> <!-- 取集合中的所有值 --> ${score} <!-- 取指定值 --> ${score[1]} <!-- 以下为jstl --> <c:forEach items="${score}" var="item" begin="0" end="2" varStatus="idx"> ${item}<br> ${idx.count} </c:forEach> -
访问map
<% Map<String,String> map = new HashMap(); map.put("name", "tim"); map.put("sex", "man"); map.put("age","12"); map.put("hobbies", "basketball"); request.setAttribute("map", map); %> <!-- 取整个集合 --> ${map} <!-- 取指定值 --> ${map.name} <!--jstl--> <c:forEach items="${map}" var="item" varStatus="sta"> ${item} ${sta.count}<br> </c:forEach> -
运算(加减乘除、取余、相等)
<% String a = "aaa"; String b = "aaa"; %> <%=a == b%> ${4 div 2 } <br /> -
empty:判断是否为空
<% List<Integer> scores = new ArrayList(); scores.add(18); scores.add(19); scores.add(23); request.setAttribute("score", scores); %> ${empty score}
三.JSTL
1.简介
jstl指的是jsp的标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如:迭代一个映射或集合、条件测试、XML处理。
想要使用jstl的条件测试和格式化就必须引入两个包:jstl.jar和standard.jar,并且需要引入两个标签库:
<!-- 核心标签库 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- 格式化标签库 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="c"%>
2.使用
-
条件选择标签
-
if标签
1.有主体内容
<c:if test=“判断条件,返回true或false” var=“限域变量名,用户接收判断条件的返回值” scope=“限域变量名的域范围 page|request|session|application”>
// 当满足条件时,执行的代码
</c:if>
2.无主体内容
<c:if test=“判断条件,返回true或false” var=“限域变量名,用户接收判断条件的返回值” scope=“限域变量名的域范围 page|request|session|application” </c:if>
<% request.setAttribute("num", 100); %> <c:if test="${num>1}" > <h2>hello</h2> </c:if> -
choose、when和otherwise标签
注意事项:
- choose标签与otherwise标签没有属性,when标签必须设置test属性
- hoose标签中只能包含when标签与otherwise标签,when标签与otherwise标签可以包含其它标签
- choose标签中至少包含一个when标签,最多只有一个otherwise标签
- 所有的when标签必须设置在otherwise标签之前
- 所有的when标签不执行的情况下才会执行otherwise标签
<% request.setAttribute("num", 90); %> <c:choose> <c:when test="${num <60 }"> <h4>你个渣渣!</h4> </c:when> <c:when test="${num >= 60 && num < 80 }"> <h4>哎哟不错哦!</h4> </c:when> <c:otherwise> <h4>你很棒棒哦!</h4> </c:otherwise> </c:choose>
-
-
迭代标签
<% Map<String,String> map = new HashMap(); map.put("name", "tim"); map.put("sex", "man"); map.put("age","12"); map.put("hobbies", "basketball"); request.setAttribute("map", map); %> <table border="1" style="border-collapse:collapse" > <tr> <th>列名</th> <th>是否为第一个:</th> <th>是否为最后一个:</th> </tr> <c:if test="${!empty map}"> <c:forEach items="${map }" var="item" varStatus="sta"> <tr> <td>${item}</td> <td>${sta.first }</td> <td>${sta.last }</td> </tr> </c:forEach> </c:if> </table> -
格式化动作标签
-
formatNumber:使用指定的格式或精度来格式化数字
<% request.setAttribute("num", 10); %> <fmt:formatNumber value="${num}" /> <fmt:formatNumber value="${num }" type="percent" /> <fmt:formatNumber value="${num }" type="currency" var="n" /> ${n } <!--设置时区--> <fmt:setLocale value="en_US"/> <fmt:formatNumber value="${num }" type="currency" /> -
formatDate:使用指定的风格或模式格式化日期和时间
<% request.setAttribute("myDate", new Date()); %> <fmt:formatDate value="${myDate }" type="date"/><br> <fmt:formatDate value="${myDate }" type="time"/><br> <fmt:formatDate value="${myDate }" type="both"/><br> <fmt:formatDate value="${myDate }" type="both" dateStyle="FULL"/><br> <fmt:formatDate value="${myDate }" type="both" dateStyle="long"/><br> <fmt:formatDate value="${myDate }" type="both" dateStyle="FULL" timeStyle="full"/><br><br> -
parseNumber:将数字、货币或百分比的字符串解析成指定格式的数字
<% request.setAttribute("num", 10); %> <fmt:parseNumber value="10%" type="percent" /> <br> <fmt:setLocale value="zh_cn"/> <fmt:parseNumber value="¥10.00" type="currency" /> -
parseDate:指定格式解析日期和时间的字符串
<% request.setAttribute("myDate", new Date()); %> <fmt:parseDate value="${mydate }" /> <br> <fmt:parseDate value="11:23:45" type="time" /><br> <fmt:parseDate value="2018-11-23 11:23:45" type="both" /><br> <fmt:parseDate value="11-01-2018 10:24" pattern="MM-dd-yyyy HH:mm" />
-

1651

被折叠的 条评论
为什么被折叠?



