`

14、JSP技术

 
阅读更多

一、什么是JSP?

 

  1. JSP全称是Java Server Pages,它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
  2. JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
  3. 案例:在jsp页面中输出当前时间。
  4. 为什么JSP技术也是一种动态web资源的开发技术?
  5. 因为JSP技术允许在页面中嵌套java代码,以产生动态数据,并且web服务器在执行jsp时,web服务器会传递web开发相关的对象给jsp,jsp通过这些对象,可以与浏览器进行交互,所以jsp当然也是一种动态web资源开发技术。
  6. Servlet是j2ee提供的动态资源开发技术,是以java的程序的形式进行开发,在java中书写HTML标签是一件十分头疼的事情,所以人们开发出了JSP,看起来像是HTML一样,但是通过服务器的编译最终可以生成Servlet

二、JSP原理

 

  1. Web服务器是如何调用并执行一个jsp页面的?
  2. Jsp页面中的html排版标签是如何被发送到客户端的?
  3. Jsp页面中的java代码服务器是如何执行的?
  4. Web服务器在调用jsp时,会给jsp提供一些什么java对象?
  5. 理解这些问题有助于我们真正理解和掌握jsp技术。

三、JSP 的执行过程

 

  1.  客户端发出Request (请求);
  2. JSP Container 将JSP 翻译成Servlet 的源代码;
  3. 将产生的Servlet 的源代码经过编译后,加载到内存执行;
  4. 把结果Response (响应)发送至客户端。
  5. JSP和Servlet的执行效率相差不大,只是第一次执行JSP页面时需要进行编译
  6. 一般人都会以为JSP 的执行性能会和Servlet 相差很多,其实执行性能上的差别只在第一次的执行。因为JSP 在执行第一次后,会被编译成Servlet 的类文件,即为XXX.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不用再重新把JSP编译成Servlet。因此,除了第一次的编译会花较久的时间之外,之后JSP 和Servlet 的执行速度就几乎相同了。
  7. 在执行JSP 网页时,通常可分为两个时期:转译时期(Translation Time)和请求时期(Request  Time) 。
  8.  JSP文件先要被服务器翻译成Java文件(Servlet),在tomcat中翻译后的Java文件在tomcat下的 work/Catalina /localhost 中相应名字的应用目录里。 
  9. 编译成Java(Servlet)文件 
  10. 运行.class文件 

四、JSP语法

 

 

  1. JSP模版元素 
  2. JSP脚本表达式 
  3. JSP脚本片断 
  4. JSP注释
  5. JSP指令
  6. JSP标签 
  7. JSP内置对象
  8. 如何查找JSP页面中的错误 

五、JSP模版元素

 

  1. JSP页面中的HTML内容称之为JSP模版元素
  2. JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

六、JSP脚本表达式 

 

 

  1. JSP脚本表达式(expression)用于将程序数据输出到客户端语法:<%= 变量或表达式 %>举例:当前时间:<%= new java.util.Date() %> 
  2. JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
  3. JSP脚本表达式中的变量或表达式后面不能有分号(;)

七、JSP脚本片断

 

  1. JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法:<% java多行代码 %>
  2. 注意:JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。
  3. JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。
  4. 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
    <%
    	int x = 10;
    	out.println(x);
    %>
    <p>这是JSP页面文本</p>
    <%
    	int y = 20;
    	out.println(y);
    %>
     
  5. 多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);
  6. 单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:
    <%
    	for (int i=1; i<5; i++) 
    	{
    %>
    
    	<H1>www.it315.org</H1>
    
    <%
    	}
    %>  

七、JSP声明 

 

  1.  JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法<% java代码 %>
  2. 所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。 
  3. 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
  4. JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。 
    <%!
    static 
    { 
    	System.out.println("loading Servlet!"); 
    }
    private int globalVar = 0;
    public void jspInit()
    {
    	System.out.println("initializing jsp!");
    }
    %>
    <%!
    public void jspDestroy()
    {
    	System.out.println("destroying jsp!");
    }
    %>
    
     
  5. JSP注释的格式:<%-- 注释信息 --%>
  6. JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。

八、JSP指令

 

  1. JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
  2. 在JSP 2.0规范中共定义了三个指令:page指令  include指令  taglib指令
  3. JSP指令的基本语法格式:<%@ 指令 属性名="值" %>举例:<%@ page contentType="text/html;charset=gb2312"%>
  4. 如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
    例如:
    		<%@ page contentType="text/html;charset=gb2312"%>
    		<%@ page import="java.util.Date"%>
    也可以写作:
    	<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
     
  5. page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。 
  6. JSP 2.0规范中定义的page指令的完整语法:
    <%@ page 
    	[ language="java" ] 
    	[ extends="package.class" ] 
    	[ import="{package.class | package.*}, ..." ] 
    	[ session="true | false" ] 
    	[ buffer="none | 8kb | sizekb" ] 
    	[ autoFlush="true | false" ] 
    	[ isThreadSafe="true | false" ] //翻译过来的servlet是否实现SingleThreadModel
    	[ errorPage="relative_url" ] 
    	[ isErrorPage=“true | false” ] //配置错误页面的,默认是false,改为true就会创建exception对象
    	[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 
    	[ pageEncoding="characterSet | ISO-8859-1" ] //服务器翻译jsp时使用的编码集.如果想防止jsp乱码,应该保证文件的保存编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致.此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性.
    	[ isELIgnored="true | false" ] 
    %>
     
  7. 可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔:<%@ page import="java.util.Date,java.sql.*,java.io.*"%>
  8. 上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:
    <%@ page import="java.util.Date"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="java.io.*"%>
    
    JSP 引擎自动导入下面的包:
    java.lang.*
    javax.servlet.*
    javax.servlet.jsp.*
    javax.servlet.http.*
     
  9. Page指令的session属性默认为true,该为false那么就不创建session,如果要用只有通过request来获得
  10. errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
  11. 可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。
  12. 如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
  13. 其实,是 转发 到错误jsp页面
  14. JSP引擎会根据page指令的contentType属性生成相应的调用ServletResponse.setContentType方法的语句。

九、使用page指令解决JSP中文乱码

 

  1. 通过page指令的contentType属性相当于response.setContentType
  2. page指令的pageEncoding属性说明JSP源文件的字符集编码
  3. pageEncoding=“characterSet”底层帮我们做了contentType=“mimeType [ ;charset=characterSet ],所以jsp中其实一行代码解决乱码,就写一个pageEncoding就o了

十、include指令

 

  1. include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
  2. 语法:<%@ include file="relativeURL"%>
  3. 其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
  4. 细节:
  5. 被引入的文件必须遵循JSP语法。
  6. 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见名知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
  7. 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)
  8. 静态引入常导致页面格式不合理,所以要自己调整好,如:head foot body的例子
  9. Taglib指令用于在JSP页面中导入标签库

十一、JSP运行原理和九大隐式对象

 

  1. 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
  2. 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
  3. JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
  4. 这9个对象分别是哪些,以及作用也是笔试经常考察的知识点
  5. JSP九大隐式对象:
    
    
    request
    response
    config
    application
    exception
    Session
    page
    out
    pageContext
     
  6. out隐式对象
  7. out隐式对象用于向客户端发送文本数据。 
  8. out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似
  9. JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。 
  10. 只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
    1、设置page指令的buffer属性关闭了out对象的缓存功能
    2、out对象的缓冲区已满
    3、整个JSP页面结束
    4、Page指令中的autoFlush属性默认为true如果改为false如果写入的内容超过了8k会发生内存溢出
     
  11. out隐式对象的工作原理图 
  12. 在jsp页面中尽量只用out对象输出
十二、pageContext对象
  1. pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。
  2. 并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。 
  3. 作用范围:整个jsp页面
  4. 生命周期:。。。
  5. 通过pageContext获得其他对象
    getException方法返回exception隐式对象 
    getPage方法返回page隐式对象
    getRequest方法返回request隐式对象 
    getResponse方法返回response隐式对象 
    getServletConfig方法返回config隐式对象
    getServletContext方法返回application隐式对象
    getSession方法返回session隐式对象 
    getOut方法返回out隐式对象
    
    pageContext封装其它8大内置对象的意义
    思考:如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将具有什么功能?  
     
  6. pageContext作为域对象 
    pageContext对象的方法 
       public void setAttribute(java.lang.String name,java.lang.Object value)
       public java.lang.Object getAttribute(java.lang.String name)
       public void removeAttribute(java.lang.String name)
    
    pageContext对象中还封装了访问其它域的方法
       public java.lang.Object getAttribute(java.lang.String name,int scope)
       public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
       public void removeAttribute(java.lang.String name,int scope)
    
    代表各个域的常量
       PageContext.APPLICATION_SCOPE
       PageContext.SESSION_SCOPE
       PageContext.REQUEST_SCOPE
       PageContext.PAGE_SCOPE 
    
    findAttribute方法,在域中找对应属性的值,按域的大小从小到大查找,如果没有找到则返回null 
    (*重点,查找各个域中的属性) EL表达式
     
  7. 引入和跳转到其他资源 
  8. PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法。
  9. pageContext.forward()   pageContext.include()
  • 大小: 15.3 KB
  • 大小: 28.1 KB
分享到:
评论

相关推荐

    毕业设计:Java项目之jsp工程项目管理系统(源码 + 数据库 + 说明文档)

    JSP技术 14 4.2 数据库设计 22 4.2.1 实体描述 22 4.2.2 联系描述 23 4.2.3 E-R图 23 第五章 系统详细设计 26 5.1 数据库的逻辑设计 26 5.2 数据库的实现 26 5.3 程序流程图 29 5.4 计算机系统配置方案 31 5.4.1 ...

    毕业设计:Java项目之jsp超市采购管理系统(源码 + 数据库 + 说明文档)

    JSP技术 14 4.2 数据库设计 22 4.2.1 实体描述 23 4.2.2 联系描述 23 4.2.3 E-R图 23 第五章 系统详细设计 26 5.1 数据库的逻辑设计 26 5.2 数据库的实现 26 5.3 程序流程图 29 5.4 计算机系统配置方案 31 5.4.1 ...

    JSP开发技术大全源代码1-14章

    应广大朋友的要求,目前已将JSP开发技术大全的全部代码上传至网上

    JSP2.0技术手册pdf(带示例源码).zip

    书名:JSP 2.0 技术手册(电子书) 格式:PDF 出版:电子工业出版社 作者:林上杰、林康司 本书图文并茂,以丰富的实例为引导,全面介绍了主流的 Java Web 开发技术—— JSP 2.0,重点介绍Java在展示层的两项重要技术...

    jsp开发技术大全14章

    这是jsp开发技术大全第14章的源代码,有关JFREECHART与jsp动态图表的

    精通JSP-Web开发技术与典型应用 光盘代码

    \ch18\* 第18章 JSP页面分页技术实现所有例程代码 \ch19\* 第19章 上传下载文件模块所有例程代码 \ch20\* 第20章 使用JSP发送邮件所有例程代码 \ch21\* 第21章 异常及日志模块所有例程代码 \ch22\* 第22章 保护...

    JSP开发实用技术整理

    14. double保留两位数的两个方案 18 16. 用户输入输出,文件输入输出范例(1) 19 17.以指定符号分割显示 22 17. 单例模式 22 18. 工厂模式 23 19. 读取配置文件(1) 25 20. 根据libName动态加载jar类库 33 ============...

    服务器安全技术分析:JSP漏洞大观

    文中介绍一下一些服务器(包括Web服务器和JSP服务器)的常见漏洞:Apache泄露重写的任意文件、在HTTP请求中添加特殊字符...Apache泄露重写的任意文件漏洞、Tomcat 暴露JSP文件内容等。并且针对这些漏洞提出了解决方案。

    基于JSP技术的旅游网站设计软件程序源码+数据库+word毕业设计论文文档.zip

    基于JSP技术的镇旅游网站设计软件程序源码+数据库+word毕业设计论文文档.旅游网站设计主要用于实现旅游景点信息管理,基本功能包括:主界面模块设计,用户注册模块,旅游景点模块,酒店预订模块,后台管理模块等。本...

    JSP 程序设计从入门到精通 PDF 教程

     本书较为全面地介绍了JSP技术,由浅入深、循序渐进地介绍了JSP的运行系统,基本概念,语法规范及其相关内容,从基本的JSP概述、与其他技术的对比,到JSP的运行系统和模式,逐步深入地对JSP语法规范进行了详细的...

    JSP网络编程学习笔记源代码 part2

    全书内容分为7篇,共23章,第一篇为“JSP应用开发基础”,主要讲述JSP技术背景情况、JSP技术的基本原理及开发环境的搭建;第二篇为“Servlet核心技术”,主要讲述Servlet的技术特点、请求和响应、数据共享、会话跟踪...

    Jsp技术实现的论坛系统

    比较完整的论坛系统,可供初学者学习使用。

    基于Java的JSP技术的天气查询网站设计源码

    本项目是基于Java的JSP技术的天气查询网站设计源码,共包含274个文件。其中HTML页面文件168个,JAR打包文件26个,PNG图片文件17个,Java源代码文件14个,XML配置文件11个,JavaScript文件11个,JSP页面文件5个,CSS...

Global site tag (gtag.js) - Google Analytics