Servlet/JSP(四)

来源:互联网 发布:脑死亡知乎 编辑:程序博客网 时间:2024/06/06 12:52

从本篇开始介绍JSP相关知识

JSP概述

JSP 是基于文本的程序,特点是 HTML 与Java 代码共存,执行JSP 会被 服务器自动编译,编译之后的 JSP 和 HttpServlet 一样,都是 javax.servlet.Servlet 接口的子类,我们前面介绍过,JSP 其实是另一种形式的Servlet

  • JSP : Java Server Page,主要是为了简化 Servlet 的工作出现的替代品,由于Servlet 中不能嵌入 HTML 代码,输出HTML 比较空难,而且所有的处理都在Servlet 中进行处理,虽然Servlet 可以完成所有的功能,但是开发远没有 PHP,ASP 那样简单,为了克服 Servlet 的这些缺点,JSP 就出现了
  • JSP 包括很多技术,比如 JavaBean Custom Tags,EL表达式,JSTL标签库等

  • 在 Java EE 5.0 之后如果 Web 应用只含有 JSP 程序以及 HTML 页面,图片等静态资源文件,则部署 Web 应用时不需要 web.xml ,反之则必须使用 web.xml

JSP 的工作原理

  • JSP 也是一种Servlet,HttpServlet 是先有源代码编译为 class 文件之后部署到服务器下面,先编译后部署,而JSP 则是先部署源代码后编译为 class 文件,先部署后编译,JSP 会在 客户端第一次请求JSP 文件时编译为 HttpJspPage 也是 Servlet 的一个子类,然后会被服务器临时存放在服务器的工作目录里面
  • JSP 的编译过程:客户端第一次请求 xxx.jsp ,服务器首先将 xxx.jsp 转化为 标准的 Java 源代码 xxx.java ,然后将 xxx.java 编译为 .class 文件,该 class 文件就是 JSP 对应的 Servlet,编译完成之后再运行 class 文件来响应客户端请求,当 客户端再次访问 xxx.jsp 的时候,服务器就不会再次编译 JSP 文件,而是直接调用 xxx.class 来 响应客户端请求
  • JSP 只会在 客户端第一次请求的时候被编译,因此第一次请求JSP 会比较慢,之后就不会了,如果我们在开发过程中需改了 JSP ,不需要重新启动服务器,服务器能够自动检测到 JSP 的改动,如果页面发生了改动,服务器就会在下次 请求 该 JSP 的时候重新编译 JSP,而不用重启服务器,而如果Servlet 发生改变,则必须重启服务器才可以,该检测是默认开启的,如果需要关闭,我们只需要在 web.xml 中进行配置关闭

JSP 生命周期

JSP 也是 Servlet,运行时只会有一个实例,和Servlet一样,JSP 实例初始化、销毁也会调用 Servlet 的 init() 和 destroy() 方法,然后JSP 还有自己的初始化方法 与销毁方法 _jspInit() _jspDestroy()

JSP 的基本语法

JSP 中可以有 HTML 代码 和 Java 代码,HTML 遵循 HTML ,Java遵循 Java语法格式

JSP 脚本

  • JSP 脚本必须使用 <% Java语法 %> 格式,否则会发生 编译错误,JSP 脚本可以出现在 JSP 文件的如何地方
  • JSP 输出,是使用 <%= 各类型数据 %>
  • JSP 中声明 方法和属性 <%! %> 比如:

JSP 指令

  • 指令是用来声明 JSP 页面的一些属性,比如编码方式、温度格式等 <%@ %>
  • 常见的 指令有 page、taglib、include 等

  • page 指令:最常用的指令,用来声明 JSP 页面的属性,多个 属性可以写在一个 page 指令中,也可以写在多个指令中,比如:

<%@ page language="java" contentType="text/html; charset = utf-8" %>    // 多个属性<%@ page pageEncoding="UTF-8"%>     // 一个属性<%@ page import="java.util.*"%>
  • 无论在哪个 page 指令中的属性,如何 page允许的属性都只能 出现一次,否则会出现错我,import 属性除外,可以出现多次,page 常见属性
名称 范围 说明 language java 解释该JSP文件时采用的语言,一般为 java ,默认也是java extends 如何类的全名 编译该JSP 文件时继承哪个类,JSP 为 Servlet,因此当我们继承普通类的时候需要实现生命周期方法 import 如何包、类名 导入JSP 中用的类和包,类似 Java 文件中的 import 语句,是唯一可以声明多次的属性,JSP 中 下面4个包的类可以直接使用,java.lang.*;java.servlet.*; javax.servlet.jsp.*;javax.servlet.http.* session true,false 默认为true,说明 JSP 是否内置 Session 对象,true 内置,false 不内置 autoFlush true,false 默认为true,是否运行缓存,如果为true,那么输出的字符串并不是立刻到达服务器,而是暂时缓存,缓存满了或是执行 out.flush() 之后才到客户端 buffer none 或者 具体kb 制定缓存大小,当 autoFlush 设置为 true 时有效 isThreadSafe true,false 是否线程安全,默认为true,如果为true,则运行多个线程同时运行该 JSP ,否则只有一个线程 isErrorPage true,false 默认为false,指定页面是否有错误处理页面,JSP 内置一个 Exception 对象 exception 可以直接使用 errorPage 某个JSP 页面的相对路径 指明错误的现实页面,如果JSP 抛出一个异常,则转到 errorPage 指定的页面,同城 isErrorPage 属性为true contentType 有效的文档类型 客户端浏览器根据该属性来判断温度类型 text/html:HTML格式;text/plain:纯文本格式;image/jpeg:JPG图像;image/gif:GIF图像;application/msword:WORD文档 info 任意字符串 指明 JSP 的信息,可以通过Servlet.getServletInfo() 方法得到 trimDirectiveWhitespaces true,false 是否去掉指令前后的空白字符,默认为 false

include 指令

  • 该指令比较简单,只有一种形式 <%@ include file = “relativeURL”%>,relativeURL为本程序的一个JSP 或是HTML 文件路径,比如网站 所有页面的统一风格导航栏 和页脚版权,使用include,用来实现JSP页面的区块化
  • 如果导航的文件有多个,还可以使用 if语句来动态 include 某个文件
<%    if("style1".equals(request.getParameter("style1"))){        <% page include = "head1.jsp"%>    }else if("style2".equals(request.getParameter("style2"))){        <% page include = "head2.jsp"%>    }%>
  • 还可以使用 命令,和以上使用基本一致,上面的指令是 把源代码添加到一起然后编译成一个 .class 文件,先包含后编译,这里的是 运行时单独执行 ,然后把执行的结果包含进去,先运行后包含
  • 我们还可以使用 web.xml 通过配置 JSP 来包含文件,后面会接着介绍

    taglib 指令

    • JSP 支持标签技术,使用标签功能能够实现视图代码的服用,很少的代码就能实现很复杂的效果,要使用标签功能必须先声明标签库和前缀,taglib 指令用来指明 JSP 页面内使用的JSP 标签库,taglib 指令有2个属性, uri 为类库地址,prefix 为标签前缀,标签库是JSP 最常用的功能,我们会在后面介绍,一个简单demo
      <%@ taglib uri = "http://java.sun.com/jsp/jst1/core" prefix ="c" %><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><c:forEach var = "item" items = "${arrays}">    <c:out value = "item"></c:out></c:forEach></body></html>
0 0