Java web基础小结八之—— jsp基础

Java web基础总结八之—— jsp基础

Java web基础总结八之—— jsp基础

一.什么是jsp?

      JSP是Java ServerPages的缩写,它和servlet一样,都是用于开发动态web资源的技术。在servlet中拼凑输出html代码时,非常麻烦。而JSP的最大的特点在于,写jsp就像在写html,但是html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,开发动态资源。

       现在随着前端越来越重要,很多的公司都会采取前后端分离的开发模式。即后端只提供返回json等格式的接口,而前端开发人员则通过对后端接口的请求处理json数据,做相应的展示。这样jsp就几乎很少用到。但是学习java web,不能不学习jsp。

        JSP和Servlet,都可以用于开发动态web资源。但在实际的开发中中,通常把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。即servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

 

二.jsp的原理

    首先需要明确的是,JSP也是一个servlet,所以它的运行原理和servlet类似。每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方式进行调用。

       由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。

      当然,jsp也可以配置为web应用启动加载。而且jsp也可以像servlet一样在web.xml中进行配置映射路径,但是通常都是通过servlet来访问相应的jsp。

例如:

<servlet>

    <servlet-name>HelloWorldJspServlet</servlet-name>

    <jsp-file>/jsp/hello.jsp</jsp-file>

    <load-on-startup>1</load-on-startup>

</servlet>

 

<servlet-mapping>

    <servlet-name> HelloWorldJspServlet</servlet-name>

    <url-pattern>/hello.html</url-pattern>

</servlet-mapping>

 

 

三.Jsp的语法简介

1. JSP元素

     JSP元素就是JSP页面中的HTML内容。Jsp页面中可以定义html的标签。所以它定义了网页的基本骨架,定义了页面的结构和外观。例如head, body。

2. JSP脚本表达式

        JSP脚本表达式(expression)用于将程序数据输出到客户端,简单的说就是输出表达式所嵌套的java变量的值。语法是:<%= 变量或表达式 %>。例如,当前时间:<%= new java.util.Date() %> 。JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…)方法将数据输给客户端。需要注意的是JSP脚本表达式中的变量或表达式后面不能有分号。

3. JSP脚本片断

         JSP脚本片断(scriptlet)就是在JSP页面中编写多行Java代码,虽然通常我们并不会在一个jsp文件中嵌套太多的java代码。语法是:<% java代码%>

       需要注意的是,JSP脚本片断中只能出现java代码,不能出现其它模板元素,这是因为 JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。所以JSP脚本片断中的Java代码必须严格遵循Java语法,和JSP脚本表达式不同的是,每一个执行语句后面必须用分号结束。

        在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。

    例如:

<%

    String s1 = "hello";

    out.println(s1);

%>

<p>hello world!</p>

<%

String s2 = "world!";

    out.println(s1+s2);  

%>

       多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(s1+s2);所以单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句。

4. JSP声明

      JSP声明和JSP脚本片断不同,JSP脚本片断中的java代码,默认会翻译到servlet的service方法中,而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:

<%! java代码 %>

所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。例如:

<%!

static

{

    System.out.println("helloworld!");

}

%>

 

5.JSP注释

    JSP注释的语法是:<%-- 注释信息 --%>。JSP引擎在将JSP页面翻译成Servlet程序时,JSP页面中被注释的内容。

6. JSP指令简介

     JSP指令的基本语法格式:<%@ 指令属性名="值" %>

         举例:<%@page contentType="text/html;charset=UTF-8" language="java"%>

下面是几个比较常用的jsp指令。

(1).page

       page指令的作用是定义JSP页面的各种属性,它作用的是整个JSP页面,所以为了保持程序的可读性和遵循良好的编程习惯,一般把page指令放在整个JSP页面的起始位置。

JSP 2.0规范中定义的page指令的完整语法:

<%@ page

    [ language="java"]

    [extends="package.class" ]

    [import="{package.class | package.*}, ..." ]

    [ session="true |false" ]

    [ buffer="none | 8kb |sizekb" ]

    [ autoFlush="true |false" ]

    [ isThreadSafe="true |false" ]

    [ info="text" ]

    [errorPage="relative_url" ]

    [ isErrorPage="true |false" ]

    [contentType="mimeType [ ;charset=characterSet ]" | "text/html ;charset=ISO-8859-1" ]

    [pageEncoding="characterSet | ISO-8859-1" ]

    [ isELIgnored="true |false" ]

%>

 

(2). Include

        include指令的作用是引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

语法:<%@include file="xx.jspf"%>

          其中的file属性用于指定被引入文件的相对路径。需要注意的是file属性的值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突。

(3). taglib

     taglib指令用于在JSP页面中导入标签库。例如:

     <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

 

四.jsp的9个内置对象以及其中的4个域对象。

         JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。需要特别注意的是:JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

1. jsp的9个内置对象

request:这个对象就是HttpServletRequest,不多叙述

response:这个对象就是HttpServletResponse。

config:就是ServletConfig,在servlet中已经介绍过,作用是为servlet配置一些初始化参数,作用范围是一个servlet。

application:就是ServletContext, 前面也介绍过,作用范围是整个web应用。

exception:异常相关,用于处理异常。

session: 就是HttpSession,也不多说。

page:就是this对象,代表当前的页面。

out:out隐式对象用于向客户端发送文本数据。 out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与      ServletResponse.getWriter方法返回的PrintWriter对象非常相似。 JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。

pageContext: pageContext对象是JSP的一个非常重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐      式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作。     它有个非常重要的方法:findAttribute方法,作用是查找各个域中的属性。EL表达式就是通过它实现的。EL表达式语句在执行       时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相     应的对象,找到则返回相应对象,找不到则返回空字符串,而不是null,可以避免异常。

 

2.      java web 的4个域对象:

这四个域中都可以保存一些属性,并且可以通过名字取出属性的值。

pageContext(称为page域):作用的范围最小,就是当前的jsp页面

request(称为request域):作用的范围为一个请求。

session(称为session域):就是session,作用范围是一个客户端浏览器。

servletContext(称为application域):作用域最大,为整个web应用。