JSP和JSTL
一,JSP
1.介绍
JSP,全称Java Server Page,是一种动态网页编程技术,是Java Web服务器端的动态资源。
相比html,JSP技术允许在网页上嵌套Java代码,为用户提供动态数据的支持。
JSP和Servlet都可以用于开发动态web资源,但是JSP更擅于页面显示,Servlet更擅于逻辑控制,因此实际生产中常把Servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板。
JSP本质是一种Servlet,JSP经过编译后就变成了Servlet,JSP是Servlet的一种简化,JSP只需要完成输出到客户端的内容。而Servlet是一个完整的Java类,这个类的Service方法用于生成对用户的响应。
2.JSP的优势
与ASP相比:动态代码用Java编写,而非VB或其他MS专用语言,此外JSP易于移植到非MS平台上。
与纯Servlet相比:JSP可以很方便的编写或者修改HTML页面。
与SSI相比:SSI无法使用表单数据,无法进行数据库连接。
与JavaScript相比:JS很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理。
与静态HTML相比:HTML不包含动态信息。
3.JSP的生命周期
1.编译阶段:当浏览器请求JSP页面时,JSP引擎会先检查是否需要编译这个文件,如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:解析JSP文件,将JSP文件转为Servlet文件,编译Servlet。
2.初始化阶段:容器载入JSP文件后,会在为请求提供任何服务前调用jspInit()方法,该方法可以重写,来实现数据库连接等操作。
3.执行阶段:执行阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。当JSP页面完成初始化后,JSP会调用_jspService()方法。
4.销毁阶段:销毁阶段描述了一个JSP页面从容器中被移除时所发生的一切,jspDestory()方法在JSP中等价于Servlet中的销毁方法。
4.基础语法
1.注释
在JSP中支持两种注释的语法操作,一种是显式注释,这种注释允许客户端看见,另一种是隐式注释,客户端无法看见
显式注释:从HTML风格继承。
隐式注释:从JAVA风格继承或者JSP自己的注释。
JSP的注释方式:
1.//注释内容
/*
*多行注释内容
*/
2.<!-- HTML风格的注释 -->
3.<%-- JSP注释 --%>
2.Scriptlet
在JSP中最重要的部分是Scriptlet,所有嵌入在HTML代码中的Java程序都必须使用Scriptlet标记出来,在JSP中一共有三种Scriptlet代码:
<% %>:java脚本段,可以定义局部变量,编写语句
<%! %>:声明,可以定义全局(成员)变量,方法,类。
<%= %>:表达式,数据一个变量或具体内容。
3.JSP的指令标签
JSP的指令标签用来控制整个JSP的行为,就当前JSP页面的某些方面对JSP转换器做出指示。
1.page指令:page指令中contentType和pageEncoding,分别用来指定MIME类型和编码格式。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
import属性用来引入其他包,和java中import语句作用相同。
<%@page import="java.util.*,java.io.*" %>
2.include静态包含:静态包含就是将内容进行了直接的替换,在servlet转译时,把此文件内容包含进去,两个文件的源代码整合到一起,却只生成一个servlet,因此两个页面中不能有相同的变量名。可以提高运行效率,但是耦合度较高。
<%@ include file="index2.html"%>
3.taglib导入标签库:当我们需要使用第三方标签库时,通过taglib进行导入
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4.JSP动作标签
当JSP被编译成执行某个操作的Java代码,例如访问某个Java对象,或者调用某个方法。JSP容器有自己支持的标准动作。除标准动作之外,还可以创建指定的标签,用来执行某些操作。这些JSP的动作标签,与HTML提供的标签有本质区别。
<jsp:include>动作元素:用来包含静态和动态的文件。该动作把指定文件插入正在生成的画面。
<jsp:include page="相对url地址" flush="true"/>
5.九大内置对象
1.request对象:该对象代表了客户端的请求信息,主要用于接收通过HTTP协议传送到服务器的数据。request对象的作用域为一次请求。
2.response对象:代表对客户端的响应,主要将JSP容器处理过的对象传回到客户端。response对象的作用域只在JSP页面有效。
3.session对象:由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保护该用户的信息,追踪用户的操作状态。
4.application对象:application对象将信息保存在服务器中,直到服务器关闭,否则application对象中保持的信息会在整个应用中都有效,其生命周期比session更长。
5.out对象:out对象用于在web浏览器内输出信息,并且管理应用服务器上的输出缓冲区,在使用out对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
6.pageContext对象:pageContext对象的作用是取得任何范围的参数,通过它可以获取JSP页面的out, request, response, session, application等对象。
7.config对象:config对象主要作用是取得服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获取一个config对象,当一个Servlet初始化时,容器把某些信息通过config对象传递给这个Servlet。
8.page对象:page对象本身代表JSP,只有在JSP页面内是合法的。page隐含对象本质上包含当前Servlet接口引用的变量,类似于Java编程中的this指针。
9.exception对象:exception对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象无法编译JSP文件。
5.EL表达式
1.EL语法和使用
EL(Expression Language)是为了使JSP写起来更加简单。表达式语言提供了在JSP中简化表达式的方法,让JSP代码更加简化。
EL语法结构为:${expression}
EL表达式一般操作的都是域对象中的数据,操作不了局部变量。域对象的概念在JSP中一共有4个:pageContext, request, session, application。范围依次为:本页面,一次请求,一次会话,整个应用程序。而EL默认的查找方式为从小到大查找,找到即停止,当整个域对象都未找到则返回空字符串""。
当需要指定某个特定的域对象中查找数据时可以使用对应域对象的空间对象:pageScorpe, requestScope, sessionScope, applicationScope。
2.EL运算
EL表达式通过${empty aggregate}来判断集合中是否含有元素。
1.List遍历
<%
List<String> list = new ArrayList<String>();
list.add("Eric");
list.add("Alex");
list.add("Leo");
request.setAttribute("list",list);
%>
${empty list}<br/>
${list[1]}<br/>
2.访问map
<%
Map map = new HashMap();
map.put("name","Eric");
map.put("age",22);
map.put("sex",true);
request.setAttribute("map",map);
%>
${empty map}<br/>
${map.name}<br/>
${map["age"]}<br/>
3.四则运算,相等判断
<%
request.setAttribute("a","abc");
request.setAttribute("b","ab");
request.setAttribute("x",10);
request.setAttribute("y",5);
%>
${x + y}<br/>
${x - y}<br/>
${x * y}<br/>
${x / y}<br/>
${x div y}<br/>
${x % y}<br/>
${x == y}<br/>
${a == b}<br/>
二,JSTL
1.简介
Java Server Pages Standard Tag Libray,JSP标准标签库,是一个定制标签库类的集合,用于解决一些常见的问题,例如迭代一个映射或者集合,条件测试,XML处理,甚至数据库的访问,数据库的操作等。
JSTL中最重要的标签是迭代集合,格式化数字和格式化日期。这几个标签使用核心标签库和格式化标签库。
核心标签库:http://java.sun.com/jsp/jstl/core 包含web应用的常见工作,例如循环,表达式赋值,输入输出。
格式化标签库:http://java.sun.com/jsp/jstl/fmt 用来格式化显示数据的工作,例如对不同区域的日期格式化等。
在JSP页面中使用JSTL类库,必须使用taglib指令,核心标签库常简写为"c",格式化标签库常简写为"fmt"。
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
此外还需要分别导入各自的jar包到lib文件夹中。(jstl.jar/standard.jar)
2.标签的使用
1.条件动作标签
1.if标签
if标签先对某个条件进行测试,如果该条件运算结果为true,则处理它的主体内容,测试结果保存在一个Boolean对象中,并创建一个限域变量来引用Boolean对象。可以利用var属性设置限域变量名,利用scope属性来指定其作用范围。
if的语法有两种形式:没有主体内容,有主体内容。
没有主体内容:
<c:if test="${num==1}" var="flag"></c:if>
<c:if test="${1==1}" var="flag"></c:if>
该情况下,var指定的限域变量由同一个JSP页面中后面的标签测试所决定。
有主体内容:
<c:if test="${num==1}">
<p>num==1</p>
</c:if>
<c:if test="${num==2}">
<p>num==2</p>
</c:if>
JSTL中没有else标签,为了模拟else的情景,则需要使用至少两个的if标签。
2.choose,when和otherwise标签
choose和when标签的作用与java中的switch和case相似。它们为相互排斥的条件式执行提供相关内容。choose标签内部必须嵌有一个或多个when标签,每个when标签代表可以进行运算和处理的一种情况,otherwise标签用于默认的条件代码块,如果所有的when标签的测试条件运算结果都补位true,就会执行该代码块。如果有otherwise标签,它必须放在最后一个when标签之后。
choose和otherwise标签没有属性,when标签则必须使用test属性设定条件,用于确定是否处理主体内容。
<c:choose>
<c:when test="${num>0}">
<p>num为正数</p>
</c:when>
<c:when test="${num==0}">
<p>num为0</p>
</c:when>
<c:when test="${num<0}">
<p>num为负数</p>
</c:when>
<c:otherwise>
<p>不知道num值</p>
</c:otherwise>
</c:choose>
2.迭代标签
forEach标签是将一个主体迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的java.util.Collection和java.util.Map接口的实现,以及对象或者基本类型的数组。
<%
Map map = new HashMap();
map.put("user1","Eric");
map.put("user2","Alex");
map.put("user3","Leo");
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="mymap">
${mymap:key}: ${mymap:value}<br/>
</c:forEach>
3.格式化动作指令
1.formatNumber标签
该标签用指定的格式或精度来格式化数字,该标签同样有无主体和有主体两种语法。
<fmt:formatNumber value="1234" type="number"/>
<fmt:formatNumber type="number">
1234
</fmt:formatNumber>
type属性可以填写需要格式化成的类型:number数值型,默认型,percent百分比类型,currency货币型。
2.formatData标签
该标签将日期型数据转换成指定格式的字符串。
<fmt:formatDate value="" var="" type="" dateStyle="" timeStyle="" pattern=""/>
value:要格式化的数据
type:要格式化成的类型:date,time,both.
dateStyle,timeStyle:日期型和时间型的格式
pattern:具体的格式。
3.parseNumber标签
将指定格式的字符串转换成数值型数据
<fmt:parseNumber value="10%" type="percent" />
4.parseDate标签
将指定格式的字符串转换成日期型
<fmt:parseDate value="11:23:45" type="time" /><br/>
<fmt:parseDate value="2018-11-23 11:23:45" type="both" /><br>/