JavaEE:day2 JSP的基本原理、语法

本文深入讲解JSP技术的基础原理及应用实践,包括JSP的工作流程、页面元素、语法结构及九大隐式对象等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSP的基本原理

什么是JSP

  • jsp是一种用来开发动态web资源的技术。
  • jsp的最大特点在于写jsp就像写html,但html只能提供静态数据,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据

JSP原理

  • IE浏览器访问jsp页面时,Web服务器是如何调用并执行一个jsp页面的?(Servlet)
  • JSP页面中的java代码服务器是如何执行的?

    (先找到jsp页面,然后tomcat会生成一个jsp对应的java文件编译成class字节码的文件。然后加载class字节码文件,调用jsp的service方法。然后产生结果,并且把结果写回到client)

  • Web服务器在执行jsp页面时,是如何把Jsp页面中的html排版标签发送到客户端的?

    (Out输出流,代码打印输出到Client)

  • Web服务器在调用jsp时,会给jsp提供一些什么java对象?

JSP最佳实践

  • 我们习惯于把Servlet作为web应用中的控制器组件来使用,而把jsp作为数据显示模板来使用
  • Servlet只负责响应请求产生数据,并且把数据通过转发技术带给jsp,数据的显示jsp来做

JSP语法

JSP模板元素

  • JSP页面中的HTML内容称之为JSP模板元素
  • JSP模板元素定义了网页的显示基本骨架,即定义了页面的结构

JSP表达式

  • 语法:<%= 变量或表达式字符串常量 %>
    举例: <%= new java.util.Date()%>
  • JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print()将数据输给客户端
  • JSP脚本表达式中的变量或表达式后面不能有分好(;)

JSP脚本片段

  • JSP脚本片段用于在JSP页面中编写多行java代码
    <%
    多行java代码
    %>
  • JSP脚本片段中只能出现java代码,不能出现其他模板元素
    JSP引擎在翻译JSP页面时,会将其中的java代码原封不动的放到Servlet的_jspService中。
  • 脚本片段中的多行java代码,最终被翻译到jspservice的方法体中
  • 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
  • 单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句

JSP声明

  • JSP页面中编写的所有代码,默认会翻译到Servlet的service方法中,而JSP声明中的java代码被翻译到_jspService方法的外面。语法:
    <%!
    java代码
    %>
  • 所以,JSP声明可以用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法
  • 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明汇总
  • JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象

什么是隐式对象?

JSP的隐式对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。

JSP注释

  • JSP注释的格式:
    <%– 注释信息 –%>
  • JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。

JSP指令

  • JSP指令是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分
  • JSP指令的基本语法格式
    <%@ 指令 属性名=“值”%>
    举例:
    <%@ page contenttype=“text/html,charset=gb2312”%>
  • 如果一个指令有多个属性,那么这多个属性可以写在一个指令中,也可以分开来写

page指令

  • page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
<%@ page 
    [ language="java" ] 
    [ extends="package.class" ] 
    [ import="{package.class | package.*}, ..." ] 
    [ session=“true | false” ]//true创建session对象 
    [ buffer="none | 8kb | sizekb" ] 
    [ autoFlush="true | false" ] 
    [ info="text" ] 
    [ errorPage="relative_url" ] 
    [ isErrorPage="true | false" ] 
    [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 
    [ pageEncoding="characterSet | ISO-8859-1" ] 
%>

Include指令

  • include指令用于引入其他JSP页面,如果使用include指令引入的其他JSP页面,那么JSP引擎将把这两个JSP翻译成一个Servlet。所以include指令引入同城也称之为静态引入
  • 语法:
    <%@ include file=“被包含组件的绝对URL或相对URL”%>
    其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
  • 被引入的文件必须遵循JSP语法
  • 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见名知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
  • 由于使用include指令将会设计到2个JSP页面,并会把2个JSP翻译成一个Servlet,所以这2个JSP页面的指令不能冲突(除了pageEncodeing和导包除外)

JSP运行原理和九大隐式对象

  • JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
  • 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
  • JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
  • request: HttpServletRequest
  • response: HttpServletResponse
  • config: ServletConfig
  • application :ServletContext
  • exception: Throwable
  • Session:HttpSession
  • page: this Object
  • out
    out隐式对象用于向客户端发送文本数据
    out对象是通过调用怕个Context对象的getOut方法返回的,其作用和用法和ServletResponse.getWriter方法非常相似。
    JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
    只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
    • 设置page指令的buffer属性关闭了out对象的缓存功能
    • out对象的缓冲区已满
  • 整个JSP页面结束

  • pageContext

taglib指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值