JSP、EL表达式、JSTL标签库

目录

JSP实际上就是一个Servlet。

jsp文件第一次访问的时候是比较慢的,为什么?

第二次就比较快了,为什么?

JSP既然本质上是一个Servlet,那么JSP和Servlet到底有什么区别呢?

JSP的基础语法

JSP的九大内置对象

EL表达式

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

EL表达式很好用,基本的语法格式:

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

EL表达式中有四个隐含的隐式的范围:

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

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

通过EL表达式获取应用的根:

JSTL标签库

什么是JSTL标签库?

使用JSTL标签库的步骤:

在IDEA当中怎么引入?

JSTL提供了很多种标签,你要引入哪个标签????重点掌握核心标签库。

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


 

 (老杜的笔记)

JSP实际上就是一个Servlet。

jsp文件第一次访问的时候是比较慢的,为什么?

  • 为什么大部分的运维人员在给客户演示项目的时候,为什么提前先把所有的jsp文件先访问一遍。

  • 第一次比较麻烦:

    • 要把jsp文件翻译生成java源文件

    • java源文件要编译生成class字节码文件

    • 然后通过class去创建servlet对象

    • 然后调用servlet对象的init方法

    • 最后调用servlet对象的service方法。

第二次就比较快了,为什么?

  • 因为第二次直接调用单例servlet对象的service方法即可。

JSP既然本质上是一个Servlet,那么JSP和Servlet到底有什么区别呢?

  • 职责不同:

    • Servlet的职责是什么:收集数据。(Servlet的强项是逻辑处理,业务处理,然后链接数据库,获取/收集数据。)

    • JSP的职责是什么:展示数据。(JSP的强项是做数据的展示)

JSP的基础语法

  • JSP中直接编写普通字符串

    • 翻译到service方法的out.write("这里")

  • <%%>

    • 翻译到service方法体内部,里面是一条一条的java语句。

  • <%! %>

    • 翻译到service方法之外。

  • <%= %>

    • 翻译到service方法体内部,翻译为:out.print();

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

    • page指令,通过contentType属性用来设置响应的内容类型。

JSP的九大内置对象

  • jakarta.servlet.jsp.PageContext pageContext 页面作用域

  • jakarta.servlet.http.HttpServletRequest request 请求作用域

  • jakarta.servlet.http.HttpSession session 会话作用域

  • jakarta.servlet.ServletContext application 应用作用域

    • pageContext < request < session < application

    • 以上四个作用域都有:setAttribute、getAttribute、removeAttribute方法。

    • 以上作用域的使用原则:尽可能使用小的域。

  • java.lang.Throwable exception

  • jakarta.servlet.ServletConfig config

  • java.lang.Object page (其实是this,当前的servlet对象)

  • jakarta.servlet.jsp.JspWriter out (负责输出)

  • jakarta.servlet.http.HttpServletResponse response (负责响应)

EL表达式

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

    • 从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。这就是EL表达式的功效。三大功效:

      • 第一功效:从某个域中取数据。

        • 四个域:

          • pageContext

          • request

          • session

          • application

      • 第二功效:将取出的数据转成字符串。

        • 如果是一个java对象,也会自动调用java对象的toString方法将其转换成字符串。

      • 第三功效:将字符串输出到浏览器。

        • 和这个一样:<%= %>,将其输出到浏览器。

  • EL表达式很好用,基本的语法格式:

    • ${表达式}

  • 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()
  • EL表达式优先从小范围中读取数据。

    • pageContext < request < session < application

  • EL表达式中有四个隐含的隐式的范围:

    • pageScope 对应的是 pageContext范围。

    • requestScope 对应的是 request范围。

    • sessionScope 对应的是 session范围。

    • applicationScope 对应的是 application范围。

  • EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。

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

    • 第一种:. (大部分使用这种方式)

    • 第二种:[ ] (如果存储到域的时候,这个name中含有特殊字符,可以使用 [ ])

      • request.setAttribute("abc.def", "zhangsan");

      • ${requestScope.abc.def} 这样是无法取值的。

      • 应该这样:${requestScope["abc.def"]}

  • 掌握使用EL表达式,怎么从Map集合中取数据:

    • ${map.key}

  • 掌握使用EL表达式,怎么从数组和List集合中取数据:

    • ${数组[0]}

    • ${数组[1]}

    • ${list[0]}

  • 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}

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

    • pageContext

    • param

    • paramValues

    • initParam

  • EL表达式的运算符

    • 算术运算符

      • +、-、*、/、%

    • 关系运算符

      • == eq != > >= < <=
    • 逻辑运算符

      • ! && || not and or
    • 条件运算符

      • ? :
    • 取值运算符

      • [ ]和.

    • empty运算符

      • empty运算符的结果是boolean类型
      • ${empty param.username}
      • ${not empty param.username}
      • ${!empty param.password}

JSTL标签库

  • 什么是JSTL标签库?

    • Java Standard Tag Lib(Java标准的标签库)

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

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

  • 使用JSTL标签库的步骤:

    • 第一步:引入JSTL标签库对应的jar包。

      • tomcat10之后引入的jar包是:(网上很多都是直接下载来着,但是其实tomcat会自带,我用的tomcat8.0.42,我自己的路径为:D:\software\tomcat\apache-tomcat-8.0.42\webapps\examples\WEB-INF\lib

        • jakarta.servlet.jsp.jstl-2.0.0.jar

        • jakarta.servlet.jsp.jstl-api-2.0.0.jar

      • 在IDEA当中怎么引入?

        • 在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中。然后将其“Add Lib...”

        • 一定是要和mysql的数据库驱动一样,都是放在WEB-INF/lib目录下的。

        • 什么时候需要将jar包放到WEB-INF/lib目录下?如果这个jar是tomcat服务器没有的。

    • 第二步:在JSP中引入要使用标签库。(使用taglib指令引入标签库。)

      • JSTL提供了很多种标签,你要引入哪个标签????重点掌握核心标签库。

      • <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        这个就是核心标签库。
        prefix="这里随便起一个名字就行了,核心标签库,大家默认的叫做c,你随意。"

    • 第三步:在需要使用标签的位置使用即可。表面使用的是标签,底层实际上还是java程序。

  • 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文件。

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

      • c:if

        • <c:if test="boolean类型,支持EL表达式"></c: if>

      • c:forEach

        • <c:forEach items="集合,支持EL表达式" var="集合中的元素" varStatus="元素状态对象"> ${元素状态对象.count} </c: forEach>

        • <c:forEach var="i" begin="1" end="10" step="2"> ${i} </c: forEach>

      • c:choose c:when c:otherwise

        • <c:choose>
              <c:when test="${param.age < 18}">
                  青少年
              </c:when>
              <c:when test="${param.age < 35}">
                  青年
              </c:when>
              <c:when test="${param.age < 55}">
                  中年
              </c:when>
              <c:otherwise>
                  老年
              </c:otherwise>
          </c:choose>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java塑造中...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值