关于java:Servlet之EL

5次阅读

共计 4080 个字符,预计需要花费 11 分钟才能阅读完成。

EL 表达式

应用传统形式获取 request 对象里的属性值

ElServlet.java

public class ElServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 从申请中获取数据
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        System.out.println("name="+name+",pwd="+pwd);
        // 设置属性的值为字符串类型
        request.setAttribute("city","beijing");
        //Object 类型
        User user = new User(1,"lisi",new Address("hubei","wuhan","hongshan"));
        request.setAttribute("user",user);
        //List 类型
        ArrayList<User> list = new ArrayList<>();
        list.add(user);
        request.setAttribute("list",list);
        //HashMap 类型
        HashMap<String, String> hm = new HashMap<>();
        hm.put("china","beijing");
        hm.put("hubei","wuhan");
        request.setAttribute("map",hm);
        HashMap<String, User> hm1 = new HashMap<>();
        hm1.put("user",user);
        request.setAttribute("suhm",hm1);
        // 通过申请转发形式跳到某 jsp 页面
        request.getRequestDispatcher("el.jsp").forward(request,response);
    }
}

el.jsp

<%@ page import="com.syf.entity.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- 应用传统形式获取作用域中的值 --%>
name:<%=request.getParameter("name")%>
pwd:<%=request.getParameter("pwd")%>
<br>
city:<%=request.getAttribute("city")%>
town:<%=((User)request.getAttribute("user")).getAddress().getTown()%>
<br>
<%=((User)((ArrayList)request.getAttribute("list")).get(0)).getAddress().getTown()%>
<br>
<%=((HashMap)request.getAttribute("map")).get("china")%>
<br>
<%=((HashMap)request.getAttribute("suhm")).get("user")%>
</body>
</html>

从下面代码能够看到,应用传统形式取得 request 对象中的属性值有以下毛病:

  • 必须要导入包
  • 须要进行类型的强制转换
  • 层次结构比较复杂

EL 表达式能够解决上述问题
1、概念

  • Expression Language 一种非常简单的表达式,语法简略易懂,便于应用。让 jsp 写起来更加不便,简化 jsp 中获取作用域或者申请数据的写法。
  • 语法结构:${expression}
  • 应用. 和 [] 两种运算符获取数据

2、用法
应用 EL 表达式进行上述输入

<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- 应用 EL 表达式获取作用域中的值 --%>
name:${param.name}
pwd:${param.pwd}<br>
city:${city}<br>
town:${user.address.town}<br>
${list[0].address.town}<br>
${map.china}<br>
${suhm.user}
</body>
</html>

3、EL 表达式作用域的程序
JSP 的四大作用域,范畴由小到大为:pageContext–>request–>session–>application
如果四个作用域中都有雷同的 key,获取值的程序是怎么的?

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!-- 在四大作用域中设置属性值 -->
<%
 pageContext.setAttribute("key","this is pageContext");
 request.setAttribute("key","this is request");
 session.setAttribute("key","this is session");
 application.setAttribute("key","this is application");
%>
<%-- 获取作用域中的值 --%>
key:${key}
</body>
</html>

上述代码获取到的是 pageContext,把 pageContext 这行正文掉,再执行程序,获取到的是 request,同理往下顺次是 session,application。
这阐明不同作用域中有雷同 key,获取 key 的值的程序是由小作用域到大作用域。
如何获取指定的 key 的值?

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!-- 在四大作用域中设置属性值 -->
<%
 pageContext.setAttribute("key","this is pageContext");
 request.setAttribute("key","this is request");
 session.setAttribute("key","this is session");
 application.setAttribute("key","this is application");
%>
<%-- 获取指定作用域中 key 的值 --%>
pageContext:${pageScope.key}<br>
request:${requestScope.key}<br>
session:${sessionScope.key}<br>
application:${applicationScope.key}
</body>
</html>


4、EL 表达式进行运算

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${1+1}<br><%--2--%>
${2-1}<br><%--1--%>
${2*3}<br><%--6--%>
${6/2}<br><%--3.0--%>
${7%3}<br><%--1--%>
${1>2?"好":"不好"}<br><%-- 不好 --%>
${1+"2"}<br><%--3--%>
<%--${1+"abc"}<br> 报错 --%>
<%--${"abc"+"cdb"} 报错 --%>
<%-- 逻辑运算 --%>
${true&&false}<br><%--false--%>
${true||false}<br><%--true--%>
</body>
</html>

EL 表达式能够进行算术运算与关系运算,关系运算返回 true 或 false。须要留神的是,EL 表达式中的 +,示意加法,不是字符串连接符。
5、EL 表达式其余用法

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- 获取申请头数据 --%>
${header}<br>
${header["host"]}<br>
${headerValues["accept-language"][0]}<br>
<hr>
<%-- 获取 cookie 数据 --%>
${cookie}<br>
${cookie.JSESSIONID}<br>
${cookie.JSESSIONID.name}<br>
${cookie.JSESSIONID.value}<br>
</body>
</html>

正文完
 0