JSP与Servlet是一体两面的关系。

JSP最终还是被编译为Servlet。

<%@page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试</title>
</head>
<body>
测试
</body>
</html>

上面的jsp文件最终被转译为Servlet:

/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/9.0.0.M15
* Generated at: 2017-03-02 01:55:32 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp; import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*; public final class one_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports { private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
} private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
} public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
} public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
} public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
} public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
} public void _jspInit() {
} public void _jspDestroy() {
} public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
} final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null; try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out; out.write("\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>测试</title>\r\n");
out.write(" </head>\r\n");
out.write("<body>\r\n");
out.write("测试\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}

第一次请求JSP时,容器会进行转译、编译和加载的操作,所以第一次请求jsp,响应会很慢。

如果想做JSP初始化或者收尾操作,则可以定义jspInit()或jspDestroy()方法。

指示元素:

<%@ 指示类型 [属性="值"]* %>

指示类型有:page、include、taglib

在<%!与%>之间声明的代码都将转译为Servlet中的类成员与方法。

在<%与%>之间声明的代码(不能声明方法)转译为_jspService()方法中的代码。

在此记录个bug:

<%@page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.util.*"%>
<%@page errorPage="errPage.jsp"%>
<html>
<head>
<title>测试</title>
</head>
<%!
int x = 0;
int z = Integer.parseInt("123qwe");
%>
<body>
</body>
</html>

并没有跳转到errPage.jsp界面?

对应的Servlet

/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/9.0.0.M15
* Generated at: 2017-03-02 07:50:01 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp; import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports { int x = 0;
int z = Integer.parseInt("123qwe"); private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("java.util");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
} private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
} public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
} public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
} public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
} public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
} public void _jspInit() {
} public void _jspDestroy() {
} public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
} final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null; try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
"errPage.jsp", true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out; out.write("\n");
out.write("\n");
out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>测试</title>\n");
out.write(" </head>\n");
out.write(" \n");
out.write(" \n");
out.write("<!--\n");
out.write("HTML注释\n");
out.write("-->\n");
out.write("\n");
out.write("\n");
out.write(" \n");
out.write("\n");
out.write(" \n");
out.write("\n");
out.write(" \n");
out.write("\n");
out.write(" \n");
out.write("<body>\n");
out.write("</body>\n");
out.write("</html>\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}

z变量初始化就导致异常产生了,大概根本就没有调用_jspService方法?

错误处理:

1、转译过程中

例如:<%@page buffer="16"%>

buffer属性必须指定单位,如16kb

2、编译过程中(unable to comple)

例如:Some some;没有部署Some类到服务器。

此时转译可以完成(生成*.java文件,不会生成*.class文件)。

3、运行时错误(找不到资源,程序逻辑错误等)(an exception occurred processing JSP page)

例如:NullPointerException异常

最新文章

  1. js出错总结
  2. Linux修改系统以及pip更新源
  3. Git工作常用
  4. unity插件开发——AssetDatabase
  5. 201521123121 《Java程序设计》第1周学习总结
  6. iOS sourceTree忽略掉必要的xcuserdata文件
  7. 腾讯云服务器哪个地区节点好?来ping一下速度就知道了
  8. 【微信小程序canvas】实现小程序手写板用户签名(附代码)
  9. 5G到来,数据中心如何变革?
  10. 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
  11. AutoCAD开发5--批量修改dwg文件
  12. 【Linux】工作管理
  13. 控制input框只能粘贴,不能输入
  14. vue项目中别个访问你的本地调试需要改东西
  15. SerializeHelper
  16. Hadoop和Apache Spark的异同
  17. bash 脚本中分号的作用
  18. 面试题30:KMP 字符串查找
  19. Ubuntu下命令行安装jdk,android-studio,及genymotion虚拟机来进行android开发
  20. linux下启动关闭oracle

热门文章

  1. ELK部署检测nginx日志demo
  2. 用Eclipse和Tomcat搭建一个本地服务器
  3. JavaSelenium 页面常用基本操作语法
  4. 能快速理解Java_集合类_的文章
  5. Oozie任务调度框架详解及使用简介(一)
  6. 一次asp.net core3.1打造webapi开发框架的实践
  7. Nginx的一理解(2)
  8. spark storm 反压
  9. HTTP图解笔记(六)—— 第6章 HTTP首部
  10. 2.Scanner的进阶使用