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来说,是单例模式的。
但是这种声明语句用的比较少,因为这种需求不是很多。