JSP本身的代码块实在是令人抓狂与无语,拆分标签到了令人无语的境地,于是EL表达式和JSTL救星横空出世,救jsp于水火之中。
1.JSTL下载
下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
拉到下面下最新版
下完解压后进入lib文件夹把两个jar复制到你项目的lib里面并导入项目
2.EL表达式
书写格式(写几个最常用的,其他用JSTL更规范):
${标识符} 输出变量 而取的值跟内置对象有优先级关系
${对象.属性} 输出对象的属性值
${empty 对象名?"为空":“不为空”}
使用EL表达式则可以减少很多取值的代码。
这些值是从哪取的呢,实际上就是从四大作用域中获取的。
servlet中的四个作用域分别为page,request,session,application
简单介绍一下四种属性范围(从上到下,范围从小到大):
page(pageContext)
:只在一个页面中保存属性。 跳转之后无效。request
:只在一次请求中有效,服务器跳转之后有效。 客户端跳无效session
:再一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效application
:在整个服务器上保存,所有用户都可使用。 重启服务器后无效
而EL表达时中的值的优先级也是从范围小的开始先取
page先于request先于session先于application
3.JSTL使用
JSP标准标签库(JavaSeverPages Standard Tag Libary)
同样的也是为了简化jsp代码,一般与EL表达式结合使用
EL表达式多用于取值操作,而JSTL则可以方便我们对集合进行遍历,对数据进行判断等操作。
3.1 jsp中引入JSTL标签
在jsp开头加上
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
注意:core是核心标签,一定是jsp内的jstl/core,并且prefix其实可以自己定,但最好还是用c比较规范
3.2 常用标签
set标签
:将值保存在指定的作用域中
<%-- var="变量名" value="值" scope="保存在哪个作用域(page、request、session、application)"--%>
<c:set var="userName" value="cicheng" scope="page"></c:set>
<%-- 可配合EL表达式取值 --%>
${userName}
out标签
:将结果输出
<%--取值--%>
<c:out value="${userName}"></c:out>
<%-- 可以替换成EL,更简单 --%>
${userName}
remove标签
:删除某个值
<%--删除userName的值--%>
<c:remove var="userName"></c:remove>
if标签
:if判断(单纯的一个判断)
<%--test内是判断条件,一般写EL表达式来当条件--%>
<c:if test="${userName == 'cicheng'}">
${userName}
</c:if>
choose标签(when标签和otherwise标签)
:if else判断
<c:choose>
<%-- 如果userName=cicheng --%>
<c:when test="${userName == 'cicheng'}">
${userName}
</c:when>
<%-- 如果userName=此成 --%>
<c:when test="${userName == '此成'}">
${userName}
</c:when>
<%-- 如果userName以上条件都不符合 --%>
<c:otherwise>
userName=${userName},不符合标准
</c:otherwise>
</c:choose>
forEach标签
:遍历集合
<%-- 基础用法,用于迭代集合,将users集合依次用user遍历 --%>
<c:forEach items="${users}" var="user">
<span>${user.name}</span>
<span>${user.password}</span>
<br>
</c:forEach>
着重讲一下forEach标签
全部属性的意义
- items:迭代的集合
- var:集合的每一项的别称
- begin:从哪个下标开始迭代,默认值为0
- end:迭代到第几个,默认值为集合的长度,即
集合.size()
- step:迭代的步长,默认为1
- varStatus:迭代项的状态变量名,可以获取迭代项的相关状态
有begin,end,step三个不变状态,
count-当前迭代次数,
current-当前对象,
first-是否为第一个对象,
last-是否为最后一个对象,
index-当前下标
实验代码:
jsp
<c:forEach items="${users}" var="user" begin="0" end="${users.size()}" step="1" varStatus="status">
name=${user.name}<br />
password=${user.password}<br />
status.begin=${status.begin}<br />
status.end=${status.end}<br />
status.count=${status.count}<br />
status.current=${status.current}<br />
status.first=${status.first}<br />
status.last=${status.last}<br />
status.index=${status.index}<br />
-----------------------------------------------<br />
</c:forEach>
后台测试集合
Servlet
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
List<User> users=new ArrayList<>();
User user1=new User("此成","123");
User user2=new User("小明","1234");
User user3=new User("小红","12345");
users.add(user1);
users.add(user2);
users.add(user3);
req.setAttribute("users",users);
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
User实体
public class User {
private String name;
private String password;
public User(String name, String password) {
this.name = name;
this.password = password;
}
}
访问servlet运行结果:
可以很清楚的看到forEach标签的各个属性的作用。
以上为本文全部内容,如果对你有所帮助,请点个赞给作者一些鼓励~