JSP: Java服务端页面技术_JSP的使用_JSP的常用指令标签_JSP内置对象_EL表达式_JSTL标签库

本文详细介绍了JSP的基本使用、数据展示、JSP指令标签、内置对象、EL表达式和JSTL标签库的应用,以及与Servlet的关系和MVC架构中的角色。
摘要由CSDN通过智能技术生成

一、JSP的使用

1.JSP的引入

        有一种特殊的文件,我们可以在它内部编写HTML代码、CSS代码、js代码还有Java代码。编写完之后,再有一个工具,将这个特殊的文件转换成Servlet,在转换好的Servlet中,之前写的Java代码还在,而HTML、css、js代码都使用writer的方式给写好。那这个特殊的文件就是jsp文件。这个工具就是Tomcat服务器中的jsp引擎。

2.JSP展示数据实例
<%@ page import="java.util.List" %>
<%@ page import="com.pojo.Emp" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>

    <style>
      table{
        width: 550px;
        margin: 0 auto;
        border: 1px solid red;
        border-collapse:collapse;
        text-align: center;
      }
      td,th{
        border: 1px solid red;
      }
    </style>
  </head>
  <body>

    <%
      //从数据库中查询
      List<Emp> list = new ArrayList<>();
      list.add(new Emp(1, "张无忌", "经理", new Date(), 5000.0));
      list.add(new Emp(2, "赵敏", "主管", new Date(), 3000.0));
      list.add(new Emp(3, "金毛狮王", "职员", new Date(), 2000.0));
      list.add(new Emp(4, "灭绝师太", "职员", new Date(), 2000.0));
      list.add(new Emp(5, "周芷若", "总监", new Date(), 8000.0));
    %>

    <table>
      <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>职位</th>
        <th>生日</th>
        <th>工资</th>
      </tr>

      <% SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); %>
      <% for (Emp emp : list) {%>

      <tr>
        <td><%out.write(emp.getId()+"");%></td>
        <td><%out.write(emp.getName());%></td>
        <td><%out.write(emp.getPosition());%></td>
        <td><%out.write(sdf.format(emp.getBirthday()));%></td>
        <td><%out.write(emp.getSalary()+"");%></td>
      </tr>

      <% }%>
    </table>
  </body>
</html>
 3.JSP执行原理及流程
  • JSP看似是HTML代码,看似是页面,但其实是一种后端技术。

  • 当我们第一发送请求访问jsp资源时,Tomcat服务器中的JSP加载引擎会将该JSP资源转换成一个 .java 文件(Servlet)。

  • 这个 .java文件其实就是一个Servlet,在这个Servlet中已经将写在JSP中的HTML代码以writer.print()的方式编写好了,然后将数据响应给浏览器的。

  • JSP本质上就是一个Servlet,JSP中的HTML代码就相当于我们之前在Servlet中写的writer.write()代码。

 4.JSP执行过程

JSP的执行过程大致可以分为三个时期:转换、编译、执行。

 

转换/翻译(translation):Tomcat中的JSP引擎将JSP网页转换成Servlet,得到一个.java文件。

编译(compile):通过javac命令将.java文件编译成 .class文件。

运行:运行.class字节码文件,处理请求。 具体运行过程:

  1. 浏览器发起请求访问jsp。

  2. Tomcat服务器接收到请求后调用对应的Servlet处理请求,调用JspServlet。

  3. JspServlet将请求的jsp文件转换成对应的Java文件并完成编译。

  4. 将编译后的class文件加载到内存并执行,其实就是运行一个Servlet。

  5. 最后得到结果数据响应浏览器

 

5.JSP加载引擎

 查看Tomcat conf/web.xml文件发现,这里默认配置了一个JSP的加载引擎-JspServlet。

引擎作用: 转换JSP页面:将JSP页面转换成一个Servlet。

编译JSP对应的Java文件:JSP引擎调用Java编译器对这个Servlet进行编译,得到可执行文件class。

请求处理:JSP引擎调用java虚拟机来解释执行class文件,得到结果响应浏览器。

 6.JSP的继承结构

JSP文件转换成JAVA代码之后,它默认继承了HttpJspBase,实现了JspSourceDependent,和JspSourceImports两个接口,其中HttpJspBase又继承了HttpServlet ,也就是说,JSP本质上就是一个Servlet。

  • HttpJSPBase重写了init,service和destory方法。

  • 并且自定义了 jspInit, jspService, jspDestory。

  • 然后在重写的init方法中调用了 JSPInit,在重写的service方法中调用了 jspService,在重写的destory方法中调用了 jspDestory。

  • 我们JSP的文件编译成JAVA代码后,继承HttpJspBase重写的方法是 jspInit, jspService, jspService。

 

7.JSP的注释

JSP中可以写HTML、Java、CSS、JS代码,那么也就可以写这些语言的注释,并且JSP也有自己的注释方式。

注释类型进入转译文件响应给浏览器
JSP注释nono
JAVA注释yesno
HTML,css,js注释yesyes

JSP的注释格式是:<%--注释内容--%>不同的注释是有差异的

 <%-- jsp独有的注释 --%>
    <!-- html中注释 -->

    <%
        // 单行注释
        /*
            多行注释
         */
        /**
         * 文档注释
         */
    %>

    <%--
        声明脚本
        编写的内容出现在类中:
            变量(全局变量)
            方法
            类中可以编写的其他内容
    --%>
    <%!
        int i = 100;
        {}
        static {}
        public void aa(){}
    %>
    <%--
        小脚本
        编写的内容出现在_jspService方法中:
            变量(局部变量)
            方法中可以编写的其他内容
    --%>
    <%
        int j = 200;
       // int a = 1/0;
        UserServiceImpl userService = new UserServiceImpl();

    %>
    <%--
        输出脚本
        编写的内容出现在_jspService方法中:
            将指定的内容直接响应
    --%>
    <%= "aa" %>
    <% out.print("aa"); %>
8. JSP使用建议
  • JSP和Servlet本质上是相同的。所以说,JSP页面功能和Servlet中功能完全可以互换。

  • JSP的编码风格是在HTML中嵌入少量的Java代码,它用于展示数据比较方便。

  • Servlet适合编写Java代码。

  • 所以在MVC分层上,我们往往将Servlet作为控制层,将JSP作为视图层。

  • 以后通过Servlet去处理请求,得到结果,然后通过JSP来进行结果展示。

 

二、JSP的常用指令标签

1.概述

        指令标签是JSP页面上的一种特殊标签,JSP指令可以用来设置整个JSP页面相关的属性,如网页的编码方式、网页使用的脚本语言、导包等。

<%@ directive attribute="value" %>
 2.JSP中的三种指令标签
指令描述
<%@ page %>定义网页依赖属性,如脚本语言、error页面、缓存需求等等
<%@ include %>包含其他文件
<%@ taglib %>引入标签库的定义
3.page指令标签
属性描述
buffer指定out对象使用缓冲区的大小
autoFlush控制out对象的 缓存区
contentType指定当前JSP页面的MIME类型和字符编码
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页
extends指定servlet从哪一个类继承
import导入要使用的Java类
info定义JSP页面的描述信息
session指定JSP页面是否使用session,默认是使用
isELIgnored指定是否执行EL表达式
4.include指令标签
  • JSP可以通过include指令来包含其他文件。被包含的文件可以是jsp文件、HTML文件或文本文件。

  • 包含的文件就像是jsp文件的一部分,会被同时编译执行。

  • 除了使用include指令标签可以实现引入外,使用jsp:include动作也可以实现引入。

5.taglib指令标签

 taglib就是标签库的意思,我们可以在jsp页面中引入其他的标签库,帮我们去快速简单的做一些事情,后面JSTL标。

<%@ taglib uri="uri" prefix="prefixOfTag" %>

三、JSP内置对象

1. 什么是内置对象

JSP给我们准备好了九个可以直接使用而不用我们自己去new的对象,这九个对象我们称之为内置对象。 内置对象完全由JSP自行去维护, 我们直接使用即可。

2.九大内置对象

 四个域对象

pageContext                              page域                                 当前页面内可用。                    request                                     reqeust域                                  一次请求。                              session                                    session域                          一次会话, 多次请求。                  application                            application域                         整个项目运行, 多次请求, 多次会话。  

响应对象 response 响应对象。

输出流对象 out 打印流对象。

其他三个对象 servletConfig 由于JSP本身也是一个Servlet,所以容器也会给我们准备一个ServletConfig。 page 就是JSP转换的Servlet的对象,也就是当前JSP对象本身 。 exception 异常对象,在错误提示页上使用,当isErrorpage=true 才具有该对象。

注意事项:

response对象 当服务器创建request对象时会同时创建用于响应客户端的response对象。

out对象 是 JspWriter 类的实例,不是PrinterWriter的实例;用来在response对象中写入内容。JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter增了一些专为处理缓存而设计的方法。另外JspWriter类会抛出IOExceptions异常。 最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作。可以在page指令中使用。buffered='false'属性来轻松关闭缓存。

pageContext对象 PageContext类的实例,用来代表整个JSP页面;提供对JSP页面所有对象以及命名空间的访问。

3.Servlet与JSP的联系与区别

联系:

  1. JSP和Servlet都是Sun公司推出的动态网页技术。

  2. 基于Servlet开发页面的繁琐性,推出JSP来简化页面开发。

  3. JSP本质上是一个Servlet,会翻译成一个Servlet。

区别:

  1. JSP使人们把显示和逻辑分隔成为可能,这意味着两者的开发可并行进行;而Servlet并没有把两者分开。

  2. JSP是在HTML代码里写JAVA代码,框架是HTML;而Servlet是在JAVA代码中写HTML代码,本身是个JAVA类。

  3. Servlet需要在web.xml中配置,而JSP无需配置。

  4. 目前JSP主要用在视图层负责显示,而Servlet主要用在控制层负责调度

强调

JSP表面上是一个HTML,本质上是一个Servlet。

4.JSP使用总结
  1. 创建Jsp文件,在项目的web目录下创建。

  2. 使用page指令设置Jsp的转译细节(一般自动生成的就够用)。

  3. 使用tablib指令引入第三方的自定义标签来使用(JSTL标签)。

  4. 使用HTML,CSS,JQuery完成页面的开发。

  5. 使用<%%>声明java脚本片段完成数据的动态拼接。

    1. <%%>:生成在_jspService()方法中

    2. <%! %>:生成在类中

    3. <%= %>:生成在_jspService()方法中,输出

  6. 获取request或者session中的数据拼接到当前页面中(内置对象)。 

四、EL表达式学习

1.EL表达式引入

        虽然Servlet结合jsp的方式已经极大的简化了我们开发功能和页面的操作。但在jsp页面中取域中的数据要使用<%%>和HTML代码进行拼接的方式展示数据,还是比较麻烦,而且不利于阅读 。可以在jsp页面中使用EL表达式来获取域对象中的数据

EL表达式:获取数据(域,参数,cookie, ...)
2.特点
  1. 可以获取作用域对象中的数据。

  2. 底层使用的是反射,在使用的时候可以通过键名即可获取对应的值。

  3. 简化了在jsp页面中使用<%%>获取域对象数据的方式。

 3.使用

基本语法

  1. ${键名},键名是域对象中存储的数据的键。

  2. ${键名.属性名.属性名…},可以获取域对象中级联属性的值。

  3. ${键名[角标]},获取域对象中存储的list集合或者数组中指定角标的数据。

  4. 注意:${}不仅可获取域对象中的数据,而且会将该数据打印到浏览器中。如果获取不到数据,也不会报错,只是不显示而已。作用域数据查找顺序

使用EL表达式获取域数据的时候,如果没有指明作用域,那会按照作用域由小到大的顺序去找,直到找到为止: ​ pageContext ---> request ---> session ---> application

语法格式:
    1.获取域对象中数据
        ${requestScope.key}
        ${sessionScope.key}
        ${applicationScope.key}
        ${key}:先从请求域中获取,获取到,直接返回,
                获取不到,在会话域中获取,获取到直接返回,
                获取不到,在应用域中获取,获取到直接返回,
                获取不到,返回空串。
    2.获取地址栏参数
        ${param.参数名}
    3.获取Cookie中数据

指定获取某个作用域中的数据

  • ${pageScope.键名} 获取page域对象中的数据

  • ${requestScope.键名} 获取request域对象中的数据

  • ${sessionScope.键名} 获取session域对象中的数据

  • ${applicationScope.键名} 获取application域对象中的数据

获取request对象中的请求数据

${param.键名},可以获取request中携带的请求参数的数据

获取request对象中Cookie的key value

${cookie.JSESSIONID.name}

${cookie.JSESSIONID.value}

EL表达式可以使用比较运算和算术运算

${键名 逻辑运算符 键名} ​ ${键名 算术运算符 键名} 注意: + 表示的是算术运算,而不是字符串拼接。

五、JSTL标签库学习

1.JSTL标签库引入

        如果要循环输出一个list集合的数据,还得在jsp页面使用<%%>的形式写java代码来完成!比较麻烦。可以使用JSTL标签来完成一些例如循环、判断等情况的与数据输出。

        JSTL的作用就是:替换在Jsp中声明的Java逻辑代码。

        JSTL标签:将EL获取到的数据进行相关的操作
2.使用

使用步骤:

  1. 在项目中导入JSTL的jar包。

  2. 在jsp页面中通过taglib指令引入jstl标签库。

  3. 使用jstl标签完成开发。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    request.setAttribute("gender", "0");
%>
<%--
    c:if 标签的作用就相当于Java中的if判断
    格式是: <c:if test="${EL 比较运算符 值}">条件成立输出的内容</c:if>
--%>
<c:if test="${gender == '0'}">
    性别是男。
</c:if>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:forEach items="${list}" var="emp">
        ${emp.id}---${emp.name}---${emp.position} <br>
    </c:forEach>

    <c:forEach begin="0" end="10" var="i" step="1" varStatus="status">
        ${i} --- ${status.index}
    </c:forEach>
</body>
</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值