06JSP技术

1. JSP概述

1.1 什么是JSP

  • JSP(Java Server Page):Java服务端页面,是Servlet更高级别的扩展,是一种动态的网页技术。其中,HTML代码用于实现网页中静态内容的显示,Java代码用于实现网页中动态内容的显示。也就是JSP = HTML + Java

  • 特点:

    • 跨平台:jsp是基于Java开发的
    • 业务代码分离:将页面的开发与应用程序的开发分离开
    • 组件重用:使用JavaBean编写业务组件,也就是使用一个JavaBean封装业务处理代码或者作为一个数据存储模型,在整个项目中,都可以重复使用
    • 预编译:第一次通过浏览器访问页面时,服务器对jsp页面进行编译,仅执行一次编译。下次访问时,直接执行编译好的代码

1.2 运行原理

在这里插入图片描述

  • 流程

    • 浏览器第一次访问timeInfo.jsp页面
    • 服务器会将timeInfo.jsp转换为名为timeInfo_jsp.java的一个Servlet
    • 服务器再将转换的servlet编译成字节码文件timeInfo_jsp.class
    • 服务器会执行该字节码文件创建一个该Servlet的实例,并执行Servlet的jspInit()方法完成初始化,jspInit()在整个servlet生命周期中只执行一次,向外提供服务
  • 对于每一个请求,jsp容器都会创建一个新的线程来处理它,使每一个客户端请求都对应一个线程

  • 如果jsp文件被修改,服务器将根据新的设置决定是否对该文件进行重新编译

  • 响应对象由JSP容器接收,并将HTML格式的响应信息发送回给客户端

  • 如果系统资源不足,jsp容器可能回将servlet实例从内存中移除,发生这种情况时,jsp容器会调用jspDestory()方法

  • 打开timeInfo_jsp.java文件查看源代码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9fg3XqH-1681126102956)(C:\Users\吴浩颖\AppData\Roaming\Typora\typora-user-images\image-20230404230420616.png)]

    • _jspService()方法中往浏览器写标签的代码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X9B1hA2D-1681126102957)(C:\Users\吴浩颖\AppData\Roaming\Typora\typora-user-images\image-20230404230506110.png)]

    • HttpJspBase

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IuTKj2iM-1681126102958)(C:\Users\吴浩颖\AppData\Roaming\Typora\typora-user-images\image-20230404225657148.png)]

2. JSP基本语法

2.1 JSP页面的基本构成

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        Date date = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String today = df.format(date);
    %>
    当前时间:<%=today%>
</body>
</html>

2.2 JSP脚本元素

  • JSP Scriptlets:主要是用于输出内容的,内容会直接放到_jspService()方法之中

    <% java代码(变量、方法、表达式等)%>
    
  • 声明标识:用于定义属性和方法的,内容会放到_jspService()方法之外,被类直接包含

    <%! 定义变量或方法等 %>
    <!--声明标识中创建的变量和方法在当前页面中有效,生命周期是从创建开始到服务器结束,代码判断创建的变量或方法在页面关闭后就会销毁-->
    
  • JSP表达式:用于向页面输出信息,内容会放到out.print()之中,作为该方法的参数

    <%= 表达式%>
    <!--注意:'<%='是一个完整的符号,之间不能有空格,且jsp表达式的中的变量或表达式后面不能加分号(;)-->
    

2.3 JSP注释

  • 带有JSP表达式的注释

    • 单行注释

      //注释内容
      
    • 多行注释

      /*
      	注释内容
      */
      
    • 提示文档注释

      /**
      	提示信息
      	提示文档注释所注释的内容,服务器不会做任何处理
      */
      
      
  • 隐藏注释

    <%--注释内容--%>
    
    • 隐藏注释在浏览器页面中看不到,在查看页面源代码时也看不到,有着较高的安全性
    • 因为Tomcat编译jsp时会将html注释当成普通文本发送到客户端,而隐藏注释的内容会被忽略,不会发送到客户端
  • 动态注释

    <!--<%= 表达式%>-->
    
    

3. JSP指令

3.1 page指令

  • 语法格式

    <%@ page 属性名1="属性值1" 属性名2="属性值2" ... %>
    
  • 常用属性

    属性名称取值范围描述
    languagejava指定jsp页面所用的脚本语言,默认为java
    import任何包名、类名指定在jsp页面翻译成Servlet源文件中导入的包或类,一个import可以引用多个类,用’,'隔开
    sessiontrue、false是否内置Session对象,true说明内置,可直接使用,默认为true
    isErrorPagetrue、false该页面是否为错误处理页面,如果为true,则jsp内置有一个Exception的对象,可直接使用,默认为false
    errorPage某个jsp页面的相对页面指定一个错误页面,如果该jsp程序抛出一个未捕捉的异常,则转到指定的页面
    contentType有效的文档类型指定当前jsp页面的MIME类型和字符编码
    pageEncoding当前页面指定页面编码格式
    • 注意:除了import属性外,其他属性都只能出现一次,否则会编译失败

3.2 include指令

  • 有时需要在jsp页面中包含另一个jsp页面,这时可通过include指令实现
<%@ include file="被包含的文件地址"%>
<!--插入文件的路径一般不以'/'开头,而是使用相对路径-->
  • 常见问题:
    • 被引入的文件必须遵循jsp语法
    • 除指令元素外,被引入文件中的其他元素都被转换成相应的Java代码,然后插入当前jsp页面的Servlet源文件中,插入位置与指令在当前jsp中的位置保持一致
    • file属性如果以'/'开头,表示相当于当前Web应用程序的根目录(不是站点根目录);这里指定的相对路径是相对于文件,而不是相对于页面
    • 在应用include指令进行文件包含时,建议在被包含页面中将、等标签删除

3.3 taglib指令

  • 标识该页面中所使用的标签库,同时引用标签库并制定标签的前缀
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!--
	prefix:用于指定标签的前缀,该前缀不能命名为jsp、jspx、java、sun、servlet和sunw
	uri:用于指定标签库文件的存放位置
-->

4. JSP动作元素

4.1 包含文件元素 <jsp:include>

  • 用于向当前页面引入其他的文件,可以是动态文件,也可以是静态文件
<jsp:include page="URL" flush="true|false" />
<!--
	page:指定被引入文件的相对路径
	flush:指定是否将当前页面的输出内容刷新到客户端,默认为false
-->
  • 原理:将被包含页面编译处理后的结果包含在当前页面中

  • include指令与<jsp:include>动作元素的区别

    • include指令的file属性不支持任何表达式;<jsp:include>的page属性支持jsp表达式
    • 使用include指令,被包含文件内容会原封不动地插入包含页中,然后jsp编译器再将合成后的文件编译成一个Java文件;使用<jsp:include>包含文件时,当该元素被执行时,程序会将请求转发到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页,继续执行后面的代码
    • 使用include指令时,包含文件和被包含文件不能有重复的变量名或方法;而<jsp:include>是允许的
  • 注意:<jsp:include>对静态文件和动态文件的处理方式:

    • 静态文件:包含页面执行后,在使用动作元素的位置将会输出被包含文件的内容
    • 动态文件:jsp编译器将编译并执行被包含文件

4.2 请求转发元素<jsp:forward>

  • 将当前请求转发到其他Web资源,执行转发请求之后,当前页面将不再执行,而是执行该元素指定的目标页面
<jsp:forward page="relativeURL" />
<!--page属性:指定请求转发到资源的相对路径,该路径的目标文件必须是当前应用中的内部资源-->
  • 因为请求转发是服务器端的操作,浏览器并不知道请求的页面,所以浏览器的地址栏不会发生变化

5. JSP隐式对象

5.1 隐式对象的概述

名称类型描述
outjavax.servlet.jsp.JspWriter用于页面输出
requestjavax.servlet.http.HttpServletRequest得到用户请求信息
responsejavax.servlet.http.HttpServletResponse服务器向客户端的回应信息
configjavax.servlet.ServletConfig服务器配置,可以取得初始化参数
sessionjavax.servlet.http.HttpSession用于保存用户的信息
applicationjavax.servlet.ServletContext所有用户的共享信息
pagejava.lang.Object指当前页面转换后的Servlet类的实例
pageContextjavax.servlet.jsp.PageContextJSP的页面容器
exceptionjava.lang.Throwable表示JSP页面所发生的异常,在错误页中才起到作用

5.2 out对象

  • out对象的类型为JspWriter,它相当于带缓存功能的PrintWriter

在这里插入图片描述

  • 由图可知,在JSP页面中,通过out隐式对象写入数据相当于将数据插入JspWriter对象的缓冲区中只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入Servlet引擎所提供的缓冲区中。Servlet引擎按照缓冲区中的数据存放顺序输出内容

  • 使用Page指令设置out对象缓冲区的大小

    <%@ page buffer="0kb" %>
    <!--当写入out对象中的内容充满了out对象的缓冲区时,out对象中输入缓冲区的数据也会真正写入Servlet引擎提供的缓冲区中-->
    

5.3 pageContext对象

//获取out隐式对象
JspWriter getOut()
//获取page隐式对象
Object getPage()
//获取request隐式对象
ServletRequest getRequest()
//获取response隐式对象
ServletResponse getResponse()
//获取session隐式对象
HttpSession getSession()
//获取exception隐式对象
Exception getException()
//获取config隐式对象
ServletConfig getServletConfig()
//获取application隐式对象
ServletContext getServletContext()
//设置pageContext对象的属性
void setAttribute(String name, Object value, int scope)
//获取pageContext对象的属性
Object getAttribute(String name, int scope)
//删除指定范围内名称为name的属性
void removeAttribute(String name, int scope)
//删除所有范围内名称为name的属性
void removeAttribute(String name)
/*
	从4个域对象中查找名称为name的属性
	查找顺序:page、 request、 session、 application
	如果找到,返回属性的名称,否则返回null
*/
Object findAttribute(String name)
    
	/*
		scope:属性的作用范围
			pageContext.PAGE_SCOPE:表示页面范围
			pageContext.REQUEST_SCOPE:表示请求范围
			pageContext.SESSION_SCOPE:表示会话范围
			pageContext.APPLICATION_SCOPE:表示Web应用程序范围
	*/

5.4 exception对象

  • exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage="true"%>的页面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CL3

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

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

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

打赏作者

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

抵扣说明:

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

余额充值