小汤学编程之JavaEE学习day03——JSP组成结构、JSP原理、JSP生命周期、JSP九大内置对象、四大作用域、JSP的MVC模式
一、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的执行过程主要可以分为以下几点:
- 客户端发出请求。
- Web容器将JSP转译成Servlet源代码。
- Web容器将产生的源代码进行编译。
- Web容器加载编译后的代码并执行。
- 把执行结果响应至客户端。
三、JSP生命周期
jsp本质是一个Servlet,它比Servlet的生命周期多了一个编译阶段。
- 翻译阶段
- 编译阶段
- 实例化阶段
- 初始化阶段
- 执行阶段
- 销毁阶段
- 回收阶段
四、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模式相关推荐
- 小汤学编程之JavaEE学习day08——Maven
一.Maven介绍 1.什么是Maven 2.Maven的功能 3.什么是构建 4.项目的构建方式 二.Maven的安装 1.下载 2.安装 3.配置 ...
- 小汤学编程之JavaEE学习day06——LayUI
一.LayUI简介 1.下载 2.入门案例 二.栅格布局 三.图标 四.按钮 1.按钮类型 2.主题 3.尺寸 4.圆角 5.按钮组 五.后台布局 六.表格数据 ...
- 小汤学编程之JavaEE学习day07——版本控制工具:SVN、GIT
一.SVN 1.SVN介绍 2.SVN安装 3.SVN操作 二.GIT 1.GIT介绍 2.集中式和分布式 3.GIT的基本使用 4.GIT时光机 5. ...
- 小汤学编程之JavaEE学习day05——会话管理、文件上传与下载、Ajax
一.会话管理 1.HTTP协议 2.会话的概念 3.会话跟踪技术 4.会话跟踪技术分类(四种) 二.文件上传与下载 1.上传 2.下载 3.上传和下载合并优化成 ...
- 小汤学编程之JavaEE学习day01——HTTP简介、B/S与C/S应用、连接的建立与断开、Tomcat
一.HTTP简介 1.HTTP请求报文 2.HTTP响应报文 二.B/S与C/S应用 三.连接的建立与断开 1.连接的建立(三次握手) 2.断开连接(四次挥手) 四.连接的建立与断开 ...
- 小汤学编程之jQuery学习day03——事件、效果、插件
一.事件 1.绑定事件 2.解绑事件 二.效果 1.基本效果 2.淡入淡出 3.自定义效果 三.插件 1.下载地址 2.语法 3.常用的校验 4.案例 ...
- 小汤学编程之JavaEE学习day10——Spring
一.Spring简介 1.特点 2.核心特性 3.两大核心 二.Spring环境搭建 1.导包 2.准备数据库和表.实体类 3.定义dao层接口和接口映射文件 ...
- 小汤学编程之JavaEE学习day09——Mybatis
一.Mybatis简介 1.官网 2.Mybatis是什么 3.有何作用 4.扩展:Hibernate 二.Maven介绍 1.导包 2.准备数据库和表.实体类 ...
- 小汤学编程之JavaEE学习day04——EL表达式、JSTL
一.EL表达式 1.EL表达式简介 2.禁用EL 3.EL中的11个隐式对象 4.EL表达式的作用 二.JSTL 1.引入步骤 2.通用标签 3.条件标签 ...
最新文章
- Android性能优化之提高ListView性能的技巧
- 《WCF技术内幕》翻译2:《WCF技术内幕》绪论
- dex:来自CoreOS的开源身份认证服务解决方案
- LA 6892 The Safe Secret(矩阵连乘)
- 正则表达式之零宽断言
- php恒等符,php学习笔记(三)操作符与控制结构
- PHP中的中文截取乱码问题_gb2312_utf-8
- linux ls 时间显示时间格式,ls -l显示的日期格式如何设定?
- 测试工程师,应当知晓的12项基本原则
- python pandas教程pdf_学习python中的pandas有没有好的教程推荐?
- 黄聪:HBuilder左侧项目管理器如何不与标签页一起自动切换
- Retinex算法介绍
- PHP中MySQLi的配置PHP使用mysqli连接mysql的方法
- 蒟蒻的做题录(时间)
- 用java在画布中绘制六个随机英文字母
- [渝粤教育] 西南科技大学 建筑CAD 在线考试复习资料(1)
- nvidia显卡驱动卸载和卸载后的问题
- linux wget
- java文件删除选择框,从列表框中删除文件
- 区域性电子商务发展的四个机会
热门文章
- 第1章第1节练习题10 查找中位数
- Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念
- MongoDB数据库CXX Driver编译
- stackoverflow favorites
- ICCV2021 Oral | UNO:用于“新类发现”的统一目标函数,简化训练流程!已开源!...
- 垃圾图像分类,街景图像识别!华为云AI主题赛火热招募中!
- 更少的标签,更好的学习,谷歌半监督学习算法FixMatch
- CV Code | 本周新出计算机视觉开源代码汇总(南理SGE 和Intel的实时动作识别很吸引人)...
- 超全机器学习工程师成长路线图,GitHub已收获6400+Star!
- 语义分割江湖的那些事儿——从旷视说起