javaweb回顧第七篇jsp

来源:http://www.cnblogs.com/LipeiNet/archive/2016/07/31/5712790.html
-Advertisement-
Play Games

1:為什麼會有JSP jsp全名(java server pages)中文叫做java伺服器頁面。在Servlet那一篇我們發現用Servlet可以生成動態頁面,但是我們卻在Servlet中卻寫了大量的html標簽,此外在Servlet中我們不得不將大量靜態顯示內容和動態生產內容混合在一起,使得我們 ...


1:為什麼會有JSP

jsp全名(java server pages)中文叫做java伺服器頁面。在Servlet那一篇我們發現用Servlet可以生成動態頁面,但是我們卻在Servlet中卻寫了大量的html標簽,此外在Servlet中我們不得不將大量靜態顯示內容和動態生產內容混合在一起,使得我們網頁編輯人員和程式員無法一起進行研發,這樣會大大增加開發的效率,有人會說為什麼不用ajax,因為在那個時候並沒有ajax。所以為了剋服這些問題,SUN公司就推出了JSP。

2:JSP的運行機制

我們先來寫一個非常簡單的jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp</title>
</head>
<body>
<%
  out.print("Hello Jsp");
%>
</body>
</html>

 這是一個非常普通的jsp如果我們打開tomcat伺服器然後在伺服器輸入http://localhost:8080/jsp-test/index.jsp它就會顯示Hello Jsp

當然這不是我說的重點,然後我們打開jsp編譯後的文件(位置在.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\jsp-test\org\apache\jsp)裡面有2個文件一個是index_jsp.java另一個是index_jsp.class。這2個文件就是當我們訪問jsp的時候由jsp(web)容器產生。現在我們看下index_jsp.java的內容

package org.apache.jsp;

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

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

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

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

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.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\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>jsp</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");

  out.print("Hello Jsp");

      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.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);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 看到這個頁面我相信大家很熟悉,可能會說這不是Servlet嗎?我們可以理解成動態的Servlet,其中_jspInit、_jspService、_jspDestroy分別對應的是Servlet中的init、service、destroy,他們具有相同的功能,他的優點顯而易見的,就不需要我們在Servlet中去寫上面我用黑體加重的代碼。這樣一來就加快了我們開發的效率。這樣一來我們就很容易理解jsp生成的過程。如下圖

 然後我們在來分析一下Servlet和Jsp的區別

1:Jsp第一次需要編譯成Servlet(只編譯一次)

2:Jsp是Java和HTML可以組合成一個擴展名為.jsp的文件而Servlet直接從Html分離出來

3:側重點不同,SP側重於視圖,Servlet主要用於控制邏輯。

3:JSP語法

3.1:指令元素

指令元素:主要用於為轉換階段提供整jsp頁面的相關信息,指令元素不會產生任何的輸出到當前的輸出流中(說白了就是定義一些關於JSP相關的信息)

3.1.1:page指令

page指令作用於整個jsp頁面,定義了許多和頁面相關的屬性,那麼我們來看看這些屬性

在我們生成的jsp頁面常常會有這條代碼<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

這上面幾個屬性就是指令元素 language表示開發的語言,contentType表示文本類型,charset和pageEncoding都表示編碼的格式

在將jsp轉成Servlet以後我們可以在_jspService的方法中可以發現response.setContentType("text/html; charset=UTF-8");那麼我們在來看其他的指令元素

<%@ page import="" %>這是是導入java的類和我們在開發中引用類的作用是一樣的,加入這個指令元素以後生成的Servlet就導入這個類。

<%@ page isELIgnored="true" %>用的比較多,表示是否啟動EL表達式 如果是Servlet2.3以前的版本預設是true,2.4以後的版本預設是false

<%@ page session="true" %>是否啟動Session 如果是false那麼Session在這個jsp就是無效的 預設是true

<%@ page errorPage="" %> 出現錯誤以後的指向的錯誤頁,此時web.xml配置的對這個就無效了

<%@ page isErrorPage="false" %> 指定這個JSP是否是別的頁面的錯誤頁 預設是false

<%@ page buffer="8kb" %> 指定out對象使用緩衝區的大小 預設值為8kb,none就是不設置緩衝區。

當然還有一些指令元素就不一一說了可以自己查閱一下,大家記住這些指令元素的範圍只能是當前頁面。

3.1.2:include指令

從字面意思我們知道include就是包含的意思,那麼這個指令元素到底幹嘛的呢,它主要用於JSP頁面中靜態包括一個文件,這個文件可以是一個html,一個jsp頁面,一個文本文件,一段java代碼,我們來看看運行結果

先寫一個簡單的jsp頁面

1 <html>
2 <head>
3 <title>我是一個jsp靜態文件</title>
4 </head>
5 <body>i am myinclede.jsp
6 </body>
7 </html>

然後我們在index.jsp中引用

1 <%@ include file="myinclude.jsp" %>

運行結果如下

如果要是一段代碼呢然後我們把myinclede.jsp修改成如下

 1 <%@ page import="java.util.*" %>
 2 <html>
 3 <head>
 4 <title>我是一個jsp靜態文件</title>
 5 </head>
 6 <body>
 7 <%
 8 out.print(new Date().toLocaleString());
 9 %>
10 </body>
11 </html>

我們在此運行結果如下

3.1.3:taglib指令

這個指令用戶自定義標簽

tablib有三個屬性分別是uri、tagdir、prefi,這個在以後的自定義標簽中詳細講解(暫時簡單介紹)

3.2:腳本元素

 腳本元素包括三個部分分別為聲明、腳本段、表達式

3.2.1:聲明

這個和在java代碼中聲明一個變數或方法一樣,我們來看下它的寫法

<%! int i=1; %>
<% out.print(i); %>

聲明以後我們就可以直接使用這個變數了,記住聲明要在%後面要加上!

當然你也可以聲明一個方法如下

<%! public String getUserName(){
return "zhangsan";
} %>
<% out.print(getUserName());%>

註意:使用<%! %>聲明的變數在jsp容器轉換成Servlet類是將該類的實例變數或者類變數(聲明時會加上static關鍵字)所以要註意線程安全問題

3.2.2:腳本段

腳本段是在請求處理期間要執行的java代碼<% %>裡面的代碼,這個就不多說了<% out.print(getUserName());%>就算。

3.2.3:表達式

表達式腳本元素是java語言完成的表達式,在請求計算這些完整表達式時會把結果轉成字元串,插入當前的輸入流中,表達式以<%=開始 %>結束

比喻姓名:<%= "張三"%>這個就是一個表達式(這個後面不需要添加如何符號)

3.3:動作元素

與 JSP指令元素不同的是,JSP動作元素在請求處理階段起作用。JSP動作元素是用XML語法寫成的。標準的jsp動作元素主要有20種,下麵我主要拿常用的說一下

1:<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>

<jsp:useBean>動作用來載入一個將在JSP頁面中使用的JavaBean,它的屬性有id為對象對一個名,class指定Bean的完整包名,scope表示這個對象的範圍

<jsp:setProperty>主要來設置對象值,其中name就是bean對象名,

<jsp:getProperty>主要來獲取對象的,我們來看下例子

public class UserBean {
    private String userName;
    private String realName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }
<body>
    <jsp:useBean id="user" class="com.lp.beans.UserBean" scope="session"></jsp:useBean>
    <jsp:setProperty property="userName" name="user" value="zhangsan" />
    <jsp:setProperty property="realName" name="user" value="張三"/>
    用戶名:<jsp:getProperty property="userName" name="user" />
    真實姓名:<jsp:getProperty property="realName" name="user" />
</body>

運行結果:

2:<jsp:forward page=""></jsp:forward>這個和上面那個forward作用相同,跳轉地址的。

3:<jsp:include page=""></jsp:include>包含頁面,作用上面也有提及

其他的我這裡不做提及,現在開發用這個估計是不多了,想瞭解的可以自己看看

 4:jsp九大內置對象

在Servlet中我們看到有許多對象比喻Request,response等那麼Jsp中有嗎,我們說過Jsp是動態的Servlet當然會有這些,我們來看看Jsp的9中內置對象

4.1:request

4.2:response

4.3:out,out的對象是JspWriter

4.4:page是jsp轉換成Servlet以後的實例object page=this;

4.5:pageContext來獲取當前頁面所有的屬性

4.6:application是javax.servlet.ServletContext的實例。

4.7:config是javax.servlet.ServletConfig實例

4.8:session

4.9:exception這個表示異常處理

這個我們一看應該都會明白

5:對象和範圍

jsp4種範圍

5.1:request:只在請求一次service有效

5.2:page只在當前頁有效,跳出此頁就無效

5.3:Session在整個會話期間有效

5.4:application在整個應用程式中有效,知道伺服器關閉

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 發現很少有集中討論C#可變性限制的中文博文(要麼就是一大段文字中夾雜很多凌亂的部分),所以寫發篇博文,集中討論,這些限制基本是基於安全考慮,亦或者根本難以實現而產生的。 註:本文不再解釋什麼是可變性,以及本文所討論的問題都基於.NET 4至.NET 4.5。所有地方我都力求簡潔。 好了,廢話不說了, ...
  • 隨著互聯網項目用戶訪問量不斷上升,單點web伺服器是無法滿足大型高併發高負載的業務處理的,為了給web伺服器做負載均衡方案,打算採用Nginx搭建負載均衡伺服器,把用戶請求分配到N個伺服器來緩解伺服器壓力。 Nginx簡介: Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代 ...
  • 前段時間,一直有練習ASP.NET MVC與Web API交互,接下來,Insus.NET再做一些相關的練習,Web API與文件操作,如POST文件至Web API,更新或是刪除等。不管怎樣,先在資料庫創建一張表,用來存儲上傳的文件。本實例中是把文件存儲過資料庫的。 CREATE TABLE Ap ...
  • 1.continue,break,ruturn eg:1-100的和 結果為:5050 換為break,查看結果 結果為:10 結論一:break:跳出整個迴圈體 換為continue看一下結果又是多少? 結果為:5045,(除5之外都執行) 結論二:continue跳過當前條件的迴圈 return ...
  • 目錄索引 【無私分享:ASP.NET CORE 項目實戰】目錄索引 簡介 本章我們來介紹下Asp.net Core 使用 CodeFirst 創建資料庫和表,通過 控制台 和 dotnet ef 兩種方式 修改EF上下文對象,添加測試類 我修改了一下名字,Domains 改為了 wkmvc.Data ...
  • 字元串操作大概是電腦程式中最常見的操作了,Java中表示字元串的類是String,它有哪些方法?內部是如何實現的?如何處理各種不同的編碼?不可變性意味著什麼?字元串常量到底是什麼?hashCode是如何實現的?... ...
  • lambda是一種匿名函數,python lambda可以使簡單的函數簡潔的表達,,C++的lambda使類似嵌套函數的功能得以實現 python的lambda VC++14的lambda lambda是vc++獨有的,在vc++11以後,擴展這個功能主要是為了使代碼書寫簡潔,gcc沒有這個功能 直 ...
  • 二叉查找樹,又名二叉排序樹,亦名二叉搜索樹,一種常用的樹形數據結構 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...