1.首先需要明白JSP是什么?
JSP全称为JavaServer Pages.
.
JSP是一个java程序(并且本质上是一个Servlet)
.
Servlet是JavaEE的13个子规范之一,即JSP也是JavaEE的13个子规范之一
.
JSP是一套规范,所有的web服务器都遵循这套规范。
.
每一个web服务器都有内置一个JSP翻译引擎
如图,我们新建了一个index.jsp文件,并清空其内容,直接输入一段字符(随意输入)。
当我们启动服务器并访问此资源时可以在服务器输出局域栏上找到如图一段路径
(CATALINA_BASE后面的路径,我的路径中由于有中文会乱码,实际路径为:C:\Users\chen\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\90f022c8-52f0-46b3-a568-9adeb603cef7)
在这个路径下面继续点击work\Catalina\localhost\Test\org\apache\jsp
(Test为项目的名字,其他的路径名都相同)
如图:
当第一次访问index.jsp时,底层会在目标路径生成一个 index_jsp.java 文件,然后Tomcat服务器会将 index_jsp.java 编译生成 index_jsp.class 文件。
.
访问index.jsp实际上执行的是index_jsp.class中的方法。
JSP实际上就是一个Servlet
-
index.jsp访问的时候,会自动翻译生成index_jsp.java,会自动编译生成index_jsp.class,可知index.jsp就是一个类。
-
index_jsp类继承HttpspBase类,HttpspBase类又继承了HttpServlet类,所以index.jsp就是一个Servlet类。
-
JSP的生命周期和Servlet的生命周期完全相同,没有区别。
-
JSP和Servlet一样都是单例的
JSP和Servlet的区别
主要作用不同:
Servlet的职责:收集数据(Servlet的强项是逻辑处理,业务处理,之后连接数据库,获取或收集数据)
JSP的职责:展示数据(JSP的强项是做数据的展示)
JSP第一次访问为什么比较慢?
因为第一次访问jsp文件的时候
1. 要把jsp文件翻译为生成Java源文件
2. Java源文件要编译生成class字节码文件
3. 再通过class字节码文件取创建Servlet对象
4. 然后调用Servlet对象的init方法
5. 最后调用Servlet对象的service方法
之后访问的时候就可以直接调用单例servlet对象的service方法即可。
JSP调试
直接打开JSP对应的Java源文件,对Java代码进行检查
JSP编译时报错:
当在jsp文件中编译了不合法的字符格式时,依旧会生成java源文件,但不会生成class字节码文件。
2.JSP的基础语法
在jsp文件中直接编写的字符会被保存翻译到java源文件的哪里?
而运行此文件在浏览器上呈现的效果如图:
这就是最开始我们在文件里面编辑的字符
翻译到servlet类的service方法的out.write(“字符目标位置”)
(注意:字符直接被翻译到双引号里面,被Java程序发当作普通字符串打印输出到浏览器)
在JSP中编写的HTML、CSS、JS代码,这些代码对于JSP来看只是一段普通的字符串。但是一旦将这些字符串输出到浏览器,浏览器就会对这些HTML、CSS、JS代码进行解释并执行,展现原有效果。
3.JSP中的基础语法
(1)<% java语句 %>
1. 在这个符号中被编写的被视为java程序,被翻译到Servlet类的service方法体内部
2. 在service当中编写的代码是有执行顺序的,方法体中的代码要遵循自上而下的顺序依次执行。
3. 注意在方法体内部不能编写的代码同样也不能在此符号中编写,否则会报错(例如:静态代码块、方法、定义成员变量等等)。
4. 此符号可以多次使用。
如图:
此时在index.java文件中的位置为:
(2)<%–注释–%>
1. JSP的专业注释,不会被当作普通字符串翻译到Java源文件当中,只存在于index.jsp文件中
2. 区别于<!--注释-->这种属于HTML的注释,依然会被翻译到java源代码当中,不建议使用。
(3)<%!代码 %> (少用,不建议使用)
在此符号当中编写的Java代码会自动翻译到service方法外。
由于在service方法外面编写静态变量和实例变量都会存在线程安全问题,在多线程并发的环境之下,单例的JSP中,一旦静态变量和实例变量发生修改操作,必然会引发线程安全问题。
(4)<% = %>
1. 此符号用于向浏览器输出有Java代码的内容。
2. 如果输出的内容中没有Java代码,可以直接编写在jsp文件中,不需要使用此符号。
3. 这相当于翻译为了out.prin(Java代码);
4. 编译到了java源文件的service方法中了
5. 当输出的内容中含有Java的变量,输出的内容是一个动态的内容,则使用此符号。
(5)<%@page contentType=“text/html;charset=UTF-8”%>
page指令,通过contentType属性来设置响应的内容类型,一般用于防止中文乱码,编写在jsp文件的顶端。