JSP初探

  JSP(Java Server Page)是一种动态网页开发技术。之前的实践中我们使用Servlet对URL请求进行一些简单的响应,例如读取应用中的某个静态文件(例如读取html文件直接在浏览器中显示,这种方法无法定制显示内容),或者直接将数据在浏览器上print出来(该方法由于引入变量,可以定制显示内容)。

  其实本质上而言,不直接读取静态资源的条件下,所有的网页显示结果都是Servlet打印出来的,但当我们是通过重定向直接读取html文件的时候就不需要用servlet的打印功能。
  有时候我突发奇想,就会将一个Html格式的文档保存为txt格式,然后再用输入输出流进行打印,这样同样可以显示出来html格式的内容。

  不管是哪种方式,都会带来一些麻烦。例如我们需要不断增加我们的静态文件(假如是html文件,那么可能这些html文件之间只有很少的不同,但我们要为此新建一个全新的文件),如果直接依靠Servlet进行打印,那么会屈服于无休止的输出语句。

  JSP一定程度上可以解决这些问题,它可以用于加载一些不同的内容。看起来它还是使用读取静态文件.jsp的方法(表面上好像不使用print方法显示结果,但其实是将这些打印操作自动化了,无需手动输入代码),所以它不同于静态的html页面。它还是和直接print一样,可以“定制”显示内容。

  JSP神奇的地方就在于这里,它可以将.jsp(仍旧不是html格式)中的网页标签和JSP脚本全部转化成Servlet程序的一部分,然后使用输出流打印出来。所以本质上.jsp是采用Servlet的输出流来展示网页结果的。而不是通过访问html文档之类的跳转到html文件来展示结果。

  Tomcat服务器有默认的设置,以.jsp为扩展名的URL访问请求都是由org.apache.jasper.servlet.JspServlet来进行处理。处理什么呢?我们知道Servlet是用于处理URL请求的,也就是说Servlet要处理的是HttpServletRequest对象。这里也是同个道理,如果我们访问/*.jsp文件,就生成了一个HttpServletRequest对象,然后.jsp文件就会就会将自身的内容整合到JspServlet,然后由JspServlet来处理HttpServletRequest
  至于URL格式上的不同(一个是/servlet,一个是/*.jsp),其实本质上是完全一样的,因为它们最终都是跳转到一个Servlet,这可以从配置文件中看出来。

JSP的基本语法:

  如果只是变量或者表达式,后面不能有分号,前面多一个等号;
如果是脚本片段后面则是必须要有分号;

//表达式
<%= expression%>
//脚本片段
<%
    int x = 3;
    out.println(x);
%>

  这些代码片段不过是被原封不动转移到Servlet的_jspService()方法中(当然html的部分也会到程序中,例如<h>itcast</h>就会被转成out.write("<h>itcast</h>"),而变量部分就会使用out.print(i)的方式进行输出),说白了,还是使用servlet中的输出方法。

  如果是<% %>,那么里面的变量是局部变量,这些代码片段也只是被原封不动转移到Servlet的_jspService()方法中。如果我们尝试定义方法,就会出现方法嵌套的错误。
  因此,如果想要定义方法,就需要采用<%! %>的格式。这时候在里面声明的都是成员方法、成员变量、静态方法、静态变量、静态代码块等。这时候这些代码片段应该就是和jspService()方法并列(而不是被包含)的所在了。


JSP指令与JSP标签

  除此以外,jsp还有一些指令可以实现功能。例如page指令可以用于对页面的特性进行描述。一个案例是使用errorPage属性来指定错误页面。

<%@page language="java" contentType="text/htm;charset=UTF-8" errorPage="error.jsp" %>

  另外一个强大的功能是使用include指令来包含一个文件,后面可以使用JSP标签实现类似的功能,里面就有一个<jsp:include>标签,同样是可以将其他资源的输入内容插入到当前JSP页面的输出内容当中。
  但是这两者也有区别,<jsp:include>标签要求动态引入的资源必须能够被web容器独立执行。而include指令只能够引入遵循jsp格式的文件,被引入文件与当前jsp文件需要共同合并才能翻译成为一个Servlet源文件。
  而<jsp:forward>标签能够实现页面跳转。


JSP隐式对象

  JSP的隐式对象可以起到简化代码的作用(不需要手动创建一些重要的对象,已经默认建好)。例如out对象,我们使用servlet进行输出的时候需要新建一个out对象,但是这里已经默认创建好了,所以可以直接使用out对象,代码就少些了。这里的out对象不是PrintWriter类,而是javax.servlet.jsp.JspWriter类。它相当于一种带缓存功能的PrintWriter。要等到整个JSP页面结束,才会把数据输入Servlet引擎提供的缓冲区。当然这个缓冲区大小我们可以使用buffer参数手动进行设置。

  除此以外,默认创建的隐式对象还有session、request、response等。当我们在URL中访问某个.jsp文件的时候,这时候就会有封装好的request和response对象,而这个.jsp文件本来就会转成某个Servlet的一部分,所以就相当于用同样的request来访问Servlet而已。然后服务器会通过getSession(True)方法来获取session(使用True是因为如果没有的时候会新建一个session)。application、page、pageContext、exception这些我们要到后面才能体验它的用法。其中pageContext除了可以获取各个隐式对象外,还能够存储其他数据,并且设定属性的作用范围。(PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE,APPLICATION_SCOPE)等。

  备注:jsp的本质虽然是一个Servlet,也是由这个Servlet来执行部分再JSP页面中的语句,那么把这个java语句从Servlet中搬到jsp中有什么好处呢,后面的框架为什么只使用它的显示功能呢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容