<h2>尾部内容</h2>
<%
System.out.println(request.getParameter("uname"));
System.out.println(request.getParameter("str"));
%>
JSP和JSTL
zzj
一、JSP
1.1 JSP基本使用
1.1 简介
JSP:java Server Page是动态网页编程技术,可以使用java代码产生动态数据。
其实JSP就是一个servlet,第一次访问JSP的时候,JSP引擎都会讲这个JSP翻译成一个servlet,这个文件存放在Tomcat中的work目录中。
1.2 注释
-
显示注释(浏览器中按F12能看到的注释)
继承HTML风格的注释;<!–HTML注释-- >
-
隐式注释(浏览器中按F12不能看到的注释)
a. jsp自己的注释;<%–jsp注释–%>
b. 继承java风格的注释;//单行注释,/ *多行注释 */
1.3 JSP的Scriptlet脚本小程序
-
Java脚本段
可以编写Java语句,定义局部变量。生成的代码在Servlet的service方法体中。
<% // 定义局部变量 int num = 100; %>
-
声明
可以声明全局变量、方法、类等生成的代码在Servlet的类体中。
<%! // 全局变量 int b = 10; %>
-
输出
可以输出表达式,字面量、变量。生成的代码在Servlet的service方法体中,相当于out.write()。
<%=num%>
1.2 JSP的指令标签
方法:将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入。
做法:分成多等分之后使用静态包含、动态包含的方式。。
1.2.1 include静态包含
特点:相当于直接内容的粘贴,只会生成一个源码文件,不能出现同名变量。
语法:<%@include file=“相对路径”%>
<%@include file="02-include静态包含02.jsp"%>
<h2>中间内容</h2>
<%=a%>
<%@include file="02-include静态包含03.jsp"%>
1.2.2 include动态包含
特点:相当于方法的调用,会生成多个源码文件,可以出现同名变量,同名变量按先后顺序会进行覆盖。
语法:<jsp:include page=“路径”>< /jsp:include>
<jsp:include page="03-include动态包含02.jsp"></jsp:include>
<h2>主体内容</h2>
<%
String str = "Hello";
%>
<%-- 传递参数 --%>
<jsp:include page="03-include动态包含03.jsp">
<jsp:param name="uname" value="admin"/>
<jsp:param name="str" value="<%=str%>"/>
</jsp:include>
注意:
-
include动态包含是双标签。
-
include动态包含可以传递参数。
< jsp:param name=“参数名” value=“参数值”/> name不支持任何表达式,value支持表达式。
参数接受:request.getParameter(name);
-
若没有参数传递,include双标签中不能有任何内容。
<jsp:include page="03-include动态包含02.jsp"></jsp:include>
<h2>主体内容</h2>
<%
String str = "Hello";
%>
<%-- 传递参数 --%>
<jsp:include page="03-include动态包含03.jsp">
<jsp:param name="uname" value="admin"/>
<jsp:param name="str" value="<%=str%>"/>
</jsp:include>
<h2>尾部内容</h2>
<%
request.getParameter("uname");//admin
request.getParameter("str");//Hello
%>
1.3 JSP的四大域对象与九大隐式对象
1.3.1 四大域对象
-
pageContext
只能在本页面中获取,页面跳转后无效。
-
request
请求转发有效,重定向无效。
-
session
请求转发和重定向都有效。浏览器关闭无效
-
application
只要服务器不关闭都有效。
注意:尽量使用范围小的域对象。
1.3.2 九大隐式对象
九大隐式对象中包含四大域对象。
pageContext、request、session、application、response、out(输出流)、config(jsp的配置信息)、page(如同java中的this)、exception (异常处理)
1.4 EL表达式
简化了jsp代码。
1.4.1 获取域对象
<%
pageContext.setAttribute("uname","zhangsan");
request.setAttribute("uname","lisi");
session.setAttribute("uname","wangwu");
application.setAttribute("uname","zaholiu");
%>
默认获取最小范围的数据:${uname}<br>
page作用域:${pageScope.uname}<br>
request作用域:${requestScope.uname}<br>
session作用域:${sessionScope.uname}<br>
application作用域:${applicationScope.uname}<br>
1.4.2 获取list
根据集合的下标获取。
<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
获取集合的长度:${list.size()} <br>
获取指定下标的值:${list[0]}<br>
1.4.3 获取map
通过key值直接获取。
<%
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", 2222);
map.put("ccc-a", 333);
request.setAttribute("map", map);
%>
获取指定key的value:${map.aaa} -- ${map["bbb"]} <br>
1.4.4 获取javabean
<%
User user = new User();
user.setUserId(1);
user.setUname("zhangsan");
user.setUpwd("123456");
Student student = new Student();
student.setId(1);
student.setStuName("ncdx");
user.setStudent(student);
request.setAttribute("user",user);
%>
获取JavaBean对象:${user} <br>
<%-- 属性字段必须提供get方法 --%>
获取JavaBean对象的属性:${user.getUname()} -- ${user.uname} -- ${user.student.stuName}<br>
1.5 empty
判断域对象是否为空。为空返回true,不为空返回false
request.setAttribute("str1","");
request.setAttribute("str2",null);
request.setAttribute("str3","Hello");
List<String> list1 = null;
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
list3.add("aaa");
list3.add("bbb");
list3.add("ccc");
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
Map<String,String> map1 = null;
Map<String,String> map2 = new HashMap<>();
Map map3 = new HashMap();
map3.put("aaa", "111");
map3.put("bbb", 2222);
map3.put("ccc-a", 333);
request.setAttribute("map1", map1);
request.setAttribute("map2", map2);
request.setAttribute("map3", map3);
字符串:${empty str1} -- ${empty str2} -- ${empty str3} <br><!--true,true,false-->
List:${empty list1} -- ${empty list2} -- ${empty list3}<br><!--true,true,false-->
Map:${empty map1} -- ${empty map2} -- ${empty map3}<br><!--true,true,false-->
javabean中
User user1 = null;
User user2 = new User();
User user3 = new User();
user3.setUserId(1);
request.setAttribute("user1", user1);
request.setAttribute("user2", user2);
request.setAttribute("user3", user3);
JavaBean:${empty user1} --${empty user2} --${empty user3} <br><!--true,false,false-->
1.6 EL运算
${a == b }
${c == d }
${c eq d }
${a == 5 }
${c == 'aa' }
二、 JSTL
jsp的标准标签库,最重要的是用于迭代集合以及格式化日期等。
使用JSTL要记得导入两个jar包,使用maven的时候不用导包,它会自动生成一个仓库。
2.1 条件动作标签
2.1.1 if标签
<%
int num = 10;
request.setAttribute("num",num);
int score = 60;
request.setAttribute("score", score);
%>
<c:if test="${num>1}">
<h3>num值大于1</h3>
</c:if>
<c:if test="${score<60}">
<h3>不及格</h3>
</c:if>
<c:if test="${score==60}">
<h3>刚刚及格</h3>
</c:if>
<c:if test="${score>60}">
<h3>哎哟不错哦!</h3>
</c:if>
2.1.2 choose、when、otherwise标签
类似于switch、case、default关键字。
<%
int num = 10;
request.setAttribute("num",num);
int score = 60;
request.setAttribute("score", score);
%>
<c:choose>
<c:when test="${score < 60}">
<h3>你个小渣渣!</h3>
</c:when>
<c:when test="${score == 60}">
<h3>分不在高,及格就行!</h3>
</c:when>
<c:otherwise>
<h3>哎哟不错哦!</h3>
</c:otherwise>
</c:choose>
2.1.3 迭代标签
-
forEach标签
<c:forEach var="i" begin="1" end="10"> ${i} </c:forEach> <br> <% List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); request.setAttribute("list", list); %> <c:forEach var="str" items="${list}"> ${str} </c:forEach><!--常用-->
2.1.4 格式化动作标签
格式化日期:(日期类型转化为字符串类型)
<%
request.setAttribute("date1",new Date());
%>
${date1}<br>
<fmt:formatDate value="${date1}" type="date"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="time"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="both"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="date" dateStyle="FULL"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="date" dateStyle="short"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" pattern="yyyy-MM-dd"></fmt:formatDate>
字符串类型转化为日期类型:
<%
request.setAttribute("str1","2020-08-09");
%>
<fmt:parseDate value="${str1}" type="date" /> <br>
<fmt:parseDate value="2020/01/06" pattern="yyyy/MM/dd" /> <br>