使用Servlet和JSP开发Java应用程序 ---- EL

使用Servlet和JSP开发Java应用程序 ---- EL,第1张

使用html" class="superseo">Servlet和JSP开发Java应用程序 ---- EL
  • 无脚本的 JSP 页面
  • EL 表达式
  • 认识 EL 表达式
    • 使用EL表达式和EL中的运算符
    • 使用EL表达式-获取请求参数的值
    • 使用EL表达式-获取Cookie的值
    • 使用EL表达式-获取四个域对象中的属性值
  • 使用EL调用类中静态方法
  • 使用 EL 表达式
  • EL表达式如何处理Null值和获取上下文参数
  • EL表达式练习

无脚本的 JSP 页面

无脚本的JSP页面是没有Java脚本元素(代码段、表达式和声明)的页面
无脚本(Scriptless)的代码使JSP页面易于阅读、维护和调试
EL 和 JSTL 可以用来编写无 Java 脚本元素的页面

EL 表达式

Expression Language - 表达式语言
提供了一种在JSP页面上编写的语言,以减少代码

认识 EL 表达式 使用EL表达式和EL中的运算符


Java表达式和EL表达式
Java表达式:<%= 15 * 15%>
EL表达式:${16 * 16}

算数运算符
算术运算符取余:${13 % 3}
算术运算符取余:${13 mod 3}
算术运算符除:${17 / 5}
算术运算符除:${17 div 5}

比较运算符
比较运算符:${1 > 2}
比较运算符:${1 gt 2}

eq: == 
ne: != 
gt: >  
lt: <  
ge: >= 
le: <= 

逻辑元素符
逻辑运算符-逻辑与:${1 > 2 && 10 > 2 && 3 > 2}
逻辑运算符-逻辑与:${1 > 2 and 10 > 2 and 3 > 2}
逻辑运算符-逻辑或:${1 > 2 || 10 > 2 || 3 > 2}
逻辑运算符-逻辑或:${1 > 2 or 10 > 2 or 3 > 2}
逻辑运算符-逻辑非:${!(2 > 1)}
逻辑运算符-逻辑非:${not(2 > 1)}

三元运算符
三元运算符:${2 > 1 ? 1 : 0}
三元运算符:${2 > 1 ? "Y" : "N"}

使用EL表达式-获取请求参数的值

Java 表达式

<%@page contentType="text/html" pageEncoding="UTF-8"%>
DOCTYPE html>
<html>
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>使用Java表达式获取请求参数的值title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head>
    <body class="bg-warning">
        <div class="container">

            <br>
            <h1 class="text-center text-primary">使用Java表达式获取请求参数的值h1>
            <hr>
            <p class="text-danger">
                * 本页面中使用java表达式获取请求参数的值,用于和second.jsp对比两种获取请求参数值的方式
            p>
            <hr>

            <%
                String[] hobbies = request.getParameterValues("hobbies");
            %>
            <p>
                <br>账户: <%=request.getParameter("username")%>
                <br>密码: <%=request.getParameter("password")%>
                <br>性别: <%=request.getParameter("gender")%>
                <br>国籍: <%=request.getParameter("nationality")%>
                <br>爱好: <%=hobbies[0]%>
                           <%=hobbies[1]%>
                           <%=hobbies[2]%>
                           <%=hobbies[3]%>
                           <%=hobbies[4]%>
            p>

        div>
    body>
html>

EL 表达式

<%@page contentType="text/html" pageEncoding="UTF-8"%>
DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>使用EL表达式获取请求参数的值title> 
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head>
    <body>
        <div class="container">

            <br>
            <h1 class="text-center text-primary">使用EL表达式获取请求参数的值h1>
            <hr>
            <p class="text-danger">
                * 本页面中使用EL表达式获取请求参数的值,用于和first.jsp对比两种获取请求参数值的方式
            p>
            <hr>

            <p>
                <%--在EL表达式中,可以使用param这个隐式对象获取请求参数的值,语法:${param.请求参数名}--%>
                    账户: ${param.username}
                <br>密码: ${param.password}
                <br>性别: ${param.gender}
                <br>国籍: ${param.nationality}
                <%--如果一个请求参数有多个值,可以使用paramValues隐式对象获取请求参数的值,语法:${paramValues.请求参数名[数组元素索引]},索引从0开始--%>
                <br>爱好: ${paramValues.hobbies[0]}
                           ${paramValues.hobbies[1]}
                           ${paramValues.hobbies[2]}
                           ${paramValues.hobbies[3]}
                           ${paramValues.hobbies[4]}
            p>

            <hr>

            <div class="text-success bg-warning padding20">
                <h3>EL表达式提供诸多隐式对象用于获取不同的信息h3>
                <hr>
                <p>  
                    param:获取请求参数的单个值<br>
                    paramValues:获取一个请求参数的多个值,如多个checkbox提交的同一个请求参数的值<br>
                    header:获取请求的标头信息<br>
                    headerValues:获取一个请求标头的多个值<br>
                    cookie:获取Cookie值<br>
                    pageScope:获取页面范围的属性值<br>
                    requestScope:获取请求范围的属性值<br>
                    sessionScope:获取会话范围的属性值<br>
                    applicationScope:获取应用程序范围(上下文范围)的属性值<br>
                    initParam:获取上下文初始化参数
                p>
                <hr>
            div>

        div>
    body>
html>

使用EL表达式-获取Cookie的值


Java 代码段获取 Cookie 值

<%@page contentType="text/html" pageEncoding="UTF-8"%>
DOCTYPE html>
<html>
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>在jsp页面中用java表达式获取cookie的值title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head>
    <body>
        <div class="container text-warning">

            <h1 class="text-center bg-success text-success padding10">get_cookie1.jsp页面-在jsp页面中用java表达式获取cookie的值h1>
            <hr>

            <%
                //获取Cookie
                Cookie[] cookies = request.getCookies();

                //定义两个变量用于存储读取的两个Cookie的值
                String accessTime = "";
                String randNum = "";

                for (Cookie ck : cookies) {
                    if ("lastAccessTime".equals(ck.getName())) { //如果cookie名称为lastAccessTime
                        accessTime = ck.getValue(); //获取其值
                    } else if ("randomNumber".equals(ck.getName())) { //如果cookie名称为randomNumber
                        randNum = ck.getValue();    //获取其值
                    }
                }
            %>

            
            <br><br>* 最后一次请求PutCookieServlet的时间:<%=accessTime%>
            <br><br>* PutCookieServlet产生的随机数字:<%=randNum%>

            <br><br><br><br>
            <div class="text-center">
                <img src="images/lxh04.gif">
            div>
            
        div>
    body>
html>

EL 表达式获取 Cookie 的值

<%@page contentType="text/html" pageEncoding="UTF-8"%>
DOCTYPE html>
<html>
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>在jsp页面中用EL表达式获取cookie的值title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head>
    <body>
        <div class="container text-info">

            <h1 class="text-center text-primary bg-primary padding10">get_cookie2.jsp页面-在jsp页面中用EL表达式获取cookie的值h1>
            <hr>

            <%--也可使用EL表达式获取cookie的值--%>            
            <%--JSP的EL(Expression Language)表达式: ${表达式}--%>
            <%--如何使用EL表达式获取Cookie的值: ${cookie.Cookie名称.value}--%>
            
            <br><br>* 最后一次请求PutCookieServlet的时间:${cookie.lastAccessTime.value}
            <br><br>* PutCookieServlet产生的随机数字:${cookie.randomNumber.value}

            <br><br><br><br>
            <div class="text-center">
                <img src="images/lxh03.gif">
            div>
            
            
        div>
    body>
html>

使用EL表达式-获取四个域对象中的属性值

java 表达式获取域对象中的属性值

<%@page contentType="text/html" pageEncoding="UTF-8"%>
DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>在jsp页面中使用java表达式获取域对象中的属性值title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head> 
    <body>
        <div class="container text-warning">
        
            <h1 class="text-center bg-success text-success padding10">
                get_domain_attribute1.jsp页面
                <br>
                <small>在jsp页面中使用java表达式获取域对象中的属性值small>
            h1>
            <hr>

            
            
            <%
                //在JSP页面上可以使用四个域对象在不同范围共享数据
                pageContext.setAttribute("number1", 100); //PageContext
                request.setAttribute("number2", 200); //HttpServletRequest
                session.setAttribute("number3", 300); //HttpSession
                application.setAttribute("number4", 400); //ServletContext
                int number5=500;
            %>

                    * 页面范围属性值:<%=pageContext.getAttribute("number1")%>
            <br><br>* 请求范围属性值:<%=request.getAttribute("number2")%>
            <br><br>* 会话范围属性值:<%=session.getAttribute("number3")%>
            <br><br>* 应用程序范围属性值:<%=application.getAttribute("number4")%>
            <hr>
            
            * java表达式访问java代码段中的变量number5:<%=number5%>
            <hr>

            <div class="text-center">
                <img src="images/lxh04.gif">
            div>
            
        div>
    body>
html>

EL表达式获取域对象中的属性值

<%@page contentType="text/html" pageEncoding="UTF-8"%>
DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>在jsp页面中使用EL表达式获取域对象中的属性值title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head> 
    <body>
        <div class="container text-info">
        
            <h1 class="text-center text-primary bg-warning padding10">
                get_domain_attribute2.jsp页面
                <br>
                <small>在jsp页面中使用EL表达式获取域对象中的属性值small>
            h1>
            <hr>

            <%
                pageContext.setAttribute("number1", 100);
                request.setAttribute("number2", 200);
                session.setAttribute("number3", 300);
                application.setAttribute("number4", 400);
                int number5 = 500;
                int number6 = 600;
                //java代码定义的变量只有作为属性加入域对象才可被EL表达式访问
                pageContext.setAttribute("number6", number6);
            %>

            <%--EL表达式提供四个xxxScope隐式对象,用于获取不同域对象中的属性值,语法:${xxxScope.属性名}或${属性名}--%>
            
            * 页面范围属性值:${pageScope.number1} | ${number1}
            <br><br>* 请求范围属性值:${requestScope.number2} | ${number2}
            <br><br>* 会话范围属性值:${sessionScope.number3} | ${number3}
            <br><br>* 应用程序范围属性值:${applicationScope.number4} | ${number4}
            <hr>
            * EL表达式访问java代码段中的变量number5:${number5}
            <br><br>
            * EL表达式访问java域对象属性number6:${pageScope.number6} | ${number6}
            <hr>

            <div class="text-center">
                <img src="images/lxh03.gif">
            div>


        div>
    body>
html>


EL表达式获取域对象中的属性值,域对象的属性在Servlet中添加的

<%@page contentType="text/html" pageEncoding="UTF-8"%>
DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>在jsp页面中使用EL表达式获取域对象中的属性值title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head> 
    <body>
        <div class="container text-success">

            <h1 class="text-center text-info bg-info padding10">
                get_domain_attribute3.jsp页面
                <br>
                <small>在jsp页面中使用EL表达式获取域对象中的属性值,域对象的属性在Servlet中添加的small>
            h1>
            <hr>
            * 请求范围属性值num1:${requestScope.num1}
            <br><br>* 会话范围属性值num2:${sessionScope.num2}
            <br><br>* 应用程序范围属性值num3:${applicationScope.num3}
            <br><br>* 学生信息:${requestScope.student.sname} | ${requestScope.student.srollno} | ${requestScope.student.sgender} | ${requestScope.student.spassword} | ${requestScope.student.sbatch}
            <br><br>* 狗(毛毛)信息:${sessionScope.dog.name} | ${sessionScope.dog.type} | ${sessionScope.dog.age}
            <br><br>* 列表第一只狗的信息:${requestScope.dogList[0].name} | ${requestScope.dogList[0].type} | ${requestScope.dogList[0].age}
            <br><br>* 字符串数组的各个值:${requestScope.names[0]} | ${requestScope.names[1]} | ${requestScope.names[2]}
            <br><br>* 对象数数组的各个值:${requestScope.info[0]} | ${requestScope.info[1]} | ${requestScope.info[2]}
            <hr>
            
            <div class="text-center">
                <img src="images/lxh01.gif" width="100" height="100">
            div>

        div>
    body>
html>

package com.qdu.servlet;

import com.qdu.entity.Dog;
import com.qdu.entity.Student;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 请求该Serlvet,会添加属性到不同的域对象中,然后转发请求给get_domain_attribute3.jsp页面,在页面中获取域对象中的属性值
 *
 * @author Anna
 */
@WebServlet("/pas")
public class PutAttributeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //通常是发送请求给servlet,servlet转发请求给jsp
        //在Servlet中可以使用请求对象、会话对象、上下文对象这三个域对象用于在不同范围共享数据
        //请求对象中的属性只有转发请求才能共享给下个组件(jsp或servlet)
        req.setAttribute("num1", 111);

        HttpSession session = req.getSession();
        session.setAttribute("num2", 222);

        ServletContext ctx = getServletContext();
        ctx.setAttribute("num3", 333);

        Student s = new Student("2020208888", "Anna", "123456", "女", "20软件J01");
        Dog d = new Dog("毛毛", "哈士奇", 2);

        req.setAttribute("student", s);
        session.setAttribute("dog", d);

        //假设用一个数组存储了很多个字符串表示的名字
        String[] array1 = {"小强", "小明", "小兰", "小花"};
        req.setAttribute("names", array1);

        //假设用一个数组存储了一个学生的名字、成绩排名和平均分,因为数据类型不同,所以可以考虑使用Object数组
        Object[] array2 = {"小明", 2, 97.3};
        req.setAttribute("info", array2);
        
        List<Dog> list=new ArrayList<>();
        list.add(new Dog("球球","泰迪",2));
        list.add(new Dog("旺财","柴犬",5));
        list.add(new Dog("哈利","哈士奇",8));
        list.add(new Dog("开心","边牧",10));
        req.setAttribute("dogList", list);
        
        req.getRequestDispatcher("/get_domain_attribute3.jsp").forward(req, resp);
    }
}

使用EL调用类中静态方法


在类中定义静态方法

package com.qdu.util;

import java.util.Random;

/**
 * 数字工具类NumberUtil,用于对数字进行 *** 作
 *
 * @author Anna
 */
public class NumberUtil {

    private static Random ran = new Random();
    
    /**
     * 生成一个1-100以内的随机整数
     *
     * @return 一个随机整数
     */
    public static int getRandomNumber() {
        return ran.nextInt(100) +1;  //1-100
    }

    /**
     * 计算一个整数的平方值
     *
     * @param x 一个整数
     * @return 整数表示的平方值
     */
    public static int square(int x) {
        return x * x;
    }

    /**
     * 计算两数之和
     *
     * @param a 整数1
     * @param b 整数2
     * @return 两数之和
     */
    public static int sum(int a, int b) { //严格来说,方法名+参数列表叫做方法的签名
        return a + b;
    }
}

package com.qdu.util;

/**
 * StringUtil类,字符串工具类,用于对字符串执行 *** 作
 *
 * @author Anna 
 */
public class StringUtil {

    public static String getMobile(String mobile){
        return mobile.substring(0,3)+"****"+mobile.substring(7,11);
    }
}

创建TLD(Tag Library Descriptor标记库描述符


<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
    
    <tlib-version>1.0tlib-version>
    
    <short-name>fcshort-name>
    
    
    
    <uri>http://www.anna.com/func/coreuri>
  
    
    
    
    
    <function>
        
        <name>randname>
        <description>获取一个1-100以内的随机整数description>
        
        <function-class>com.qdu.util.NumberUtilfunction-class>
        
        
        <function-signature>int getRandomNumber()function-signature>
    function>
    
    <function>
        <name>squarename>
        <description>计算一个整数的平方值description>
        <function-class>com.qdu.util.NumberUtilfunction-class>
        <function-signature>int square(int)function-signature>
    function>
    
    <function>
        <name>sumname>
        <description>计算两数之和description>
        <function-class>com.qdu.util.NumberUtilfunction-class>
        <function-signature>int sum(int, int)function-signature>
    function>
    
    <function>
        <name>getMobilename>
        <description>获取电话号码description>
        <function-class>com.qdu.util.StringUtilfunction-class>
        <function-signature>java.lang.String getMobile(java.lang.String)function-signature>
    function>
  
taglib>

在jsp页面使用taglib指令引入TLD




<%@taglib uri="http://www.anna.com/func/core" prefix="fc" %> 

在EL表达式中调用方法

<%--
    使用EL调用类中静态方法
--%>



<%@taglib uri="http://www.anna.com/func/core" prefix="fc" %> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
DOCTYPE html>
<html>
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>使用EL调用类中静态方法title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
    head>
    <body>

        <div class="container">
            <br>

            <h1 class="text-center text-primary">使用EL调用类中静态方法h1>
            <hr>

            <p class="text-danger">
                <b>* 使用EL调用类中静态方法的步骤:b><br>
                1) 在类中定义静态方法<br>
                2) 创建TLD(Tag Library Descriptor标记库描述符,一个xml文件,描述如何使用标记或函数)文件,TLD中不仅可以描述标记,还可描述函数,描述如何使用函数(function)<br>
                3) 在jsp页面使用taglib指令引入TLD<br>
                4) 在EL表达式中调用方法即可,调用语法:\${TLD别名:函数名(参数列表)}<br>
            p>
            <hr>
            <p class="text-success">
                        * 调用getRandomNumber()方法:  ${fc:rand()}
                <br><br>* 调用square()方法: ${fc:square(4)}
                <br><br>* 调用sum()方法:  ${fc:sum(2, 4)}
                <br><br>* 调用getMobile()方法: ${fc:getMobile("18706579002")}
            p>

            <hr>

        div>
    body>
html>

使用 EL 表达式 EL表达式如何处理Null值和获取上下文参数

如果只是显示一个空值,EL表达式自动处理空值,什么都不显示

* 属性或变量值:${number}

EL表达式中,使用空值进行算术运算,则空值做0处理

* 求和:${number + 6}

EL表达式中,在比较运算中使用空值,则做false处理

* 逻辑判断:${result ? 1 : 0}

使用EL表达式获取上下文参数(context parameter)


<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    

    <context-param>
        <param-name>encodingparam-name>
        <param-value>UTF-8param-value>
    context-param>
    
    <context-param>
        <param-name>emailparam-name>
        <param-value>[email protected]param-value>
    context-param>
    
    <session-config>
        <session-timeout>
            30
        session-timeout>
    session-config>
web-app>

EL表达式提供initParam隐式对象,用于获取上下文参数,语法:${initParam.参数名}

* 上下文参数encoding: ${initParam.endcoding}
EL表达式练习

            <p>
                * 请求参数name的值:${param.name}
                <br>* 请求参数address的值:${paramValues.address[0]} | ${paramValues.address[1]}
                <br>* 属性number的值:${pageScope.number}
                <br>* 属性msg的值:${requestScope.msg}
                <br>* 属性username的值:${sessionScope.username}
                <br>* 属性onlineCount的值:${applicationScope.onlineCount}
                <br>* 员工小明的所有信息:${requestScope.emp1.empId} | ${requestScope.emp1.empName} | ${requestScope.emp1.empGender} | ${requestScope.emp1.empGrade} | ${requestScope.emp1.empDob}
                <br>* 员工小花的所有信息:${sessionScope.emp2.empId} | ${sessionScope.emp2.empName} | ${sessionScope.emp2.empGender} | ${sessionScope.emp2.empGrade} | ${sessionScope.emp2.empDob}
                <br>* 上下文参数dbusername的值:${initParam.dbusername}
                <br>* 上下文参数dbpassword的值:${initParam.dbpassword}
                <br>* 属性data的所有元素值:${pageScope.data[0]} | ${pageScope.data[1]} | ${pageScope.data[2]} | ${pageScope.data[3]} | ${pageScope.data[4]}
            p>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/741762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存