• 1. 北京传智播客教育 www.itcast.cnJSP徐仕锋
  • 2. 北京传智播客教育 www.itcast.cnTip:什么是JSP?JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。 JSP这门技术的最大的特点在于,写jsp就像在写html,但: 它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。 相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。 Jsp快速入门:在jsp页面中输出当前时间。
  • 3. 北京传智播客教育 www.itcast.cnTip:JSP原理目标: Web服务器是如何调用并执行一个jsp页面的? Jsp页面中的html排版标签是如何被发送到客户端的? Jsp页面中的java代码服务器是如何执行的? Web服务器在调用jsp时,会给jsp提供一些什么java对象? 思考:JSP为什么可以像servlet一样,也可以叫做动态web资源的开发技术? 看JSP翻译后的Servlet代码和原码说明
  • 4. 北京传智播客教育 www.itcast.cnTip:JSP语法JSP模版元素 JSP表达式 JSP脚本片断 JSP注释 JSP指令 JSP标签 JSP内置对象 如何查找JSP页面中的错误
  • 5. 北京传智播客教育 www.itcast.cnTip: JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素。 JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。
  • 6. 北京传智播客教育 www.itcast.cnTip: JSP脚本表达式 JSP脚本表达式(expression)用于将程序数据输出到客户端 语法:<%= 变量或表达式 %> 举例:当前时间:<%= new java.util.Date() %> JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.write(…) 将数据输给客户端。 JSP脚本表达式中的变量或表达式后面不能有分号(;)。
  • 7. 北京传智播客教育 www.itcast.cnTip: JSP脚本片断(1) JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法: <% 多行java代码 %> 注意:JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。 JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。
  • 8. 北京传智播客教育 www.itcast.cnTip: JSP脚本片断(2) 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。 举例: <% int x = 10; out.println(x); %>

    这是JSP页面文本

    <% int y = 20; out.println(y+””+x); %> 多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);
  • 9. 北京传智播客教育 www.itcast.cnTip: JSP脚本片断(3) 单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:<% for (int i=1; i<5; i++) { %>

    www.itcast.cn

    <% } %>
  • 10. 北京传智播客教育 www.itcast.cnTip: JSP声明 JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面,即实例变量。语法: <%! java代码 %> 所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。 JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。
  • 11. 北京传智播客教育 www.itcast.cnTip: 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!"); } %>
  • 12. 北京传智播客教育 www.itcast.cnTip: JSP注释 JSP注释的格式: <%-- 注释信息 --%> JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。
  • 13. 北京传智播客教育 www.itcast.cnTip: JSP指令 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令: page指令 Include指令 taglib指令
  • 14. 北京传智播客教育 www.itcast.cnTip: JSP指令简介 JSP指令的基本语法格式: <%@ 指令 属性名="值" %> 举例:<%@ page contentType="text/html;charset=UTF-8"%> 如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。 例如: <%@ page contentType="text/html;charset=UTF-8"%> <%@ page import="java.util.Date"%> 也可以写作: <%@ page contentType="text/html;charset=UTF-8" import="java.util.Date"%>
  • 15. 北京传智播客教育 www.itcast.cnTip: taglib指令Taglib指令用于在JSP页面中导入标签库,讲标签技术时讲。
  • 16. 北京传智播客教育 www.itcast.cnTip: Page指令 page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。 JSP 2.0规范中定义的page指令的完整语法: <%@ page [ language="java" ] [ import="{package.class | package.*}, ..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ] [ autoFlush="true | false" ] [ isThreadSafe="true | false" ] [ info="text" ] [ errorPage="relative_url" ] [ isErrorPage="true | false" ] [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] [ pageEncoding="characterSet | ISO-8859-1" ] [ isELIgnored="true | false" ] %> JSP 引擎自动导入下面的包: java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔: <%@ page import="java.util.Date,java.sql.*,java.io.*"%> 上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类: <%@ page import="java.util.Date"%> <%@ page import="java.sql.*"%> <%@ page import="java.io.*"%>errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。 可以在web.xml文件中使用元素为整个WEB应用程序设置错误处理页面,其中的子元素指定异常类的完全限定名,元素指定以“/”开头的错误处理页面的路径。 如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。JSP引擎会根据page指令的contentType属性生成相应的调用ServletResponse.setContentType方法的语句。 page指令的contentType属性还具有说明JSP源文件的字符编码的作用。
  • 17. 北京传智播客教育 www.itcast.cnTip: include指令 include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。 语法: <%@ include file="relativeURL"%> 其中的file属性用于指定被引入文件的相对路径。 file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。 细节: 被引入的文件必须遵循JSP语法。 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
  • 18. 北京传智播客教育 www.itcast.cn Tip:使用page指令解决JSP中文乱码JSP程序存在有与Servlet程序完全相同的中文乱码问题 输出响应正文时出现的中文乱码问题 读取浏览器传递的参数信息时出现的中文乱码问题 JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题(UTF-8) 如何解决JSP引擎翻译JSP页面时的中文乱码问题 通过page指令的contentType属性说明JSP源文件的字符集编码 或 page指令的pageEncoding属性说明JSP源文件的字符集编码
  • 19. 北京传智播客教育 www.itcast.cnTip: JSP标签虽然我们希望JSP页面仅用作数据显示模块,不要嵌套任何java代码引入任何业务逻辑,但在实际开发中不引入一点业务逻辑是不可能的,但引入业务逻辑会导致页面出现难看java代码,怎么办? Sun公司允许用户开发自定义标签封装页面的java代码,以便jsp页面不出现一行java代码。当然Sun公司在jsp页面中也内置了一些标签(这些标签叫做jsp标签/动作),开发人员使用这些标签可以完成页面的一些常用业务逻辑。 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能。
  • 20. 北京传智播客教育 www.itcast.cnTip: JSP常用标签标签 标签 标签
  • 21. 北京传智播客教育 www.itcast.cnTip: 标签 标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。 语法: page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。 flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端,默认为false。
  • 22. 北京传智播客教育 www.itcast.cnTip: 与include指令的比较 标签是动态引入, 标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。 而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。 不管是标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
  • 23. 北京传智播客教育 www.itcast.cnTip: 与include指令的比较 标签:使用page属性指定被引入资源。 include指令:使用file属性指定被引入资源。
  • 24. 北京传智播客教育 www.itcast.cnTip: 标签标签用于把请求转发给另外一个资源。 语法: page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
  • 25. 北京传智播客教育 www.itcast.cnTip: 标签 当使用标签引入或将请求转发给其它资源时,可以使用标签向这个资源传递参数。 语法1: 语法2: 标签的name属性用于指定参数名,value属性用于指定参数值。在标签中可以使用多个标签来传递多个参数。
  • 26. 北京传智播客教育 www.itcast.cnTip:JSP最佳实践不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。 其原因为,程序的数据通常要美化后再输出: 让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。 让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。 因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。
  • 27. 北京传智播客教育 www.itcast.cnTip:JSP运行原理和九大隐式对象每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。 JSP引擎在调用JSP对应的_jspService时,会传递或创建9个与web开发相关的对象供_jspService使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。 这9个对象分别是哪些,以及作用也是笔试经常考察的知识点。
  • 28. 北京传智播客教育 www.itcast.cnTip:JSP九大隐式对象request HttpServletRequest response HttpServletResponse session HttpSession application ServletcContext config ServletConfig exception (特殊情况下使用) page this(本JSP页面) out JspWriter(带缓冲的PrintWriter) pageContext (使普通Java类可访问WEB资源,自定义 标签常用)
  • 29. 北京传智播客教育 www.itcast.cnTip: out隐式对象out隐式对象用于向客户端发送文本数据。 out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。 JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。 只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中: 设置page指令的buffer属性关闭了out对象的缓存功能 out对象的缓冲区已满 整个JSP页面结束
  • 30. 北京传智播客教育 www.itcast.cnTip: out隐式对象的工作原理图
  • 31. 北京传智播客教育 www.itcast.cnTip: out隐式对象的注意事项 同时使用out和response.getwriter()输出数据。
  • 32. 北京传智播客教育 www.itcast.cnTip: pageContext对象 pageContext对象是JSP技术中最重要的一个对象,它代表当前JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如包含和跳转其它资源、检索其它域对象中的属性等。
  • 33. 北京传智播客教育 www.itcast.cnTip:通过pageContext获得其他对象 getException方法返回exception隐式对象 getPage方法返回page隐式对象 getRequest方法返回request隐式对象 getResponse方法返回response隐式对象 getServletConfig方法返回config隐式对象 getServletContext方法返回application隐式对象 getSession方法返回session隐式对象 getOut方法返回out隐式对象 pageContext封装其它8大内置对象的意义,思考:如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将具有什么功能?
  • 34. 北京传智播客教育 www.itcast.cnTip: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方法 (*重点,先后查找各个域中的属性)
  • 35. 北京传智播客教育 www.itcast.cnTip:引入和跳转到其他资源 PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法 传递给这些方法的资源路径,如果路径以“/”开头,表示相对于当前WEB应用程序的根目录,否则,表示相对于当前JSP所映射到的访问路径。
  • 36. 北京传智播客教育 www.itcast.cnTip:重点*到此为止,web开发接触到了4个域对象: pageContext(称之为page域) request(称之为request域) session(称之为session域) servletContext(称之为application域) 这4个域对象是学习web的重点,也是笔试经常考察的知识点。 明确如下问题: 这4个对象的生命周期? 什么是域?为什么把这4个对象叫做域对象呢? 哪种情况下用哪种域对象。 画图解释
  • 37. 北京传智播客教育 www.itcast.cnEL表达式语言
  • 38. 北京传智播客教育 www.itcast.cnTip:EL表达式简介EL 全名为Expression Language。EL主要作用: 获取数据: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组) 执行运算: 利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null} 获取web开发常用对象 EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。 调用Java方法 EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
  • 39. 北京传智播客教育 www.itcast.cnTip:获取数据(1)使用EL表达式获取数据语法:“${标识符}” EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。 示例:${user}
  • 40. 北京传智播客教育 www.itcast.cnTip:获取数据(2)EL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,例如: ${user.address.city} ${user.list[0]}:访问有序集合某个位置的元素 ${map.key} : 获得map集合中指定key的值
  • 41. 北京传智播客教育 www.itcast.cnTip: 执行运算语法:${运算表达式},EL表达式支持如下运算符:empty运算符:检查对象是否为null或“空”,很好用!!!
  • 42. 北京传智播客教育 www.itcast.cnTip:获得web开发常用对象EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。 语法:${隐式对象名称} :获得对象的引用隐含对象名称描 述pageContext对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)pageScope代表page域中用于保存属性的Map对象requestScope代表request域中用于保存属性的Map对象sessionScope代表session域中用于保存属性的Map对象applicationScope代表application域中用于保存属性的Map对象
  • 43. 北京传智播客教育 www.itcast.cnTip:获得web开发常用对象隐含对象名称描 述param表示一个保存了所有请求参数的Map对象paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]header表示一个保存了所有http请求头字段的Map对象headerValues 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]cookie表示一个保存了所有cookie的Map对象initParam表示一个保存了所有web应用初始化参数的map对象
  • 44. 北京传智播客教育 www.itcast.cnTip:获得web开发常用对象测试各个隐式对象 注意事项 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] 测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}
  • 45. 北京传智播客教育 www.itcast.cnTip:EL注意事项EL表达式是JSP 2.0规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。 注意:有些Tomcat服务器如不能使用EL表达式 (1)升级成tomcat6 (2)在JSP中加入<%@ page isELIgnored="false" %>
  • 46. 北京传智播客教育 www.itcast.cnTip: EL表达式保留关键字所谓保留字的意思是指变量在命名时,应该避开上述的名字,以免程序编译时发生错误