10、JSP技术概述
对JavaServer Page的需求
servlet的编写方便,执行效率较高。它们使得请求参数的读取,以及建立自定义代码处理缺失和异常数据变得简单。它们能够容易地使用HTTP请求报头,并且能够灵活地操作HTTP响应数据。它们能够基于cookie定制自身的行为,用会话跟踪API来跟踪用户的具体数据,以及使用JDBC与关系型数据库进行对话。它们都是与编程或数据处理相关的任务。JSP擅长表示。从根本上,JSP页面能够执行的任何任务都可以用servlet来完成。然而,底层的等同性并不意味着servlet和JSP页面对于所有的情况都同等使用。问题不在于技术的能力,二是便利性、生产率和可维护性上的不同。
JSP中HTML的编写与维护更为简单;能够使用标准的网站开发工具;可以对开发团队进行划分:Java程序员可以致力于动态代码,web开发人员可以将精力集中在表示层上。JSP擅长生成由大量组织有序的结构化HTML或其他字符数据组成的页面;servlet擅长生成二进制数据,构建结构多样的页面,以及执行输出很少或者没有输出的任务,如重定向。
JavaScript一般用于在客户端动态生成HTML,在浏览器载入文档时构建网页的部分内容,一般与JSP(只在服务器端运行)并不发生重叠。JavaScript是一项补充技术而非竞争技术。
servlet和JSP规范为Web应用定义了一个标准的目录结构,并提供用于部署Web应用的标准文件(.war文件)。所有JSP兼容的服务器必须支持这些标准。我们可以建立过滤器作用到任意数目的servlet和JSP页面上,但不能用于非标准资源。
记住JSP是服务器端技术
如何将Swing组件用到JSP页面中呢?重要的是浏览器的Java版本,和服务器的Java版本无关。
如何将图像放到JSP中?只需将图像放在存储web资源的目录中,并输出一个IMG标签。
Tomcat不支持JavaScript,当用户在图像上移动鼠标时,如何使图像突出显示呢?用script标签,使用客户端JavaScript创建在鼠标下会更改的图像,这不会由于服务器使用JSP而改变。
客户使用不理解JSP的旧浏览器怎么办?浏览器根本不“支持”JSP,只需确保JSP输出的HTML与浏览器兼容。
客户在浏览器中查看源代码时,如何阻止他们看到JSP标签?不需要采取措施,这些标签在服务器上进行处理,发送给客户的输出中不出现。
JSP页面仅在修改后第一次被访问时,才会被转换成servlet并进行编译;载入到内存中、初始化和执行遵循servlet的一般规则。
基本语法:
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代码
如果在JSP页面中使用大量复杂的Java代码块,造成的后果是难以维护,难以调试,难以重用,很难再开发团队的不同成员间划分工作。没有IDE能够解决测试和重用问题,核心的通用设计策略应该事:把复杂的代码放在常规Java类中,保持JSP页面相对简单。
从简单应用(小型开发团队)到复杂应用(大型开发团队)的方式:
直接调用Java代码
间接调用Java代码:开发单独的实用工具,插入调用的Java代码
使用bean: 开发单独的实用工具类,按照bean的要求进行构造。使用jsp:useBean、jsp:getProperty、jsp:setProperty调用
使用MVC构架:由一个servlet负责处理最初的请求,查找数据,并将结果存储在bean中,然后将请求转发到JSP页面来提交最后的结果。JSP页面使用bean。
使用JSP表达式语言:一般和bean和MVC组合使用
使用定制标签:开发标签处理类。用类XML的定制标签调用标签处理器。
JSP脚本元素的三种形式
<%= Java Expression %
求值后、转换成字符串后插入到servlet的输出之中;请求是在运行期间执行,因此可以访问到请求的所有信息。
<% Java Code %>
插入到servlet的 _jspService 方法中
<%! Field/Method Declaration %>
插入servlet类的定义中
预定义变量:
request对象,HttpServletRequest
response对象, HttpServletResponse
session对象,HttpSession
out对象,用来将输出发送到客户端的Writer
application对象,ServletContext,这是一个由Web应用中所有servlet和JSP页面共享的数据结构
要使用XML方式,整个页面都必须使用XML语法。我们必须将页面全部包括在一个jsp:root元素中。XML元素不同于HTML元素,它们对大小写敏感<jsp:expression>Java Expression</jsp:expression>
;与<% Java Code %>
等价的XML表达式是<jsp:scriptlet>Java Code</jsp:scriptlet>
Scriptlet可以完成单独使用表达式所不能完成的许多任务,任务包括设置响应报头和状态代码,调用边界效应,如写服务器日志或更新数据库,或执行含有循环、条件分支结构或其他复杂结构的代码
JSP生成的servlet使用Writer的一种特殊变体(JspWriter),它会对文档做部分缓冲,所以在少量的文档内容之后再来设置报头和响应代码是合法的。
Scriptlet代码(<% %>)只是直接插入到_jspService方法中:不需要字符串,不用print语句,不做任何更改,调用任何方法时加分号(<% baz(); %>),区别于<%= bar() %>;JSP表达式包含Java值(不以分号结尾),而大多数JSP scriptlet包含Java语句(必须以分号结束)。要记住,表达式要放在print或write语句中。
Scriptlet的另一种用途是条件性地输出HTML或其他不在任何JSP标签内的内容,应该避免使用它来讲大块的HTML条件化,同时力图使JSP页面尽可能集中在表示任务上。
声明几乎总是包含字段或方法定义,不要使用JSP声明覆盖servlet的标准生命期方法;对于JSP页面中的初始化和清理工作,可以使用JSP声明来覆盖jspInit或jspDestroy,不要直接使用init或destroy。使用单独的Java类而非JSP声明来定义绝大多数的方法。与<%! Field or Method Definition %>
等同的XML语法是<jsp:declaration>Field or Method Definition</jsp:declaration>
预定义变量:
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指令
在JSP中,主要有3中指令:
page:允许我们通过类的导入、servlet超类的定制、内容类型的设置、以及诸如此的事物来控制servlet的结构,可以放在文档中的任何地方
include:放置在文档中希望插入文件的地方
taglib:定义自定义的标记标签
JSP页面的默认MIME类型是text/html(默认字符集为ISO-8859-1),所以,如果JSP页面以Latin字符集输出HTML,则无需使用ContentType;如果要更改内容的类型和字符集,使用<%@ page contentType="someMimeType; charset=someCharacterSet" %>
;如果只想更改字符集,则日语JSP页面使用<%@ page pageEncoding="Shift_JIS" %>
。
JSP不忽略空格——JSP一般生成HTML,浏览器会忽略HTML中的大部分空格,但JSP自身会维护空格并将它发送到客户端。
errorPage属性用来指定一个JSP页面,由该页面来处理当前页面中抛出但未被捕获的任何异常<%@ page errorPage="Relative URL" %>
;isErrorPage属性表示当前页是否可以作为其他JSP页面的错误页面<%@ page isErrorPage="true" %>
。要注意,errorPage属性指定页面专用的错误页面,如果要为整个Web应用指定错误页面,需要使用web.xml中的error-page元素