栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet 学习总结(七)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet 学习总结(七)

一、EL表达式

1、EL表达式是干什么用的?

  • EL表达式可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁,美观。
  • EL表达式可以算是JSP语法的一部分。EL表达式归属于JSP。

2、EL表达式出现在JSP中主要是:

  • 从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。
  • 四个域:pageContext、request、session、application

3、EL表达式很好用,基本的语法格式: ${表达式}

4、EL表达式的使用:

<%
	// 创建User对象
	User user = new User();
	user.setUsername("jackson");
	user.setPassword("1234");
	user.setAge(50);

	// 将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个范围中取数据。
	// 数据是必须存储到四大范围之一的。
	request.setAttribute("userObj", user);
%>

<%--使用EL表达式取--%>
${这个位置写什么????这里写的一定是存储到域对象当中时的name}
要这样写:
${userObj}
等同于java代码:<%=request.getAttribute("userObj")%>
你不要这样写:${"userObj"}

面试题:
	${abc} 和 ${"abc"}的区别是什么?
		${abc}表示从某个域中取出数据,并且被取的这个数据的name是"abc",之前一定有这样的代码: 域.setAttribute("abc", 对象);
		${"abc"} 表示直接将"abc"当做普通字符串输出到浏览器。不会从某个域中取数据了。

${userObj} 底层是怎么做的?从域中取数据,取出user对象,然后调用user对象的toString方法,转换成字符串,输出到浏览器。

<%--如果想输出对象的属性值,怎么办?--%>
${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。
${userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。
${userObj.age} 使用这个语法的前提是:User对象有getAge()方法。
${userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。
EL表达式中的. 这个语法,实际上调用了底层的getXxx()方法。
注意:如果没有对应的get方法,则出现异常。报500错误。

${userObj.addr222.zipcode}
以上EL表达式对应的java代码:
user.getAddr222().getZipcode()

5、EL表达式优先从小范围中读取数据。

  • pageContext < request < session < application

6、EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。(很友好)

7、EL表达式取数据的时候有两种形式:

  • 第一种:. (大部分使用这种方式)
  • 第二种:[ ] (如果存储到域的时候,这个name中含有特殊字符,可以使用 [ ])
    • request.setAttribute("abc.def", "zhangsan");
    • ${requestScope.abc.def} 这样是无法取值的。
    • 应该这样:${requestScope["abc.def"]}

8、掌握使用EL表达式,从集合中取数据:

  • Map集合中取数据:${map.key}
  • 从数组和List集合中取数据:${数组[0]}、${数组[1]}、${list[0]}

9、page指令当中,有一个属性,可以忽略EL表达式

<%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
isELIgnored="true" 表示忽略EL表达式
isELIgnored="false" 表示不忽略EL表达式。(这是默认值)

isELIgnored="true" 这个是全局的控制。

可以使用反斜杠进行局部控制:${username} 这样也可以忽略EL表达式。

通过EL表达式获取应用的根: ${pageContext.request.contextPath}

10、EL表达式中其他的隐式对象:

  • pageContext、param(请求体参数值)、paramValues、initParam
    • 例如http://localhost:8080/servlet/oa?username=123
    • 可以通过${param.username}获取123
  • EL表达式的运算符(介绍一些特殊的):
    • + : 只做加法运算,不做字符串拼接。
    • empty:empty运算符的结果是boolean类型
    • ${empty param.username} : false
二、JSTL标签库

1、什么是JSTL标签库

JSTL标签库通常结合EL表达式一起使用。目的是让JSP中的java代码消失。

标签是写在JSP当中的,但实际上最终还是要执行对应的java程序。(java程序在jar包当中。)

2、使用JSTL标签库的步骤:

  • 引入JSTL标签库对应的jar包
    • jakarta.servlet.jsp.jstl-2.0.0.jar
    • jakarta.servlet.jsp.jstl-api-2.0.0.jar
  • 在JSP中引入要使用标签库(使用taglib指令引入标签库。)
    • <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      这个就是核心标签库。
      prefix="这里随便起一个名字就行了,核心标签库,大家默认的叫做c,你随意。"
  • 在需要使用标签的位置使用即可。表面使用的是标签,底层实际上还是java程序。

3、JSTL标签的原理

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
以上uri后面的路径实际上指向了一个xxx.tld文件。
tld文件实际上是一个xml配置文件。
在tld文件中描述了“标签”和“java类”之间的关系。
以上核心标签库对应的tld文件是:c.tld文件。它在哪里。
在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。
  • 源码解析:配置文件tld解析
  • 
        对该标签的描述
        catch 标签的名字
        org.apache.taglibs.standard.tag.common.core.CatchTag 标签对应的java类。
        JSP 标签体当中可以出现的内容,如果是JSP,就表示标签体中可以出现符合JSP所有语法的代码。例如EL表达式。
        
            
            	对这个属性的描述
            
            var 属性名
            false false表示该属性不是必须的。true表示该属性是必须的。
            false 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。
        
      
    
    
    	JSP....
    

4、jstl中的核心标签库core当中有哪些常用的标签呢?  

  • c:if
  • c:forEach
    • ${元素状态对象.count}
    • ${i}
  • c:choose c:when c:otherwise
    • 
          
              青少年
          
          
              青年
          
          
              中年
          
          
              老年
          
      

5、 演示:

<%@ page import="com.zikai.javaweb.jsp.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@page contentType="text/html;charset=utf-8" %>

<%--
    练习:jstl标签库
--%>

<%--引入标签库 这里引入的是jstl核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%--格式化标签库--%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<%--sql标签库--%>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>

<%
    Student stu1 = new Student();
    stu1.setId(1);
    stu1.setName("jack");
    Student stu2 = new Student();
    stu2.setId(2);
    stu2.setName("smith");
    List list = new ArrayList<>();
    list.add(stu1);
    list.add(stu2);
    request.setAttribute("list", list);
%>

<%
    List stus = (List)request.getAttribute("list");
    for (Student stu : stus){
%>
    <%=stu.getId()%>,<%=stu.getName()%>
<% } %> <%-- --%>
<%@page contentType="text/html;charset=utf-8" %>
<%--
    JSTL标签库中的if表达式
--%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


    用户名为空!



${b}
用户名为${param.username}
<%@ page import="com.zikai.javaweb.jsp.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@page contentType="text/html;charset=utf-8" %>

<%--
    练习:jstl标签库 forEach
--%>

<%--引入标签库 这里引入的是jstl核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%--格式化标签库--%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<%--sql标签库--%>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>

<%
    Student stu1 = new Student();
    stu1.setId(1);
    stu1.setName("jack");
    Student stu2 = new Student();
    stu2.setId(2);
    stu2.setName("smith");
    List list = new ArrayList<>();
    list.add(stu1);
    list.add(stu2);
    request.setAttribute("list", list);
%>

<%
    List stus = (List)request.getAttribute("list");
    for (Student stu : stus){
%>
    <%=stu.getId()%>,<%=stu.getName()%>
<% } %> <%--使用jstl标签库--%> 编号:${stu.id},姓名:${stu.name}
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.zikai.javaweb.jsp.bean.Student" %>
<%@ page import="java.util.List" %>
<%@page contentType="text/html;charset=utf-8" %>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

从1开始,10结束,步数为2
${i}
<% Student stu1 = new Student(); stu1.setId(1); stu1.setName("jack"); Student stu2 = new Student(); stu2.setId(2); stu2.setName("smith"); List list = new ArrayList<>(); list.add(stu1); list.add(stu2); request.setAttribute("list", list); %> <%-- varStatus: student的状态对象,有一个属性count可以用来做编号或者序号,以1递增。 --%> 编号:${stuStatu.count},Student:${stu.id},${stu.name}
<%@page contentType="text/html;charset=utf-8" %>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%--
    if(){

    }else if(){

    }...
--%>


    
        等级A
    
    
        等级B
    
    
        等级C
    

jstl标签库和EL表达式总结。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/826148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号