JavaWeb(4)JSP和JSTL
文章目录一、JSP1.1 JSP的基础语法1.2准备工作1.3 注释1.4Scriptlet一、JSP1.1 JSP的基础语法JSP,动态网页编程技术,是JavaWeb服务端的动态资源。它相比于html而言。html只能为用户提供静态数据,而JSP技术允许在页面中嵌套java代码,为用户提供动态数据。相比于servlet,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据
文章目录
一、JSP
1.1 JSP的基础语法
JSP,动态网页编程技术,是JavaWeb服务端的动态资源。
它相比于html而言。html只能为用户提供静态数据,而JSP技术允许在页面中嵌套java代码,为用户提供动态数据。
相比于servlet,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。
不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
其实Jsp就是一个servlet,当我们第一次访问jsp的时候,jsp引擎会将这个jsp翻译成一个servlet,这个文件存放在tomcat中的work目录中。
1.2准备工作
💟配置IEDA
1.选择File - Settings -> 搜索encode,选择File Encoding
2.设置页面模板。搜索“template"
选择右侧的”Other"选择下方的jsp File
3.在webapp创建jsp
1.3 注释
在JSP中支持两种注释的语法操作:
一种是显示注释,这种注释是允许客户端看见的;另一种是隐式注释,此种注释是客户端无法看见的。
(1)👊显示注释语法:从HTML风格继承而来
(2)👊隐式注释语法:从JAVA风格继承;JSP自己的注释
JSP的三种注释方式:
1) //注释 单行注释
/* 多行注释 */
2)<!-- HTML风格的注释 -->
3)<% JSP注释 --%>
1.4Scriptlet
在JSP中最重要的部分就是Scriptlet(脚本小程序)所有嵌入在HTML代码中的Jav程序
在JSP中一共有三种Scriptlet代码:都必须使用Scriptlet标记出来
<body>
<%
//JAVA脚本段,可以写Java代码,定义局部变量,编写语句等
//定义
String str = "Hello JSP";
//输出内容到控制台
System.out.println(str);
//输出所有内容到浏览器
out.print(str);
//输出全局变量
out.write(num);
%>
<%!
//声明全局变量,类和方法
int num = 10;
%>
<%-- 第三种 输出表达式,可以出书变量或字面值 --%>
<%=str%>
%>
</body>
二、JSP的指令标签
使用包含操作,可以将一些重复的代码包含起来使用,从正常的页面组成来看,有时可能分为几个区域。现在又两种方法可以实现上述功能。
方法一:在每个JSP页面(HTML)都包含工具栏、头部栏、头部信息、尾部信息、具体内容
方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件、使用的时候直接导入
很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便、在JSP中如果想要实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用include指令即可,动态包含则需使用include动作标签。
2.1include 静态包含
<%@include file="04-header.jsp"%>
<h2>主体内容</h2>
<%@include file="04-footer.jsp"%>
静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样实在servlet引擎转译时,就把此文件包含进去,所以就生成了一个servlet,所以两个页面不能有同名的变量,运行效率高点点。耦合性较高,不够灵活。
2.2include动态包含
动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:include page="04-header.jsp"> </jsp:include>
<h2>主体内容</h2>
<%
int a = 1;
String str = "hello";
%>
<jsp:include page="04-footer.jsp"> </jsp:include>
<jsp:include page="04-footer.jsp">
<jsp:param name="uname" value="admin"/>
<jsp:param name="msg" value="<%=str%>"/>
</jsp:include>
</body>
</html>
三、JSP的四大域对象
3.1 四种属性范围
在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以在多少个页面中保存并继续使用
1.page范围
pageContext:只在一个页面中保存属性,跳转之后无效
2.request范围
request:只在一次请求中保存,服务器跳转后依然有效
3.session范围
session:在一次会话范围中,无论何种跳转都可以使用
4.application范围
application:在整个服务器上保存
3.2 验证属性范围的特点
1.page
本页面获得,服务器端跳转,(<jsp :forward>)后无效
2.request
服务器跳转有效,相当于发出了两次请求,那么第一次的请求将不存在了;如果希望不管是在客户端还是服务端跳转,都能保存的话,就需要继续扩大范围。
3.session
无论是客户端还是服务端都可以取得,但是现在重新开启一个新的浏览器,则无法获得之前设置的session了,因为每一个session只保存在当前的浏览器中,并在相应的页面获取。
对于服务器而言,每一个连接到它的客户端都是一个session
如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application
4.applicatin
所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得
只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法获得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。
<body>
<%
//设置page范围的域对象
pageContext.setAttribute("name1","zhangsan");
//设置request范围的域对象
request.setAttribute("name2","lisa");
//设置session范围的域对象
session.setAttribute("name3","wangwu");
//设置application范围的域对象
application.setAttribute("name4","zhangsan");
%>
<%-- jsp服务端跳转 --%>
<jsp:forward page="06-JSP的四大域对象%2002.jsp"></jsp:forward>
</body>
<body>
<%
//获取域对象的值
out.print("page的值:" + pageContext.getAttribute("name1"));
out.print("request的值:" + request.getAttribute("name2"));
out.print("session的值:" + session.getAttribute("name3"));
out.print("application的值:" + application.getAttribute("name4"));
%>
</body>
三、EL表达式的使用
3.1EL表达式的语法
EL是为了使JSP写起来更加简单。表达式语言的灵感来自ECMAScript和XPath表达式语言,它提供了在JSP中简化表达式的方法,让JSP的代码更加简单化。
语法结构非常简单:${expression}
EL表达式一般操作的都是域对象中的数据,操作不了局部变量。
域对象的概念在JSP中一共有四个:pageContext,request,session,application;范围依次是:本页面,一次请求,一次会话,整个页面。
当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope,requestScope,sessionScope,applicationScope
而EL默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空字符串。
3.2EL表达式的作用
1.获取数据
设置域对象中的数据
<body>
<%
pageContext.setAttribute("uname","zhangsan");
request.setAttribute("uname","lisi");
session.setAttribute("uname","wangwu");
application.setAttribute("uname","zhaosi");
//定义局部数据
String str = "Hello";
%>
<%--获取数据--%>
获取局部变量: ${str}<br>
获取域对象:${uname}<br>
获取指定范围的域对象:<br>
Page范围:${pageScope.uname}<br>
request范围:${requestScope.uname}
session范围:${sessionScope.uname}
application范围:${applicationScope.uname}
</body>
设置域对象的值
获取域对象中的数据:默认查找方式为从小到大,找到即可,若四个范围都未找到,则返回空字符串。
获取List
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
${list[下标]}
${list.size()}
获取Map
<body>
//List
<%
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
Map map = new HashMap();
map.put("aaa","111");
map.put("bbb",2222);
map.put("ccc",333);
request.setAttribute("map",map);
%>
<h4>获取List</h4>
获取List的size:${list.size()}<br>
获取List的指定下标:${list[1]}<br>
<h4>获取Map指定key的value的值</h4>
${map.aaa}---${map["bbb"]}
获取JavaBean对象
注:
获取JavaBean中的属性字段必须提供get方法
建立User,java
public class User {
private Integer useId;
private String uname;
private String upwd;
public User() {
}
public User(Integer useId, String uname, String upwd) {
this.useId = useId;
this.uname = uname;
this.upwd = upwd;
}
public Integer getUseId() {
return useId;
}
public void setUseId(Integer useId) {
this.useId = useId;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
}
//JavaBean对象
User user = new User();
user.setUseId(1);
user.setUname("zhangsan");
user.setUpwd("123456");
request.setAttribute("user",user);
<h4>获取JavaBean</h4>
${user}<br>
获取属性
${user.uname} -- ${user.getUpwd()}
2.empty的使用
判断域对象是否为空。为空,返回true;不空返回false;
${empty uname}
${empty list}
${empty map}
${empty user}
<%
//字符串
request.setAttribute("str1","abc");
request.setAttribute("str2","");
request.setAttribute("str3",null);
%>
div>判断是否为空</div>
${empty str} <br>
${empty str1} <br>
${empty str2} <br>
${empty str3} <br>
JavaBean对象:
null:true
空对象:false
3.EL运算
等值判断:
算数运算;
四、JSTL
4.1标签的使用
Java Server Pages Standard Library;JSP标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML处理,甚至数据库和访问数据库操作等。
核心操作库:
https://www.oracle.com/java/technologies/
格式化标签库:
此时需要导入两个jar包
https://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下载
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>JSTL的使用</title>
<%-- 下载JSTL需要的jar包--%>
<%-- 引入jar包--%>
<%-- 选择文件->项目结构 选择jar包 将对应的lib目录加载进来--%>
</head>
<body>
<c:if test="${1==1}">
Hello JSTL
</c:if>
</body>
</html>
4.2 条件动作标签
条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在Java中是利用if,if…else和switch语句来进行处理的。在JSTL中也有4个标签可以执行条件动作指令L:if、choose、when和otherwise
👉1.if标签
如果该条件运算结果为true,则处理它的主题内容,测试结果保存在一个Boolean对象中,并创建一个限域变量来引用Boolean对象。可利用var属性设置限域变量名,利用scope属性来指定其作用范围。
(1)语法格式:
(2)属性:
if标签有如下属性:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>if标签</title>
</head>
<body>
<%-- 格式:--%>
<%-- <c:if test="<boolean>" var="<string>" scope="<string>"> </c:if>--%>
<%-- 常用属性:--%>
<%-- test:条件判断,操作的是域对象,接收返回结果是boolean类型的值(必要属性)--%>
<%-- var:限域变量名(存放在作用域中的变量名),用来接收判断结果的值(可选属性)--%>
<%-- scope:限域变量名的范围(page\request\session\application)(可选属性)--%>
注:
1、标签操作的一般是域对象
2、if标签没有else,如有想要else的效果。就需要设置两个完全相反的条件。
<%
//设置数据
request.setAttribute("num",0);
%>
<c:if test="${num > 0}">
数值大于0
</c:if>
<c:if test="${num <= 0}">
数值不大于0
</c:if>
<br>
<c:if test="${num > 100}" var="flag" scope="request"> </c:if>
${flag} -- ${requestScope.flag}--${sessionScope.flag}
</body>
</html>
👊2.choose、when和otherwise标签
choose和when标签的作用与java中的switch和case关键字相似,用于在众多选项中做出选择。也就是说:他们为相互排斥的条件式执行提供相关内容。
choose -> switch
when->case
otherwise -> default
switch语句中有case,而choose标签中对应有when,switch语句中有default,而choose标签中有otherwise。
(1)语法格式:
注意:
1.choose标签没有属性
2.when标签只有一个test属性,必录属性
3.otherwise标签没有属性
4.choose标签中至少包含一个when标签,可以没有otherwise;
5.otherwise标签必须设置在最后一个when标签之后
6.choose标签中只可以设置when标签和otherwise标签
7.when标签和ptherwise标签可以嵌套其他标签
8.otherwise标签会在所有的when标签不执行时才会执行
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("score",80);
%>
<%-- 注意:--%>
<%-- 1.choose标签没有属性--%>
<%-- 2.when标签只有一个test属性,必录属性--%>
<%-- 3.otherwise标签没有属性--%>
<%-- 4.choose标签中至少包含一个when标签,可以没有otherwise;--%>
<%-- 5.otherwise标签必须设置在最后一个when标签之后--%>
<%-- 6.choose标签中只可以设置when标签和otherwise标签--%>
<%-- 7.when标签和ptherwise标签可以嵌套其他标签--%>
<%-- 8.otherwise标签会在所有的when标签不执行时才会执行--%>
<c:choose>
<c:when test="${score < 60}">
<h2>你个小渣渣</h2>
</c:when>
<c:when test="${score == 60}">
<h2>分不在高,及格就行!</h2>
</c:when>
<c:when test="${score > 60 && score < 80}">
<h2>哎呦,不错哦</h2>
</c:when>
<c:otherwise>
<h2>你很棒哦!</h2>
<c:if test="${1==1}">111</c:if>
</c:otherwise>
</c:choose>
</body
4.3迭代标签
forEach是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的java.util.Collection和java.util.Map接口的实现,以及对象或者基本类型的数组。他还可以迭代java.util.lterator和java.util.Enumeration,但不能再多个动作指令中使用lterator和Enumeration
1.forEach属性
(1)语法格式:
(2)属性
(3)用法:
遍历主体内容多次:
循环:
<body>
<%-- 1、迭代主体多次--%>
<c:forEach var="i" begin="1" end="10" step="2">
${i}
</c:forEach>
<%-- 2.循环--%>
<%
List<String> list = new ArrayList<>();
for(int i = 1; i <= 10; i++){
list.add("A:" + i);
}
pageContext.setAttribute("li",list);
%>
<c:forEach items="${li}" var="item">
${item}
</c:forEach>
</body>
实例:
❤️❤️
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.example.JSTL.User" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: lenovo
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 1、迭代主体多次--%>
<c:forEach var="i" begin="1" end="10" step="2">
${i}
</c:forEach>
<%-- 2.循环--%>
<%
List<String> list = new ArrayList<>();
for(int i = 1; i <= 10; i++){
list.add("A:" + i);
}
pageContext.setAttribute("li",list);
%>
<c:forEach items="${li}" var="item">
${item}
</c:forEach>
<br>
<table align="center" width="800" border="1" style="border-collapse: collapse;">
<tr>
<th>名称</th>
<th>当前成员下标</th>
<th>当前成员循环数</th>
<th>是否是第一次循环</th>
<th>是否是最后一次循环</th>
</tr>
<c:forEach items="${li}" var="item" varStatus="itemp">
<tr>
<td>${item}</td>
<td>${itemp.index }</td>
<td>${itemp.index}</td>
<td>${itemp.count}</td>
<td>${itemp.first}</td>
<td>${itemp.last}</td>
</tr>
</c:forEach>
<hr>
<%-- 循环对象集合--%>
<%
List<User> userList = new ArrayList<User>();
User user = new User(1,"zhangsan","123456");
User user2 = new User(2,"lisi","123");
User user3 = new User(3,"wangwu","123");
userList.add(user);
userList.add(user2);
userList.add(user3);
//将数据设置到作用域
request.setAttribute("userList",userList);
%>
<%-- 判断集合是否为空--%>
<c:if test="${!empty userList}">
<table align="center" width="800" border="1" style="border-collapse: collapse;">
<tr>
<th>用户编号</th>
<th>用户名称</th>
<th>用户密码</th>
<th>用户操作</th>
</tr>
<c:forEach items="${userList}" var="user">
<tr align="center">
<td>${user.userId}</td>
<td>${user.uname}</td>
<td>${user.upwd}</td>
<td><button>修改</button></td>
</tr>
</c:forEach>
</table>
</c:if>
<%-- 循环map --%>
<%
Map<String,Object> map = new HashMap<>();
map.put("map1","aaa");
map.put("map2","bbb");
map.put("map3","ccc");
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="m">
key:${m.key} ${m.value} <br>
</c:forEach>
</table>
</body>
</html>
4.4格式化动作标签
JSTL提供了格式化和解析数字和日期的标签,我们主要讨论:formatNumber,formatDate、parseNumber及parseDate。
1.formatNumber
formatNumber标签用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字。(将数值型转换为指定格式的字符串类型)
(1)语法格式:
(2)属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- formatNumber--%>
<%-- 将数值型转换为指定格式的字符串--%>
<%-- 常用属性:--%>
<%-- value:要格式的数值--%>
<%-- type:变格式的类型--%>
<%-- number 数值型(默认)--%>
<%-- percent 百分比类型--%>
<%-- currency 货币类型--%>
<%-- 常用属性--%>
<%-- var:限域变量名,用来接收格式化后的结果--%>
<%--注意:--%>
<%-- 如果使用了var属性,标签不会输出结果,需要通过el表达式--%>
<fmt:formatNumber value="10" type="number" var="num"/> ${num} <br>
<fmt:formatNumber value="10" type="percent"/><br>
<fmt:formatNumber value="10" type="currency"/><br>
<%-- 设置时区--%>
<fmt:setLocale value="en_US"/>
</body>
</html>
2.formatDate标签
用于使用不同的格式化日期将Date数据类型转换为指定格式的字符串类型
(1)语法格式
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: lenovo
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- formatNumber--%>
<%-- 将数值型转换为指定格式的字符串--%>
<%-- 常用属性:--%>
<%-- value:要格式的数值--%>
<%-- type:变格式的类型--%>
<%-- number 数值型(默认)--%>
<%-- percent 百分比类型--%>
<%-- currency 货币类型--%>
<%-- 常用属性--%>
<%-- var:限域变量名,用来接收格式化后的结果--%>
<%--注意:--%>
<%-- 如果使用了var属性,标签不会输出结果,需要通过el表达式--%>
<fmt:formatNumber value="10" type="number" var="num"/> ${num} <br>
<fmt:formatNumber value="10" type="percent"/><br>
<fmt:formatNumber value="10" type="currency"/><br>
<%-- 设置时区--%>
<fmt:setLocale value="en_US"/>
<%-- 格式化日期--%>
<%
request.setAttribute("myDate",new Date());
%>
formatDate标签:
常用属性:
value:要格式化的日期
type:格式化的类型
date:日期型 年月日
time:时间型
dateStyle:日期格式
timeStyle:日期时间
pattern:自定义模式
y M d H m s
timeZone:
var:
scope:
${myDate}
<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="short"/><br>
<fmt:formatDate value="${myDate}" pattern="yyyy-MM-dd" /><br>
</body>
</html>
3.parseNumber标签
标签用来解析数字,百分数,货币可以将其转换为数值型
(1)语法格式:
<fmt:parseNumber value="100"> </fmt:parseNumber>
<fmt:parseNumber value="100" type="number"> </fmt:parseNumber>
<fmt:parseNumber value="100%" type="percent"> </fmt:parseNumber>
<fmt:parseNumber value="$10.00" type="currency"> </fmt:parseNumber>
(2)属性
4.parseDate标签
用于解析日期(将指定格式的字符串转换成Date类型)
(1)语法格式:
(2)属性
(3)实例:
更多推荐
所有评论(0)