el表达式初步、获取Map中的值、el内置对象、运算符、使用EL替换所有jsp表达式

EL表达式
[1] 简介

JSP表达式 <%= %> 用于向页面中输出一个对象。
到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段。
使用EL表达式来代替JSP表达式 ,使用标签来代替脚本片段。
EL表达式用来向页面输出内容

[2] 基本语法
    > ${表达式}
    > EL表达式可以从域中获取属性。
         - 使用 ${属性名}
         - 如果只填写一个属性名,EL表达式会自动做全域查找。
         - 所谓的全域查找,就是按照page request session application四个域范围内分别,找到就返回属性,如果没找到什么都不返还。
         - 我们还可以指定去哪个域查找
            pageScope
            requestScope
            sessionScope
            applicatScope
        - 例子:
            查找request中属性
                ${requestScope.属性名}
            查找session中的属性
                ${sessionScope.属性名}

        - 注意:EL表达式只能获取域中的属性
            EL表达式不能直接调用对象的方法

        - 通过EL表达式读取对象的属性时,只需要${对象.属性名}
            EL表达式会自动调用对象的对应的getter方法,通过将属性名首字母大写,然后加上一个get

        - 当读取一些名字比较特殊的属性时,这种特殊值必须要指定域
            ${requestScope['属性名']}

[3] 隐含对象
        > EL中一共有11个内置对象。
            - pageContext
                类型 PageContext
                    它和JSP中pageContext是一个东西
                作用 可以获取到JSP中其他的隐含对象
                例如:可以获取项目名:
                    ${pageContext.request.contextPath }

            - pageScope
                类型:Map<String,Object>
                代表:page域中的属性
                作用:可以获取到page域中的属性

            - requestScope
                类型:Map<String,Object>
                代表:request域中的属性
                作用:可以获取到request域中的属性

            - sessionScope
                类型:Map<String,Object>
                代表:session域中的属性
                作用:可以获取到session域中的属性

            - applicatScope
                类型:Map<String,Object>
                代表:application域中的属性
                作用:可以获取到application域中的属性

            - param
                类型: Map<String , String>
                代表:用户发送的请求参数
                作用:可以获取请求参数 
                用法: ${param.参数名}

            - paramValues
                类型:Map<String , String[]>
                代表:一个请求参数对应的多个值
                用法: ${paramValues.参数名[索引]}

            - header
                作用:可以获取到用户发送的请求头
                类型:Map<String , String>
                例如:获取用户的系统信息 ${header['User-Agent']}

        ?   - headerValues
                类型: Map<String , String[]>
                作用:可以获取一个头的多个值

        ?   - initParam;
                类型:Map<String , String>
                作用:获取整个WEB应用的初始化参数

        ?   - cookie
                类型:Map<String , Cookie>
                作用:用来获取Cookie



[4] 运算
    > 在EL中可以直接使用运算符进行运算。
    > 在EL中可以使用Empty元素符:
        如果值为null , empty则返回 true
        如果为空串, 则返回 true
        空的集合    返回true
    > 所以empty元素符经常用来判断集合或者字符串是否为空

======================
代码结构:
这里写图片描述

Address.java

package com.atguigu.bean;

public class Address {

    private String city;
    private String street;

    public String getCity() {
        return city;
    }

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

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    @Override
    public String toString() {
        return "Address [city=" + city + ", street=" + street + "]";
    }

}

User.java

package com.atguigu.bean;

public class User {

    private String username;
    private String gender;
    private int age;

    private Address address;



    public String getUsername() {

        System.out.println("GET方法被调用了");

        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", gender=" + gender + ", age="
                + age + "]";
    }

    public User(String username, String gender, int age) {
        super();
        this.username = username;
        this.gender = gender;
        this.age = age;
    }

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

=======================

el表达式初步
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
    pageContext.setAttribute("key", "pageValue");
    request.setAttribute("key", "reqValue");
    session.setAttribute("key", "sessValue");
    application.setAttribute("key", "appValue");

%>
</head>
<body>

<%-- <%=request.getAttribute("requKey") %> --%>

<!-- 如果使用EL表单时获取一个null的对象,它不会显示null,而是什么都不显示 -->
<!-- EL表达式会在四个域中分别查找属性,以从小到大的顺序查找 -->
<%-- ${key } --%>
<!-- 我们可以通过pageScope requestScope sessionScope applicationScope
        来指定要查找的域
 -->
 ${sessionScope.key }

</body>
</html>

1.jsp

<%@page import="com.atguigu.bean.Address"%>
<%@page import="com.atguigu.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%
        User user = new User();
        user.setUsername("孙悟空");
        user.setAge(18);
        user.setGender("男");

        //创建一个Address对象
        Address address = new Address();
        address.setCity("北京");
        address.setStreet("长安街");

        //将address设置进User中
        user.setAddress(address);

        //将USer对象放入进request域中
        request.setAttribute("user", user);
    %>

    ${user.address.street}

</body>
</html>

===============================
获取Map中的值
2.jsp

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
    request.setAttribute("Hello-Kitty", "Tomcat");

    Map<String, String> map = new HashMap<String, String>();

    map.put("name", "张三");
    map.put("age", "18");
    pageContext.setAttribute("map", map);
%>

<!-- 像这种名字比较特殊的属性,我们还可以通过另一种方式获取 -->
${requestScope['Hello-Kitty']}
<br />
<!-- 可以通过map.key来获取map中的值  -->
${map.name}
${map['age']}

</body>
</html>

=============================
el内置对象
3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${pageContext.request.contextPath }
    <%
        request.setAttribute("reqKey", "reqValue");
    %>

    <br />
    <br />

    ${requestScope.contextPath }

    <!-- 通过param对象获取到用户发送的请求参数 -->
    <h3>${param.name }</h3>

<hr />

    <h2>${paramValues.hobby[1] }</h2>

<hr />

    <h3>${header['User-Agent'] }</h3>


</body>
</html>

================================
运算符
4.jsp

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${123*456 } <br />

    <%
        request.setAttribute("user", "");

        List<String> list = new ArrayList<String>();

        request.setAttribute("list", list);

        list.add("贾宝玉");
        list.add("潘金莲");
    %>

    user == null : ${user == null} <br />
    empty user : ${empty user }<br />

    <hr />

    ${empty "" }

    <hr />
    empty list --> ${empty list}
    <hr />
    list == null --> ${list == null }

    <hr />
    ${list[1] }

</body>
</html>

=================================
使用EL替换所有jsp表达式
login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>尚硅谷会员登录页面</title>
<%@ include file="/WEB-INF/include/base.jsp" %>
</head>
<body>
        <div id="login_header">
            <img class="logo_img" alt="" src="static/img/logo.gif" >
        </div>

            <div class="login_banner">

                <div id="l_content">
                    <span class="login_word">欢迎登录</span>
                </div>

                <div id="content">
                    <div class="login_form">
                        <div class="login_box">
                            <div class="tit">
                                <h1>尚硅谷会员</h1>
                                <a href="pages/user/regist.jsp">立即注册</a>
                            </div>
                            <div class="msg_cont">
                                <b></b>
                                <%-- <span class="errorMsg"><%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg") %></span> --%>
                                <span class="errorMsg">${empty msg?"请输入用户名和密码":msg }</span>
                            </div>
                            <div class="form">
                                <form action="client/UserServlet?method=login" method="post">

                                    <!-- <input type="hidden" name="method" value="login" /> -->

                                    <label>用户名称:</label>
                                    <input value="${param.username }" class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" />
                                    <br />
                                    <br />
                                    <label>用户密码:</label>
                                    <input class="itxt" type="password" placeholder="请输入密码" autocomplete="off" tabindex="1" name="password" />
                                    <br />
                                    <br />
                                    <input type="submit" value="登录" id="sub_btn" />
                                </form>
                            </div>

                        </div>
                    </div>
                </div>
            </div>
        <div id="bottom">
            <span>
                尚硅谷书城.Copyright &copy;2015
            </span>
        </div>
</body>
</html>

regist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>尚硅谷会员注册页面</title>
<%@ include file="/WEB-INF/include/base.jsp" %>

<script type="text/javascript">
    $(function(){

        //正则表达式,用来检查字符串是否符合规则
        /* var reg = /a/;
        var flag = reg.test("cbbc");
        alert(flag); */


        //为提交按钮绑定单击响应函数
        $("#sub_btn").click(function(){

            //获取用户输入的用户名、密码、确认密码、电子邮件、验证码
            var name = $("[name=username]").val();
            var password = $("[name=password]").val();
            var repwd = $("[name=repwd]").val();
            var email = $("[name=email]").val();
            var code = $("[name=code]").val();

            //检查用户名、密码等信息是否符合规则
            //验证用户名
            var nameReg = /^[a-zA-Z0-9_-]{3,16}$/;
            if(!nameReg.test(name)){
                //用户名格式不正确
                alert("请输入包含字母、数字、-、_且3-16位的用户名!");
                //取消默认行为
                return false;
            }

            //验证密码
            var pwdReg = /^[a-zA-Z0-9_-]{6,18}$/;
            if(!pwdReg.test(password)){
                //密码格式不正确
                alert("请输入包含字母、数字、-、_且6-18位的密码!");
                //取消默认行为
                return false;
            }

            //验证确认密码
            if(repwd != password){
                //两次输入的密码不一致
                alert("两次输入的密码不一致!");
                return false;
            }

            //检查邮箱格式
            var emailReg = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if(!emailReg.test(email)){
                alert("请输入正确的邮箱地址!");
                return false;
            }

            //检查验证码是否为空
            if(code == ""){
                alert("请输入验证码!");
                return false;
            }

        });

    });

</script>

<style type="text/css">
    .login_form{
        height:420px;
        margin-top: 25px;
    }

</style>
</head>
<body>
        <div id="login_header">
            <img class="logo_img" alt="" src="static/img/logo.gif" >
        </div>

            <div class="login_banner">

                <div id="l_content">
                    <span class="login_word">欢迎注册</span>
                </div>

                <div id="content">
                    <div class="login_form">
                        <div class="login_box">
                            <div class="tit">
                                <h1>注册尚硅谷会员</h1>
                                <%-- <span class="errorMsg"><%=request.getAttribute("msg")==null?"":request.getAttribute("msg") %></span> --%>
                                <span class="errorMsg">${msg }</span>
                            </div>
                            <div class="form">
                                <form action="client/UserServlet?method=regist" method="post">
                                    <label>用户名称:</label>
                                    <input value="${param.username }" class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" />
                                    <br />
                                    <br />
                                    <label>用户密码:</label>
                                    <input class="itxt" type="password" placeholder="请输入密码" autocomplete="off" tabindex="1" name="password" />
                                    <br />
                                    <br />
                                    <label>确认密码:</label>
                                    <input class="itxt" type="password" placeholder="确认密码" autocomplete="off" tabindex="1" name="repwd" />
                                    <br />
                                    <br />
                                    <label>电子邮件:</label>
                                    <input value="${param.email }" class="itxt" type="text" placeholder="请输入邮箱地址" autocomplete="off" tabindex="1" name="email" />
                                    <br />
                                    <br />
                                    <label>验证码:</label>
                                    <input class="itxt" type="text" style="width: 150px;" name="code"/>
                                    <img alt="" src="static/img/code.bmp" style="float: right; margin-right: 40px">                                 
                                    <br />
                                    <br />
                                    <input type="submit" value="注册" id="sub_btn" />

                                </form>
                            </div>

                        </div>
                    </div>
                </div>
            </div>
        <div id="bottom">
            <span>
                尚硅谷书城.Copyright &copy;2015
            </span>
        </div>
</body>
</html>

base.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<base href="http://${pageContext.request.serverName }:${pageContext.request.serverPort }${pageContext.request.contextPath }/" />
<link type="text/css" rel="stylesheet" href="static/css/style.css" >
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>

================================
一、EL表达式的出现是为了替代jsp表达式书写的繁琐,看看错误误消息显示、表单回显二者书写的差别。
Jsp表达式:

//错误误消息
<%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg") %>

//表单回显
<input value="<%=request.getParameter("username")==null?"":request.getParameter("username") %>" class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" />

EL表达式:

//错误误消息
${empty msg?"请输入用户名和密码":msg }

//表单回显
<input value="${param.username }" class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" />

二、EL表达式的正确书写规则
前世:想要调用某个对象的成员变量、方法的值的时候,通过对象.属性或者对象.方法

User user=new User();
System.out.println(user.name);
System.out.println(user.getName());

今生:想要调用某个对象的成员变量的值的时候,先要把对象放到EL内置对象里,之后通过 .tips {对象.方法},而是去掉前面的get,将驼峰命名法大写的字母变成小写。

User user=new User();
<%
  request.setAttribute("user", user);
%>
${user.name}

想要获得服务器主机名、端口号、项目路径,需通过request对象获取,request对象可以通过EL的内置对象pageContext获取。
这里写图片描述

<base href="http://${pageContext.request.serverName }:${pageContext.request.serverPort }${pageContext.request.contextPath }/" />

三、JSP 4个域对象-9个内置对象-11个EL隐式对象

一. 四大域对象

1. PageContext :页面范围的数据

2. ServletRequest:请求范围的数据

3. HttpSession:会话范围的数据

4. ServletContext:应用范围的数据


二. 9个内置对象

1.request对象

   request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。

 (包括头信息. 系统信息. 请求方式以及请求参数等)。request对象的作用域为一次请求。

2.response对象

   response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

3.session对象

   session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。

   session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

4.application对象

   application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。

   与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

5.out 对象

   out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。

   在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

6.pageContext 对象

   pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out. request. reponse. session. application 等对象。

   pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

7.config 对象

   config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。

   当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。

   开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

8.page 对象

   page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

9.exception 对象

   exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。

   excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。

   如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

三. EL表达式的11个隐式对象

请求参数

   1. param 包含所有的参数的Map可以获取参数返回String

   2. paramValues 包含所有参数的Map,可以获取参数的数组返回String[]

头信息

   3. header 包含所有的头信息的Map。可以获取头信息返回String

   4. headerValues 包含所有的头信息的Map。可以获取头信息数组返回String[]

Cookie

   5. cookie包含所有cookie的Map,key为Cookie的name属性值

初始化参数

   6. iniParam 包含所有的初始化参数的Map,可以获取初始化的参数.

作用域

   7. pageScope 包含page作用域内的Map.

   8. requestScope 包含request作用域内的Map

   9. sessionScope 包含session作用域内的Map

  10. applicationScope 包含application作用域内的Map

  11. pageContext 包含页面内的变量的Map,包含request,response,page,application,config等所有的隐藏对象

=======================

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值