JavaEE学习笔记之Servlet/JSP(6)

来源:互联网 发布:考上清华 知乎 编辑:程序博客网 时间:2024/06/08 20:02

JSP的简单介绍

JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。jsp就是Servlet变种。

JSP = html + servlet

1.生成页面的流程:

浏览器(客户端) --> 服务器(Tomcat) --> Servlet --> HTML

浏览器发送请求给服务器,服务器解析请求,并找到相应的Servlet,处理请求,并返回相应的HTML格式的数据返回给客户端,让客户端的浏览器解析并渲染成页面。

2.JSP的执行流程

这里写图片描述

这里写图片描述

访问JSP会经过三个阶段:

第一个阶段:翻译阶段 jsp->.java
当容器接受到客户端第一次请求JSP的时候,首先先会判断JSP资源是否存在,不存在则404,存在的话,会将JSP翻译成.java文件

第二个阶段:编译阶段 .java->.class
转化成字节码文件

第三个阶段:执行阶段

补充

a.JSP最终都会转换为Servlet去执行。b.如果被请求的jsp源文件内容发生改变,那么还会重新执行上面的流程

3.JSP的三种语法

3.1、编译器指令(DIRECTIVE):

<%@ page import="java.io.*"%>

包含指令,页指令,taglib指令

包含在<%@ %>卷标里

两个主要的指令page include

<%@ page language="java" import="java.util.*" pageEncoding="uft-8"%><%@ include file=""%><%@ taglib uri="http://www.jspcentral.com/tags" prefix="public" %>该指令声明此JSP文件使用了自定义的标签,同时引用标签库,也指定了标签的前缀。

3.2、脚本语法

JSP脚本元素用来插入Java代码,这些Java代码将出现在由当前JSP页面生成的Servlet中。脚本元素有三种格式:

声明格式<%! declaration; %>,其作用是把声明加入到Servlet类(在任何方法之外);表达式格式<%= expression %>,作用是计算表达式并输出其结果;Scriptlet格式<% code %>,作用是把代码插入到Servlet的service方法。

3.2.1、JSP声明:

JSP声明用来声明JSP程序中的变量、实例、方法和类。声明是以<%!为起始,以%>结尾。在JSP程序中,在使用一个变量或引用一个对象的方法和属性前,必须先对使用的变量和对象进行声明。声明后,你才可以在后面的程序中使用它们。

<%! int i=0; %><%! int a,b,c; %>

注意:

1.编译JSP时,而声明却生成于jspService()方法之外,与源文件合成一体。使用<%! %>方式所声明的变量为全局变量,即表示若同时n个用户在执行此JSP网页时将会共享此变量。因此应尽量少用声明变量,若要使用变量时,请直接在scriptlet之中声明使用即可。

2.每一个声明仅在一个页面中有效,如果你想每个页面都用到一些声明,最好把它们写成一个单独的JSP页面或单独的Java类,然后用<%@ include %>或< jsp : include >动作元素包含进来。

由于声明不会有任何输出,因此它们往往和JSP表达式或脚本小程序结合在一起使用。例如,下面的JSP代码片断输出自从服务器启动(或Servlet类被改动并重新装载以来)当前页面被请求的次数:

<%! private int accessCount = 0; %>

自从服务器启动以来页面访问次数为:

<%= ++accessCount %>

3.2.2、JSP表达式:

JSP表达式用来计算输出Java数据,表达式的结果被自动转换成字符型数据,结果可以作为HTML的内容,显示在浏览器窗口中。JSP表达式包含在“<%= %>”标记中,不以分号结束,除非在加引号的字符串部分使用分号。开始字符和结束字符之间必须是一个完整合法的Java表达式。可以是复杂的表达式,在处理这个表达式的时候按照从左向右的方式来处理。

<%= i %><%= "Hello" %><%= a+b %>

3.2.3脚本小程序:

如果要完成的任务比简单的表达式复杂时,可以使用JSP脚本小程序(Scriptlet)。脚本小程序中可以包含有效的程序片段,只要是合乎Java本身的标准语法即可。通常我们核心程序都写在这里,是我们实际编写的JSP程序的主要部分。

<%String queryData = request.getQueryString();out.println("Attached GET data: " + queryData);%>

注意:在程序段中定义的变量是局部变量,且程序段中的“表达式”必须使用“;”作为结束符,程序片段并不局限于一行代码中。

3.3、动作语法

JSP动作利用XML语法格式的标记来控制Servlet引擎的行为。动作组件用于执行一些标准的常用的JSP页面。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。

JSP动作元素包括:

jsp:include:当页面被请求时引入一个文件。

jsp:forward:请求转到一个新的页面。

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

jsp:useBean:寻找或者实例化一个JavaBean。

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

3.4、注释

JSP注释分为HTML注释和隐藏注释两种。JSP隐藏注释语句在JSP页面执行的时候会被忽略,不会执行。并且注释语句信息不会被送到客户端的浏览器中,也就是说,用户通过查看源文件是无法看到这些注释信息的,所以称之为隐藏注释。HTML注释和隐藏注释的不同之处在于HTML注释在客户端浏览器能通过查看源文件而被查看到。

3.4.1HTML注释

<!-- -->

3.4.2隐藏注释

<%-- --%> 不发送到客户端

补充:

内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用

1.out:

  javax.servlet.jsp.JspWriter类型,代表输出流的对象。作用域为page(页面执行期)

2.request:

    javax.servlet.ServletRequest的子类型,此对象封装了由WEB浏览器或其它客户端生成地HTTP请求的细节(参数,属性,头标和数据)。作用域为request(用户请求期)。

3.response:

    javax.servlet.ServletResponse的子类型,此对象封装了返回到HTTP客户端的输出,向页面作者提供设置响应头标和状态码的方式。经常用来设置HTTP标题,添加cookie,设置响应内容的类型和状态,发送HTTP重定向和编码URL。作用域为page(页面执行期)。

4.pageContext:

    javax.servlet.jsp.PageContext(抽象类)类型,作用域为page(页面执行期)。此对象提供所有四个作用域层次的属性查询和修改能力,它也提供了转发请求到其它资源和包含其他资源的方法:该对象的方法都是抽象方法

5.session:

    javax.servlet.http.HttpSession类型,主要用于跟踪对话。作用域session(会话期)。

6.application:

    javax.servlet.ServletContext类型,servlet的环境通过调用getServletConfig().getContext()方法获得。作用域是application(整个程序运行期)。它提供了关于服务器版本,应用级初始化参数和应用内资源绝对路径,注册信息的方式

7.config:

    javax.servlet.ServletConfig,作用域为page(页面执行期)

8.exception:

    java.lang.Throwable,通过JSP错误页面中一个catch块已经抛出但没有捕获的java.lang.Throwable的任意实例,传向了errorPage的URI。作用域为page(页面执行期)。注意:    exception只有在page指令中具有属性isErrorPage="true"时才有效。

9.page:

    java.lang.Object类型,指向页面自身的方式。作用域为page(页面执行期)

总结:

声明和脚本段转换为Servlet代码的位置是不一样的,声明语句定义的变量会方法成员变量的位置,而脚本段中的变量会转换为局部变量。每个用户都会访问到成员变量,而脚本段的局部变量每个用户保存一个副本,互不影响。声明语句的变量在重新刷新页面时不会被重新定义,所以在_jspService方法中修改的状态是会保留下来的。

对于Servlet来说,是单例模式的。

但是这种声明语句用的比较少,因为这种需求不是很多。

2 1