JavaWeb之EL表达式和JSTL基础

EL表达式基础

相关的代码演示

JSP页面:

<%@ page import="cn.servlet.bean.Usera" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%--
  Created by IntelliJ IDEA.
  User: linyuqi
  Date: 2019-07-08
  Time: 21:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h3>EL表达式的学习:</h3>
<hr>
<b>传统jsp方式:</b><br>
<%--使用传统方式获取并输出数据--%>
<%=request.getParameter("name")%>
<%=request.getAttribute("str")%>
<%=((Usera)request.getAttribute("user")).getAddress().getTown()%>

<%=((ArrayList)request.getAttribute("list")).get(2)%>
<%=((Usera)((ArrayList)request.getAttribute("list1")).get(0)).getAddress().getCity()%>
<%=((HashMap)request.getAttribute("map")).get("b")%>
<%=((Usera)(((HashMap)request.getAttribute("map2")).get("q"))).toString()%>
<br><b>EL表达式:</b><br>
${param.name}
${str}
${user.address.town}

${list[2]}
${list1[0].address.city}
${map.b}
${map2.q}
<%--
     问题:
        在servlet进行请求处理后,使用作用域对象作为数据流转的载体,将数据流转给指定的jsp
        如何在jsp中获取在jsp中的数据呢
     使用:
        传统方式:在jsp页面使用Java脚本段语
           缺点:导入包 需要强转 获取数据的代码过于麻烦
        EL表达式:(只能获取作用中的数据)
            作用:获取作用域对象中的数据:request session pageContext application
            语法:${表达式}
                表达式:
                request: param.键名  返回值
                         paramvalues.键名  返回数组
                通过setAttribute存储的数据:
                        ${键名.属性名}
         作用域查找顺序:
            默认查找舒徐:
                pageContext  request  session  application  从小到大
            指定查找:pageScope  requestScope  sessionScope  applicationScope
        EL表达式逻辑运算:
            逻辑表达式:
            算术表达式:
            关系表达式:
            空值判断:${empty 键名}
                作用:判断键名的对象是否存有数据
                注意:+表示加法运算,不表示字符连接,使用EL表达式进行字符串连接会报错。

        EL获取请求头和cookie数据:
                请求头数据:
                          ${header}     返回所有的请求头数据
                          ${header["键名"]}       返回指定的键名的请求头数据
                          ${headerValues["键名"]}     返回指定的键名(同键不同值)的值的数组。
                获取cookie数据:
                        ${cookie}       返回存储了所有的cookie对象的map集合
                        ${cookie.键名}        返回指定的cookie对象
                        ${cookie.键名.name}       返回指定的cookie对象存储的数据的键名
                        ${cookie.键名.value}      返回指定的cookie对象存储的数据的值

         注意:取得数据不存在时,不会报错,不显示。


--%>
<h3>获获取请求头和cookie数据</h3>
<hr>
${header}<br><br>
${header["accept"]}<br><br>
${headerValues["accept"][0]}
<br><br><br>

${cookie}
${cookie.name}
${cookie.name.value}
<html>
<head>
    <title>EL学习</title>
</head>
<body>

</body>
</html>

Sevlet页面:

package cn.servlet.servlet;

import cn.servlet.bean.Address;
import cn.servlet.bean.Usera;

import javax.servlet.ServletException;
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.HashMap;
import java.util.List;

public class ELServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("enter ELServlet:");
        //设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //获取信息
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");

        System.out.println(name+":"+pwd);

        //处理请求
        //string
        req.setAttribute("str","天气不错!");

        //对象
        Usera usera =new Usera(1,"Linyuqi","打游戏",new Address("陕西","西安","长安"));
        req.setAttribute("user",usera);

        //集合
        //list
        List<String> list = new ArrayList<String>();
        list.add("qwer");list.add("asdf");list.add("zxcv");
        req.setAttribute("list",list);

        List<Usera> list1 = new ArrayList<Usera>();
        Usera usera1 =new Usera(2,"林雨奇","听音乐",new Address("山西","太原","乐市"));
        list1.add(usera1);
        req.setAttribute("list1",list1);
        //map
        HashMap<String,String> hashMap = new HashMap<String,String>();
        hashMap.put("a","qw");hashMap.put("b","gh");
        req.setAttribute("map",hashMap);

        HashMap<String,Usera> hashMap1=new HashMap<String,Usera>();
        hashMap1.put("q",usera);hashMap1.put("w",usera1);
        req.setAttribute("map2",hashMap1);

        req.getRequestDispatcher("el.jsp").forward(req,resp);
        return;
    }
}

Usera对象类:

package cn.servlet.bean;

import java.util.Objects;

public class Usera {
    private int uid;
    private String name;
    private String fav;
    private Address Address;

    public Usera(int uid, String name, String fav, cn.servlet.bean.Address address) {
        this.uid = uid;
        this.name = name;
        this.fav = fav;
        Address = address;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFav() {
        return fav;
    }

    public void setFav(String fav) {
        this.fav = fav;
    }

    public cn.servlet.bean.Address getAddress() {
        return Address;
    }

    public void setAddress(cn.servlet.bean.Address address) {
        Address = address;
    }

    @Override
    public String toString() {
        return "Usera{" +
                "uid=" + uid +
                ", name='" + name + '\'' +
                ", fav='" + fav + '\'' +
                ", Address=" + Address +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Usera usera = (Usera) o;
        return uid == usera.uid &&
                name.equals(usera.name) &&
                fav.equals(usera.fav) &&
                Address.equals(usera.Address);
    }

    @Override
    public int hashCode() {
        return Objects.hash(uid, name, fav, Address);
    }
}

Address类:

package cn.servlet.bean;

import java.util.Objects;

public class Address {
    private String province;
    private String city;
    private String town;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getTown() {
        return town;
    }

    public void setTown(String town) {
        this.town = town;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                ", town='" + town + '\'' +
                '}';
    }

    public Address(String province, String city, String town) {
        this.province = province;
        this.city = city;
        this.town = town;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return province.equals(address.province) &&
                city.equals(address.city) &&
                town.equals(address.town);
    }

    @Override
    public int hashCode() {
        return Objects.hash(province, city, town);
    }
}

JSTL基础

相关代码演示

<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: linyuqi
  Date: 2019-07-09
  Time: 10:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>JSTL学习</title>
</head>

<%--
    JSTL的学习:
            作用:提高在jsp中的逻辑代码的编写效率,使用标签。
            使用:
                核心标签库(重点)1、导入jar包
                    2、声明jstl标签库的引入:
                        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
                    3、内容:
                        基本标签:
                            3.1<c:out value="数据" default="默认值"></c:out>
                                数据可以是常量值也可以是EL表达式
                                作用:将数据输出给客户端
                            3.2<c:set var="存储的键名" value="存储的值" scope="存入的作用域对象"></c:set>
                                作用:存储数据到作用域对象中
                            3.3<c:remove var="键名" scope="作用域对象"></c:remove>
                                作用:删除作用域中指定键的数据
                                注意:如果在不指定作用域对象的情况下,会删除所有符合键名的
                         逻辑标签:
                            3.4 <c:if test="EL表达式的逻辑运算">
                                    前端代码
                                </c:if>
                                作用:进行逻辑判断,相当于Java代码的单分支判断
                                注意:逻辑判断标签需要依赖于EL表达式的逻辑运算,也就是表达式中涉及到的数据必须
                                从作用域中获取。
                            3.5<c:choose>
                                    <c:when test="EL表达式的逻辑运算">
                                        执行内容
                                    </c:when>
                                    .....
                                    <c:otherwise>
                                        执行内容
                                    </c:otherwise>
                                </c:choose>
                                作用:用来进行多分支条件的逻辑判断,类似于Java的多分支语句
                                注意:条件成立只会执行一次 都不成立则会执行otherwise
                         循环标签:
                            3.6常量循环:
                                    <c:forEach begin="开始位置" end="结束位置" step="步长" varStatus="we">
                                        we-----${we.index}----${we.count}----${we.first}----${we.last}<br>
                                    </c:forEach>
                                    作用:循环内容进行处理
                                    varStatus:声明变量记录每次循环的数据(角标,次数,是否是第一次循环,是否是最后一次循环)
                                            ${we.index}----${we.count}----${we.first}----${we.last}
                                            注意:数据存储在作用域中,需要用EL表达式获取
                                动态循环:
                                    <c:forEach items="${list}" var="str">
                                        ${str}
                                    </c:forEach>
                                    items:声明要遍历的对象,结合EL表达式获取对象
                                    var:声明变量记录每次循环的结果,存储在作用域中,需要使用EL表达式获取。
                格式化标签库:
                    日期:
                    数字:
                SQL标签库:
                函数标签库:
                XML标签库:

--%>

<h3>JSTL基本标签</h3><hr>
<%--输出数据--%>
<c:out value="Linyuqi" default="Linyuqi"></c:out>
<%--存储数据到作用域中--%>
<c:set var="hello" value="Hello Request" scope="request"></c:set>
<%--指定范围取数据--%>
<c:out value="${requestScope.hello}" ></c:out>
<%--移除数据--%>
<c:remove var="hello" scope="request"></c:remove>

<h3>JSTL逻辑标签</h3><hr>
<c:set var="h" value="4" scope="request"></c:set>
<c:if test="${requestScope.h>3}">
    <c:out value="今天很凉快!" ></c:out>
</c:if>
<c:choose>
    <c:when test="${requestScope.h<3}">
        <i>继续加油!</i>
    </c:when>
    <c:when test="${requestScope.h==3}">
        <b>你及格了!</b>
    </c:when>
    <c:when test="${requestScope.h>3}">
        <b><b>棒棒哒</b></b>
    </c:when>
</c:choose>
<h3>JSTL循环标签</h3><hr>
<h4>常量循环</h4>
<c:forEach begin="1" end="5" step="1" varStatus="we">
    we-----${we.index}----${we.count}----${we.first}----${we.last}<br>
</c:forEach>
<h4>动态循环</h4>
<%--存储数据--%>
<%
    ArrayList arrayList = new ArrayList();
    arrayList.add("abc");arrayList.add("efg");arrayList.add("hjk");
    request.setAttribute("list",arrayList);
%>


<c:forEach items="${list}" var="str">
    ${str}
</c:forEach>
<body>

</body>
</html>

总结

EL负责作用域数据的调用,JSTL郭帆jsp页面书写,简化代码,整洁页面。

发布了28 篇原创文章 · 获赞 5 · 访问量 2206

猜你喜欢

转载自blog.csdn.net/qq_40307379/article/details/95184329
今日推荐