博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsp简介
阅读量:2062 次
发布时间:2019-04-29

本文共 7300 字,大约阅读时间需要 24 分钟。

我在这里首先要明确一点JSP技术的实现是依赖于Servlet的

好了我们先明确一下这个真理然后来看jsp的几大内容

1 jsp的指令

1 page 指令

<%@ page attr="value"%>

page指令的常用属性

1 import 导入jar包,和java的用法一样可以设置多个
2 pageEncoding :指定当前页面的编码
   如果pageEncoding没有指定,那么默认为contentType的值;
   如果pageEncoding和contentType都没有指定,那么默认值为iso-8859-1
3 contentType :等同与调用response.setContentType("text/html;charset=xxx")
  如果没有指定contentType属性,那么默认为pageEncoding的值;
  如果contentType和pageEncoding都没有指定,那么默认值为iso-8859-1
4 isErrorPage:用来声明该页面是错误信息页面
5 ErrorPage:用来声明出错时要跳转到的页面
好了我们就说这几个常用的属性别的可以参看文档

2 include指令

<%@ include file="url"%>
include指令称之为静态包含指令,其作用是在include指令处静态包含另一个文件的内容。

3 taglib指令

<%@ taglib prefix="xxx" uri="XXX" %>
taglib指令用于导入第三方标签库,关于标签库的内容我们以后在来学习。
好了介绍完了jsp的三大指令我们在来玩点别的

JSP的脚本元素

1 Scriptlet

即java脚本,既然是语法就一定又格式,让我们来看看其使用格式:
<% 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
好了,在这里我们列举出了这9大隐式对象了,熟知的那几个我们就不说了,我们单独说一下陌生的
out:这个对象的用法基本上和Writer对象相同
exception: 并不是每一个jsp页面都会获取这个对象的,只有page指令属性isErrorPage为true时,才有该对象
page:这个对象的范围为该页面。
pageContext:这个对象的范围为该页面,但是可以通过该对象获取其他域对象,和为其他域对象设置属性值。

JSP原理

关于JSP页面的知识我们就算是讲完完了,当然我们也在我们的jsp页面上打了不少的元素,接下来让我们看看我们的jsp页面最终会以什么面貌示人吧!
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" errorPage="/jsp/error.jsp" %><%--
<%@ include file="url"%>
<%@ taglib prefix="xxx" uri="XXX" %> --%> 主页面
<%! private String string1 = "123456789"; private int add(int a,int b) { return a + b; } %>
<% int a = add(1,2); out.print(a); %>
<% int i = 12 / 0; %>
<%= a %> <%= string1 %>
哦了,让我们揭下他真正的面具吧!
我们查看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
_jspx_dependants; private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map
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("\r\n"); out.write("\r\n"); out.write("\t
主页面\r\n"); out.write("\r\n"); out.write("\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("
\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("\r\n"); out.write("\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的配置文件中,内容如下:
jsp
*.jsp
*.jspx
jsp
org.apache.jasper.servlet.JspServlet
fork
false
xpoweredBy
false
3
大家看到我们在请求jsp页面时实际上是在请求org.apache.jasper.servlet.JspServlet这个他妈的servlet,这不是坑爹吗,来让我们看看这小子做了什么
算了,现在还有些源代码没有弄清楚呢,以后再续!

转载地址:http://muelf.baihongyu.com/

你可能感兴趣的文章
wi10优化
查看>>
windows console 颜色设置
查看>>
VC unicode下Cstring转char*
查看>>
MFC ListBox使用
查看>>
Linux 使用grep筛选多个条件
查看>>
H264 NALU分析(sps,pps,关键帧,非关键帧)
查看>>
Windows文本加载wscite的使用
查看>>
浏览器主页被篡改修复
查看>>
FFmpeg - 新老接口对比问题
查看>>
Windows下MinGW编译ffmpeg库
查看>>
SDL在windows下使用 - 显示YUV
查看>>
三种方式YUV420转RGB24/BGR24,实测可用
查看>>
Windows下使用VS2015编译openssl库
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>
开源Faac实现PCM编码AAC
查看>>
Windows下wave API 音频采集
查看>>