java之 JSP & el & jstl

0x01、JSP入门

jsp执行流程:

  1. 第一次访问的xxx.jsp时候,服务器收到请求,JspServlet会去查找对应的jsp文件

  2. 找到之后,服务器会将这个jsp文件转换成java文件(Servlet)

  3. 服务器编译java文件,生成class文件

  4. 服务器运行class文件,生成动态的内容

  5. 服务器收到内容之后,返回给浏览器

1、JSP基本语法

我们可以通过JSP脚本在JSP页面上编写Java代码. 一共有三种方式:

类型 翻译成Servlet对应的部分 注意
<%...%>:Java程序片段 翻译成Service()方法里面的内容, 局部的
<%=...%>:输出表达式 翻译成Service()方法里面的内容,相当于调用out.print() 输出表达式不能以;结尾
<%!...%>:声明成员变量(肯定不用) 翻译成Servlet类里面的内容
  • eg
 <%
		for(int i = 0; i < 10;i++){
			out.print("i="+i);
			%>
			<hr/>
			<%
		}
	%> 
注释类型
HTML注释
JAVA注释 //; /* */
JSP注释; <%--注释内容--%>

0x02、EL表达式

​ Expression Language:表达式语言, jsp2.0之后内置在jsp里面

​ 目的:为了使JSP写起来更加简单, 取值(取的域对象里面存的值)更加简单。(代替脚本 <% %>)

  1. 语法:${el表达式}
  2. 作用:
    • 获取域对象里面的数据
    • 执行运算

1、EL获取简单数据类型(基本类型,字符串)

​ 语法:

${requestScope|sessionScope|applicationScope.属性名}; 

快捷写法: ${属性名}, 属性名就是存在域对象里面的key

实例代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用EL表达式获取域对象中的简单类型的数据</title>
</head>
<body>
    <%
        //往域对象存值
        application.setAttribute("msg","applicationValue");
        //session.setAttribute("msg","sessionValue");
        //request.setAttribute("msg","requestValue");

        //在我们开发过程中,是否会往多个域对象中存放同一个key??? 这是不会的
        //所以我们用el表达式获取域对象里面的数据,还可以简化成${key} 获取范围最小的域对象中的这个key对应的值
    %>
    获取的application域对象中的msg=${applicationScope.msg}<br>
    获取session域对象中的msg=${sessionScope.msg}<br>
    获取request域对象中的msg=${requestScope.msg}<br>
    获取存放在域对象中的msg=${msg}
</body>
</html>

3.2获取数组

​ 语法: ${key[下标]} key就是域对象里面存的key

3.3获取list

​ 语法:

${list属性名[index]}
${list属性名.get(index)};

list属性名就是存入域对象里面的key

3.4获取Map

​ 语法:

${map属性名.键}

${map属性名.get("键")}

map属性名就是存入域对象里面的key

3.5 获取bean

语法:${key.javabean属性}

​ 依赖getxxx()方法; eg: getPassword()---去掉get-->Password()----首字母小写--->password

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用EL表达式获取存储在域对象中的复杂类型的数据</title>
</head>
<body>
    <%
        //往域对象中存放数组类型的数据
        String[] arr = {"张三","李四","王五","赵六","田七","狗娃"};
        request.setAttribute("arr", arr);

        //往域对象中存放一个集合
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("田七");
        request.setAttribute("list", list);

        //往域对象中存放一个map
        Map<String,String> map = new HashMap<String,String>();
        map.put("name", "张三");
        map.put("password", "123456");
        map.put("nickname", "张三丰");
        request.setAttribute("map", map);

        //往域对象中存放一个pojo对象
        User user = new User(1, "jay", "台湾省");
        request.setAttribute("user",user);
    %>
    获取存放在request域对象中的数组中的第三个元素:${arr[2]}<br>
    <%--
        在el表达式中,只要是根据下标获取元素,都可以写[index]
    --%>
    获取存放在request域对象中的集合中的第四个元素:${list[3]}<br>

    <%--
        在el表达式中,只要是根据对应的属性的get方法去获取数据,都可以写成".属性名"  或者 ["属性名"]
    --%>
    获取存储在request域对象中的map中的nickname:${map.nickname}<br>

    获取存放在request域对象中的user的address属性的值:${user.address}
</body>
</html>

0x03、JSTL标签库

在jsp页面需导入才可使用

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

1、if标签

  • 语法
<c:if test="el表达式${..}">
</c:if>
  • 代码实例
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jstl的if标签</title>
</head>
<body>
    <%
        //往域对象中存储age
        request.setAttribute("age",19);
    %>

    <c:if test="${age >= 18}">
        已成年
    </c:if>
    <c:if test="${age < 18}">
        未成年
    </c:if>
</body>
</html>

2、choose标签

实例:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jstl中的choose标签的使用介绍</title>
</head>
<body>
    <%
        request.setAttribute("course","PHP");
    %>
    <c:choose>
        <%--
            一个when标签表示一个条件
        --%>
        <c:when test="${course == 'Java'}">
            学习Java
        </c:when>

        <c:when test="${course == 'Android'}">
            学习Android
        </c:when>

        <c:when test="${course == 'C++'}">
            学习C++
        </c:when>

        <c:otherwise>
            学习,学个屁!!!
        </c:otherwise>
    </c:choose>
</body>
</html>

3、foreach标签

语句格式:

<%--
        jstl中的forEach标签是用来代替for循环语句

        目标1: 在浏览器上显示0-9的数字
            begin属性: 从哪个下标开始遍历, 如果不写默认是从0开始
            end属性: 到哪个下标结束遍历,如果不写默认是遍历到集合/数组的最后一个元素
            step属性: 表示遍历时候的步长,默认步长是1
            var属性: 表示将遍历的结果存放进域对象时候的key
    --%>
<c:forEach begin="0" end="9" step="1" var="i">
	${i}
</c:forEach><br>

(一)、遍历集合

<%
    //往域对象存储一个集合
    List<String> list = new ArrayList<String>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    list.add("赵六");
    list.add("田七");
    request.setAttribute("list", list);
%>

<c:forEach begin="0" end="9" step="1" var="i">
    ${i}
</c:forEach><br>

	<%--
    通过items属性指定遍历域对象里面的list
    通过var属性指定遍历出来的每个数据存储到域对象时候的key
    --%>
<c:forEach items="${list}" var="username">
    ${username}
</c:forEach>
  • c:forEach中的varStatus属性。

    指向一个字符串,该字符串引用一个对象。  map.put("vs",一个对象);

    这个对象记录着当前遍历的元素的一些信息:

    index:返回索引。从0开始

    count:返回计数。从1开始

    last:是否是最后一个元素

    first:是否是第一个元素

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>forEach 标签的varStatus属性的介绍</title>
</head>
<body>
    <%
        //往域对象存储一个集合
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("田七");
        request.setAttribute("list", list);
    %>

    <%--
        forEach标签的varStatus属性:指定将遍历出来的每一个元素的状态存储进域对象时候的key
            遍历出来的每一个元素都有一些状态(属性),比如:
                下标 index:
                计数 count:
                当前元素的值 current:
                是否是第一个元素:
                是否是最后一个元素
    --%>
    <table border="1" cellspacing="0" width="700" align="center">
        <tr>
            <th>下标</th>
            <th>计数</th>
            <th>姓名</th>
            <th>是否是第一个元素</th>
            <th>是否是最后一个元素</th>
        </tr>
        <c:forEach items="${list}" varStatus="vst">
            <tr>
                <td>${vst.index}</td>
                <td>${vst.count}</td>
                <td>${vst.current}</td>
                <td>${vst.first}</td>
                <td>${vst.last}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

4、总结

  • 简单使用
<c:foreach begin="从哪里开始" end="到哪里结束" var="每次遍历的赋值变量" step="步长">
	//每遍历一次 foreach里面就执行一次
</c:foreach>
  • 复杂使用
<c:foreach items="使用el从域对象里面取出集合" var="每次遍历的赋值变量" varStatus="遍历的状态">
	//每遍历一次 foreach里面就执行一次
</c:foreach>
posted @ 2021-01-26 17:47  0X7e  阅读(75)  评论(0编辑  收藏  举报