动态网页技术---J

JSP(全称JavaServer Pages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTMLXML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。

JSP使Java代码和特定的预定义动作可以嵌入到静态页面中。JSP句法增加了被称为JSP动作的XML标签,它们用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库提供了一种和平台无关的扩展服务器性能的方法。

JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。

目录

  • 1 JSP和Servlets

    • 1.1 JSP指令
    • 1.2 JSP脚本元素和变量
      • 1.2.1 标准脚本变量
      • 1.2.2 脚本元素
    • 1.3 JSP动作
      • 1.3.1动作样例

        • 1.3.1.1 jsp:include
        • 1.3.1.2 jsp:forward
        • 1.3.1.3 jsp:plugin
        • 1.3.1.4 jsp:useBean
    • 1.4 JSP标签库
  • 2. 本地化
  • 3. JSP2.0
  • 4. 模型-视图-控制器 模式
  • 5. 样例
  • 6. 出版物
  • 关注交流

JSP和Servlets

从架构上说,JSP可以被看作是从Servlets高级提炼而作为JAVA Servlet 2.1 API的扩展而应用。Servlets和JSP最早都是由Sun Microsystems(太阳公司)开发的。从JSP1.2版本以来,JSP处于Java Community Process(有人译为:JAVA社区组织)开发模式下。JSR-53规定了JSP 1.2和Servlet 2.4的规范,JSR-152规定了JSP 2.0的规范。2006年5月,JSP 2.1的规范作为Java EE 5的一部分,在JSR-245中发布。

静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致。此时,该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且,客户端每次请求都会得到相同的响应内容。

JSP指令

JSP指令控制JSP编译器如何去生成servlet,以下是可用的指令:

  • 包含指令include –包含指令通知JSP编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和C预处理器所提供的很类似。被包含文件的扩展名一般都是"jspf"(即JSP Fragment,JSP碎片):
<%@ include file="somefile.jsp" %>
  • 页面指令page –页面指令有以下几个选项:
import 使一个JAVA导入声明被插入到最终页面文件。
contentType 规定了生成内容的类型。当生成非HTML内容或者当前字符集character set并非默认字符集时使用。
errorPage 处理HTTP请求时,如果出现异常则显示该错误提示信息页面。
isErrorPage 如果设置为TRUE,则表示当前文件是一个错误提示页面。
isThreadSafe 表示最终生成的servlet是否线程安全(thread safe)。
<%@ page import="java.util.*" %> //example import导入样例
<%@ page contentType="text/html" %> //example contentType页面类型样例
<%@ page isErrorPage=false %> //example for non error page无错页面样例
<%@ page isThreadSafe=true %> //example for a thread safe JSP线程安全JSP样例

注意:在同一个JSP文件中只有"import"导入页面指令可以被多次使用。

  • 标签库指令taglib –标签库指令描述了要使用的JSP标签库。该指令需要指定一个前缀prefix(和C++的命名空间很类似)和标签库的描述URI:
<%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>

JSP脚本元素和变量

标准脚本变量

以下是永远可用的脚本变量:

  • out:JSPWriter,用来写入响应流的数据
  • page:servlet自身
  • pageContext:一个PageContext实例包括和整个页面相联系的数据,一个给定的HTML页面可以在多个JSP之间传递。
  • request:HTTP request(请求)对象
  • response:HTTP response(响应)对象
  • session:HTTP session(服务端会话)对象

脚本元素

有三个基本的脚本元素,作用是使JAVA代码可以直接插入servlet.

  • 一种是声明标签,在JAVA SERVLET的类体中放入一个变量的定义。静态的数据成员也可以如此定义。

    <%! int serverInstanceVariable = 1; %>
    
  • 一种是脚本标签,在JAVA SERVLET的类的_jspService()方法中放入所包含的语句。
    <% int localStackBasedVariable = 1;  out.println(localStackBasedVariable); %>
    
  • 一种是表达式标签,在JAVA SERVLET的类中放入待赋值的表达式,表达式注意不能以分号结尾。
    <%= "expanded inline data " + 1 %>
    

JSP动作

JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作:

jsp:include 和子过程类似,JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页中共享而不用复制。
jsp:param 可以在jsp:include, jsp:forward或jsp:params块之间使用。指定一个将加入请求的当前参数组中的参数。
jsp:forward 用于处理对另一个JSP或SERVLET的请求和响应。控制权永远不会交还给当前JSP页。
jsp:plugin Netscape Navigator的老版本和Internet Explorer使用不同的标签以嵌入一个applet。这个动作产生为嵌入一个APPLET所需要的指定浏览器标签。
jsp:fallback 如果浏览器不支持APPLETS则会显示的内容。
jsp:getProperty 从指定的JavaBean中获取一个属性值。
jsp:setProperty 在指定的JavaBean中设置一个属性值。
jsp:useBean 创建或者复用一个JavaBean变量到JSP页。

标签样例

jsp:include
1 <html>
2 <head></head>
3 <body>
4 <jsp:include page="mycommon.jsp" >
5     <jsp:param name="extraparam" value="myvalue" />
6 </jsp:include>
7 name:<%=request.getParameter("extraparam")%>
8 </body>
9 </html>
jsp:forward
1 <jsp:forward page="subpage.jsp" >
2      <jsp:param name="forwardedFrom" value="this.jsp" />
3 </jsp:forward>

在本例中,请求被传递到"subpage.jsp",而且请求的处理权不会再返回前者。

jsp:plugin

 1 <jsp:plugin type=applet height="100%" width="100%"
 2             archive="myjarfile.jar,myotherjar.jar"
 3             codebase="/applets"
 4             code="com.foo.MyApplet" >
 5     <jsp:params>
 6         <jsp:param name="enableDebug" value="true" />
 7     </jsp:params>
 8     <jsp:fallback>
 9         Your browser does not support applets.
10     </jsp:fallback>
11 </jsp:plugin>

上述plugin例子说明了一种在网页中嵌入applet的统一方法。在<OBJECT>标签出现之前,并没有一种嵌入applets的通用方法。这个标签设计得并不好,但有希望在以后加入动态属性(height="${param.height}", code="${chart}"等)和动态参数的新功能。目前jsp:plugin标签不允许动态调用applets。例如,你如果有一个图表applet需要数据点以参数形式被传入,除非数据点的数量是一个常量,否则你就不能使用ResultSet循环来创建jsp:param标签,你不得不手写每个jsp:param标签的代码。而每个上述jsp:param标签可以有一个动态命名和动态值。

jsp:useBean

1 <jsp:useBean id="myBean" class="com.foo.MyBean" scope="request" />
2 <jsp:getProperty name="myBean" property="lastChanged" />
3 <jsp:setProperty name="myBean" property="lastChanged" value="<%= new Date()%>" />

scope属性可以是request, page, session or application,它有以下用意:

  • request— 该属性在请求的生命周期内有效,一旦请求被所有的JSP页处理完后,那么该属性就不可引用。
  • page— 该属性只是当前页中有效。
  • session— 该属性在用户会话的生命周期内有效。
  • application— 该属性在各种情况下都有效,并且永远不会被变为不可引用,和全局变量global variable相同。

上述例子将会用一个创建一个类的实例,并且把该实例存储在属性中,该属性将在该请求的生命周期内有效。它可以在所有被包含或者从主页面(最先接收请求的页面)转向到的JSP页之间共享。

JSP标签库

除了JSP预定义动作之外,开发者还可以使用JSP标签扩展API添加他们自定义的动作。开发者写一种实现一个标签的界面和一个标签库的XML描述文件的JAVA类,这就能指定标签和实现标签的JAVA类 请看如下JSP:

<%@ taglib uri="mytaglib.tld" prefix="myprefix" %>
...
<myprefix:myaction> <%-- the start tag %>
...
</myprefix:myaction> <%-- the end tag %>
...

JSP编译器将会载入mytaglib.tld这个XML文件,然后可以看到标签myaction由JAVA类MyActionTag实现。当该标签首次在文件中使用时,将会创建一个MyActionTag的实例。然后(而且当每次该标签被使用时),当出现开始标签时,将会调用doStartTag()方法,根据开始标签的结果,来决定如何处理标签的主体。主体是指开始标签和结束标签之间的文本。这个doStartTag()方法将会返回如下之一:

  • SKIP_BODY - 标签之间不做处理。
  • EVAL_BODY_INCLUDE - 对标签之内主体进行赋值。
  • EVAL_BODY_TAG - 对标签之内主体进行赋值并把结果输出到流(保存在标签的主体内容属性中)。
注意:如果标签扩展了BodyTagSupport类,当主体被执行时会在调用doEndTag()之前调用doAfterBody()方法。该方法用于实现循环结构。

当结束标签出现时,它会调用doEndTag()方法,该方法会返回如下两做之一:

  • EVAL_PAGE - 表示JSP文件的剩余部分将会被执行。this indicates that the rest of the JSP file should be processed.
  • SKIP_PAGE - 表示将不会再有更多执行操作。当前JSP页交出控制权。就象在转发动作中的作用一样。

上述myaction标签tag会有一个类似下面例子的用于实现的类:

 1 public class MyActionTag extends  TagSupport {
 2     //Releases all instance variables.
 3     public void release() {...}
 4
 5     public MyActionTag() { ... }
 6
 7     //called for the start tag
 8     public int doStartTag() { ... }
 9
10     //called at the end tag
11 }

本地化

JSP的本地化是通过和JAVA应用程序相同的方式完成的,即使用资源包

JSP 2.0

新的JSP规范版本包括新的用于提升程序员工作效率功能,主要有:

Hello, ${param.visitor}  <%-- same as: Hello, <%=request.getParameter("visitor")%> --%>

模型-视图-控制器 模式

为了把表现层presentation从请求处理request processing和数据存储data storage中分离开来,太阳公司推荐在JSP文件中使用一种模型-视图-控制器Model-view-controller模式。规范的SERVLET或者分离的JSP文件用于处理请求。当请求处理完后,控制权交给一个只作为创建输出作用的JSP页。有几种平台都基于服务于网络层的模-视图-控件 模式(比如StrutsSpring framework)。

样例

不管JSP编译器是生成SERVLET的JAVA源码,或者是直接发布二进制码,了解一下JSP编译器是如何把文件转换成一个JAVA SERVLET,都是很有帮助的。例如,看一下如下输入JSP和它最后生成的JAVA SERVLET:

Input JSP

 1 <%@ page errorPage="myerror.jsp" %>
 2 <%@ page import="com.foo.bar" %>
 3
 4 <html>
 5 <head>
 6 <%! int serverInstanceVariable = 1;%>
 7 ...
 8 <% int localStackBasedVariable = 1; %>
 9 <table>
10     <tr><td><%= "expanded inline data " + 1 %></td></tr>
11     ...

Resulting servlet

 1 package jsp_servlet;
 2 import java.util.*;
 3 import java.io.*;
 4 import javax.servlet.*;
 5 import javax.servlet.http.*;
 6 import javax.servlet.jsp.*;
 7 import javax.servlet.jsp.tagext.*;
 8
 9 import com.foo.bar; //imported as a result of <%@ page import="com.foo.bar" %>
10 import ...
11
12 class _myserlvet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage {
13     //inserted as a
14     //result of <%! int serverInstanceVariable = 1;%>
15     int serverInstanceVariable = 1;
16     ...
17
18     public void _jspService( javax.servlet.http.HttpServletRequest request,
19                             javax.servlet.http.HttpServletResponse response )
20         throws javax.servlet.ServletException,
21                java.io.IOException
22     {
23         javax.servlet.ServletConfig config = ...;//get the servlet config
24         Object page = this;
25         PageContext pageContext = ...;//get the page context for this request
26         javax.servlet.jsp.JspWriter out = pageContext.getOut();
27         HttpSession session = request.getSession( true );
28         try {
29              out.print( "<html>\r\n" );
30              out.print( "<head>\r\n" );
31              ...
32              //from <% int localStackBasedVariable = 1; %>
33              int localStackBasedVariable = 1;
34              ...
35              out.print( "<table>\r\n" );
36              out.print( "   <tr><td>" );
37              //note, toStringOrBlank() converts the expression into a string or if
38              // the expression is null, it uses the empty string.
39              //from <%= "expanded inline data " + 1 %>
40              out.print( toStringOrBlank( "expanded inline data " + 1 ) );
41              out.print( "   </td></tr>\r\n" );
42              ...
43         } catch ( Exception _exception ) {
44            //clean up and redirect to error page in <%@ page errorPage="myerror.jsp" %>
45         }
46     }
47 }

出版物

JavaServer Pages, Third EditionHans BergstenO‘Reilly & Associates, Inc.,Sebastopol, California, 2003. ISBN 0-596-00563-6



关注交流

个人公众微信公众号:華少



动态网页技术---J

时间: 2024-10-27 13:41:57

动态网页技术---J的相关文章

J2EE动态网页技术—JSP

学习JSP,我们需要知道的是什么是JSP?JSP有什么特点?JSP与svelte有什么关系? 第一个概念:JSP是服务器端运行的一种脚本语言,这类似的语言还有CGI.ASP.PHP等.          CGI:采用单进程模式,每次请求服务器端的一个服务,都需要启动一个新的线程.所以当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,加重了服务器的负担,使服务器的执行效率变得越来越低下. ASP:是微软所开发一种后台脚本语言,特点简单易用,其局限性在于只能在微软的服务器平台上良好运行,

用动态网页技术PHP生成验证码图片的源代码

文件a.php <? //checkNum.php session_start(); function random($len) { $srcstr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; mt_srand(); $strs=""; for($i=0;$i<$len;$i++){ $strs.=$srcstr[mt_rand(0,35)]; } return strtoupper($strs); } $str=ra

动态网页技术--JSP(4)

分页查询 1.创建web工程 2.连接数据库引入jar包 classes12.jar                                 ojdbc14.jar 放入lib中 3.指定一个jsp页面中的一个链接,跳转到一个Servlet上 4.创建一个Servlet,勾选上doget,dopost方法,Next后,Servlet/JSP Mapping URL:要从根目录跳转,删去前面一部分,留下/PageServlet 5.web.xml中配置会自动生成 6.因为要跳转到servl

动态网页技术--JSP(7)

一.Ajax 同步传输:一问一答的样式,有发送的请求就返回响应 异步传输:多问多答的样式,不需要刷新整个页面,就可以完成局部数据访问 开发步骤: 1.事件驱动函数 2.如需要在函数中做异步交互,首先创建ajax引擎对象(XMLHttpRequest) 创建ajax引擎对象两种方法: //根据不同浏览器创建AJAX引擎对象 function createXHR(){ var xhr = null; //如果是IE if(window.ActiveXObject){ //alert("IE"

使用JSP/Server技术开发新闻发布系统第一章动态网页开发基础

      一:为什么需要动态网页    由于静态网页的内容是固定的,不能提供个性化和定制化得服务,使用动态网页可真正地与用户实现互动. 二:什么是动态网页  ①:动态网页是指在服务器端运行的,使用程序语言设计的交互网页,她们会根据某种条件的变化返回不同的网页内容.  ②动态网页需要使用服务器脚本语言. 三:动态网页的优势: ①        交互性:即网页会根据用户的要求和选择而动态改变和显示内容. ②        自动更新:即无時须改变页面代码,便会自动生成新的页面内容,可以大大节省工作量

使用JSP/Servalet技术开发新闻发布系统------动态网页开发基础

什么是动态网页? 动态网页是指在服务器端运行的程序或者网页,它们会随不同客户.不同时间,返回不同的网页. 动态网页的特点? (1).交互性:即网页会根据用户的要求和选择而动态改变和响应.采用动态网页技术的网站可以实现与用户的交互功能. (2).自动更新:无需手动操作,便会自动生成新的页面,可以节省工作量. (3).随机性:即当不同的时间.不同的人访问同一网址时会产生不同的页面效果. 为什么需要动态网页? 静态网页不能真正与用户实现互动.静态网页的内容是固定的,当修改了网页中的元素的时候,都需要重

动态网页和静态网页的区别

一.从功能方面来说动态网站与静态网站的区别 1. 动态网站可以实现静态网站所实现不了的功能,比方说:聊天室.论坛.音乐播放.浏览器.搜索等:而静态的网站则实现不了.2. 静态网站,如用Frontpage或Dreamweaver开发出来的网站,其源代码是完全公开的,任何浏览者都可以非常轻松地得到其源代码,也就是说,自己设计出来的东西很容易被别人盗用.动态网站,如:ASP开发出来的网站,虽然浏览者也可以看到其源代码,但是那已经是转换过以后的代码,想盗用源代码那是不可能的,因为它的源代码已经放在服务器

静态网页与动态网页的区别

1. 什么是静态网页?什么是动态网页?两者的区别是什么?试举例说明. 答:在网站设计中,纯粹 HTML 格式的网页通常被称为 " 静态网页 " ,早期的网站一般都是 由静态网页制作的.静态网页是相对于动态网页而言,是指没有后台数据库.不含程序和 不可交互的网页.你编的是什么它显示的就是什么.不会有任何改变.静态网页相对更新 起来比较麻烦,适用于一般更新较少的展示型网站.静态网页的网址形式通常为 : www.exa mple.com/eg/eg.htm ,也就是以 .htm . .htm

什么是静态网页与动态网页

什么是静态网页与动态网页? 在服务器端运行的程序.网页.组件,属于动态网页,它们会随不同客户.不同时间,返回不同的网页 运行于客户端的程序.网页.插件.组件,属于静态网页 区分动态网页与静态网页的基本方法: ---->>>>第一看后缀名,第二看是否能与服务器发生交互行为. 静态页面特点: 静态网页是相对于动态网页而言,是指没有后台数据库.不含程序和不可交互的网页.你编的是什么它显示的就是什么.不会有任何改变. 静态网页相对更新起来比较麻烦,适用于一般更新较少的展示型网站 静态网页是