JSP
JSP规范介绍
- 来自于JAVAEE规范中一种。
- JSP规范制定了如何开发JSP文件代替响应对象将处理结果写入到响应体的开发流程。
- JSP规范制定了Http服务器应该如何调用管理JSP文件。
响应对象存在弊端
- 适合将数据量较少的处理结果写入到响应体。
- 如果处理结果数量过多,使用响应对象增加开发难度。
JSP文件优势
- JSP文件在互联网通信过程,是响应对象替代品。
- 降低将处理结果写入到响应体的开发工作量降低处理结果维护难度。
- 在JSP文件开发时,可以直接将处理结果写入到JSP文件不需要手写out.print()命令,在Http服务器调用JSP文件时,根据JSP规范要求自动的将JSP文件书写的所有内容通过输出流写入到响应体。
HTML文件与JSP文件区别
作为资源文件类型不同
- HTML文件属于静态资源文件,其相关命令需要在浏览器编译并执行的。
- JSP文件属于动态资源文件,其相关命令需要在服务端编译并执行的。
调用形式不同
- 如果浏览器访问HTML文件,此时Http服务器直接通过一个输出流。
- 将HTML文件中所有的内容写入到响应体。
- 如果浏览器访问JSP文件。此时Http服务器根据JSP规范来操作JSP文件编辑—->编译—–>调用。
JSP文件运算原理
- Http服务器将JSP文件内容【编辑】为一个Servlet接口实现类(.java)
- Http服务器将Servlet接口实现类【编译】为class文件(.class)
- Http服务器通过Servlet实例对象调用_jspService方法,将jsp文件内容写入到响应体
- Http服务器负责创建这个class的实例对象,这个实例对象就是Servlet实例对象
JSP实现类存放位置:
C:\Users[登录windows系统用户角色名]\AppData\Local\JetBrains\IntelliJIdea[idea版本号]\tomcat[网站工作空间]\work\Catalina\localhost[网站别名]\org\apache\jsp
JSP隐含对象
概述
- 容器自动创建,在JSP文件中可以直接使用的对象。
作用
- JSP预先创建的这些对象可以简化对HTTP请求、响应信息的访问。
隐含对象 | 类型 | 说明 |
---|---|---|
request | HttpServletRequest | 请求对象 |
response | HttpServletResponse | 响应对象 |
out | JSPWrite | 输出流对象 |
session | HttpSession | 会话作用域对象 |
application | ServletContext | 全局作用域对象 |
pagecontext | PageContext | JSP页面上下文 |
page | Object | JSP页面本身 |
config | Servletcontig | Servlet配置对象 |
exception | Throwable | 异常对象 |
HttpJspBase类
- Tomcat将JSP文件编辑后生成的Java文件,继承与HttpJspBase。通过Apache官方文档查看,其身份是HttpServlet的子类。所以Tomcat将JSP编辑为的文件为一个Servlet接口实现类。
_jspService方法
概述
当一个JSP文件被访问时,Tomcat调用的并不是当前JSP文件。而是JSP文件对应的Servlet接口实现类中_jspService方法。_jspService方法负责将开发人员在JSP文件书写的所有内容写入到响应体中。
内部结构
- 判断当前请求方式。Jsp文件可以接收的请求方式有POST,GET,HEAD
- 声明局部变量。这些局部变量都可以在JSP文件开发时直接使用
- 输出部分。这部分执行时将JSP文件内容通过输出流写入到响应体
public void _jspService(final jakarta.servlet.http.HttpServletRequest request, final jakarta.servlet.http.HttpServletResponse response)
throws java.io.IOException, jakarta.servlet.ServletException {
if (!jakarta.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
// JSP输出内容
}
JSP语法
执行标记
命令格式:
<% int a =10; %> 声明局部变量
<% boolean flag = 30 >= 40; %> Java中表达式(数学表达式,关系表达式,逻辑表达式)
<%
if(判断条件){
}else{
}
while(){
}
// 书写控制语句
%>
命令作用:
- 通知Http服务器将JSP文件中Java命令与其他普通执行结果进行区分。
输出标记
命令格式:
<%=java的变量名%>
<%=java的表达式%>
命令作用:
- 通知Tomcat将输出标记中【变量的值】或则输出标记中【表达式运算结果】写入到响应体。
Servlet数据共享给JSP常用方法
- JSP文件被访问时,并不是JSP文件在执行。而是对应的Servlet在执行。
- 自定义Serlvet接口实现类与JSP文件之间调用关系,等同于两个Servlet之间调用关系。
- 自定义Servelt接口实现类与JSP文件之间可以通过重定向方案或则请求转发方案进行调用考虑到运行效率问题,一般采用【请求转发】。
- 自定义Servlet接口实现类可以通过请求作用域对象将共享数据交给JSP来输出到响应体。