JSP动态网页编程技术、JSTL标签库

一、JSP基础语法

1.理解

JSP:Java Server Page SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。

Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。

​ 相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。

2.准备工作

1、修改JSP页面的编码
​ 选择"Window",选择"Preferfences",搜索"JSP",选择"JSP Files",设置编码为UTF-8(默认是ISO-8859-1)
2、修改模板
​ 将模板中html4修改html5

3.注释

两类三种
​ 第一类:隐式注释
​ 在浏览器中看不见的注释
​ 1.Jsp自己的注释 <%–JSP注释–%>
​ <%–JSP注释 --%>
​ 2.继承java风格的注释
​ //单行注释
​ /多行注释/
​ 第二类:显示注释
​ 在浏览中审查元素或者查看源代码可以看到的注释
​ 继承HTML风格的注释

		
<%
	/*
		Java代码
	*/
	// 定义变量
	String str = "Hello";
%>		

4.Scriptlet

Scriptlet脚本小程序
所有嵌入在 HTML 代码中的 Java 程序。
​ JSP一种有三种脚本小程序:
第一种:Java脚本段,可以定义局部变量、写java语句
​ 生成的源码在编译后的Servlet类中的service方法体中
​ 格式:<% //Java代码 %>
​ <% %>
第二种:声明,可以声明全局变量、方法、类等
​ 生成的源码在编译后的Servlet类体中
​ 格式:<%! //声明 %>
​ <%! %>
第三种:输出,可以输出变量或字面量
​ 格式:<%=变量或字面量 %>
​ <%=1 %>

		
<%
	// 定义变量
	int a = 1;
	// 定义集合
	List list = new ArrayList<>();
	list.add("Hello");
	// 输出
	System.out.println(list.get(0));
	
	// 输出
	System.out.println(num);
	// 输出到浏览器
	out.print(num);
	
	List list2 = null;
	
%>	

<%
 	if (1 > 0) {
%>
	

哈哈哈哈哈

<% } %> <%! // 声明全局变量 int num = 100; // 定义方法 // 定义类 %>
<%=a %>
<%-- <%=list2.get(0) %> --%>

二、JSP的指令标签

1.page指令

格式:
​ <%@ page 属性名=“属性值” 属性名=“属性值”%>
常用属性:(多个属性之间用空格隔开)
​ language:语言,目前只有java
​ contentType:响应类型及编码格式
​ pageEncoding:页面编码格式
​ 页面的编码以contentType中的charset的值为准,若charset未设置,则以pageEncoding的属性值为准;
​ 如果pageEncoding的属性也未设置则使用默认编码ISO-8859-1。
​ import:导包。只有该属性可以在page指令中出现多次。
​ errorPage:当页面报错时,跳转的页面(与isErrorPage属性结合使用)
​ isErrorPage:是处理报错的页面,默认是false (与errorPage属性结合使用)

<%@page import="java.util.*" import="java.io.*" %>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" errorPage="error.jsp"%>

2.taglib标签

当使用到第三方标签库时需要通过 taglib 标签进行导入。

<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

3.include静态包含

格式:
​ <%@ include file=“要包含的文件路径” %> 相对路径

特点:
​ 相当于将内容直接复制
​ 只会生成一个源码文件,不能有同名变量。
​ 运行效率快一点点,耦合度高,不够灵活。


 	<%@include file="header.jsp" %>
 
 	

我是主体!

<%-- <% int a =1; %> --%>
<%@include file="footer.jsp" %>

4.include动态包含

格式:

有参数:




​ value:参数值,可以接收表达式
​ name:参数名,字符串,不接受任何表达式
​ 取值方式:request.getparameter(“参数名”);
特点:
​ 相当于方法的调用
​ 会生成多个源码文件,可以有相同的变量名。
​ 灵活,耦合度低。
动态包含和静态包含的区别:
​ 1、静态包含相当于将内容进行直接的复制,动态包含相当于方法的调用。
​ 2、静态包含只会生成一个源码文件,而动态包含会生成多个源码文件。
​ 3、静态包含不能有同名变量,而动态包含可以有同名变量。
​ 4、静态包含不能传递参数,而动态包含可以。
​ 5、静态包含耦合度高,而动态包含耦合度低。​

注:
​ 当使用动态包含没有设置参数时,jsp:include双标签中不要有任何内容,包括空格和换行。

<%
		String str = "admin";
%>
	
	
	
	
		
		
	
	
	

我是主体!

<% int a =20; %>

三、九大内置对象

1.内置对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afgytqVQ-1582809367948)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582804488275.png)]

九大内置对象
四大域对象:
​ pageContext 当前JSP页面有效,跳转页面后无效
​ request 一次请求,请求转发跳转(服务端跳转)有效,重定向跳转(客户端跳转)无效
​ session 一次会话,无论是服务端跳转还是客户端,都有效;session对象销毁后失效。
​ application 整个应用,只有服务器不关闭都不会失效

	public void setAttribute(String name, Object o)		设置属性的名称及内容
	public Object getAttribute(String name)				根据属性名称取属性
	public void removeAttribute(String name)			删除指定的属性


两个输出对象
​ response 响应对象
​ out 输出对象

一个配置对象
​ config 获取配置信息

一个异常对象
​ exception 只有设置过isErrorPage="true"的页面才能使用

一个页面对象
​ page 指代jsp页面本身

四、EL表达式

1.EL表达式

​ EL 表达式一般操作的都是域对象中的数据操作不了局部变量。(通过限域变量名获取域对象中的值。)
格式:
​ ** 限 域 变 量 名 ∗ ∗ ​ ∗ ∗ 取 值 范 围 : ∗ ∗ ​ p a g e 作 用 域 : {限域变量名}** ​ **取值范围:** ​ page作用域: page{pageScope.限域变量名}
​ request作用域: r e q u e s t S c o p e . 限 域 变 量 名 ​ s e s s i o n 作 用 域 : {requestScope.限域变量名} ​ session作用域: requestScope.session{sessionScope.限域变量名}
​ application作用域:${applicationScope.限域变量名}
默认取值方式:
​ EL表达式在取值时,会自动从小范围到大范围查找,找到即止;
从page->request->session->application,如果四个域范围都未找到,则返回空字符串。

<%
 	// 设置域对象
 	pageContext.setAttribute("uname", "zhangsan");
	request.setAttribute("uname", "lisi");
	session.setAttribute("uname", "wangwu");
	application.setAttribute("uname", "zhaoliu");
%>

EL表达式 取值

获取域对象的值:${uname }
request作用域:${requestScope.uname }
session作用域:${sessionScope.uname }
application作用域:${applicationScope.uname }

2.EL表达式使用

EL表达式取值:
1、判断域对象是否为空
e m p t y 限 域 变 量 名 ∗ ∗ ​ 该 域 对 象 可 以 是 字 符 串 、 J a v a B e a n 对 象 、 L i s t 集 合 、 M a p 等 ​ ∗ ∗ {empty 限域变量名}** ​ 该域对象可以是字符串、JavaBean对象、List集合、Map等 ​ ** emptyJavaBeanListMap{!empty 限域变量名}
​ 判断域对象不为空
​ a、字符串:
​ 如果字符串是null或空字符串,返回true
​ b、JavaBean对象
​ 如果JavaBean是null,返回true
​ c、List集合
​ 如果集合为null或集合的长度不大于0,返回true
​ d、Map
​ 如果map对象为null或map没有内容,返回true

2、获取JavaBean对象
​ a、获取对象
限 域 变 量 名 ∗ ∗ ​ b 、 获 取 类 中 的 属 性 ​ ∗ ∗ {限域变量名 }** ​ b、获取类中的属性 ​ ** b{限域变量名.属性名 } 或 限 域 变 量 名 . g e t 属 性 名 ( ) ∗ ∗ ​ c 、 获 取 对 象 中 的 对 象 的 属 性 ​ ∗ ∗ {限域变量名.get属性名() }** ​ c、获取对象中的对象的属性 ​ ** .get()c{限域变量名.属性名.属性名}
​ 注:JavaBean中属性需要提供getter方法

3、获取List集合
​ a、获取集合对象
限 域 变 量 名 ∗ ∗ ​ b 、 获 取 集 合 中 的 元 素 ​ ∗ ∗ {限域变量名 }** ​ b、获取集合中的元素 ​ ** b{限域变量名[下标] }
​ c、获取集合的长度
限 域 变 量 名 . s i z e ( ) ∗ ∗ ​ ∗ ∗ 4 、 获 取 M a p 对 象 ∗ ∗ ​ a 、 通 过 m a p 的 k e y 获 取 值 ​ ∗ ∗ {限域变量名.size() }** ​ **4、获取Map对象** ​ a、通过map的key获取值 ​ ** .size()4Mapamapkey{限域变量名.key} 或 ${限域变量名[“key”]}

EL表达式运算:
运算:
​ ${限域变量名1 + 限域变量名2}
​ ${限域变量名1 + 字面量}
比较:
等值比较:
​ a、 ==
​ ${限域变量名1 == 限域变量名2} 或 ${限域变量名1 == 字面量}
​ b、eq
​ ${限域变量名1 eq 限域变量名2} 或 ${限域变量名1 eq 字面量}
大小比较:
​ ${限域变量名1 > 限域变量名2}
​ ${限域变量名1 >= 限域变量名2}
限 域 变 量 名 1 + 字 面 量 > = 限 域 变 量 名 2 ​ ​ 注 : 所 有 的 运 算 和 比 较 都 必 须 写 在 表 达 式 里 面 , 即 {限域变量名1 + 字面量 >= 限域变量名2} ​ ​ 注:所有的运算和比较都必须写在表达式里面,即 1+>=2{}里面

<%
// 字符串
	String str = "Hello";
	String str2 = null;
	String str3 = "";
	request.setAttribute("str", str);
	request.setAttribute("str2", str2);
	request.setAttribute("str3", str3);
	
	// JavaBean对象
	User user = new User();
	user.setUserId(1);
	user.setUserName("Lisa");
	Dog dog = new Dog();
	dog.setName("张二狗");
	dog.setAge(1);
	user.setDog(dog);
	
	User user2 = null;
	User user3 = new User();
	request.setAttribute("user", user);
	request.setAttribute("user2", user2);
	request.setAttribute("user3", user3);
		
	// List集合
	List list = new ArrayList<>();
	list.add("aaa");
	list.add("bbb");
	List userList = new ArrayList<>();
	userList.add(user);
	List list2 = null;
	List list3 = new ArrayList<>();
	request.setAttribute("list", list);
	request.setAttribute("list2", list2);
	request.setAttribute("list3", list3);
	request.setAttribute("userList", userList);
	
	// Map
	Map map = new HashMap<>();
	map.put("uname","admin");
	map.put("user",user);
	map.put("userList",userList);
	Map map2 = null;
	Map map3 = new HashMap<>();
	request.setAttribute("map", map);
	request.setAttribute("map2", map2);
	request.setAttribute("map3", map3);
 
 %>

判断域对象是否为空

字符串:${empty str } -- ${empty str2 } -- ${empty str3 }
JavaBean对象:${empty user } -- ${empty user2 } -- ${empty user3 }
List集合:${empty list } -- ${empty list2 } -- ${empty list3 }
Map:${empty map } -- ${empty map2 } -- ${empty map3 }

获取JavaBean

获取对象:${user }
获取JavaBean的属性:${user.userName } -- ${user.getUserName() }
获取对象中的对象的属性:${user.dog.name }

获取List集合

获取集合对象:${list }
获取集合中的元素:${list[0] }
获取集合的长度:${list.size() }
获取对象集合:${userList } -- ${userList[0] } -- ${userList[0].userName }

获取Map对象

过map的key获取值:${map.uname } -- ${map["user"].userName } -- ${map.userList[0].userName } <% request.setAttribute("num", 10); request.setAttribute("num2", 2); request.setAttribute("s1", "aa"); request.setAttribute("s2", "bb"); %>

EL表达式运算

${num+1 } -- ${num + num2 }
${num/num2 } -- ${num div num2 }
${num > 1 } -- ${num+num2 > 10 }
${num == num2 } -- ${s1 == s2 } -- ${s1 == "aa" } -- ${s1 eq s2 }

五、JSTL标签库

1.标签的使用

1、将jstl所需的两个jar包拷贝到项目的WEB-INF的lib目录下
2、在需要使用标签库的页面引入对应库

<%--核心签库--%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
					prefix表示该库的前缀,可以是任意字符,但一般使用"c"
<%--格式化标签库--%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

2.条件动作标签

1)if标签

​ 无主体内容

​ 有主体内容

​ 内容
​ /c:if>
常用属性:
test:if判断的条件,一般结合el表达式操作域对象
​ **var:**条件判断后的返回结果(true|false),存在一个域对象中
​ **scope:**域对象的范围,默认是page。可以取值page|request|session|application

注:if标签没有else标签,所以如果需要else的效果,需要写一个完全相反的条件

<%
		// 后台将数据存到request作用域中
		request.setAttribute("score", 59);
%>
${requestScope.flag } 
${flag2 }
${flag3 }
${flag4 }
<%-- ${flag5 }
--%> ${flag6 }

值大于1

值小于等于1

你个渣渣!

分不在高,及格就行!

<% Integer score = (Integer)request.getAttribute("score"); // 判断分数 if (score < 60) { %>

你个渣渣!

<% } else if (score == 60) { %>

分不在高,及格就行!

<% } %>
2)choose、when、otherwise标签

choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。

注意点:
1、choose、otherwise标签没有属性,但是when标签必须要有test属性
​ 2、choose标签中只能嵌套otherwise和when标签,otherwise和when标签中可以嵌套其他标签

​ Illegal “c:if” after “c:otherwise” tag in “c:choose” tag.
​ 3、choose标签中至少有一个when标签,可以没有otherwise标签
​ Illegal “choose” without child “when” tag
​ 4、otherwise标签必须放在最后一个when标签之后
​ Illegal “c:when” after “c:otherwise” tag in “c:choose” tag.
​ 5、otherwise标签会在所有的when标签不执行时,执行

<%
		// 后台将数据存到request作用域中
		request.setAttribute("score", 60);
%>

		
			

你个渣渣!

哎哟不错哦!

你很棒棒哦!

3)forEach标签

forEach标签
迭代内容多次

循环

<%
	 	request.setAttribute("start", 0);
	 	request.setAttribute("end", 10);
	 %>
	 
	 
	 
	 	 

${i }


<% List list = new ArrayList(); for (int i = 0; i < 10; i++) { list.add("A:" + i); } pageContext.setAttribute("li", list); %> ${item }
<%---varStatus--%>

forEach

List内容 当前下标 成员总数 是/否first成员 是/否为last成员
${item} ${idx.index} ${idx.count } ${idx.first } ${idx.last}
<% // Map Map map = new HashMap<>(); map.put("uname","admin"); map.put("user",user); map.put("userList",userList); request.setAttribute("map", map); %> ${item.key } -- ${item.value }
<%--九九乘法表--%>
${j } * ${i } = ${i*j }

3.迭代标签

forEach标签
迭代内容多次

循环

<%
	 	request.setAttribute("start", 0);
	 	request.setAttribute("end", 10);
	 %>
	 
	 
	 
	 	 

${i }


<% List list = new ArrayList(); for (int i = 0; i < 10; i++) { list.add("A:" + i); } pageContext.setAttribute("li", list); %> ${item }
<%---varStatus--%>

forEach

List内容 当前下标 成员总数 是/否first成员 是/否为last成员
${item} ${idx.index} ${idx.count } ${idx.first } ${idx.last}
<% // Map Map map = new HashMap<>(); map.put("uname","admin"); map.put("user",user); map.put("userList",userList); request.setAttribute("map", map); %> ${item.key } -- ${item.value }
<%--九九乘法表--%>
${j } * ${i } = ${i*j }

4.格式化动作标签

1)formatNumber
将数值型的数据转换成指定格式的数值字符串
有主体内容

​ 要格式化的数据(接收表达式)
​ ​ 无主体内容

常用属性:
​ type:格式化后的格式
​ percent 百分比类型
​ number 数值型
​ currency 货币型
​ var:限域变量名
​ 用来接收格式化后的结果。如果设置了var属性,格式化后的结果不会输出,需要通过el表达式获取var属性的值

2)formatDate

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYjDvpcU-1582809367951)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582806649877.png)]

​ 将日期型的数据转换成指定格式的字符串
​ var:限域变量名
​ 用来接收格式化后的结果。如果设置了var属性,格式化后的结果不会输出,需要通过el表达式获取var属性的值
​ type:日期类型
​ date 日期型,默认
​ time 时间型
​ both 日期+时间
​ dateStyle:日期型的格式
​ timeStyle:时间型的格式
​ pattern:具体的时间格式
​ y 年
​ M 月
​ d 日
​ H 时(0-24)
​ h 时(0-12)
​ m 分
​ s 秒

3)parseNumber
​ 将指定格式的数值字符串转换成数值型数据

4)parseDate
​ 将指定格式的字符串转换成日期型的数据

<%
		request.setAttribute("num", 1);
	%>
	

formatNumber

10
10 ${num1 }
${num } ${num2 }





<% request.setAttribute("myDate", new Date()); %>

formatDate

${myDate }









parseNumer

100
100%
<% request.setAttribute("n", "$1.00"); %>

parseDate

2017-03-04

你可能感兴趣的:(jsp,jstl)