1、JSP概述
JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示,为了与传统的HTML有所区别,JSP文件的扩展名为.jsp。
JSP技术所开发的Web应用程序是基于Java的,它可以用一种简捷而快速的方法从Java程序生成web页面
2、JSP原理
JSP编译成的Servlet源文件及相应字节码文件存在路径:
C:\Users\<机器用户名>\.IntelliJIdea2018.1\system\tomcat\项目名\work\Catalina\localhost\项目名\org\apache\jsp\
Web容器处理JSP文件请求的执行过程主要包括以下4个部分:
1.客户端发出request请求
2.JSP Container将JSP转译成Servlet的源代码
3.将产生的Servlet源代码经过编译后产生字节码文件,并加载到内存执行
4.把结果response(响应)至客户端
在执行JSP页面时,通常可以分为两个时期:转译时期(Translation Time)和请求时期(Request Time):
转译时期:jsp页面 -> servlet文件 -> class文件
请求时期:将响应结果发送至客户端
注:
1:很多人都会认为JSP的执行性能会和Servlet相差很多,其实如果没有jsp代码更改,执行性能上的差别只在第一次的执行。因为JSP在执行第一次后,会被编译成Servlet的类文件,即.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不再重新把JSP编译成Servelt。因此,除了第一次的编译会花较久的时间之外,之后JSP和Servlet的执行速度就几乎相同了。
2:当JSP网页在执行时,JSP Container会做检查工作,如果发现JSP网页有更新修改时,JSP Container才会再次编译JSP成Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet
3、JSP语法和指令:
基本语法:
代码:<%java代码%> //内部的Java代码会被翻译到service方法的内部
输出:<%=java变量或表达式%> //会被翻译成service方法内部的out.print()参数
声明:<%!java代码%> //会被翻译成servlet的成员的内容
注释:
1)Html注释:<!--注释内容--> //可见范围 jsp源码、翻译后的servlet、页面显示html源码
2)java注释://单行注释 /*多行注释*/ //可见范围 jsp源码 翻译后的servlet
3)jsp注释:<%--注释内容--%> // 可见范围 jsp源码可见
JSP指令:
page指令:属性最多的指令,根据不同的属性,指导整个页面特性
<%@ page 属性1="属性值" 属性2="属性值1,属性值2"......%>
include指令:页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
<%@ include file="被包含的文件地址"%>
taglib指令:在jsp页面中引入自定义标签库(jstl标签库、struts2标签库)
<%@ taglib uri="标签库地址" prefix="前缀"%> [uri: 标签库路径,prefix : 标签库的别名]
JSP动作元素:
页面包含(动态包含):<jsp:include page="被包含的页面"/>
请求转发:<jsp:forward page="要转发的资源" />
参数加入:jsp:param
意思是: 在包含某个页面的时候,或者在跳转某个页面的时候,加入这个参数。
<jsp:forward page="other02.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
静态包含和动态包含的区别:
静态包含只是把被包含页面的信息放到本jsp所编译成的servlet中的out.print()中 (静态包含不能包含自身)
动态包含只是把被包含页面的结果拿来用,最后还是编译成两个java文件,两个字节码文件
4、JSP内置对象:
JSP隐式(内置/预定义)对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用他们而不用显式声明
JSP所支持的9大内置对象:
详情:https://www.w3cschool.cn/jsp/jsp-implicit-objects.html
注:out.write()与response.getWriter().write()的区别:
1、out对象与response对象所属类不同,out对象属于JspWriter类,response.getWriter()对象属于PrintWriter类
2、out对象所输出的内容会先到自身的缓冲区,然后到response缓冲区,然后返回页面;response.getWriter()所输出内容直接到自身缓冲区,然后返回至页面
考虑jsp页面中如下代码:
<body>
aaaaaa
<%="bbbbbb"%>
<%out.write("ccccc");%>
<%response.getWriter().write("dddddddd");%>
</body>
输出:dddddddd aaaaaa bbbbbb ccccc
[解释:tomcat服务器会默认提取response缓冲区中的内容。而out对象本身也有个out缓冲区,前三行执行后要输出的内容先被存到out缓冲区内,然后再转移到response缓冲区中被tomcat服务器提取,所以最后一个方法内容先被输出,然后等到前三个的内容转移到response缓冲区之后再被tomcat服务器刷到页面上,存在一个时间差]
out缓冲区可以通过page指令buffer属性来设置它的缓存区大小,一般默认的是8kb,当我们设置为buffer=“0kb”时,就让out缓冲区存储空间为0,这样out对象输出的内容直接存到response缓冲区中,就不存在时间差了:
<%@page buffer="0kb" %>
输出:aaaaaa bbbbbb ccccc dddddddd