Web基础:EL技术

Web基础:EL技术,第1张

Web基础:EL技术

目录

1.EL工具包介绍

2.传统JSP文件中主要开发步骤

3.EL表达式

3.1 语法格式

3.2 作用对象别名

3.3 EL表达式将引用对象属性写入到响应体

4.EL表达式简化版

5.EL表达式支持运算表达式

6.EL表达式提供的内置对象

7.EL表达式中的常见异常


1.EL工具包介绍

   ①由Java技术开发的一个jar包

   ②作用是降低JSP文件开发时Java命令的开发强度

   ③Tomcat服务器本身自带了EL工具包:Tomcat安装地址/lib/el-api.jar

2.传统JSP文件中主要开发步骤

   将作用域存放的处理结果读取出来并写入到响应体。

        ①从指定的作用域对象读取处理结果

        ②将得到的数据进行类型强转

        ③将转换后的数据写入到响应体

        比如:

public class oneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.分别将共享数据添加到作用域对象
        ServletContext application = request.getServletContext();
        HttpSession session = request.getSession();

        application.setAttribute("sid",10);//全局作用域对象
        session.setAttribute("sname","mike");//会话作用域对象
        request.setAttribute("home","新起屯");//请求作用域对象

        //2.通过请求转发方式,向Tomcat申请调用index1.jsp,由index1.jsp负责将作用域对象共享数据读取并写入到响应体,交给浏览器
        request.getRequestDispatcher("/index1.jsp").forward(request,response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    Integer sid = (Integer)application.getAttribute("sid");
    String sname = (String)session.getAttribute("sname");
    String home = (String)request.getAttribute("home");
%>
学员ID:<%=sid%>
学员姓名:<%=sname%>
学员地址:<%=home%>
3.EL表达式 3.1 语法格式

   如果使用EL表达式,上述JSP文件将变为:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

学员ID:${applicationScope.sid}
学员姓名:${sessionScope.sname}
学院地址:${requestScope.home}

   命令格式:${作用域对象别名.共享数据}

   命令作用:

        ①EL表达式是EL工具包提供一种特殊命令格式(表达式命令格式)

        ②EL表达式在JSP文件上使用

        ③负责在JSP文件上从作用域对象读取指定的共享数据并输出到响应体

3.2 作用域对象别名

   JSP文件中可以使用的作用域对象:

        ①ServletContext application:全局作用域对象

        ②HttpSession session:会话作用域对象

        ③HttpServletRequest request:请求作用域对象

        ④PageContext pageContext:当前页作用域对象(JSP文件独有的作用域对象,Servlet中没

          有),在当前页作用域对象中存放的共享数据仅能在当前JSP文件中使用,不能共享给其他

          Servlet或者其他JSP文件。真实开发过程中,主要用于JSTL标签与JSP文件之间的数据共

          享。JSTL---pageContext---JSP。

   EL表达式提供的作用域对象的别名:

JSPEL表达式application${applicationScope.共享数据名}session${sessionScope.共享数据名}request${requestScope.共享数据名}pageContext${pageScope.共享数据名} 3.3 EL表达式将引用对象属性写入到响应体

   语法格式:

        ${作用域对象别名.共享数据名.属性名}

   作用:从作用域对象读取指定共享数据关联的引用对象的属性值,并自动将属性的结果写入到响应体。

   注意:属性名一定要与引用类型的属性名完全一致(包括大小写)。虽然属性是私有的,但是可以利用反射机制来访问。

public class Student {
    private Integer sid;
    private String sname;

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Student() {
    }

    public Student(Integer sid, String sname) {
        this.sid = sid;
        this.sname = sname;
    }
}
public class oneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建一个引用类型实例对象
        Student stu = new Student(20,"allen");
        //2.将引用类型对象存入到请求作用域对象作为共享数据
        request.setAttribute("key",stu);
        //3.请求转发,向Tomcat申请调用index1.jsp
        request.getRequestDispatcher("/index1.jsp").forward(request,response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    Student student = (Student)request.getAttribute("key");
%>
学员编号:<%=student.getSid()%>
学生姓名:<%=student.getSname()%>


学员编号:${requestScope.key.sid}
学生姓名:${requestScope.key.sname}

   EL表达式没有提供遍历集合的方法,因此无法从作用域对象读取集合内容输出。

4.EL表达式简化版

   命令格式:${共享数据名}

   作用:EL表达式允许开发人员开发时省略作用域对象别名。

   工作原理:EL表达式简化版由于没有指定作用域对象,因此在执行时采用"猜"算法。

        ①首先在pageContext定位共享数据,如果存在直接读取输出并结束执行;

        ②如果在pageContext没有定位成功,到request定位共享数据,如果存在直接读取输出并结

          束执行;

        ③如果在request没有定位成功,到session定位共享数据,如果存在直接读取输出并结束执

          行;

        ④如果在session没有定位成功,到application定位共享数据,如果存在直接读取输出并结束

          执行;

        ⑤如果在application没有定位成功,返回null

        pageContext---request---session---application---null

   存在隐患:

        ①容易降低程序的执行速度

        ②容易导致数据定位错误

   应用场景:设计目的就是简化从pageContext读取共享数据并降低输出难度。

   在实际开发中,为了节省时间,一般会使用简化版。

5.EL表达式支持运算表达式

   在JSP文件中,有时需要将读取到的共享数据进行一番运算之后,才会将运算结果写入到响应体。

   运算表达式:

        ①数学运算

public class oneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("key1","100");
        request.setAttribute("key2",200);

        request.getRequestDispatcher("/index1.jsp").forward(request,response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    String num1 = (String)request.getAttribute("key1");
    Integer num2 = (Integer)request.getAttribute("key2");

    int num3 = Integer.valueOf(num1) + num2;
%>
传统的Java命令计算后的结果<%=num3%>

EL表达式计算后的结果:${key1+key2}

        ②关系运算:>/gt   >=/ge   ==/eq   

public class TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setAttribute("age","25");
        request.getRequestDispatcher("/index2.jsp").forward(request,response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    String age = (String)request.getAttribute("age");
    if(Integer.valueOf(age) >= 18){
%>
    欢迎光临
<% }else{ %> 谢绝入内
<% } %> EL表达式:${age>=18?"欢迎光临":"谢绝入内"}

        ③逻辑运算:&&   ||   !

6.EL表达式提供的内置对象

   命令格式:${param.请求参数名}

   命令作用:从通过请求对象读取当前请求保重的请求参数内容并将请求参数内容写入到响应体

   代替命令:

index.jsp

发送请求:Http://localhost:8080/myWeb/index.jsp?userName=mike&password=123

<%
        String userName =   request.getParameter("userName");
        String password =   request.getParameter("password");
%>
<%=userName%>
<%=password%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


来访者姓名:${param.userName}
来访者密码:${param.password}

   命令格式:${paramValues.请求参数名[下标]}

   命令作用:如果浏览器发送的请求参数是一个请求参数关联多个值,此时可以通过paramValues读取请求参数下指定位置的值,并写入到响应体。

   代替命令:

http://localhost:8080/myWeb/index_2.jsp? 
此时pageNo请求参数在请求包以数组形式存在
pageNo:[1,2,3]

<%
        String[]  array = request.getParameterValues("pageNo");
%>
第一个值:<%=array[0]%>
第二个值:<%=array[1]%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

第一个部门编号:${paramValues.deptNo[0]}
第二个部门编号:${paramValues.deptNo[1]}
第三个部门编号:${paramValues.deptNo[2]}
7.EL表达式中的常见异常

   javax.el.PropertyNotFoundException:在对象中没有找到指定属性。

public class Student {
    private Integer sid;
    private String sname;

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Student() {
    }

    public Student(Integer sid, String sname) {
        this.sid = sid;
        this.sname = sname;
    }
}
public class oneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Student stu = new Student(10,"mike");
        request.setAttribute("key",stu);

        request.getRequestDispatcher("index1.jsp").forward(request,response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

学员编号:${key.sid}
学员姓名:${key.name}

PS:根据动力节点课程整理,如有侵权,联系删除。

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

原文地址:https://54852.com/zaji/4020952.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存