婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > JSP動態(tài)網(wǎng)頁開發(fā)原理詳解

JSP動態(tài)網(wǎng)頁開發(fā)原理詳解

熱門標(biāo)簽:南通通訊外呼系統(tǒng)產(chǎn)品介紹 海外圖書館地圖標(biāo)注點(diǎn) 潤滑油銷售電銷機(jī)器人 電銷機(jī)器人免培訓(xùn) 電話機(jī)器人需要使用網(wǎng)絡(luò)嗎 自繪地圖標(biāo)注數(shù)據(jù) 如何看懂地圖標(biāo)注點(diǎn) 外呼系統(tǒng)使用方法 給地圖標(biāo)注得傭金

一、什么是JSP?

     JSP全稱是Java Server Pages,它和servle技術(shù)一樣,都是SUN公司定義的一種用于開發(fā)動態(tài)web資源的技術(shù)。
  JSP這門技術(shù)的最大的特點(diǎn)在于,寫jsp就像在寫html,但它相比html而言,html只能為用戶提供靜態(tài)數(shù)據(jù),而Jsp技術(shù)允許在頁面中嵌套java代碼,為用戶提供動態(tài)數(shù)據(jù)。

二、JSP原理

2.1、Web服務(wù)器是如何調(diào)用并執(zhí)行一個jsp頁面的?

  瀏覽器向服務(wù)器發(fā)請求,不管訪問的是什么資源,其實都是在訪問Servlet,所以當(dāng)訪問一個jsp頁面時,其實也是在訪問一個Servlet,服務(wù)器在執(zhí)行jsp的時候,首先把jsp翻譯成一個Servlet,所以我們訪問jsp時,其實不是在訪問jsp,而是在訪問jsp翻譯過后的那個Servlet,例如下面的代碼:

index.jsp

%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
html>
 head>
  base href="%=basePath%>" rel="external nofollow" >

  title>First Jsp/title>

 /head>

 body>
  %
    out.print("Hello Jsp");
  %>
 /body>
/html>

  當(dāng)我們通過瀏覽器訪問index.jsp時,服務(wù)器首先將index.jsp翻譯成一個index_jsp.class,在Tomcat服務(wù)器的work\Catalina\localhost\項目名\org\apache\jsp目錄下可以看到index_jsp.class的源代碼文件index_jsp.java,index_jsp.java的代碼如下:

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
  implements org.apache.jasper.runtime.JspSourceDependent {

 private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

 private static java.util.List _jspx_dependants;

 private javax.el.ExpressionFactory _el_expressionfactory;
 private org.apache.AnnotationProcessor _jsp_annotationprocessor;

 public Object getDependants() {
  return _jspx_dependants;
 }

 public void _jspInit() {
  _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
  _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
 }

 public void _jspDestroy() {
 }

 public void _jspService(HttpServletRequest request, HttpServletResponse response)
    throws java.io.IOException, ServletException {

  PageContext pageContext = null;
  HttpSession session = null;
  ServletContext application = null;
  ServletConfig config = null;
  JspWriter out = null;
  Object page = this;
  JspWriter _jspx_out = null;
  PageContext _jspx_page_context = null;


  try {
   response.setContentType("text/html;charset=UTF-8");
   pageContext = _jspxFactory.getPageContext(this, request, response,
         null, true, 8192, true);
   _jspx_page_context = pageContext;
   application = pageContext.getServletContext();
   config = pageContext.getServletConfig();
   session = pageContext.getSession();
   out = pageContext.getOut();
   _jspx_out = out;

   out.write('\r');
   out.write('\n');

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

   out.write("\r\n");
   out.write("\r\n");
   out.write("!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
   out.write("html>\r\n");
   out.write(" head>\r\n");
   out.write("  base href=\"");
   out.print(basePath);
   out.write("\">\r\n");
   out.write("  \r\n");
   out.write("  title>First Jsp/title>\r\n");
   out.write("\t\r\n");
   out.write(" /head>\r\n");
   out.write(" \r\n");
   out.write(" body>\r\n");
   out.write("  ");

    out.print("Hello Jsp");

   out.write("\r\n");
   out.write(" /body>\r\n");
   out.write("/html>\r\n");
  } catch (Throwable t) {
   if (!(t instanceof SkipPageException)){
    out = _jspx_out;
    if (out != null  out.getBufferSize() != 0)
     try { out.clearBuffer(); } catch (java.io.IOException e) {}
    if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
   }
  } finally {
   _jspxFactory.releasePageContext(_jspx_page_context);
  }
 }
}

  我們可以看到,index_jsp這個類是繼承 org.apache.jasper.runtime.HttpJspBase這個類的,通過查看Tomcat服務(wù)器的源代碼,可以知道在apache-tomcat-6.0.20-src\java\org\apache\jasper\runtime目錄下存HttpJspBase這個類的源代碼文件,如下圖所示: 

我們可以看看HttpJsBase這個類的源代碼,如下所示:

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.jasper.runtime;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.HttpJspPage;
import javax.servlet.jsp.JspFactory;

import org.apache.jasper.compiler.Localizer;

/**
 * This is the super class of all JSP-generated servlets.
 *
 * @author Anil K. Vijendran
 */
public abstract class HttpJspBase
  extends HttpServlet
  implements HttpJspPage


{

  protected HttpJspBase() {
  }

  public final void init(ServletConfig config)
  throws ServletException
  {
    super.init(config);
  jspInit();
    _jspInit();
  }

  public String getServletInfo() {
  return Localizer.getMessage("jsp.engine.info");
  }

  public final void destroy() {
  jspDestroy();
  _jspDestroy();
  }

  /**
   * Entry point into service.
   */
  public final void service(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
  {
    _jspService(request, response);
  }

  public void jspInit() {
  }

  public void _jspInit() {
  }

  public void jspDestroy() {
  }

  protected void _jspDestroy() {
  }

  public abstract void _jspService(HttpServletRequest request,
           HttpServletResponse response)
  throws ServletException, IOException;
}

  HttpJspBase類是繼承HttpServlet的,所以HttpJspBase類是一個Servlet,而index_jsp又是繼承HttpJspBase類的,所以index_jsp類也是一個Servlet,所以當(dāng)瀏覽器訪問服務(wù)器上的index.jsp頁面時,其實就是在訪問index_jsp這個Servlet,index_jsp這個Servlet使用_jspService這個方法處理請求。

2.2、Jsp頁面中的html排版標(biāo)簽是如何被發(fā)送到客戶端的?

瀏覽器接收到的這些數(shù)據(jù)

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
html>
 head>
  base href="http://localhost:8080/JavaWeb_Jsp_Study_20140603/" rel="external nofollow" >

  title>First Jsp/title>

 /head>

 body>
  Hello Jsp
 /body>
/html>

都是在_jspService方法中使用如下的代碼輸出給瀏覽器的:

out.write('\r');
   out.write('\n');

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

   out.write("\r\n");
   out.write("\r\n");
   out.write("!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
   out.write("html>\r\n");
   out.write(" head>\r\n");
   out.write("  base href=\"");
   out.print(basePath);
   out.write("\">\r\n");
   out.write("  \r\n");
   out.write("  title>First Jsp/title>\r\n");
   out.write("\t\r\n");
   out.write(" /head>\r\n");
   out.write(" \r\n");
   out.write(" body>\r\n");
   out.write("  ");

    out.print("Hello Jsp");

   out.write("\r\n");
   out.write(" /body>\r\n");
   out.write("/html>\r\n");

  在jsp中編寫的java代碼和html代碼都會被翻譯到_jspService方法中去,在jsp中編寫的java代碼會原封不動地翻譯成java代碼,如%out.print("Hello Jsp");%>直接翻譯成out.print("Hello Jsp");,而HTML代碼則會翻譯成使用out.write("html標(biāo)簽>\r\n");的形式輸出到瀏覽器。在jsp頁面中編寫的html排版標(biāo)簽都是以out.write("html標(biāo)簽>\r\n");的形式輸出到瀏覽器,瀏覽器拿到html代碼后才能夠解析執(zhí)行html代碼。

2.3、Jsp頁面中的java代碼服務(wù)器是如何執(zhí)行的?

  在jsp中編寫的java代碼會被翻譯到_jspService方法中去,當(dāng)執(zhí)行_jspService方法處理請求時,就會執(zhí)行在jsp編寫的java代碼了,所以Jsp頁面中的java代碼服務(wù)器是通過調(diào)用_jspService方法處理請求時執(zhí)行的。

2.4、Web服務(wù)器在調(diào)用jsp時,會給jsp提供一些什么java對象?

  查看_jspService方法可以看到,Web服務(wù)器在調(diào)用jsp時,會給Jsp提供如下的8個java對象

PageContext pageContext;
HttpSession session;
ServletContext application;
ServletConfig config;
JspWriter out;
Object page = this;
HttpServletRequest request,
HttpServletResponse response

  其中page對象,request和response已經(jīng)完成了實例化,而其它5個沒有實例化的對象通過下面的方式實例化

pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
 application = pageContext.getServletContext();
 config = pageContext.getServletConfig();
 session = pageContext.getSession();
 out = pageContext.getOut();

 這8個java對象在Jsp頁面中是可以直接使用的,如下所示:

%
    session.setAttribute("name", "session對象");//使用session對象,設(shè)置session對象的屬性
    out.print(session.getAttribute("name")+"br/>");//獲取session對象的屬性
    pageContext.setAttribute("name", "pageContext對象");//使用pageContext對象,設(shè)置pageContext對象的屬性
    out.print(pageContext.getAttribute("name")+"br/>");//獲取pageContext對象的屬性
    application.setAttribute("name", "application對象");//使用application對象,設(shè)置application對象的屬性
    out.print(application.getAttribute("name")+"br/>");//獲取application對象的屬性
    out.print("Hello Jsp"+"br/>");//使用out對象
    out.print("服務(wù)器調(diào)用index.jsp頁面時翻譯成的類的名字是:"+page.getClass()+"br/>");//使用page對象
    out.print("處理請求的Servlet的名字是:"+config.getServletName()+"br/>");//使用config對象
    out.print(response.getContentType()+"br/>");//使用response對象
    out.print(request.getContextPath()+"br/>");//使用request對象
%>

運(yùn)行結(jié)果如下:

 

2.5、Jsp最佳實踐

  Jsp最佳實踐就是jsp技術(shù)在開發(fā)中該怎么去用。

  不管是JSP還是Servlet,雖然都可以用于開發(fā)動態(tài)web資源。但由于這2門技術(shù)各自的特點(diǎn),在長期的軟件實踐中,人們逐漸把servlet作為web應(yīng)用中的控制器組件來使用,而把JSP技術(shù)作為數(shù)據(jù)顯示模板來使用。其原因為,程序的數(shù)據(jù)通常要美化后再輸出:讓jsp既用java代碼產(chǎn)生動態(tài)數(shù)據(jù),又做美化會導(dǎo)致頁面難以維護(hù)。讓servlet既產(chǎn)生數(shù)據(jù),又在里面嵌套html代碼美化數(shù)據(jù),同樣也會導(dǎo)致程序可讀性差,難以維護(hù)。因此最好的辦法就是根據(jù)這兩門技術(shù)的特點(diǎn),讓它們各自負(fù)責(zé)各的,servlet只負(fù)責(zé)響應(yīng)請求產(chǎn)生數(shù)據(jù),并把數(shù)據(jù)通過轉(zhuǎn)發(fā)技術(shù)帶給jsp,數(shù)據(jù)的顯示jsp來做。

2.6、Tomcat服務(wù)器的執(zhí)行流程

  

第一次執(zhí)行:

  1. 客戶端通過電腦連接服務(wù)器,因為是請求是動態(tài)的,所以所有的請求交給WEB容器來處理
  2. 在容器中找到需要執(zhí)行的*.jsp文件
  3. 之后*.jsp文件通過轉(zhuǎn)換變?yōu)?.java文件
  4. *.java文件經(jīng)過編譯后,形成*.class文件
  5. 最終服務(wù)器要執(zhí)行形成的*.class文件

第二次執(zhí)行:

因為已經(jīng)存在了*.class文件,所以不在需要轉(zhuǎn)換和編譯的過程

修改后執(zhí)行:

       1.源文件已經(jīng)被修改過了,所以需要重新轉(zhuǎn)換,重新編譯。

到此這篇關(guān)于JSP動態(tài)網(wǎng)頁開發(fā)原理詳解的文章就介紹到這了,更多相關(guān)JSP動態(tài)網(wǎng)頁開發(fā)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • JSP動態(tài)網(wǎng)頁開發(fā)技術(shù)概述
  • jsp實現(xiàn)將動態(tài)網(wǎng)頁轉(zhuǎn)換成靜態(tài)頁面的方法

標(biāo)簽:樂山 廣州 貸款邀約 黃石 內(nèi)江 南京 大連 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP動態(tài)網(wǎng)頁開發(fā)原理詳解》,本文關(guān)鍵詞  JSP,動態(tài),網(wǎng)頁,開發(fā),原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《JSP動態(tài)網(wǎng)頁開發(fā)原理詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于JSP動態(tài)網(wǎng)頁開發(fā)原理詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美激情综合五月色丁香| 91在线porny国产在线看| www.在线成人| 91香蕉视频mp4| 在线不卡欧美精品一区二区三区| 欧美精品九九99久久| 日韩午夜精品视频| 国产欧美精品在线观看| 亚洲精品视频观看| 久久精品国产色蜜蜜麻豆| 粉嫩在线一区二区三区视频| 色综合天天综合网天天看片| 日韩一区二区三区电影在线观看| 久久久久久久电影| 亚洲自拍另类综合| 国产美女在线精品| 欧美挠脚心视频网站| 国产精品色婷婷久久58| 成人美女视频在线看| 国产九色精品成人porny | 亚洲欧美一区二区三区久本道91| 亚洲人快播电影网| 亚洲女性喷水在线观看一区| 麻豆久久一区二区| 欧美系列在线观看| 中文字幕一区二区视频| 精品在线观看视频| 欧美挠脚心视频网站| 综合久久久久久久| 亚洲成人1区2区| 成人精品鲁一区一区二区| 欧美喷潮久久久xxxxx| 亚洲精品一二三区| 97se亚洲国产综合自在线不卡| 蜜臀精品一区二区三区在线观看 | 欧美怡红院视频| 亚洲天堂中文字幕| 国产精品一区二区在线观看不卡| 欧美精品v国产精品v日韩精品| 亚洲精品v日韩精品| 91色.com| 最新国产成人在线观看| www.日韩在线| 国产精品久久久久久久裸模| 国产成人超碰人人澡人人澡| 久久亚洲春色中文字幕久久久| 极品尤物av久久免费看| 欧美电影免费提供在线观看| 青娱乐精品视频| 91精品国产欧美一区二区18| 日韩成人dvd| 美女尤物国产一区| 91福利资源站| 中文字幕乱码久久午夜不卡| 国产在线播放一区| 欧美成人video| 久久99国产精品久久| 日韩女优电影在线观看| 日本va欧美va瓶| 777奇米成人网| 美女网站在线免费欧美精品| 欧美日韩一区二区在线观看视频 | 国产精品123| 中文字幕欧美国产| 91免费看片在线观看| 一区二区在线观看av| 欧美日韩在线播放三区四区| 亚洲靠逼com| 粉嫩一区二区三区性色av| 久久天天做天天爱综合色| 国内精品在线播放| 国产精品免费视频一区| 91片在线免费观看| 视频在线在亚洲| 国产日产亚洲精品系列| 日本韩国欧美在线| 蜜桃av噜噜一区二区三区小说| 精品噜噜噜噜久久久久久久久试看| 国产在线精品一区二区夜色 | 欧美成人一区二区三区在线观看| 秋霞电影一区二区| 国产天堂亚洲国产碰碰| 一本色道久久综合亚洲aⅴ蜜桃| 五月天久久比比资源色| 日韩女优毛片在线| 成人精品小蝌蚪| 日韩电影在线观看网站| 国产精品久久久久久久久果冻传媒 | 午夜精品福利一区二区蜜股av| www.av亚洲| 日本一区二区三区dvd视频在线| 亚洲精品欧美激情| 一本大道av一区二区在线播放| 亚洲成a人片在线不卡一二三区| 欧美三级午夜理伦三级中视频| 免费观看成人av| 亚洲国产精品精华液2区45| 91精品国产综合久久福利| 欧美激情中文不卡| 色琪琪一区二区三区亚洲区| 夜色激情一区二区| 日韩三级在线免费观看| 国产河南妇女毛片精品久久久| 亚洲伦理在线精品| 欧美成人艳星乳罩| 在线一区二区三区做爰视频网站| 亚洲图片欧美综合| 国产欧美视频一区二区三区| 在线观看成人小视频| 国产综合久久久久久鬼色| 亚洲综合在线视频| 日本一二三四高清不卡| 欧美一级欧美三级| 欧美色精品天天在线观看视频| 成人美女在线视频| 国产综合一区二区| 亚洲成人av在线电影| 欧美大胆一级视频| 色哟哟一区二区三区| 麻豆专区一区二区三区四区五区| 1024成人网| 亚洲国产成人在线| 久久日一线二线三线suv| 欧美日韩一区二区三区视频| 成人午夜私人影院| 国产在线不卡一区| 蜜桃av一区二区三区| 性欧美疯狂xxxxbbbb| 一区二区三区日韩在线观看| 亚洲欧美综合色| 国产拍揄自揄精品视频麻豆| 日韩一级高清毛片| 91国产免费看| 色成年激情久久综合| 成人动漫一区二区| 成人一级黄色片| 成人午夜免费电影| 不卡一区二区在线| 国产成人精品一区二| 激情六月婷婷综合| 香蕉影视欧美成人| 一区二区三区不卡视频在线观看 | 色婷婷国产精品综合在线观看| 国产永久精品大片wwwapp| 国产在线不卡视频| 精品亚洲成a人| 国产电影一区在线| 成人av手机在线观看| 一本久久a久久免费精品不卡| 91国产福利在线| 欧美猛男男办公室激情| 日韩一区二区三区精品视频 | 国产精品18久久久久久vr| 国产呦萝稀缺另类资源| 丰满少妇久久久久久久| 色综合色综合色综合色综合色综合| 色综合久久久久综合体| 99久久久免费精品国产一区二区| 91在线一区二区| 91国偷自产一区二区开放时间 | 日韩欧美电影一二三| 精品国产区一区| 国产精品精品国产色婷婷| 亚洲一区二区视频在线| 久久国产精品露脸对白| 不卡一卡二卡三乱码免费网站| 欧美专区日韩专区| 日韩免费一区二区| 国产精品网友自拍| 亚洲精品videosex极品| 久久99国内精品| 成人深夜在线观看| 欧美日韩在线三区| 久久网这里都是精品| 亚洲激情在线激情| 精品一区二区三区在线观看 | 亚洲精品乱码久久久久久久久 | 国产日韩精品一区二区浪潮av| 亚洲乱码国产乱码精品精98午夜| 日本sm残虐另类| 国产不卡视频在线播放| 欧美日韩国产小视频| 精品国产电影一区二区| 最新久久zyz资源站| 日日夜夜免费精品视频| 处破女av一区二区| 制服丝袜av成人在线看| 久久久久免费观看| 伊人开心综合网| 国产成人免费在线观看| 91精品久久久久久久久99蜜臂| 国产精品热久久久久夜色精品三区 | 亚洲国产精品久久久男人的天堂| 另类成人小视频在线| 色哟哟一区二区| 精品久久久久久无| 性久久久久久久| 91最新地址在线播放| 欧美tickling网站挠脚心| 亚洲成av人片观看|