我们在JSP页面上,可以通过一对<%%>标签在页面上嵌入JAVA代码.请求JSP页面时,会执行嵌入的JAVA代码,这样就可以让页面上的资源动态生成.
JSP的执行过程大致可以分为三个时期:转译、编译、执行
转译/翻译(Translation ):
JSP网页转译成Servlet,生成.java文件,然后进行编译生成.class字节码文件
编译(Compile):
JSP网页转译成Servlet,生成.java文件,然后进行编译生成.class字节码文件
运行(Request ):
运行.class字节码文件,处理请求。
1、浏览器发起.jsp的请求
2、TOMCAT服务器接收到请求后调用对应的Servlet处理请求,调用JspServlet
3、JspServlet将请求的Jsp文件转译为对应的java文件并完成编译
4、将.class字节码文件加载进入内存并执行,其实就是在运行一个Servlet
5、通过Response对象将数据响应给浏览器
主要是将逻辑从servlet中分离出来,体现了HTML语法可以嵌入java编码的扩展
客户端第一次访问jsp资源时,会向一个servlet发送请求,servlet再把以.jsp文件转换为.java
文件,相当于自动生成了一个servlet,再又servlet编译,将数据响应给浏览器
① Jsp经编译后就变成了Servlet
② Jsp更擅长表现页面显示,servlet更擅长逻辑控制
③ Servlet中没有内置对象,jsp中的内置对象都是必须通过HttpServletResponse对象以及HttpServlet对象得到
④ Servlet则是个完整的java类,这个类的servlet方法用于生成对客户端的响应
Page指令作用:定义网页依赖属性
① contentType属性的作用:告知浏览器以什么格式编码和解析
② language属性的作用:设置jsp页面转换语言
③ import属性的作用:导包
④ pageEncoding属性的作用:在转换成java代码时使用的编码
⑤ errorPage属性的作用:指定错误页,当页面发生错误时,指定跳转的页面
⑥ isErrorPage属性的作用:指定当前页为错误提示页,当前页面可以接收异常对象
静态引入@include:被引入的网页和当前页生成代码后形成一个java文件
动态引入jsp:include:被引入的jsp页面会生成独立的java代码
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。Taglib指令引入一
个自定义标签集合的定义,包括库路径、自定义标签。
语法:
<%@ taglib uri=“uri” prefix=“prefixOfTag” %>
四个域对象
pageContext page域 当前页面内可用
request reqeust域 单次请求
session session域 单次会话
application application 域项目运行
响应对象
response 响应对象
输出流对象
out 打印流对象
其他三个对象
servletConfig: 由于JSP本身也是一个Servlet,所以容器也会给我们准备一个ServletConfig
page 就是他this对象 当前JSP对象本身
exception 异常对象,在错误提示页上使用,当isErrorpage=true 才具有该对象
10.Servlet与JSP的联系和区别
JSP和Servlet都是Sun公司推出的动态网页技术
基于Servlet开发页面的繁琐性,推出JSP来简化页面开发
JSP本质上是一个Servlet,会翻译成一个Servlet
JSP使人们把显示和逻辑分隔成为可能,这意味着两者的开发可并行进行;而Servlet并没有把两者分开。
JSP是在HTML代码里写JAVA代码,框架是HTML;而Servlet是在JAVA代码中写HTML代码,本身是个JAVA类。
Servlet需要在web.xml中配置,而JSP无需配置。
目前JSP主要用在视图层负责显示,而Servlet主要用在控制层负责调度
JSP表面上是一个HTML,本质上是一个Servlet
① 创建Jsp文件,在项目的web目录下创建。
② 使用page指令设置Jsp的转译细节(一般自动生成的就够用)
③ 使用tablib指令引入第三方的自定义标签来使用(JSTL标签)
④ 使用HTML,CSS,JQuery完成页面的开发
⑤ 使用<%%>声明java脚本片段完成数据的动态拼接
⑥ 获取request或者session中的数据拼接到当前页面中(内置对象)
① 只能获取作用域对象中的资源
② 底层使用的是反射,我们直接声明作用域中的键名以及键对应的资源的属性名以此 类推即可获取数据
③ 简化了JSP中获取作用域资源的方式。
① 只能获取作用域对象中的资源
② 底层使用反射
③ 简化了jsp中获取作用域资源的方式
① 基本语法:
${键名},键名为作用域对象中存储的键值对数据的键名
${键名.属性名.属性名…},获取作用域中存储的数据的属性的属性的值
${键名[角标]},获取作用域中存储的list集合或者数组中指定角标的数据
注意:
在jsp页面使用EL表达式获取作用域数据自带输出功能,可以任意的嵌 套在前端代码中使用。如果作用域中没有对应的数据则什么都不显示也不 报错。
② 作用域数据查找流程
如果没有指明作用域的情况下,使用EL表达式获取作用域对象中的数据,也就是
直接使用${键名}获取数据。则底层会先从小到大依次查找数据,找打了则不再找, 直接显示,都没有找到则什么都不显示:
pageContext–>request–>session—>application
③ 指定获取某个作用域中的数据
${requestScope.键名} 指明获取request作用域对象中的资源
${sessionScope.键名} 指明获取session作用域对象中的资源
${applicationScope.键名} 指明获取application作用域对象中的资源
④ 获取request对象中的请求数据
${param.键名}
此种方式可以在Jsp中获取request对象中封装的请求实体数据。
⑤ 在EL表达式中可以使用逻辑表达式和算术运算:
${键名 逻辑表达式 键名}
${键名 算术表达式 键名}
注意:”+”符号只代表算术运算,不代表字符串拼接。
部分代码
获取普通字符串数据==== :${str}JSTL标签库是第三方发明的自定义的标签,每个标签都有自己特定的含义表示一个具 体的java逻辑。我们要在JSP中使用JSTL必须使用taglib标签引入第三方标签资源。
① 在页面里使用jstl标签可以使用像HTML标签一样,增加了阅读性
② 将业务封装到jstl可以很方便的重用
③ 将数据与显示分离
④ 简化了jsp的web应用系统的开发,并且使得jsp页面更加美观
⑤ 可以对其进行自定义扩展
① 导入jstl的jar包
② 在JSP页面中taglib指令标签引入第三方资源
③ 使用标签完成开发即可。
c:if标签,相当于java逻辑中的if语句
使用:
<c:if test="${EL的逻辑表达式}">
要输出的内容,可以直接声明HTML代码,也可以直接拼接EL表达式
</c:if>
c:foreach标签,相当于java逻辑中的for循环
items:使用EL表达式获取要遍历的数据
var:声明变量名记录每次遍历的结果,并在在循环体中使用EL表达式来获取遍历出
来的数据
begin:设置循环的开始值
end:设置循环结束值
step:设置循环的步长
varStatus:设置遍历记录每次循环的状态,结合EL表达式获取