我在这里首先要明确一点JSP技术的实现是依赖于Servlet的
好了我们先明确一下这个真理然后来看jsp的几大内容
1 jsp的指令
1 page 指令
<!-- page指令的使用格式: --><%@ page attr="value"%>
page指令的常用属性
1 import 导入jar包,和java的用法一样可以设置多个
2 pageEncoding :指定当前页面的编码
如果pageEncoding没有指定,那么默认为contentType的值;
如果pageEncoding和contentType都没有指定,那么默认值为iso-8859-1
如果pageEncoding和contentType都没有指定,那么默认值为iso-8859-1
3 contentType :等同与调用response.setContentType("text/html;charset=xxx")
如果没有指定contentType属性,那么默认为pageEncoding的值;
如果contentType和pageEncoding都没有指定,那么默认值为iso-8859-1
如果contentType和pageEncoding都没有指定,那么默认值为iso-8859-1
4 isErrorPage:用来声明该页面是错误信息页面
5 ErrorPage:用来声明出错时要跳转到的页面
好了我们就说这几个常用的属性别的可以参看文档
2 include指令
<!-- include指令的用法 --><%@ include file="url"%>
include指令称之为静态包含指令,其作用是在include指令处静态包含另一个文件的内容。
3 taglib指令
<!-- taglib指令的用法 --><%@ taglib prefix="xxx" uri="XXX" %>
taglib指令用于导入第三方标签库,关于标签库的内容我们以后在来学习。
好了介绍完了jsp的三大指令我们在来玩点别的
JSP的脚本元素
1 Scriptlet
即java脚本,既然是语法就一定又格式,让我们来看看其使用格式:
内容遵循java语法格式,并且在这里面执行的代码,相当于是在servlet的service()方法中的本位置执行的代码。
<!-- Scriptlet的使用格式 -->
<%
int i = 12 / 0;
%>
内容遵循java语法格式,并且在这里面执行的代码,相当于是在servlet的service()方法中的本位置执行的代码。
2 声明
声明是用来定义域属性和与方法的,凡是在这里面定义的东西都相当于编译后这个servlet类的成员变量和方法,一般我们不是用他。
使用格式:
<!-- 声明的使用 -->
<%!
private String a = "123456789";
private int add(int a,int b) {
return a + b;
}
%>
<!-- 我们在该处调用声明的函数看看结果 -->
<%
int a = add(1,2);
out.print(a);
%>
3 表达式
表达式的使用格式
<%= a %>
<%= string1 %>
相当于计算该表达式,在调用print方法输出到客户端。
好了我们一在个jsp页面上添加了这些东西,随让并没有什么用,但是我们我们可以更好的熟悉jsp的使用方式,不能一嘴吃个胖子你说是吗?下面我在所最后一点基本上jsp的部分就算是完工了。
JSP的9大内置对象(隐式对象)
比如说request,response,session...在一般的servlet中我们是不是得手动打代码获取这些对象呢,很庆幸,我们在jsp中,服务器自动为我们生成了这些对象在该servlet的service方法中,也就是说这几个对象是局部对象。
这9大内置对象是哪9大呢?
response | HttpServletResponse |
request | HttpServletRequest |
session | HttpSession |
out | JspWriter |
application | ServletContext |
pageContext | PageContext |
config | ServletConfig |
page | HttpJspPage |
exception | Throwable |
out:这个对象的用法基本上和Writer对象相同
exception: 并不是每一个jsp页面都会获取这个对象的,只有page指令属性isErrorPage为true时,才有该对象
page:这个对象的范围为该页面。
pageContext:这个对象的范围为该页面,但是可以通过该对象获取其他域对象,和为其他域对象设置属性值。
JSP原理
关于JSP页面的知识我们就算是讲完完了,当然我们也在我们的jsp页面上打了不少的元素,接下来让我们看看我们的jsp页面最终会以什么面貌示人吧!
<!-- 我们jsp页面上的内容为如下 -->
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" errorPage="/jsp/error.jsp" %>
<%-- <!-- include指令的用法 --><%@ include file="url"%>
<!-- taglib指令的用法 --><%@ taglib prefix="xxx" uri="XXX" %> --%>
<html>
<head>
<title>主页面</title>
</head>
<body>
<!-- 声明的使用 -->
<%!
private String string1 = "123456789";
private int add(int a,int b) {
return a + b;
}
%>
<!-- 我们在该处调用声明的函数看看结果 -->
<%
int a = add(1,2);
out.print(a);
%>
<!-- Scriptlet的使用格式 -->
<%
int i = 12 / 0;
%>
<!-- 表达式的使用格式 -->
<%= a %>
<%= string1 %>
</body>
</html>
哦了,让我们揭下他真正的面具吧!
我们查看tomcat根路径下的
\work\Catalina\localhost\day12_1\org\apache\jxxxx
看一下toncat把我们的jsp页面编译成什么样子了?
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.75
* Generated at: 2017-03-23 12:10:36 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.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class jsp1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
/*
<!-- 声明的使用 -->
<%!
private String string1 = "123456789";
private int add(int a,int b) {
return a + b;
}
%>
*/
private String string1 = "123456789";
private int add(int a,int b) {
return a + b;
}
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 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 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 {
/*获取9大内置对象*/
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,
"/jsp/error.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('\r');
out.write('\n');
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("\t<title>主页面</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<!-- 声明的使用 -->\r\n");
out.write("\t");
out.write("\r\n");
out.write("<!-- 我们在该处调用声明的函数看看结果 -->\r\n");
out.write("\t");
/*我们的Scriptlet脚本*/
int a = add(1,2);
out.print(a);
out.write("\r\n");
out.write("<!-- Scriptlet的使用格式 -->\r\n");
out.write("\t");
int i = 12 / 0;
out.write("\r\n");
out.write("<!-- 表达式的使用格式 -->\r\n");
out.write("\t");
/*我们的表达式*/
out.print( a );
out.write('\r');
out.write('\n');
out.write(' ');
out.print( string1 );
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);
}
}
}
那么既然道最后编译成了servlet,我们是不是应该在web.xml又该servlet的映射呢?
答案是有的,但是没有在项目中的xml中而是在tomcat的配置文件中,内容如下:
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
大家看到我们在请求jsp页面时实际上是在请求org.apache.jasper.servlet.JspServlet这个他妈的servlet,这不是坑爹吗,来让我们看看这小子做了什么
算了,现在还有些源代码没有弄清楚呢,以后再续!