Servlet与JSP核心编程(四)

时间:2022-01-12 17:16:18

10、JSP技术概述

  1. 对JavaServer Page的需求
    1. servlet的编写方便,执行效率较高。它们使得请求参数的读取,以及建立自定义代码处理缺失和异常数据变得简单。它们能够容易地使用HTTP请求报头,并且能够灵活地操作HTTP响应数据。它们能够基于cookie定制自身的行为,用会话跟踪API来跟踪用户的具体数据,以及使用JDBC与关系型数据库进行对话。它们都是与编程或数据处理相关的任务。JSP擅长表示。从根本上,JSP页面能够执行的任何任务都可以用servlet来完成。然而,底层的等同性并不意味着servlet和JSP页面对于所有的情况都同等使用。问题不在于技术的能力,二是便利性、生产率和可维护性上的不同。
    2. JSP中HTML的编写与维护更为简单;能够使用标准的网站开发工具;可以对开发团队进行划分:Java程序员可以致力于动态代码,web开发人员可以将精力集中在表示层上。JSP擅长生成由大量组织有序的结构化HTML或其他字符数据组成的页面;servlet擅长生成二进制数据,构建结构多样的页面,以及执行输出很少或者没有输出的任务,如重定向。
  2. JavaScript一般用于在客户端动态生成HTML,在浏览器载入文档时构建网页的部分内容,一般与JSP(只在服务器端运行)并不发生重叠。JavaScript是一项补充技术而非竞争技术。
  3. servlet和JSP规范为Web应用定义了一个标准的目录结构,并提供用于部署Web应用的标准文件(.war文件)。所有JSP兼容的服务器必须支持这些标准。我们可以建立过滤器作用到任意数目的servlet和JSP页面上,但不能用于非标准资源。
  4. 记住JSP是服务器端技术
    • 如何将Swing组件用到JSP页面中呢?重要的是浏览器的Java版本,和服务器的Java版本无关。
    • 如何将图像放到JSP中?只需将图像放在存储web资源的目录中,并输出一个IMG标签。
    • Tomcat不支持JavaScript,当用户在图像上移动鼠标时,如何使图像突出显示呢?用script标签,使用客户端JavaScript创建在鼠标下会更改的图像,这不会由于服务器使用JSP而改变。
    • 客户使用不理解JSP的旧浏览器怎么办?浏览器根本不“支持”JSP,只需确保JSP输出的HTML与浏览器兼容。
    • 客户在浏览器中查看源代码时,如何阻止他们看到JSP标签?不需要采取措施,这些标签在服务器上进行处理,发送给客户的输出中不出现。
  5. JSP页面仅在修改后第一次被访问时,才会被转换成servlet并进行编译;载入到内存中、初始化和执行遵循servlet的一般规则。
  6. 基本语法:
    • HTML注释:<!-- aaa -->发送给客户,但不被浏览器显示
    • JSP注释:<%-- aaa -->开发人员注释,不发送到客户程序
    • JSP表达式:<%= Java Value %>表达式,每次请求页面时计算值并发送到客户程序
    • JSP Scriptlet:<% Java Statement %>每次请求页面时执行的一个或多个语句
    • JSP声明:<%! Field Difinition %> <%! Method Definition %>在页面转换成servlet时,成为类定义的一部分的字段或方法
    • JSP指令:<%@ directive att="val" %>servlet代码的高层结构信息(page)、页面转换期间引入的代码(include)、采用的定制标签库(taglib)
    • JSP动作:<jsp:blah>...</jsp:blah>页面被请求时应采取的动作
    • JSP表达式语言的元素:${ EL Expression }简写的JSP表达式
    • 定制标签:<prefix:name> Body </prefix:name>
    • 转义的模板文本:<\% %\>特殊解释的文本,斜杠被移除,剩余的文本发送到客户端

11、用JSP脚本元素调用Java代码

  1. 如果在JSP页面中使用大量复杂的Java代码块,造成的后果是难以维护,难以调试,难以重用,很难再开发团队的不同成员间划分工作。没有IDE能够解决测试和重用问题,核心的通用设计策略应该事:把复杂的代码放在常规Java类中,保持JSP页面相对简单。
  2. 从简单应用(小型开发团队)到复杂应用(大型开发团队)的方式:
    • 直接调用Java代码
    • 间接调用Java代码:开发单独的实用工具,插入调用的Java代码
    • 使用bean: 开发单独的实用工具类,按照bean的要求进行构造。使用jsp:useBean、jsp:getProperty、jsp:setProperty调用
    • 使用MVC构架:由一个servlet负责处理最初的请求,查找数据,并将结果存储在bean中,然后将请求转发到JSP页面来提交最后的结果。JSP页面使用bean。
    • 使用JSP表达式语言:一般和bean和MVC组合使用
    • 使用定制标签:开发标签处理类。用类XML的定制标签调用标签处理器。
  3. JSP脚本元素的三种形式
    1. <%= Java Expression %求值后、转换成字符串后插入到servlet的输出之中;请求是在运行期间执行,因此可以访问到请求的所有信息。
    2. <% Java Code %>插入到servlet的 _jspService 方法中
    3. <%! Field/Method Declaration %>插入servlet类的定义中
  4. 预定义变量:
    • request对象,HttpServletRequest
    • response对象, HttpServletResponse
    • session对象,HttpSession
    • out对象,用来将输出发送到客户端的Writer
    • application对象,ServletContext,这是一个由Web应用中所有servlet和JSP页面共享的数据结构
  5. 要使用XML方式,整个页面都必须使用XML语法。我们必须将页面全部包括在一个jsp:root元素中。XML元素不同于HTML元素,它们对大小写敏感<jsp:expression>Java Expression</jsp:expression>;与<% Java Code %>等价的XML表达式是<jsp:scriptlet>Java Code</jsp:scriptlet>
  6. Scriptlet可以完成单独使用表达式所不能完成的许多任务,任务包括设置响应报头和状态代码,调用边界效应,如写服务器日志或更新数据库,或执行含有循环、条件分支结构或其他复杂结构的代码
  7. JSP生成的servlet使用Writer的一种特殊变体(JspWriter),它会对文档做部分缓冲,所以在少量的文档内容之后再来设置报头和响应代码是合法的。
  8. Scriptlet代码(<% %>)只是直接插入到_jspService方法中:不需要字符串,不用print语句,不做任何更改,调用任何方法时加分号(<% baz(); %>),区别于<%= bar() %>;JSP表达式包含Java值(不以分号结尾),而大多数JSP scriptlet包含Java语句(必须以分号结束)。要记住,表达式要放在print或write语句中。
  9. Scriptlet的另一种用途是条件性地输出HTML或其他不在任何JSP标签内的内容,应该避免使用它来讲大块的HTML条件化,同时力图使JSP页面尽可能集中在表示任务上。
  10. 声明几乎总是包含字段或方法定义,不要使用JSP声明覆盖servlet的标准生命期方法;对于JSP页面中的初始化和清理工作,可以使用JSP声明来覆盖jspInit或jspDestroy,不要直接使用init或destroy。使用单独的Java类而非JSP声明来定义绝大多数的方法。与<%! Field or Method Definition %>等同的XML语法是<jsp:declaration>Field or Method Definition</jsp:declaration>
  11. 预定义变量:
    • Request:通过它访问请求的参数(GET或POST)和输入的HTTP报头(如cookie)
    • Response
    • Out:用来将输出发送到客户程序的Writer
    • Session:JSP中会话是自动创建的
    • Application:返回类型为ServletContext,servlet和JSP页面可以在Servlet对象中(而非实例变量中)存储持续性数据。ServletContext由Web应用中所有的servlet和JSP页面共享
    • Config:原则上,用来读取初始化参数,但在实践中,初始化参数在jspInit中读取,而非_jspService。
    • PageContext:访问页面的许多属性
    • Page:this的同义词,在脚本语言还不是Java的时代用作占位符

12、控制所生成的servlet的结构:JSP page指令

  1. 在JSP中,主要有3中指令:
    • page:允许我们通过类的导入、servlet超类的定制、内容类型的设置、以及诸如此的事物来控制servlet的结构,可以放在文档中的任何地方
    • include:放置在文档中希望插入文件的地方
    • taglib:定义自定义的标记标签
  2. JSP页面的默认MIME类型是text/html(默认字符集为ISO-8859-1),所以,如果JSP页面以Latin字符集输出HTML,则无需使用ContentType;如果要更改内容的类型和字符集,使用<%@ page contentType="someMimeType; charset=someCharacterSet" %>;如果只想更改字符集,则日语JSP页面使用<%@ page pageEncoding="Shift_JIS" %>
  3. JSP不忽略空格——JSP一般生成HTML,浏览器会忽略HTML中的大部分空格,但JSP自身会维护空格并将它发送到客户端。
  4. errorPage属性用来指定一个JSP页面,由该页面来处理当前页面中抛出但未被捕获的任何异常<%@ page errorPage="Relative URL" %>;isErrorPage属性表示当前页是否可以作为其他JSP页面的错误页面<%@ page isErrorPage="true" %>。要注意,errorPage属性指定页面专用的错误页面,如果要为整个Web应用指定错误页面,需要使用web.xml中的error-page元素