java web基础之jsp

JSP的基本概念

         JSP(Java Server Pages)是一种动态网页技术标准。它在HTML代码中,插入JSP标记(tag)及Java程序片段 (Scriptlet),构成JSP页面,其扩展名为.jsp。当客户端请求JSP文件时,Web服务器执行该JSP文件,然后以HTML的格式返回给客户。

          本质上JSP只是构建在Servlet之上的高层次的动态网页标准,JSP主要有以下特点:
       1) 一次编译,多次、多处运行,代码的执行效率高。当JSP第一次被请求时,JSP页面转换成servlet,然后被编译成.calss文件,以后(除非页面有改动或Web服务器被重新启动)再有客户请求该JSP页面时,JSP页面不被重新编译,而是直接执行已编译好的.class文件。
       2. 组件的重用性。可重用的、跨平台的JavaBeans和EJB(Enterprise JavaBeans)组件,为JSP程序的开发提供方便,我们可以将复杂的处理程序(如页面中需要显示的动态内容及对数据库的操作)放到组件中。可以多次使用这些组件,极大的减少了在JSP页面中重写重复的代码。
       3. 将内容的生成和显示进行分离。

JSP的运行方式

       当服务器启动后,当Web浏览器端发送过来一个页面请求时,Web服务器先判断是否是JSP页面请求。
1)如果该页面只是一般的HTML/XML页面请求,则直接将HTML/XML页面代码传给Web浏览器端。
2)如果该页面是第一次被请求、或不是第一次被请求但已被修改,则JSP引擎将此JSP页面代码转换成Servlet代码,然后JSP引擎调用服务器端的Java编译器javac.exe对Servlet代码进行编译,把它变成字节码(.class)文件,然后再调用JAVA虚拟机执行该字节码文件,然后将执行结果传给Web浏览器端。
3)如果该JSP页面不是第一次被请求,且没有被修改过,则直接由JSP引擎调用JAVA虚拟机执行已编译过的字节码.class文件,然后将结果传送Web浏览器端。

     关于有了Servlet还要在高层实现一个JSP,涉及到Servlet本身编写的烦杂程度有关,如果用Servlet来控制页面外观的话,将是一件十分头疼的事情,使用JSP就把烦杂的打印任务交给了JSP引擎,程序员可以把精力集中到逻辑控制上面。

JSP指令

1)html注释

<!-- 页面不显示的注释 -->

注意:源文件中仍可以看到该注释

2)jsp注释

<%-- jsp注释在html源文件中也不显示 --%>

3)声明(变量或方法)

<%! int i =8; %>
<%! int n, m, k,j; %>
<%! String s = new String("hello"); %>

4)表达式

<div>随机数:<%=java.lang.Math.random()%></div>

5)脚本段

<%
for(int i=0;i<8;i++){
	out.println(i); 
}
%>

6)include指令
该指令用于包含一个文本或代码的文件。
JSP语法:<%@ include file="relativeURL"%>

<%@ include file="random.jsp" %>

file文件可以是JSP,HTML或文本。如果是JSP文件,则J先由SP引擎编译完该JSP文件,否则直接将其内容插入到主JSP文件中Include指令所在的位置。该包含是静态包含,即被包含的文件处理完,而且结果也插入到主JSP文件完毕,主JSP文件将继续执行include指令下面的内容。

7)page指令
定义整个JSP页面的全局属性。
  JSP语法:
  <%@ page
  [ language="java"]
  [ extends="package.class"]
  [ import= "{ package.class | package.* }, ..." ]
  [ session="true|false" ]
  [ buffer="none|8kb|sizekb" ]
  [ false" ]
  [ isThreadSafe="true|false" ]
  [ info="text"]
  [ errorPage="relativeURL"]
  [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
  [ isErrorPage="true|false"] %>

<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*, java.lang.*" %>
<%@ page buffer="8kb" %>
<%@ page errorPage="error.jsp" %>


JSP动作元素

1)<jsp:forward>元素
将客户端的请求转交给一个HTML文件、JSP文件或脚本段处理。
JSP语法:<jsp:forward page="{ relativeURL | <%= expression %> }" />

<jsp:forward page="/dong/hello.jsp" />

特别注意:JSP引擎对主JSP页面<jsp:forward>下面的代码不再执行。

2)<jsp:useBean>
调用或创建一个指定名字和使用范围的Bean.

<jsp:useBean id="init" scope="page" class="chinaa.basket" />

<jsp:setProperty name="init" property="*" />

<jsp:useBean id="hello" scope="session" class="dadi.reg">
	<jsp:setProperty name="hello" property="n" value="45" />
</jsp:useBean>

<jsp:useBean>标签首先调用一个指定的名字和使用范围的Bean,如果这个Bean不存在,则创建该 Bean。
  属性和用法
  id="beanInstanceName"
  被调用或创建的Bean的名字.你可以在JSP文件的表达式、脚本段中使用该变量名。如果该Bean已经被另一个<jsp:useBean>创建,id值必须同原来的<jsp:useBean>标签中使用的id号相同.
  scope="page|request|session|application"
  定义Bean存在的范围。默认值是page。Bean的必须在其指定的范围内使用,否则使用它,将会出错。
  class="package.class"
  指定Bean的存放位置即存在哪个包中的哪个类。该类不能是抽象类,而且有一个公共的、无参数构造函数。包和类名是严格区分大小写的。
  class="package.class" type="package.class"
  类型type的值可以和类、该类的超类或该类实现的接口的类型一样。

3)<jsp:getProperty>
取得Bean属性的值,以便在结果页面中显示。
JSP语法:<jsp:getProperty name="beanInstanceName" property="propertyName"/>

<jsp:useBean id="init" scope="page" class="AccessDatabase.readdate" />
<!-- 从Bean中取得属性名为username的值在页面上显示 --><jsp:getProperty name=" init " property="username" />
在使用<jsp:getProperty>前,你必须使<jsp:useBean>元素创建或调用一个Bean实例。<jsp:getProperty>标签是用于取得JavaBeans属性值,相当于调用Bean中的某个属性的getXXX()方法。且该Bean中要有对应的getXXX()方法,否则编译时会出错。

4)<jsp:setProperty>
设置Bean的一个或多个属性值。

<jsp:setProperty name="init" property="*" />
<jsp:setProperty name="init" property="username" />
<jsp:setProperty name="init" property="username" value="lili" />

        a.使用<jsp:setProperty name="beanInstanceName" property="*" />方法,即可将用户请求中的所有值(这些值一般是客户表单中的元素的值,且作为参数存储在request对象中)和Bean中的相匹配的属性赋值。此时,Bean中属性的名字必须和客户端表单中元素的名字一样。
        b.使用<jsp:setProperty name="beanInstanceName" property="propertyName" [ param="parameterName"] />方法, 用请求对象中一个特定的值和Bean中相匹配的属性赋值或不相匹配的属性赋值。
        c.使用<jsp:setProperty name="init" property="username" value="{ string | <%= expression %> }" />方法,用字符串的值或表达式的值直接设置为Bean的属性

5)<jsp:plugin>
下载一个plugin插件到客户端以便执行applet或Bean

JSP中的隐藏对象

        由于JSP是嵌入式的语言,不能显式的把一些必须的参数传递进来,比如Request对象,Response对象等,所以在JSP规范中提供了几个隐含的对象来实现折椅功能。所谓隐含的对象,就是大家约定好使用一个名字来指代某个特定的对象,在编写JSP的时候不用显式的声明就能使用,由JSP引擎负责在解释的时候把隐含对象加入到解释完的.java文件中。常用的隐含对象有application, session, request, response, out, page, exception, pageContext。

        1)session对象
前面在Servlet部分已经提到,过当客户第一次访问Web服务器发布目录(一个Web服务器有一个或多个"发布目录")下的网页文件时,Web服务器会自动创建一个session对象,并为其分配唯一的ID号,客户可以将其需要的一些信息保存到该session对象,以便需要时使用。session对象就是指通过getSession法办法得到的对象,在JSP中是隐含对象,关于session对象的使用读者可以参见Servlet API

        2)application对象
当Web服务器启动时,Web服务器会自动创建application对象。Application对象一旦创建,它将一直存在,直到Web服务器关闭。因此,application对象可以实现多客户间的数据共享。一个Web服务器常常有多个发布目录,当Web服务器启动时,它自动为每个发布目录都创建一个application对象,这些application对象各自独立,而且和发布目录一一对应。
application的生命周期:从Web服务器启动到Web服务器关闭。
application在生命周期内的作用范围:在同一个发布目录A下的所有网页文件中,都可以对"和发布目录A对应"的application对象进行操作,而且访问发布目录A的所有客户都共用一个application对象。因此,当在该application中存放数据信息时,所有访问该发布目录A的客户都能够对其进行访问,实现了多客户之间的数据共享。
application对象的基类是:javax.servlet.ServletContext类。可以用该类中的getServletContext()方法取得application。具体的使用方法参见Servlet API。

        3)request对象
request对象主要用于取得客户在表单中提交的数据信息及多个网页之间数据信息传递等。同时通过它也可以取得Web服务器的参数。跟Servlet参数中的Request对象是相对应的。
request对象的基类为:javax.servlet.ServletRequest
如果传输协议是http,则是javax.servlet.HttpServletRequest

        4)respose对象
respose对象主要用于向客户端输出信息,响应客户端的请求。跟Servlet参数中的Response对象是相对应的。
respose对象的基类是:javax.servlet.ServletResponse
如果传输协议是http.则为javax.servlet.HttpServletResponse.

         5)out对象
out对象用于向客户端输出数据。
out对象基类是:javax.servlet.JspWriter类,跟Servlet中由HttpServletResponse得到的PrintWriter略有不同,但是都是从Writer继承而来,所以基本上还是一样的。

        6)page对象
page对象是当前JSP页面本身的一个实例。它的类型是:java.lang.Object。
其方法就是Object类中的方法。如:Class getClass()返回一个对象在运行时所对应的类的表示,从而可以得到相应的信息。String toString()返回当前对象的字符串表示。page对象在当前页面中可以用this代替。

        7)exception对象
当JSP页面在执行过程中发生例外或错误时,会自动产生exception对象。
在当前页面用<%@ page isErrorPage="true" %>设置后,就可以使用该exception对象,来查找页面出错信息。
exception对象的类型是:java.lang.Exception类.
exception对象的常用方法为:
String getMessage() 返回页面的出错信息,如果没有则返回null
void printStackTrace()以标准错误输出流的形式,打印并显示当前exception对象及其执行轨迹.

include指令与jsp:include动作的区别

         前者是指令元素、后者是行为元素。
首先我们必须了解:Jsp容器除了负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答。

<%@include file="date.jsp"%>
jsp页面是把include指令元素所指定的页面的实际内容(也就是代码段)加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet。
因此,在翻译阶段(JSP->Servlet),被包含文件的代码被原封不动地加入到了主导页面从而合成一个完整的文件。
编译结果(2个文件):主导页面.java、主导页面.class

<jsp:include page="dae.jsp" flush="true"/>
include行为元素是在请求处理阶段执行的。所以在我们作include行为元素引入页面时,实际只是引用了date.jsp这个文件被转化并被编译后产生的servlet类文件。既如此, date.jsp就是作为一个单独的文件在执行后才被主导文件运行时调用。
编译结果(4个文件):主导页面.java、主导页面.class、date_jsp.jsp、date_jsp.class
查看下“主导文件.jsp”,会发现此时只新增加了一句代码:
JspRuntimeLibrary.include(request, response, "date.jsp", out, true);

以下是对include 两种用法的区别,主要有两个方面的不同:

1)执行时间上
<%@include file="date.jsp"%> 是在翻译阶段执行
<jsp:include page="dae.jsp" flush="true"/>在请求处理阶段执行.

2)引入内容的不同
<%@include file="date.jsp"%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.
<jsp:include page="dae.jsp" flush="true"/>引入执行页面或servlet所生成的应答文本.

另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释.

 

你可能感兴趣的:(java,jsp,Web,servlet,application,web服务)