目录
一、JSP
jsp全称 Java Server Page,是一种动态网页编程技术,是 Java Web 服务器端的动态
资源;Jsp 技术允许在页面中嵌套java 代码,为用户提供动态数据;
其实 Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个Jsp翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中;
1、jsp注释
显示注释:允许客户端看见的;(从 HTML 风格继承而来)
<!-- HTML 风格的注释 -->
隐式注释:客户端无法看见的;(从 JAVA 风格继承;JSP 自己的注释)
<%-- jsp注释--%>
//单行注释
/* 多行注释 */
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jsp注释</title> </head> <body> <pre> 隐式注释: 在浏览器中看不见的注释; 1、JSP自己的注释 <%-- JSP注释 --%> 2、继承Java风格的注释 //:单行注释 /**/:多行注释 显示注释: 在浏览器中审查元素或者查看源代码可以看到的注释 ; 继承HTML风格的注释:<!-- HTML风格的注释 --> <!-- HTML风格的注释 --> </pre> <% String name="hello"; //单行注释 /*多行注释*/ out.write(name); %> </body> </html>
2、scriptlet
JSP 中最重要的部分就是 Scriptlet(脚本小程序),所有嵌入在 HTML 代码中的Java 程序,在 JSP 中一共有三种 Scriptlet 代码:都必须使用 Scriptlet 标记出来;
<% %>:java 脚本段,可以定义局部变量、编写java语句等;(生成的源码在编译后的Servlet类中的service方法体中)
<%! %>:声明,可以声明全局变量、方法、类等;(生成的源码在编译后的Servlet类体中)
<%= %>:输出,可以输出变量或字面量;
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="jsp01.jsp"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <pre> Scriptlet脚本小程序: 所有嵌入在 HTML 代码中的 Java 程序。 </pre> <!-- ava脚本段,可以定义局部变量、写java语句等 (在service方法里面)--> <% //局部变量 String name="haha"; //int a=2/0;//报错跳转 jsp01.jsp页面也要设置属性isErrorPage="true";默认为false,结合errorPage属性使用; %> <%-- <% String name="hehe"; %> --%> <!-- 第二种:声明,可以声明全局变量、方法、类等(在class里) --> <%! //全局变量 String name="heihei"; int age=100; %> <!-- 第三种:输出,可以输出变量或字面量(在service方法里面) --> <%=name %> <%=age %> </body> </html>
3、jsp的指令标签
JSP 的指令标签用来控制整个 jsp 的行为,就当前 JSP 页面的某些方面对 JSP 转换器作出指示;
1.page指令
常用属性:
language:语言,目前只有java;
contentType:设置MIME (页面响应类型);
pageEncoding:指定编码格式;(页面的编码以contentType中的charset的值为准,若charset未设置,则以pageEncoding的属性值为准;都没设置默认ISO-8859-1)
import:用来引入其他包,和 java 中 import 语句作用相同,可以多次出现,其他属性都只能设置一次;
errorPage:当页面报错时,跳转的页面;(与isErrorPage属性结合使用)
isErrorPage:是处理报错的页面,默认是false;(与errorPage属性结合使用)
2.taglib标签:当使用到第三方标签库时需要通过 taglib 标签进行导入;
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="jsp01.jsp"%> //jsp01.jsp中的page <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%> //taglib标签 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3.include静态包含
两个文件的源代码整合到一起, 全部放到 jspService方法中,只生成了一个 servlet,所以两个页面不能有同名的变量;
格式:<%@ include file="要包含的文件路径" %> 相对路径;
特点:
相当于将内容直接复制;
只会生成一个源码文件,不能有同名变量;
运行效率快一点点,耦合度高,不够灵活。
4.include动态包含
用于动态地包含另一个资源,它可以包含另一个 JSP 页面、一个 Servlet 或 者一个静态的 HTML 页面;
动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用;
注意:动态包含,中间不要加任何内容,包括空格和换行,除非确认要使用参数,否则报错
格式:
<jsp:include page="要包含的页面">< /jsp:include>
有参数:<jsp:include page="要包含的页面"><jsp:param value="参数值" name="参数名"/>< /jsp:include>
value:参数值,可以接收表达式;
name:参数名,字符串,不接受任何表达式;
取值方式:request.getparameter("参数名");
特点:
相当于方法的调用;
会生成多个源码文件,可以有相同的变量名;
灵活,耦合度低;
5.动态包含和静态包含的区别
静态包含相当于将内容进行直接的复制,动态包含相当于方法的调用;
静态包含只会生成一个源码文件,而动态包含会生成多个源码文件;
静态包含不能有同名变量,而动态包含可以有同名变量;
静态包含不能传递参数,而动态包含可以;
静态包含耦合度高,而动态包含耦合度低;
<body> <!-- 静态包含 --> <%-- <%@include file="top.jsp" %> --%> <!-- 主体 --> <div style="background: blue;height:100px;"> context <% String name="apple";//静态包含只生成一个源文件,所有不能有同名变量; %> </div> <!-- 动态包含(里面不能加注释) --><!-- 传递参数给bottom.jsp --> <jsp:include page="bottom.jsp"> <jsp:param value="<%=name %>" name="name"/> </jsp:include> </body> <!--bottom.jsp--> <body> <div style="background: pink;height:80px;"> bottom <!-- 接收参数 --> <%=request.getParameter("name") %> </div> </body>
4、九大内置对象
1、九大内置对象
四大域对象:
pageContext:当前JSP页面有效,跳转页面后无效
request:一次请求,请求转发跳转(服务端跳转)有效,重定向跳转(客户端跳转)无效;
session:一次会话,无论是服务端跳转还是客户端都有效,session对象销毁后失效;
application:整个应用,只有服务器不关闭都不会失效;
两个输出对象:
response:响应对象;
out:输出对象;
一个页面对象:
page对象:指代jsp页面本身;
一个配置对象:
config对象:异常;(只有设置过isErrorPage="true"的页面才能使用)
一个页面对象:
exception对象:获取配置信息;
2、四大域对象的方法
setAttribute(String name, Object o):设置属性的名称及内容;
getAttribute(String name):根据属性名称取属性;
removeAttribute(String name):删除指定的属性;
<% request.setAttribute("a", 2); request.setAttribute("b", 4); request.getAttribute("a"); request.removeAttribute("a"); %>
5、EL表达式
1.EL语法
结构:${限域变量名}
EL(ExpressionLanguage)提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更 加简化;
EL 表达式一般操作的都是域对象中的数据,操作不了局部变量;(通过限域变量名获取域对象中的值)
域 对 象:四大域对象;
EL 默认的查找方式为从小到大查找,都未找到,则返回空字符串;
当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope, requestScope, sessionScope, applicationScope;
2.EL使用
使用 EL 表达式可以用来判断域对象是否为空:
${!empty 限域变量名}:判断域对象不为空;
${empty 限域变量名}:为空,该域对象可以是字符串、JavaBean对象、List集合、Map;
a、字符串:如果字符串是null或空字符串,返回true;
b、JavaBean对象:如果JavaBean是null,返回true;
c、List集合:如果集合为null或集合的长度不大于0,返回true;
d、Map:如果map对象为null或map没有内容,返回true;
使用 EL 表达式可以用来获取属性值:
获取JavaBean对象:
获取类中的属性:${限域变量名.属性名 } 或 ${限域变量名.get属性名() };
获取List集合:
获取集合中的元素:${限域变量名[下标] };
获取Map对象:
通过map的key获取值:${限域变量名.key} 或 ${限域变量名["key"]};
3.EL 运算
注:所有的运算和比较都必须写在表达式里面,即${}里面;
+|| -:加减
*|| % || / (也可以使用 div 来表示)
=:赋值
== (可以使用eq表示):相等
<%@page import="com.cl.po.User"%> <%@page import="java.util.Map"%> <%@page import="java.util.HashMap"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% //设置域对象 pageContext.setAttribute("name", "哈哈"); request.setAttribute("name", "嘿嘿"); session.setAttribute("name", "呀呀"); application.setAttribute("name", "呵呵"); %> 获取域对象的值:${name }<!-- 没有标明作用域自动从小到大的作用域中找 --> ${requestScope.name } ${sessionScope.name } ${applicationScope.name }<br> <% //数组 List ls=new ArrayList(); ls.add("小楠"); ls.add("小米"); ls.add("小夏"); //将数组存入作用域中 request.setAttribute("list", ls); %> 判断是否有元素: 空数组:${empty list } -- 非空数组:${!empty list} <br> 数组:--${list } -- ${list[1] } -- ${list.size() } <br> <% //Javabean User user=new User(); user.setUid(1); user.setUname("姝姝"); user.setUpwd("1234"); %> <% //map对象 Map map=new HashMap(); map.put("name", "筱筱"); map.put("list", ls); map.put("user",user); request.setAttribute("map", map); %> map对象:${map.name } 或者 ${map["name"] } -- ${map.list[2] } -- map长度:${map.size() } user:${map.user.uname } <br> <% request.setAttribute("user", user); %> user对象:${user.uname } --${user.getUpwd() } <br> <% request.setAttribute("a", 2); request.setAttribute("b", 4); %> EL表达式运算:<br> a>b:${a > b }<br> a=b:${a=b}<br> a==b:${a==b } -- ${a eq b }<br> a+b:${a+b }<br> a/b:${a/b } -- ${a div b }<br> <br> </body> </html>
6、jstl标签库
全称:Java Server Pages Standard Tag Libray,JSP 标准标签库,是一个定制标签类库的集合;
1、标签库
核心标签库:包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等;
格式化标签库: 用来格式化显示数据的工作,比如:对不同区域的日期格式化等;
2、条件动作标签
if标签:
没有主体内容:<c:if test="条件" var="限域变量名" scope="域范围">< /c:if>
有主体内容没有主体内容:<c:if test="条件" var="限域变量名" scope="域范围">内容< /c:if>
常用属性:
test:if判断的条件,一般结合el表达式操作域对象;
var:条件判断后的返回结果(true|false),存在一个域对象中;
scope:域对象的范围,默认是page。可以取值page|request|session|application;
注:if标签没有else标签,所以如果需要else的效果,需要写一个完全相反的条件;
choose、when 和 otherwise 标签:
choose标签,等同于java中的switch语句
注意点
choose、otherwise标签没有属性,但是when标签必须要有test属性;
choose标签中只能嵌套otherwise和when标签,otherwise和when标签中可以嵌套其他标签;
choose标签中至少有一个when标签,可以没有otherwise标签;
otherwise标签必须放在最后一个when标签之后;
otherwise标签会在所有的when标签不执行时,执行;
3、迭代标签(forEach)
循环:<c:forEach begin="开始数" end="结束数" var="限域变量名" step="间隔数" >< /c:forEach>
迭代:<c:forEach items="要遍历的对象(集合、map等)" var="限域变量名" >< /c:forEach>
4、格式化动作标签
formatNumber:将数值型的数据转换成指定格式的数值字符串;
常用属性:
type:格式化后的格式(percent 百分比、number 数值、currency 货币)
var:限域变量名
formatDate :将日期型的数据转换成指定格式的字符串;
常用属性:
var:限域变量名
type:日期类型(date 日期型,默认;time 时间型;both 日期+时间)
dateStyle:日期型的格式
timeStyle:时间型的格式
pattern: 具体的时间格式(y:年;M:月;d:日;H:0~24小时;h:0~12小时;m:分;s:秒)
parseNumber:将指定格式的数值字符串转换成数值型数据;
parseDate:将指定格式的字符串转换成日期型的数据;
<%@page import="java.util.Map"%> <%@page import="java.util.HashMap"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!--核心标签库--> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!--格式化标签库--> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSTL标签库</title> </head> <body> <!-- if标签,等同于java中的if语句--> <% //后台数据存入域对象 request.setAttribute("month", 8); %> <!-- 前台执行 --> <c:if test="${month > 0 }" var="flag" scope="request"><h3>${flag }</h3></c:if> <!-- scope 属性来指定其作用范围,默认会在域对象中从小到大找数据,所以pageContext会报错 --> <%-- <c:if test="${month > 0 }" var="flag" scope="pageContext"><h3>${flag }</h3></c:if> --%> <c:if test="${month > 0 }" var="flag" scope="application"><h3>${flag }</h3></c:if> <c:if test="${month > 0 && month <=3 }"> <h4>${month }月是春季</h4> </c:if> <c:if test="${month > 3 && month <=6 }"> <h4>${month }月是夏季</h4> </c:if> <c:if test="${month > 6 && month <=9 }"> <h4>${month }月是秋季</h4> </c:if> <c:if test="${month > 9 && month <=12 }"> <h4>${month }月是冬季</h4> </c:if> <!-- choose标签,等同于java中的switch语句 --> <c:choose> <c:when test="${month > 0 && month <=3 }"> <h4>${month }月是春季</h4> </c:when> <c:when test="${month > 3 && month <=6 }"> <h4>${month }月是夏季</h4> </c:when> <c:when test="${month > 6 && month <=9 }"> <h4>${month }月是秋季</h4> </c:when> <c:otherwise> <h4>${month }月是冬季</h4> </c:otherwise> </c:choose> <hr> <!-- forEach标签,等同于java中的switch语句 --> <% List ls=new ArrayList(); ls.add("小楠"); ls.add("小米"); ls.add("小夏"); Map map=new HashMap(); map.put("name", "筱筱"); map.put("list", ls); request.setAttribute("map", map); //将数组存入作用域中 request.setAttribute("list", ls); %> <!-- step可以省略 --> <c:forEach var="i" begin="1" end="${list.size() }" step="1"> <c:forEach var="j" begin="1" end="${i }"> ${j } * ${i } = ${i*j } </c:forEach> <br> </c:forEach> <hr> <!-- 迭代 --> <c:forEach items="${list }" var="ls"> ${ls }<br> </c:forEach> <c:forEach items="${map }" var="item" > ${item.key }---- ${item.value }<br> </c:forEach> </body> </html> <%-- 格式化动作标签 --%> <!-- formatNumber:将数值型的数据转换成指定格式的数值字符串 属性: type: percent 百分比 number 数值 currency 货币 --> 数值:<fmt:formatNumber type="number">100</fmt:formatNumber><br> 百分比:<fmt:formatNumber type="percent">100</fmt:formatNumber><br> 货币: <fmt:formatNumber type="currency">100</fmt:formatNumber><br> 设置地区:<fmt:setLocale value="en-US"/> 货币: <fmt:formatNumber type="currency">100</fmt:formatNumber><br> <%-- <fmt:setLocale value="zh-cn"/> --%> 无主体内容:<fmt:formatNumber type="currency" value="100" /> <br> <hr> <!-- formatDate :将日期型的数据转换成指定格式的字符串 属性: var:限域变量名 type:日期类型 date 日期型,默认 time 时间型 both 日期+时间 dateStyle:日期型的格式 timeStyle:时间型的格式 pattern: 具体的时间格式 --> <% request.setAttribute("date", new Date()); %> <fmt:formatDate value="${date }"/><br> <fmt:formatDate value="${date }" type="time"/><br> <fmt:formatDate value="${date }" type="both"/><br> <fmt:formatDate value="${date }" dateStyle="full"/><br> <fmt:formatDate value="${date }" timeStyle="short"/><br> <fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/><br> <hr> <!-- parseNumber:将指定格式的数值字符串转换成数值型数据 --> <% request.setAttribute("num", "100%"); %> <fmt:parseNumber type="currency">$100</fmt:parseNumber><br> <%-- <fmt:setLocale value="zh-cn"/> <fmt:parseNumber type="currency">¥100</fmt:parseNumber><br> --%> <fmt:parseNumber type="percent" value="${num }"/><br> <fmt:parseNumber type="percent" var="n" >${num }</fmt:parseNumber> ${n }<br> <hr> <!-- parseDate:将指定格式的字符串转换成日期型的数据 --> <fmt:parseDate pattern="yyyy-MM-dd HH:mm:ss">2020-02-27 13:30:27</fmt:parseDate><br> <br> <br> </body>