首页 > 代码库 > Servlet学习笔记(七)—— JSP概述

Servlet学习笔记(七)—— JSP概述

1.Servlet两个缺陷:
 ①所有HTML标签必须包在Java字符串中,使得发送HTTP响应十分繁琐;
 ②所有文本和HTML标签都必须进行硬编码,即使对表示层做极其微小的修改,也需要重新编译。

2.注释:
 (1)JSP备注:<% %>,不会发送到浏览器,不能嵌套
 (2)HTML备注:<!-- -->,不被容器处理,直接发送到浏览器,用途之一是标识JSP页面。在处理带有许多JSP片段的应用程序时,开发者通过查看HTML源代码,可以轻松查出某个HTML代码部分生成了那个JSP页面

3.隐式对象:
对象
类型
request
javax.servlet.http.HttpServletRequest
response
javax.servlet.http.HttpServletResponse
out
javax.servlet.jsp.JspWriter
session
javax.servlet.http.HttpSession
application
javax.servlet.ServletContext
config
javax.servlet.ServletConfig
pageContext
javax.servlet.jsp.PageContext
page
javax.servlet.jsp.HttpjspPage
exception
java.lang.Throwable
out类似于HttpServletResponse中调用
page对象表示当前的JSP页面
getWriter()之后得到的java.io.PrintWriter

4.三个句法元素:
  (1)指令directive:指示JSP转换器应该如何将某JSP页面转换为Servlet
          ①page:就当前JSP页面的某些方面对JSP转换器提出指示 。page指令可以出现在页面的任何位置。只是当它包含contentType或者pageEncoding属性时,必须放在所有模板数据之前,并且是在利用Java 代码发送任何内容之前。这是因为必须在发送任何内容之前设置内容类型和字符编码。    
          ②include:将另一个文件的内容放在当前的JSP页面中。文件扩展名.jspf
    (2)脚本元素scripting:将Java代码和比高成一个JSP页面
          ①Scriplet:在一个Scriplet中定义的变量,对于它后面的其他Scriplet也是可见的
          ②声明:能在JSP页面使用的变量和方法
          ③表达式:Today is <%= java.util.Calendar.getInstance().getTime() %>  表达式后面不需要分号
             关闭脚本元素:随着Expression Language的发展,建议利用EL来访问服务器端的对象,而不是在JSP页面中编写Java代码。因此,原本开启的脚本元素,可以在部署描述符的<jsp-property-group>中定义一个scripting-invalid元素,将它关闭,例如:
<jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <scripting-invalid>true</scripting-invalid>
</jsp-property-group>
    (3)动作action:被编译成执行某个动作的Java代码
            ①useBean:创建一个与某个Java对象相关的脚本变量,将表现逻辑与业务逻辑分开
            ②setProperty与getProperty:保存与获取一个java对象中的一个属性
            ③include动作:
                   include指令和include动作的区别:
                         include指令是在页面转换时使用,比如JSP容器将页面转换成一个生成的Servlet的时候;include动作是在发生请求的时候使用。
                         可以通过include动作传递参数,但是include指令不可以。
                         使用include指令时,被包含资源的文件扩展名并不重要;使用include动作时,文件扩展名必须是jsp
            ④forward:将当前页面跳转到另一个不同的资源
               forword与redirect的区别:
               http://zhulin902.iteye.com/blog/939049
               http://www.2cto.com/kf/201109/105650.html

5.错误处理:
  (1)用try语句处理Java代码
  (2)指定一个页面,让它在应用程序遇到未捕捉的异常时显示出来。
    利用page指令的isErrorPage属性,就可以把一个JSP页面变成一个错误处理页面
6.概述:
  (1)Jsp页面也是一个Servlet,但简单的多:
          ①不需要编译JSP页面;
          ②*.jsp为扩展名的文本文件,可以用任意文本编辑器编写。
  (2)JSP页面在JSP容器中运行,Servlet容器一般也是JSP容器。Tomcat就是一个Servlet/JSP容器。
  (3)第一次请求一个JSP页面时,容器所做的两件事:
          ①将JSP页面转换车一个JSP页面实现类,即一个实现javax.servlet.jsp.JspPage或者javax.servlet.jsp.HttpjspPage接口的Java类。JspPage是javax.servlet.Servlet的子接口,所以每个Jsp页面都编程一个Servlet。
          ②转换成功,容器编译Servlet类,加载和实例化Java字节码,执行它通常对Servlet所做的生命周期操作。
  (4)对于同一个JSP页面的后续请求,容器会查看这个JSP页面自从最后一次转换以来是否被修改过。如果修改过,就会重新转换、编译、执行;若没有,则执行内存中已经存在的Servlet。所以,第一次掉一个JSP页面的时间比后续请求都更长。解决这个问题的措施:
          ①配置应用程序,在应用程序启动而不是初始请求的时候,调用所有的JSP页面进行转换编译。
          ②预先编译JSP页面,并将它们以Servlet的方式进行部署。
  (5)JSP API的4个包:
          ①javax.servlet.jsp
          ②javax.servlet.jsp.target
          ③javax.el
          ④javax.servlet.jsp.el
  (6)JSP 页面包含句法元素和模板数据:
          ①<% 和%>就是句法元素,HTML标签和文本就是模板数据。
  (7)JSP不需要在部署描述符中进行标注,或者映射成一个URL
  (8)添加完一个新的JSP页面不需要重启Tomcat
 
7.如何查看JSP转译成servlet后的源代码?
   在eclipse的工作区\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\(项目名)\org\apache\jsp这里。