JSP


JSP概述

JSP是在HTML页面中嵌入Java代码片段,或使用JSP标签,包括用户自定义标签,动态地提供页面内容。

JSP本质上是Servlet,当用户向指定Servlet发送请求时,Servlet利用输出流动态地生成HTML页面,包括每一个静态的HTML页面中出现的内容。

JSP页面内容主要包括两部分:

  • 静态部分:标准的HTML标签、静态的页面内容,这些内容与静态HTML页面相同;
  • 动态部分:受Java程序控制的内容,这些内容由Java脚本动态生成。

代码示例

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<html>
<head>
<title>欢迎</title>
</head>
<body>
欢迎学习Java Web知识,现在时间是:
<%out.println(new java.util.Date());%>
</body>
</html>

其中放在<%和%>之间的代码便是Java脚本,动态部分,这样就把Java代码嵌入HTML页面中,构成一个动态的JSP页面。

JSP页面看书去好像不需要Java类,让人感觉好像完全脱离了Java面向对象的特征。实际上,JSP的本质依然是Servlet(一个特殊的Java类),每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet在负责响应用户请求。Web应用中的每个JSP页面都会由Servlet容器生成对应Servlet。在tomcat中,JSP页面生成的Servlet放在work路径下对应的Web应用下。如一个test.jsp页面会生成对应的test_jsp.java和test_jsp.class,这两个页面都是由Web容器(如Tomcat)生成的。对比test.jsp和test_jsp.java文件,易知JSP页面所有内容都由test_jsp.java文件的页面流来生成



由此,我们可以得到如下结论:

  • JSP文件必须在JSP服务器内运行;
  • JSP文件必须生成Servlet才能执行;
  • 每个JSP 页面的第一个访问者速度很慢,因为要等待JSP编译成Servlet;
  • JSP页面的访问者无需安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。

JSP的四种基本语法

1. JSP注释
JSP注释用于标注在程序开发过程中的开发提示,不会输出到客户端。格式为
<%-- 注释内容 -->
不同于HTML注释格式
<!-- 注释内容 -->
JSP注释无法通过源代码查看到,而HTML注释可以通过源代码查看到,这表明JSP注释不会被发送到客户端。

2. JSP声明
JSP声明用于声明变量和方法,JSP声明方法看似不需要定义类就可以直接定义方法,方法好像可以脱离类独立存在,实际上,JSP声明将会转换成对应Servet的成员变量或成员方法,这样JSP声明依然符合Java语法。
声明示例:

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<html>
<head>
<title>声明示例</title>
</head>
<!-- 下面是JSP声明部分 -->
<%! //声明一个整型变量 public int count; //声明一个方法 public String info() { return "Hello"; } %>
<body>
<% //将count的值输出后在加1 out.println(count++); %>
<br/>
<% //输出info()方法的返回值 out.println(info()); %>
</body>
</html>


表面上看,这段代码部分证明了一个整型变量和一个普通方法,变量和方法好像不属于任何类,似乎可以独立存在,这是假象,打开Tomcat的work里面找到对应的java文件,会看到一段与JSP页面声明变量和方法完全对应的的代码,这表明JSP页面的声明部分转换成对应Servlet的成员变量或成员方法。因此JSP声明部分的变量和方法可以使用private、public等访问控制符修饰、也可以使用static修饰,将其变成类属性和类方法,但不能用abstract修饰声明部分的方法,因为抽象方法将导致JSP对应的Servlet变成抽象类,从而导致无法实例化。

打开不同浏览器测试代码,会发现不同机器不同客户端访问的count值是连续的,所有客户端共享同一个count变量。因为JSP页面会编译成一个Servlet类,每个Servlet的容器只有一个实例;在JSP中声明的变量时成员变量,成员变量只在创建实例时初始化,该变量的值将一直被保存,直到实例被销毁。

info()方法的值以可以正常输出,JSP中声明的方法是在JSP声明中生成的Servlet的实例方法,Java的方法是不能独立存在的,即使在JSP中也不行。

3. JSP输出表达式
JSP提供一种输出表达式值的简单方法,输出表达值的语法格式
<%= 表达式 %>
示例

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<html>
<head>
<title>声明示例</title>
</head>
<!-- 下面是JSP声明部分 -->
<%! //声明一个整型变量 public int count; //声明一个方法 public String info() { return "Hello"; } %>
<body>
<!-- 使用表达式输出变量 -->
<%=count++%>
<br/>
<!-- 使用表达式输出方法返回值 -->
<%=info()%>
</body>
</html>

输出表达式语法后不能有分号。

4. JSP脚本

JSP脚本里可以包含任何可执行的Java代码,JSP脚本可以控制JSP页面的所有静态内容。JSP脚本编译后将被转换成Servlet里_jspService方法的可执行性代码,由于Java语法不允许在方法里定义方法,所以JSP脚本里不能定义方法。JSP脚本部分也可以声明变量,但在JSP脚本本分声明的变量时局部变量,但不能用public、private、static等访问控制符等修饰符。

JSP的3个编译指令

JSP的编译指令是通知JSP引擎的消息,不直接生成输出,而是告诉引擎如何处理JSP页面中的其余部分。编译指令都有默认值,程序员无需为每个指令设置值

  • page: 针对当前页面的指令。用于定义JSP页面的各种属性,无论page指令出现在JSP页面的什么地方,它都作用于整个JSP页面,通常我们将page指令房在JSP页面的开始位置。

    JSP_第1张图片

  • include:用于指定包含另一个 。用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件进行引入的方式称为静态引入,当前JSP页面与静态引入的页面紧密结合成一个Servlet。
  • taglib: 用于定义和访问自定义标签。


JSP的7个动作指令

编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的动作。编译指令在将JSP编译成Ser略同时起作用;而处理指令可替换成JSP脚本,它是JSP脚本的标准化写法

  • jsp:forward:执行页面转向,将请求的处理转发发到下一个页面;
  • jsp:param:用于传递参数,必须与其他支持参数的标签一起使用;
  • jsp:include:动态引入一个JSP页面;
  • jsp:plugin:用于下载JavaBean或Applet到客户端进行执行;
  • jsp:useBean:创建一个JavaBean实例;
  • jsp:setProperty:设置JavaBean实例的属性值;
  • jsp:getProperty:输出JavaBean实例的属性值。


JSP脚本中的9个内置对象

JSP中包含9个内置对象,都是Servlet API接口的实例,JSP规范对它们进行了默认初始化(由JSP页面对应Servlet的_jspService()方法来创建这些实例)。即它们已经是对象了,可以直接使用。

  • application:java.servlet.ServleContext的实例,该实例代表JSP所属的Web应用本身,可用于JSP页面,或者在Servlet之间交换信息。常用方法有getAttribute(String arrName)、setAttribute(String attName, String attValue)和getInitParameter(String paramName)等;
  • config: javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。常用方法有getInitParameter(String paraName)和getInitParameternames()等方法。JSP页面通常无需配置,也就不存在配置信息。该对象更多在Servlet中有效。
  • Exception:java.lang.Throwable的实例。该实例代表其他页面中的异常错误。只有当页面是错误处理页面即编译指令page的isErrorPage属性为true时,该对象才可以使用。常用方法有getMessage()和printStackTrace()等。
  • out:javax.servlet.jsp.JspWriter的实例,该对象代表JSP中的输出流,用于内天的输出形成HTML页面。
  • page: 代表该页面本身,通常没有太大用处,也就是Servlet的this,其类型就是生成的Servlet类,能用于page的地方就可以用this。
  • pageContext: javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。常用的方法有getServletContext()和getServletConfig()等。
  • request: javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,局偶去客户端请求参数必须使用该对象。常用的方法有getParameter(String paraName)、getAttrbute(String attrName)和setCharacterEncoding(String attrName,Object attrValue)、getAttribute(String attrName)等。
  • response: javax.servlet.http.HttpServletResponse的实例,该对象代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符串响应。而response对象常用于重定向,常用的方法有getOutputString()、sendRedirect(java.lang.String.locaton)等。
  • session: javax.servlet.http.HttpSession的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。常用的方法有:getAttribute(String attrName)、setAttribute(StringName,Object attrValue)等。

你可能感兴趣的:(jsp,java-ee)