JSTL
中常见的Core
标签库EL
中的常见隐式对象JavaBean
,什么是EL
表达式和JSTL
标签库JavaBean
是一个Java
类setter
方法或getter
方法JavaBean
的属性JavaBean
中的属性是以方法定义的形式出现的例如JavaBean
中包含一个String
类型的属性name
,在JavaBean
中至少有getName()
和setName()
方法中的一个
如果一个属性只有getter
方法,则该属性为只读属性,
如果一个属性只有setter
方法,则该属性为只写属性,
如果一个属性既有getter
方法,又有setter
方法,则该属性为读写属性,
如果属性的类型为boolean
,它的命名方式应该使用is/set
而不是get/set
。
通过具体的案例来实现一个JavaBean
程序
public class Worker {
private String sid;
private String name;
private int age;
private boolean married;
//只读属性
public String getSid() {
return sid;
}
//只写属性
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//boolean类型是is/set
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
}
BeanUtils类的常用方法
void populate(Object bean, Map properties)
JavaBean
属性设置值。void setProperty(Object bean, String name, Object value)
bean
进行操作,第二参数是属性名
,第三个参数是设置属性的值
String getProperty(Object bean, String name)
bean
对象,第二个参数是属性名,获取属性值bean
指定属性的值,返回值类型为String
类型public class BeanUtilsDemo {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
//属性的写入
Person p1 = new Person();
BeanUtils.setProperty(p1, "name", "jack");
BeanUtils.setProperty(p1, "age", 9);
System.out.println(p1);
Person p2 = new Person();
BeanUtils.setProperty(p2, "fullInfo", "tom-3");
System.out.println(p2);
//属性的读取
String nameOfP1 = BeanUtils.getProperty(p1, "name");
String ageOfP1 = BeanUtils.getProperty(p1, "age");
System.out.println("p1: name = " + nameOfP1 + ", age = " + ageOfP1);
String nameOfP2 = BeanUtils.getProperty(p2, "name");
String ageOfP2 = BeanUtils.getProperty(p2, "age");
System.out.println("p1: name = " + nameOfP2 + ", age = " + ageOfP2);
//使用map的数据写属性
Map<String, Object> map = new HashMap<>();
map.put("name", "jerry");
map.put("age", 10);
Person p3 = new Person();
BeanUtils.populate(p3, map);
System.out.println(p3);
}
}
<%=%>
以及部分Java程序片段<% %>
${
开始,以}
结束的,具体格式为${表达式}
and、or、gt
pageContext
'、"、-、/
username,username123,user_name,_username
123username,or,user"name,pageContext
保留字就是编程语言里事先定义好并赋予了特殊含义的单词
EL中的保留字有:and,eq,gt,true,instanceof,or,ne,le,false,empty,not,It,ge,null,div,mod
例子:
通过EL表达式,${001}
没取出来,${x002}
取到了
EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上。
EL表达式中的变量不用事先定义就可以直接使用。如:${product}
就可以访问变量product的值。
布尔常量:两个值true和false
整形常量、浮点数常量、字符串常量、Null常量
${customer.name}
-或?
等,就只能用方括号运算符来访问该属性${user["My-name"]}
&&、||、!
${empty var}
pageContext对象、Web域相关对象
EL主要是为了展示数据,所以它的隐式对象都和数据相关。
pageScope/requestScope/SessionScope/applicationScope
代表4个域对象,都可以用来保存数据
servlet得到数据,交给jsp,jsp把数据展示出来
@WebServlet("/userinfo")
public class UserInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = "li4";
String newpassword = "123";
int times = 5;//已经登录的次数
String grade = "B";
/*
把数据交给jsp展示
save data
*/
//方法1:把数据保存到域对象reuqest中
//req.setAttribute("username",username);
//方法2:把数据放到域对象session中
req.getSession().setAttribute("username", username);
req.setAttribute("newpwd", newpassword);
req.setAttribute("times", times);
req.setAttribute("grade", grade);
//请求转发
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/el01/userinfo.jsp");
dispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
用户名:<%=session.getAttribute("username")%><br/>
密码:<%=request.getAttribute("newpwd")%><br/>
登录次数:<%=request.getAttribute("times")%><br/>
等级:<%=request.getAttribute("grade")%><br/>
<hr/>
通过el表达式取数据:<br/>
用户名:${username}<br/>
密码:${newpwd}<br/>
次数:${times}<br/>
等级:${grade}<br/>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<%--使用jsp表达式的方法--%>
<%=((HttpServletRequest) pageContext.getRequest()).getRequestURI()%>><br>
<%--使用el表达式的方法--%>
请求URI为:${pageContext.request.requestURI}<br>
Content-Type响应头:${pageContext.response.contentType}<br>
服务器信息为:${pageContext.servletContext.serverInfo}<br>
Servlet注册名为:${pageContext.servletConfig.servletName}<br>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<% pageContext.setAttribute("userName", "zhang3");%>
<% request.setAttribute("userName", "li4");%>
<% session.setAttribute("userName", "wang5");%>
<% application.setAttribute("userName", "zhao6");%>
表达式\${pageScope.userName}的值为:${pageScope.userName}<br>
表达式\${requestScope.userName}的值为:${requestScope.userName}<br>
表达式\${sessionScope.userName}的值为:${sessionScope.userName}<br>
表达式\${applicationScope.userName}的值为:${applicationScope.userName}
<br>
表达式\${userName}的值为:${userName}
</body>
</html>
把pageContent注释掉
把request和pageContent都注释掉
把session也注释掉,还是有wang5的信息,因为session中的数据只要写入,数据就一直在
param对象用于获取请求参数的某个值
paramValues对象返回请求参数所有值组成的数组
header对象用于获取请求头字段的某个值
headerValues对象用于返回请求头字符的所有值组成的数组
cookie对象获取客户端的Cookie信息
initParam对象获取web.xml文件中的一些初始化参数
param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<form action="paramTest.jsp">
user: <input type="text" name="user-name"><br>
hobby:<input type="text" name="hobby"><br>
hobby:<input type="text" name="hobby">
<input type="submit">
</form>
</body>
</html>
paramTest.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
${param["user-name"]}
<hr>
${param.hobby}
<hr>
${paramValues.hobby[0]} - ${paramValues.hobby[1]}
</body>
</html>
访问网页,并输入信息:http://localhost:8080/javabean_war_exploded/param.jsp
点击提交后,进入网页:http://localhost:8080/javabean_war_exploded/paramTest.jsp?user-name=aaa&hobby=学习&hobby=打球
Sun
公司制定的一套标准标签库(JavaServer Pages Standard Tag Library
),简称JSTL
。5
个标签库分别指定了不同的URI
以及建议使用的前缀。
标签可以将一段文本内容或表达式的结果输出到客户端。
没有标签体的情况
<c:out value="value" [default="defaultValue"] [escapeXml="{true|false}"]/>
有标签体的情况,在标签体中指定输出的默认值
<c:out value="value" [excapeXml="{true|false}"]>
defaultValue
</c:out>
value
属性:用于指定输出的文本内容
default
属性:指定当value属性为null时所输出的默认值。
escapeXml
属性:用于指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出,默认值为true。
用于完成JSP页面中的条件判断
没有标签体的情况
<c:if test="testCondition" var="result"
[scope="page|request|session|application"]/>
有标签体的情况,在标签体中指定要输出的内容
<c:if test="testCondition" var="result"
[scope="page|request|session|application"]>
body content
</c:if>
将test的测试结果保存在var中。
当test的值为true时,就显示body content的内容,如果为false,就不显示。
[]
中的内容可以省略
标签,用于指定多个条件选择的组合边界,它必须与
、
标签一起使用。
标签没有属性,在它的标签体中只能嵌套一个或多个
标签和零个或一个
标签。<c:choose>
Body content(<when> and <otherwise> subtags)
</c:choose>
标签,只有一个test属性,布尔类型。test
属性是true
,执行标签体的内容:<c:when test="testCondition">Body content</c:when>
标签,没有属性,它必须作为
标签最后分支出现。
标签的test
条件都不成立时,才执行和输出otherwise
标签体的内容:<c:otherwise>conditional block</c:otherwise>
标签,用于迭代集合对象
中的元素,如Set
、List
、Map
、数组等,并且能重复执行标签体中的内容。标签体中的内容body content会循环出现在页面上
items指定要迭代的集合对象,如set、list、map、数组等
通过var访问集合中的每个元素
varStatus访问当前var的状态
begin从哪个开始,end从哪个结束,step步长
迭代包含多个对象的集合:
<c:forEach [var="varName"] items="collection"
[varStatus="varStatusName"]
[begin="begin"][end="end"][step="step"]>
body content
</c:forEach>
---
迭代指定范围内的集合:
<c:forEach [var="varName"]
[varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
</c:forEach>
如果value属性是空值,就显示default中的内容
<%@ taglib %>
c:out
标签输出内容default
的内容:unknown user
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<c:out value="${param.userName}" default="unknown user"/>
</body>
</html>
登录网站:http://localhost:8080/jstl_war_exploded/01_out.jsp
得到的结果:
在域名中指定userName
的值:http://localhost:8080/jstl_war_exploded/01_out.jsp?userName=zhang3
,得到的结果:
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<c:out value="${param.count > 0 ? '老用户':'新用户'}"/>
<c:if test="${param.count > 0}">
老用户
</c:if>
<c:if test="${!(param.count > 0)}">
new用户
</c:if>
</body>
</html>
访问网页:http://localhost:8080/jstl_war_exploded/02_if.jsp
在URL中设置count=2,访问网页:http://localhost:8080/jstl_war_exploded/02_if.jsp?count=2
中写内容
测试条件设置为成绩
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<c:choose>
<%-- <c:when test="${param.score >= 70}">xxx</c:when>--%>
<c:when test="${param.score >= 90}">优秀</c:when>
<c:when test="${param.score >= 80}">良好</c:when>
<c:when test="${param.score >= 60}">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
</body>
</html>
设置分数为90,访问网页:http://localhost:8080/jstl_war_exploded/03_choose.jsp?score=90
设置分数为50,访问网页:http://localhost:8080/jstl_war_exploded/03_choose.jsp?score=50
将score>=70
那行注释打开,
设置的分数只要大于70,就显示下图
此时,设置分数为60时,显示
循环展示标签体内容status
可以通过点号.
显示它的一些属性:count\index\first\last\step
count
从1开始;first
是否是第一个;index
因为begin
是3,所以index
从3开始,step
步长<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<c:forEach begin="3" end="9" var="x" varStatus="status" step="2">
${status.count}, ${status.index}, ${status.first}, ${status.last}, ${status.step}
hello, ${x} <br>
</c:forEach>
</body>
</html>
<% %>
定义数组(一般是通过java
代码将数组传给jsp
)
遍历数组,items
中写jsp
表达式EL
表达式输出<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<%
String[] fruits = {"apple", "orange", "grape", "banana"};
%>
<c:forEach items="<%=fruits%>" var="fruit" begin="1" end="3" step="2" varStatus="status">
水果: ${fruit}:
${status.count}, ${status.index}, ${status.first}, ${status.last}, ${status.step}
<br>
</c:forEach>
</body>
</html>
遍历list,items指定list,使用var获得每个元素<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<%
List userList = new ArrayList();
userList.add("zhang3");
userList.add("li4");
userList.add("wang5");
userList.add("tom");
%>
<c:forEach items="<%= userList%>" var="user" varStatus="status">
用户: ${user}
${status.count}, ${status.index}, ${status.first}, ${status.last}, ${status.step}
<br/>
</c:forEach>
</body>
</html>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<%
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("zhang3", 33);
map.put("li4", 44);
map.put("wang5", 55);
%>
<c:forEach items="<%=map%>" var="item">
用户:${item.key} -> ${item.value} <br>
</c:forEach>
</body>
</html>
students.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<td>序号</td>
<td>索引</td>
<td>姓名</td>
<td>年龄</td>
<td>是否是第一个</td>
<td>是否是最后一个</td>
</tr>
<c:forEach items="${data}" var="student" varStatus="status">
<tr>
<td>${status.count}</td>
<td>${status.index}</td>
<td>${student.name}</td>
<td>${student.age}</td>
<td>${status.first}</td>
<td>${status.last}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
User.java
package bean;
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
QueryStudents.java
package controller;
import bean.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/QueryStudents")
public class QueryStudents extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> students = new ArrayList<>();
students.add(new User("zhang3", 33));
students.add(new User("li4", 44));
students.add(new User("wang5", 55));
students.add(new User("zhao6", 66));
students.add(new User("tom", 77));
//请求转发
req.setAttribute("data", students);
req.getRequestDispatcher("students.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}