一、JSP组成结构
二、JSP的原理
1.JSP的运行原理     2.分析JSP所生成的Servlet代码     3.JSP的执行过程
三、JSP生命周期
四、JSP九大内置对象
五、JSP四大作用域
1.request:作用在请求阶段     2.page:作用在某个页面     3.session:作用在整个会话     4.application:作用在整个应用程序
六、MVC模式

jsp全称Java Server Page, 一种动态网页开发技术。它允许使用el表达式、jstl来获取Java代码中的数据,同时允许在jsp中编写html代码,使得jsp可以非常容易的显示页面。Jsp本质是Servlet,最终以Servlet方式运行,所以可以说Jsp是一种特殊的Servlet

一、JSP组成结构

静态内容

HTML静态文本

注释

<!-- HTML注释 -->
<%-- JSP注释 --%>
<% //Java注释 %>

表达式

<%=Math.PI %>

表达式的结果会直接被输出到页面中。要注意表达式的后面不能有;号

代码段Scriptlet

<% Java代码 %>

声明

<%! int a = 0; %>

JSP用来定义页面级变量,以保存信息或定义JSP页面的其余部分可能需要的方法。

指令

用于将有关的页面的特殊处理信息传送到JSP容器。常见的JSP指令分为三种。

<%@ page ... %>page指令:用来导入指定类、编码等

缺省情况下JSP默认自动导入以下四个包中的所有类:java.lang、javax.servlet、javax.servlet.http、javax.serlvet.jsp

属性 缺省值
import 类名或包名
language 脚本语言名称 “java”
contentType MIME类型和字符集 “text/html”
extends 类名
info 文本字符串
session 布尔值 “true”
buffer 缓冲器大小,或none “8kb”
autoFlush 布尔值 “true”
isThreadSafe 布尔值 “true”
errorPage 本地URL
isErrorPage 布尔值 “false”

错误页面的配置除了通过page指令中的errorPage跟isErrorPage来配置外,还可以通过web.xml中来配置全局的错误页面。可以通过错误代码跟错误类型来配置。
通过错误代码配置错误页面:

<error-page><error-code>500</error-code><location>/error.jsp</location>
</error-page>

通过错误类型来配置错误页面:

<error-page><exception-type>java.lang.NullException</exception-type><location>/error.jsp</location>
</error-page>

<%@ include file="URL" %>include指令:用来在jsp文件转换成Servlet时引入其他文件
<%@ taglib ... %>taglib指令:用来定义标签

动作

JSP中定义了若干个标准动作,可以在页面中使用JavaBean组件和有条件的把页面的控制权移到其他页面。

①jsp:useBean:寻找或者实例化一个JavaBean

//声明一个JavaBean:
​<jsp:useBean id="sevenbean" class="com.blb.MyBean" scope="request" />
  • id表示JavaBean的标识,代表了一个JavaBean实例对象
  • class属性值表示JavaBean实例的类的名字,大小写要完全一致
  • scope属性值表示指定JavaBean实例的作用域。取值是page(默认)、request、session、application
  • 整体表示在request范围中获取名称为“sevenbean”的对象,如果能获取到则直接使用,如果获取的是null则新创建一个MyBean对象。

②jsp:setProperty:设置JavaBean的属性

<jsp:setProperty property="age" name="sevenbean" value="18" />

表示给sevenbean这个实例对象的age属性赋值18。

<jsp:setProperty property="age" name="sevenbean" param="ageParam" />

表示给sevenbean这个实例对象的age属性赋值,值通过请求参数request.getParameter(“ageParam” ) 获取到。

<jsp:setProperty property="*" name="sevenbean" />

表示给sevenbean这个实例对象的所有属性进行赋值,值通过请求参数中获取,所以要求请求参数中的参数名称跟bean的属性名必须一样才能自动映射上。

注意:<jsp:setProperty>标签不能单独使用,必须在之前使用<jsp:useBean />标签。

③jsp:getProperty:输出某个JavaBean的属性

<jsp:getProperty name="sevenbean" property="name" />

表示获取sevenbean对象的name属性值并输出,会依次从pageConext、request、session、application范围中寻找。

注意:<jsp:getProperty> 标签不能单独使用,必须在之前使用<jsp:useBean />标签。

④jsp:include:在页面被请求的时候引入一个文件

<jsp:include page="URL" flush="true" />

page属性包含的是一个相对的URL,可以是HTML页面、JSP页面或者是Servlet的url-pattern。flush属性作用是在包含页面前清空在缓冲区中的数据,默认值是true。可以在标签内通过 <jsp:param > 标签来传递参数。

⑤jsp:forward:把请求转到一个新的页面

<jsp:forward page="new URL">

forward动作用于将控制权从JSP页面传递给本地服务器的另一个位置。丢弃当前页面生成的任何内容,并在替换位置上重新处理请求。forward标签只有一个page属性。page属性包含的是一个相对URL ,可以是HTML页面、JSP页面或者是Servlet的url-pattern。

page的值既可以直接给出,也可以在请求的时候动态计算,通过表达式来实现,如:

<jsp:forward page='<%="new"+newNo+".html"%>' >

此标签在传递页面的控制权到另外的页面的时候,可以把相应的参数值传递到目的页面。如果需要传递参数,使用<jsp:param >标签,注意这时必须要使用对标签。把<jsp:param >标签包含在里面。

<jsp:forward page="a_02.jsp"><jsp:param value="zhangsan" name="name"/><jsp:param value="123" name="pwd"/>
</jsp:forward>

静态包含(指令)跟动态包含(动作)的区别:

静态包含 动态包含
原理 先合并再翻译 先翻译再包含
最终编译成java文件的数目 一个 多个
多个文件中能否有相同变量 不允许 允许
语法 <%@inclue file=“被包含的页面”%> <jsp:include page=“被包含的页面”>
参数传递 不能向被包含页面传递参数 可以使用jsp:param标签向被包含页面传递参数

二、JSP的原理

1.JSP的运行原理

WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina<主机名><应用程序名>\”目录中。
其他版本Tomcat的JSP页面翻译成的Servlet的包名为org.apache.jsp.<JSP页面在WEB应用程序内的目录名> 。

JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言,JSP中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写,但是,JSP页面最终必须转换成Java Servlet程序。

可以在WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序,可以加快页面加载速度。事实上,很多公司在将项目给客户演示前都会把页面先访问一遍,使JSP事先编译成Servlet。

2.分析JSP所生成的Servlet代码

JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类是HttpServlet的一个子类,因此JSP页面翻译成的Servlet是HttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法,因此,HttpJspBase类是抽象的。

SUN公司为JSP的WEB容器开发商和JSP页面开发人员提供了一套专门应用于开发JSP程序的Java类,这套Java类被称为JSP API。HttpJspPage接口和JspPage接口属于JSP API,在HttpJspPage接口中只定义了一个_jspService方法,但它继承了JspPage接口,JspPage接口中定义了两个方法:jspInit()和jspDestroy()。
HttpJspBase的init方法调用了jspInit和_jspInit方法,destroy方法内部调用了jspDestroy和_jspDestroy方法,service方法内部调用了_jspService方法。在HttpJspBase中实现的init、service和destroy方法都被声明成了final类型。

JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,JSP脚本片断(位于<%%>内的一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,JSP表达式(位于<%=和%>之中的内容)则是被转换成以其中的变量或表达式作为参数的out.print语句。

3.JSP的执行过程


JSP的执行过程主要可以分为以下几点:

  1. 客户端发出请求。
  2. Web容器将JSP转译成Servlet源代码。
  3. Web容器将产生的源代码进行编译。
  4. Web容器加载编译后的代码并执行。
  5. 把执行结果响应至客户端。

三、JSP生命周期

jsp本质是一个Servlet,它比Servlet的生命周期多了一个编译阶段。

  1. 翻译阶段
  2. 编译阶段
  3. 实例化阶段
  4. 初始化阶段
  5. 执行阶段
  6. 销毁阶段
  7. 回收阶段

四、JSP九大内置对象

内置对象 说明
request HttpServletRequest对象,代表请求
response HttpServletResponse对象,代表响应
out JspWriter对象,代表输出
session HttpSession对象,代表每个会话
application ServletContext应用对象,代表整个应用程序
config ServletConfig配置对象,代表配置文件中的信息
pageContext PageContext对象页面上下文对象,包含页面信息
page 当前页面对象(this)(基本不使用)
exception Throwable异常对象,包含jsp异常信息

五、JSP四大作用域

1.request:作用在请求阶段

设置参数:request.setAttribute("key","value");
获取参数:request.getAttribute("key");

2.page:作用在某个页面

设置参数:pageContext.setAttribute("key","value");
获取参数:pageContext.getAttribute("key");

3.session:作用在整个会话

Servlet中设置参数:request.getSession().setAttribute("key","value");
jsp中设置参数:session.setAttribute("key","value");
获取参数:session.getAttribute("key");

4.application:作用在整个应用程序

Servlet设置参数:request.getServletContext().setAttribute("key","value");
jsp设置参数:application.setAttribute("key","value");
获取参数:application.getAttribute("key");

六、MVC模式

MVC不是一种技术,而是一种思想,一种架构模式,它主要用来将页面、数据、逻辑代码进行分离,更是责任分工的一种体现。
M:Model(模型) JavaBean
V:View(视图) 显示jsp
C:Controller(控制器) Servlet

小汤学编程之JavaEE学习day03——JSP组成结构、JSP原理、JSP生命周期、JSP九大内置对象、四大作用域、JSP的MVC模式相关推荐

  1. 小汤学编程之JavaEE学习day08——Maven

    一.Maven介绍 1.什么是Maven     2.Maven的功能     3.什么是构建     4.项目的构建方式 二.Maven的安装 1.下载     2.安装     3.配置      ...

  2. 小汤学编程之JavaEE学习day06——LayUI

    一.LayUI简介 1.下载     2.入门案例 二.栅格布局 三.图标 四.按钮 1.按钮类型     2.主题     3.尺寸     4.圆角     5.按钮组 五.后台布局 六.表格数据 ...

  3. 小汤学编程之JavaEE学习day07——版本控制工具:SVN、GIT

    一.SVN 1.SVN介绍     2.SVN安装     3.SVN操作 二.GIT 1.GIT介绍     2.集中式和分布式     3.GIT的基本使用     4.GIT时光机     5. ...

  4. 小汤学编程之JavaEE学习day05——会话管理、文件上传与下载、Ajax

    一.会话管理 1.HTTP协议     2.会话的概念     3.会话跟踪技术     4.会话跟踪技术分类(四种) 二.文件上传与下载 1.上传     2.下载     3.上传和下载合并优化成 ...

  5. 小汤学编程之JavaEE学习day01——HTTP简介、B/S与C/S应用、连接的建立与断开、Tomcat

    一.HTTP简介 1.HTTP请求报文     2.HTTP响应报文 二.B/S与C/S应用 三.连接的建立与断开 1.连接的建立(三次握手)     2.断开连接(四次挥手) 四.连接的建立与断开 ...

  6. 小汤学编程之jQuery学习day03——事件、效果、插件

    一.事件 1.绑定事件     2.解绑事件 二.效果 1.基本效果     2.淡入淡出     3.自定义效果 三.插件 1.下载地址     2.语法     3.常用的校验     4.案例 ...

  7. 小汤学编程之JavaEE学习day10——Spring

    一.Spring简介 1.特点     2.核心特性     3.两大核心 二.Spring环境搭建 1.导包     2.准备数据库和表.实体类     3.定义dao层接口和接口映射文件      ...

  8. 小汤学编程之JavaEE学习day09——Mybatis

    一.Mybatis简介 1.官网     2.Mybatis是什么     3.有何作用     4.扩展:Hibernate 二.Maven介绍 1.导包     2.准备数据库和表.实体类    ...

  9. 小汤学编程之JavaEE学习day04——EL表达式、JSTL

    一.EL表达式 1.EL表达式简介     2.禁用EL     3.EL中的11个隐式对象     4.EL表达式的作用 二.JSTL 1.引入步骤     2.通用标签     3.条件标签    ...

最新文章

  1. Android性能优化之提高ListView性能的技巧
  2. 《WCF技术内幕》翻译2:《WCF技术内幕》绪论
  3. dex:来自CoreOS的开源身份认证服务解决方案
  4. LA 6892 The Safe Secret(矩阵连乘)
  5. 正则表达式之零宽断言
  6. php恒等符,php学习笔记(三)操作符与控制结构
  7. PHP中的中文截取乱码问题_gb2312_utf-8
  8. linux ls 时间显示时间格式,ls -l显示的日期格式如何设定?
  9. 测试工程师,应当知晓的12项基本原则
  10. python pandas教程pdf_学习python中的pandas有没有好的教程推荐?
  11. 黄聪:HBuilder左侧项目管理器如何不与标签页一起自动切换
  12. Retinex算法介绍
  13. PHP中MySQLi的配置PHP使用mysqli连接mysql的方法
  14. 蒟蒻的做题录(时间)
  15. 用java在画布中绘制六个随机英文字母
  16. [渝粤教育] 西南科技大学 建筑CAD 在线考试复习资料(1)
  17. nvidia显卡驱动卸载和卸载后的问题
  18. linux wget
  19. java文件删除选择框,从列表框中删除文件
  20. 区域性电子商务发展的四个机会

热门文章

  1. 第1章第1节练习题10 查找中位数
  2. Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念
  3. MongoDB数据库CXX Driver编译
  4. stackoverflow favorites
  5. ICCV2021 Oral | UNO:用于“新类发现”的统一目标函数,简化训练流程!已开源!...
  6. 垃圾图像分类,街景图像识别!华为云AI主题赛火热招募中!
  7. 更少的标签,更好的学习,谷歌半监督学习算法FixMatch
  8. CV Code | 本周新出计算机视觉开源代码汇总(南理SGE 和Intel的实时动作识别很吸引人)...
  9. 超全机器学习工程师成长路线图,GitHub已收获6400+Star!
  10. 语义分割江湖的那些事儿——从旷视说起