JSP介绍(二)

JSP介绍

什么是JSP

  • jsp (Java Server Page) 是Java EE规范中的Web组件,用来编写动态页面。
  • JSP文件.jsp 为后缀,通常存放在 Eclipse 的工程目录中的 WebContent 目录下,与静态资源使用方式非常相似。
  • 内容构成:JSP 文件中的内容是 HTML 和 Java 代码的结合,静态部分使用 HTML 和文本,动态部分使用 Java 代码。

Web容器处理JSP文件请求的三个阶段

  1. 翻译阶段
    • Web 服务器找到 xxx.jsp 文件,对其进行翻译,生成 xxx_jsp.java 文件。
    • 查看路径:工作空间 work\Catalina\localhost
  2. 编译阶段
    • 服务器将 xxx_jsp.java 编译成类文件(.class),翻译和编译过程遵守 Servlet 规范。
  3. 执行阶段
    • 实例化并提供服务,服务器实例化类,调用类中的 _javaService 方法提供服务。

总结

  • 与Servlet比较:使用 Servlet 生成动态网页比较繁琐,而使用 JSP 生成动态网页则比较便捷,因为其中的静态内容可以直接使用 HTML 生成。
  • 执行过程:JSP 的执行过程是:翻译 -> 编译 -> 实例化 -> 提供服务。
  • 本质:JSP 的本质是 Servlet,只不过是服务器将 JSP 文件进行了翻译和编译;可以说 JSP 也是 Java 的一个类。

JSP语法格式

Page指令

<%@ page 属性1="属性值1" 属性2="属性值2, 属性值3" ... 属性n="属性值n" %>

Include命令

<%@ include file="xxx.jsp" %>

小脚本

<% 
// 这里可以写 Java 代码
%>

输出信息到页面

<%= 表达式 %>

声明

<%! 
// 这里可以定义方法和变量
%>

注释

<%-- 注释内容 --%>

JSP内置对象及4种作用域

什么是内置对象

在 JSP 开发中会频繁使用到一些对象,如果每次在 JSP 页面中使用这些对象都要手动创建就会特别繁琐。为此,Sun 公司在设计 JSP 时,自动帮开发者创建好了这些对象,开发者只需要使用相应的对象调用相应的方法即可。这些系统创建好的对象就叫做内置对象。

9种内置对象

  1. request对象

    • request对象是 javax.servlet.http.HttpServletRequest 类型的对象,该对象代表了客户端的请求信息,主要用于接收通过 HTTP 协议传送到服务器的数据,包括头信息、系统信息、请求方式及请求参数等。
    • request对象的作用域是一次请求。
  2. response对象

    • response代表的是对客户端的响应,主要是将 JSP 容器处理过的数据传回到客户端。
    • response对象也具有作用域,它只在 JSP 页面内有效。
  3. session对象

    • session对象是由服务器自动创建的与客户请求相关的对象,服务器为每个用户都生成一个 session 对象,用于保护该用户的信息,追踪用户的操作状态。
    • session对象内部使用 Map 类来保存数据,因此保存数据的格式为"key/value"。
    • session对象的 value 可以使用复杂的对象类型,而不仅仅局限于字符串类型。
  4. application对象

    • application对象可将信息保存在服务器中,直到服务器关闭,否则 application 对象中保存的信息会在整个应用中都有效。
    • session 对象相比,application 对象生命周期更长,类似于系统的“全局变量”。
  5. out对象

    • out对象用于在 Web 浏览器中输出信息,并且管理应用服务器上的输出缓冲区。
    • 在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清理数据缓冲区中的残余数据,为其他输出让出缓冲空间。
    • 数据输出完毕后,要及时关闭输出流。
  6. pageContext对象

    • pageContext 对象的作用是取得任何范围的参数,通过它可以获得 JSP 页面中的 outrequestresponsesessionapplication 等对象。
    • pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用 pageContext 对象。
  7. config对象

    • config 对象的主要作用是取得服务器的配置信息,通过 pageContext 对象的 getServletConfig() 方法可以获取一个 config 对象。
    • 当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给 Servlet,开发者可以在 web.xml 文件中为应用程序环境中的 Servlet 程序和 JSP 页面提供初始化参数。
  8. page对象

    • page 对象代表 JSP 本身,只有在 JSP 页面内才是合法的。
    • page 隐含对象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的 this
  9. exception对象

    • exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面才可以被使用。
    • 在一般 JSP 页面中使用该对象无法编译 JSP 文件。
    • exception 对象和 Java 的所有对象一样,都具有系统提供的继承结构。
    • exception 对象几乎定义了所有的异常情况,在 Java 程序中可以使用 try/catch 关键字来处理异常情况。
    • 在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送给 page 指令中设置的错误页面中,然后再错误页面中处理相应的 exception 对象。

4种作用域

  • ServletContext:application域
  • HttpServletRequest:request域
  • HttpSession:session域
  • PageContext:page域

JSP与Servlet配合使用

JSP与Servlet的分工

Servlet 和 JSP 本质上是一个东西,但是写法上各有优势。Servlet 中写 Java 代码更方便,JSP 编写页面内容更方便。所以一般会由 Servlet 来负责代码调用,由 JSP 负责数据显示。因此需要将 Servlet 中处理的数据传递到 JSP 上。

跳转方式

响应重定向
  • 响应重定向通过 response 对象调用,让浏览器向重定向的地址重新发送一次请求。
    response.sendRedirect("xxx.jsp");
    
  • 注意:因为是重定向发送新的请求,会导致第一次请求的相关数据在第二次请求中读取不到。如果需要这些数据可以使用请求转发的跳转方式。
请求转发
  • 请求转发通过 request 对象调用,把请求对象和响应对象与跳转地址共享。
    request.getRequestDispatcher("xxx.jsp").forward(request, response);
    

两者区别

  • 转发(常用,效率高)

    • 浏览器URL不变。
    • 服务器行为(服务器内部)。
    • 浏览器只做了一次请求访问。
    • 两次跳转之间传输的信息不会丢失。
  • 重定向

    • 浏览器URL的地址栏改变。
    • 客户端行为。
    • 浏览器做了至少两次访问请求。
    • 两次跳转之间传输的信息会丢失(request范围)。
      请添加图片描述

EL表达式

EL表达式的作用

  • EL 即 Expression Language(表达式语言)。
  • 页面中嵌入 Java 代码容易造成结构混乱,不易阅读和调试。可以使用一些其他技术来提高可阅读性并对原始方法进行优化,如 EL 表达式和 JSTL 标签。
  • EL 表达式的主要作用是从域对象或参数中取值并输出到页面中。

EL表达式特点

  • 自动转换类型:EL 获取某个数据时可以自动转换类型,对于类型的限制更加宽松。
  • 使用简单:相较于在 JSP 页面中嵌套 Java 代码,EL 引用更简单。

EL语法

  • 基本语法:${表达式}

EL表达式示例

  • 在 request 域中存储对象
    request.setAttribute("testuser", myuser);
    
  • 使用 EL 表达式获取域中 user 对象的 username 属性,并输出到页面
    ${testuser.username}
    

EL操作符

  • “.”:获取对象的属性
    ${news.title}
    
  • “[]”:获取集合中的对象
    ${newList[0]}
    

EL表达式中允许使用运算符

请添加图片描述

  • 数学运算符:+, -, *, /, %
  • 逻辑运算符:and, or, not
  • 比较运算符:==, !=, <, >, <=, >=
  • 其他运算符:empty(判断是否为空)

EL表达式隐式对象

EL 表达式包含一些隐式对象。

作用域访问对象

可以用来指定某个域中取值。默认从上到下取值。

  • pageScope

    <% pageContext.setAttribute("name", "a") %>
    ${pageScope.name} <!-- pageScope 代表 page 域中用于保存属性的 Map 对象 -->
    
  • requestScope

    <% request.setAttribute("name", "b") %>
    ${requestScope.name} <!-- requestScope 代表 request 域中用于保存属性的 Map 对象 -->
    
  • sessionScope

    <% session.setAttribute("name", "c") %>
    ${sessionScope.name} <!-- sessionScope 代表 session 域中用于保存属性的 Map 对象 -->
    
  • applicationScope

    <% application.setAttribute("name", "d") %>
    ${applicationScope.name} <!-- applicationScope 代表 application 域中用于保存属性的 Map 对象 -->
    
参数访问对象

可指定从 request 的参数部分取值。

  • param

    <!-- param 表示一个保存了所有请求参数的 Map 对象 -->
    ${param.xxx} <!-- 此表达式常用于数据回显 -->
    
    <!-- 以下模拟应用场景为表达提交到后台后校验未通过,回到注册表数据回显 -->
    <!-- ${pageContext.request.contextPath} 取出部署项目名 -->
    <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
      <input type="text" name="username" value="${param.username}">
      <input type="submit" value="注册">
    </form>
    
  • paramValues

    <!-- paramValues 表示一个保存了所有请求参数的 Map 对象,对于某个请求参数,返回的是一个 string[] -->
    ${paramValues.like[0]}
    ${paramValues.like[1]}
    
JSP配置对象
  • pageContext
    <!-- pageContext 对应 JSP 页面中的 pageContext 对象 -->
    ${pageContext} <!-- pageContext.findAttribute("name") -->
    

JSTL标签

JSTL标签的作用

  • EL 表达式主要用于取值和输出功能,需配合 JSTL 标签来完成逻辑控制(条件判断、循环)。
  • JSTL(JavaServer Page Standard Tag Library)是 JSP 基本标签库,主要用来替换页面中逻辑判断相关的代码,常与 EL 表达式配合使用。

JSTL使用

  • 需要的 Jar 包
    • 下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
    • 下载 jstl.jarstandard.jar 包。
  • 在使用 JSTL 的页面中,需要加入 taglib 指令,导入核心标签库
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    

JSTL标签分类

通用标签
  • set:设置指定范围内的变量值

    <c:set var="example" value="${100+1}" scope="session"/>
    
  • out:计算表达式并将结果输出显示

    <c:out value="${example}"/>
    
  • remove:删除指定范围内的变量

    <c:remove var="example" scope="session"/>
    
条件标签
  • if:条件判断语句
    <c:if test="${empty loginUser}" var="islogin" scope="session">
      <!-- test:判断条件,可以将结果保存在域中,var 是 key,scope 是域 -->
      <c:redirect url="testEL.jsp"></c:redirect> <!-- 配合跳转标签使用 -->
    </c:if>
    
    <c:if test="${not islogin}">
      <!-- 对之前保存的判断结果取反,完成 else 结构 -->
      已登录
    </c:if>
    
迭代标签
  • forEach:遍历集合中的元素时使用
    <c:forEach items="${listEntity}" var="myentity">
      <!-- items 是遍历的集合,var 是每次遍历到的对象,每次会存在域中 -->
      <tr>
        <td>${myentity.ename}</td>
        <td>${myentity.eage}</td>
        <td>${myentity.eaddr}</td>
      </tr>
      <!-- 遍历中取值直接使用遍历到并存在域中的 key,通过 EL 表达式取值 -->
    </c:forEach>
    
时间格式化标签
  • fmt:formatDate:显示格式化标签
    <!-- 导入格式化标签库 -->
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    
    <!-- 使用格式化标签 -->
    <fmt:formatDate value="${时间对象}" pattern="yyyy-MM-dd HH:mm:ss"/>
    

JSTL其他标签库

请添加图片描述

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值