1、jsp概念
其实jsp就是一套翻译引擎。
例如我们访问的是index.jsp文件,其实底层执行的是index_jsp.class 这个java程序。
web服务器会把jsp文件翻译为java文件再编译生成class文件。
2、jsp本质
- JSP实际上就是一个Servlet。
- 从一个jsp文件翻译到生成一个class文件,生成的class文件就会继承HttpServlet
- 那么jsp生命周期也就和Servlet的生命周期没有什么区别了
3、jsp文件第一次访问的时候比较慢是因为第一次还没有生成class文件,所以访问比较慢。
所以运维人员给客户演示的时候一般都会提前把jsp文件先运行一遍,目的是为了生成class文件。
4、jsp是什么?
- JSP是java程序。(JSP本质还是一个Servlet)--翻译引擎
- JSP是:JavaServer Pages的缩写。(基于Java语言实现的服务器端的页面。)
- Servlet是JavaEE的13个子规范之一,那么JSP也是JavaEE的13个子规范之一。
- JSP是一套规范。所有的web容器/web服务器都是遵循这套规范的,都是按照这套规范进行的“翻译”
- 每一个web容器/web服务器都会内置一个JSP翻译引擎。
5、开发JSP的最高境界
眼前是JSP代码,但是脑袋中呈现的是java代码。出了错要检查java文件。
6、servlet和jsp区别是什么,什么时候应该选择jsp呢?
- 职责不同
- Servlet的职责是什么:收集数据。(Servlet的强项是逻辑处理,业务处理,然后链接数据库,获取/收集数据。)
- JSP的职责是什么:展示数据。(JSP的强项是做数据的展示)
- 就是说jsp主要做页面展示的。
7、JSP的基础语法
(1)在jsp文件中直接编写文字,对应的语法是:out.write("翻译到这里");也就是普通字符串。
(2)如果写的是html,css,js代码,也会被解释为字符串,只不过浏览器会将字符串进行解释执行。
(3)在jsp中怎么编写java程序?
- 使用<% java语句; %>
- 在jsp文件中这样的语法可以出现多次
- 要注意的是:编写的java程序是出现在service方法中,所以该写什么和不该写什么要清楚。
(4)可以在service方法外部编写java程序吗?
- 使用<%! %>
- 一般都不建议使用,因为Servlet是支持多线程并发的,如果使用的话会涉及到线程安全问题。
(5)jsp的输出语句
- 使用<%= %>
- 什么时候使用呢?
- 如果需要输出的是一个变量或者是java代码、动态的内容,那么可以使用<%= %>
- 如果输出的是普通字符串,那直接在jsp文件中编写就可以了
- <%= %>会被翻译为:out.print();
- out.print()和out.write()区别在于能输出的类型不一样,out.write()只能输出普通字符串。
(6)jsp文件中如何使用注释
使用:<%--JSP的专业注释,不会被翻译到java源代码当中。--%>
(7)JSP基础语法总结:
- JSP中直接编写普通字符串
- 翻译到service方法的out.write("这里")
- <%%>
- 翻译到service方法体内部,里面是一条一条的java语句。
- <%! %>
- 翻译到service方法之外。
- <%= %>
- 翻译到service方法体内部,翻译为:out.print();
- <%@page contentType="text/html;charset=UTF-8"%>
- page指令,通过contentType属性用来设置响应的内容类型。
8、开发的时候一定要职责分明
JSP就是做数据展示。Servlet就是做数据的收集。(JSP中编写的Java代码越少越好。)一定要职责分明。
9、JSP文件的扩展名必须是xxx.jsp吗?
- jsp文件的扩展名是可以配置的。不是固定的。
- 在CATALINA_HOME/conf/web.xml,在这个文件当中配置jsp文件的扩展名。
-
jsp *.jsp *.jspx - 小窍门:JSP如果看不懂,建议把jsp翻译成java代码,就能看懂了
10、JSP的指令
- 指令的作用:指导JSP的翻译引擎如何工作(指导当前的JSP翻译引擎如何翻译JSP文件。)
- 指令包括哪些呢?
- include指令:包含指令,在JSP中完成静态包含,很少用了。(只做了解)
- taglib指令:引入标签库的指令。JSTL标签库的时候会使用。
- page指令:目前重点学习一个page指令。
- 指令的使用语法是什么?
- <%@指令名 属性名=属性值 属性名=属性值 属性名=属性值....%>
11、关于page指令当中都有哪些常用的属性呢?
<%@page session="true|false" %> true表示启用JSP的内置对象session,表示一定启动session对象。没有session对象会创建。 如果没有设置,默认值就是session="true" session="false" 表示不启动内置对象session。当前JSP页面中无法使用内置对象session。
<%@page contentType="text/json" %> contentType属性用来设置响应的内容类型 但同时也可以设置字符集。 <%@page contentType="text/json;charset=UTF-8" %>
<%@page pageEncoding="UTF-8" %> pageEncoding="UTF-8" 表示设置响应时采用的字符集。
<%@page import="java.util.List, java.util.Date, java.util.ArrayList" %> <%@page import="java.util.*" %> import语句,导包。
<%@page errorPage="/error.jsp" %> 当前页面出现异常之后,跳转到error.jsp页面。 errorPage属性用来指定出错之后的跳转位置。
<%@page isErrorPage="true" %> 表示启用JSP九大内置对象之一:exception 默认值是false。
12、JSP九大内置对象
- jakarta.servlet.jsp.PageContext pageContext 页面作用域
- jakarta.servlet.http.HttpServletRequest request请求作用域
- jakarta.servlet.http.Session session会话作用域
- jakarta.servlet.ServletContext application应用作用域
- pageContext < request < session < application
- 以上四个作用域都有:setAttrtbute、getAttribute、removeAttribute方法
- 以上作用域的使用原则:尽可能使用小的域。
- java.lang.Throwable exception
- jakarta.servlet.ServletConfig config
- java.lang.Object page (其实就是this,当前的servlet对象)
- jakarta.servlet.jsp.JspWriter out (负责输出)
- jakarta.servlet.http.HttpServletResponse response (负责响应)
JSP学习总结。



