整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          常用JSP文件上傳,下載的一些方法

          用JSP文件上傳,下載的一些方法,Java實現文件分片上傳、大文件秒傳,大文件如何做斷點續傳?JAVAWEB 文件上傳及下載,JAVA大文件上傳,大文件下載解決方案,JAVA實現文件分片上傳并且斷點續傳,JAVA大文件分片上傳/多線程上傳功能,超大文件上傳和斷點續傳的控件,JAVA實現瀏覽器端大文件分片上傳,JAVA實現大文件上傳,JAVA WEB 實現文件上傳和下載接口功能,

          百度webuploader上傳文件到服務器指定文件夾問題,webuploader上傳文件到服務器指定文件夾問題,JSP上傳文件到服務器指定文件夾問題,JAVA上傳大文件實現源代碼,JAVA上傳大文件實現源碼,JAVA上傳大文件實現代碼,JAVA上傳大文件實現技巧,JAVA上傳大文件實現技術,JAVA上傳大文件實現思路,JAVA上傳大文件實現解決方案,

          前端上傳大文件實現方案,js上傳大文件實現方法,JavaScript上傳大文件實現方法,vue上傳大文件實現方法,前端上傳大文件實現方法,html上傳大文件實現方法,html5上傳大文件實現方法,百度webuploader上傳大文件實現方法,webuploader上傳大文件實現方法,JAVA上傳大文件實現方法,

          網上也搜過相關的解決方案,論壇里面也有網友交流,但是都不太令人滿意,與實際的需求需求也相差太遠。可以說是完全不能滿足公司這邊的項目需求。公司項目這塊實際上是需要一個成熟的商業解決方案。

          大文件上傳的話基本上都是分片來傳,網上很多文章講的不能說亂七八糟只能說完全沒用。

          JAVA的話主要是負責后端的接口,業務邏輯,功能的實現,比如文件初始化,文件分塊,文件塊合并,文件信息的查詢等。

          客戶這個項目跟了很長時間了,大概有2年了。實際上客戶并不在意使用哪種技術,只在乎兩點。

          文件比較大,有50G左右,用戶希望能夠在網頁里面直接上傳,一期的時候我們是直接用的HTML5的API,也就是chrome提供的API來做的,但是上線后用戶反饋不是特別的好用,用戶那邊有些電腦用的是WIN7+IE9,chrome的API在ie9里面不支持。但是用戶系統是支持的,這就把人整的有點不會了。二期的時候我們還是定制開發了,

          前端用了JSP,VUE2,VUE3,后端用了JSP,SpringBoot,IDE用了Eclipse,MyEclipse,因為新項目和老項目都用了兩種IDE。

          用戶要求能夠在網頁上面上傳文件夾,文件夾里面大約有1萬多個文件,有大有小,大的有1G~10G,小的有幾MB,文件夾上傳的時候需要保存層級結構,同時能夠將層級結構信息保存到數據庫中,同時還需要支持文件夾下載,下載下來的文件夾要和上傳的文件夾層級結構一模一樣。客戶每天都會傳輸一些資料,功能這塊使用頻率非常高。

          要求支持斷點續傳,支持進度信息離線存儲,用戶可能傳一半沒有傳完,下班了,明天上班后繼續上傳,電腦晚上到點需要關機,支持加密傳輸,支持國密加密算法SM4,要求支持下載,支持非打包方式下載,瀏覽器要求支持包含IE在內的所有瀏覽器,

          系統環境要求支持信創國產化,比如銀河麒麟,中標麒麟,統信UOS,龍芯,數據庫支持MySQL,Oracle,達夢數據庫,人大金倉,需要提供前端源碼,后端源碼,控件源碼,公司自己的項目,也有自己的產品,后續需要集成使用,

          要求提供7*24小時技術支持服務,提供文檔教程,視頻教程,遠程技術指導,1對1技術支持服務,提供手機,微信,QQ,郵箱,企業微信等聯系方式。導入項目:
          導入到Eclipse:http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
          導入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
          springboot統一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2

          下載示例:

          https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/

          工程

          NOSQL

          NOSQL示例不需要任何配置,可以直接訪問測試

          創建數據表

          選擇對應的數據表腳本,這里以SQL為例

          修改數據庫連接信息

          訪問頁面進行測試

          文件存儲路徑

          up6/upload/年/月/日/guid/filename

          相關問題:
          1.javax.servlet.http.HttpServlet錯誤
          2.項目無法發布到tomcat
          3.md5計算完畢后卡住
          4.服務器找不到config.json文件

          相關參考:

          文件保存位置

          源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

          源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl

          OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

          控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

          yEclipse官方最新版免費下載|Myeclipse漢化下載.MyEclipse-功能最全面的Java IDE. - MyEclipse官方中文網

          如果您有HTML或JSP文件要編輯,這里將介紹如何編輯。查找以下信息:

          • 編輯源代碼
          • 大綱和屬性視圖
          • 參數頁面

          該功能在MyEclipse中是可用的。

          一、HTML / JSP編輯器

          要編輯HTML或JSP文件,請執行以下操作當中的一個:

          • 雙擊HTML或JSP文件。
          • 右鍵單擊HTML或JSP文件,并選擇Open。

          HTML編輯器有以下模式:

          • 源模式 — 源模式是HTML和JSP代碼的源代碼編輯器,它包括智能內容輔助、行編號、彩色語法高亮顯示、格式操作、實時驗證、在輸入時標記有問題的源代碼以及代碼格式化。
          • 設計模式 — 設計模式具有雙面板視圖,頂部面板為設計模式,底部面板為源模式。設計模式為所見即所得的可視化編輯模式,設計畫布允許選擇、復制、剪切、粘貼和使用拖放重新定位Web UI控件。此模式包括一個設計調色板,其中包含可以添加到設計畫布的UI Web控件。
          • 預覽模式 — 預覽模式允許用戶快速查看頁面在瀏覽器中的外觀,預覽模式從設計模式加載當前源代碼,即使編輯器內容尚未保存。HTML源代碼以預覽模式呈現,并且“扎根”于資源所在的位置。如果HTML文檔中的圖像相對于HTML頁面的當前位置,則圖像將在預覽中正確呈現。

          打開文件時,默認模式是Design(設計),通過單擊編輯器底部的適當選項卡來更改模式。

          本文概述了使用源代碼編輯器編輯HTML時最重要的概念和特性。

          二、編輯源代碼

          用戶可以從源代碼模式或設計模式訪問源代碼,設計模式具有雙面板視圖,設計模式位于頂部面板,源模式位于底部面板。

          直接編輯源代碼時,可以使用以下功能:

          • 語法、顏色和高亮
          • 智能代碼完成和內容輔助
          • HTML驗證
          • 源格式和清理
          • HTML模板
          • HTML片段

          2.1 智能代碼完成和內容輔助

          在整個源代碼中,編輯器提供特定于內容的代碼幫助。

          Tag names(標記名稱):Code assist根據當前上下文提供可用HTML標記的列表。

          Tag attributes(標記屬性):代碼輔助提供了特定于正在編輯的標記屬性列表。

          Attribute values(屬性值):在適當的時候,代碼幫助會為您提供一個已知可能值的列表。

          2.2 HTML驗證

          有兩種類型的HTML驗證:“輸入時”和“資源更改”。

          “輸入時”:當對HTML文檔進行更改時,編輯器總是檢查HTML語法的有效性,就像Java編輯器一樣。

          注意:這種類型的驗證錯誤和警告不會出現在Problems視圖中。

          資源更改:當資源被修改(保存、移動、復制或導入)時,資源構建器將對資源執行HTML驗證。

          注意:您可以通過從菜單中選擇Window>Preferences,展開MyEclipse并選擇Validation來設置驗證參數。

          2.3 源格式化和清理

          要快速格式化源代碼,請右鍵單擊編輯器,并選擇Source>Format。格式化器不會在內部修改HTML標記元素,它只調整HTML元素的縮進和間距。

          使用Cleanup Document選項進行高級格式化和樣式調整,允許您更改標記名稱和屬性的大小寫,還有其他選項可以插入所需的標記和屬性。要使用此選項,請在編輯器中右鍵單擊并選擇Source>Cleanup Document,選擇Format source復選框,來將Format Document操作作為文檔清理的一部分。

          、JSP

              1、什么是JSP?

                 JSP(Java Server Pages):是以Java語言為基礎的動態網頁開發技術,

                 特點:

                    Servlet特點:在Java源碼中嵌入html源碼

                    JSP特點:在html源碼中嵌入java代碼

                 JSP就是Servlet

                    1、tomcat獲得JSP文件后,先將JSP轉成servlet,變成xxx.java(servlet源碼),

                      D:\java\tomcat7.0\apache-tomcat-7.0.53\apache-tomcat-7.0.53\work\Catalina\localhost\test01\org\apache\jsp

                          tomcat安裝目錄                        引擎   主機  項目   固定包名  這個之下就是存放著jsp變成的servlet文件.java和編譯文件.class 

                    2、tomcat將java文件編譯成class文件         

          3、tomcat運行class文件,并將結果輸出到瀏覽器,

          實例:

          創建一個jsp。查看其轉換后的servlet代碼。

                    NewFile.jsp          

          復制代碼

           1 <%@ page language="java" contentType="text/html; charset=UTF-8"
           2     pageEncoding="UTF-8"%>
           3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
           4 <html>
           5 <head>
           6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
           7 <title>Insert title here</title>
           8 </head>
           9 <body>
          10     hahaha
          11 </body>
          12 </html>

                    NewFile_jsp.java          

          復制代碼

           1 /*
           2  * Generated by the Jasper component of Apache Tomcat
           3  * Version: Apache Tomcat/7.0.53
           4  * Generated at: 2017-02-22 02:09:08 UTC
           5  * Note: The last modified time of this file was set to
           6  *       the last modified time of the source file after
           7  *       generation to assist with modification tracking.
           8  */
           9 package org.apache.jsp;
          10 
          11 import javax.servlet.*;
          12 import javax.servlet.http.*;
          13 import javax.servlet.jsp.*;
          14 
          15 public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase
          16     implements org.apache.jasper.runtime.JspSourceDependent {
          17 
          18   private static final javax.servlet.jsp.JspFactory _jspxFactory =
          19           javax.servlet.jsp.JspFactory.getDefaultFactory();
          20 
          21   private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
          22 
          23   private javax.el.ExpressionFactory _el_expressionfactory;
          24   private org.apache.tomcat.InstanceManager _jsp_instancemanager;
          25 
          26   public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
          27     return _jspx_dependants;
          28   }
          29 
          30   public void _jspInit() {
          31     _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
          32     _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
          33   }
          34 
          35   public void _jspDestroy() {
          36   }
          37 
          38   public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
          39         throws java.io.IOException, javax.servlet.ServletException {
          40 
          41     final javax.servlet.jsp.PageContext pageContext;
          42     javax.servlet.http.HttpSession session = null;
          43     final javax.servlet.ServletContext application;
          44     final javax.servlet.ServletConfig config;
          45     javax.servlet.jsp.JspWriter out = null;
          46     final java.lang.Object page = this;
          47     javax.servlet.jsp.JspWriter _jspx_out = null;
          48     javax.servlet.jsp.PageContext _jspx_page_context = null;
          49 
          50 
          51     try {
          52       response.setContentType("text/html; charset=UTF-8");
          53       pageContext = _jspxFactory.getPageContext(this, request, response,
          54                   null, true, 8192, true);
          55       _jspx_page_context = pageContext;
          56       application = pageContext.getServletContext();
          57       config = pageContext.getServletConfig();
          58       session = pageContext.getSession();
          59       out = pageContext.getOut();
          60       _jspx_out = out;
          61 
          62       out.write("\r\n");
          63       out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
          64       out.write("<html>\r\n");
          65       out.write("<head>\r\n");
          66       out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
          67       out.write("<title>Insert title here</title>\r\n");
          68       out.write("</head>\r\n");
          69       out.write("<body>\r\n");
          70       out.write("\thahaha\r\n");
          71       out.write("</body>\r\n");
          72       out.write("</html>");
          73     } catch (java.lang.Throwable t) {
          74       if (!(t instanceof javax.servlet.jsp.SkipPageException)){
          75         out = _jspx_out;
          76         if (out != null && out.getBufferSize() != 0)
          77           try { out.clearBuffer(); } catch (java.io.IOException e) {}
          78         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
          79         else throw new ServletException(t);
          80       }
          81     } finally {
          82       _jspxFactory.releasePageContext(_jspx_page_context);
          83     }
          84   }
          85 }

          可以看到public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent

          NewFile_jsp.java繼承自HttpJspBase。來看看HttpJspBase的源碼

          HttpJspBase.java         

          復制代碼

           1 /*
           2  * Licensed to the Apache Software Foundation (ASF) under one or more
           3  * contributor license agreements.  See the NOTICE file distributed with
           4  * this work for additional information regarding copyright ownership.
           5  * The ASF licenses this file to You under the Apache License, Version 2.0
           6  * (the "License"); you may not use this file except in compliance with
           7  * the License.  You may obtain a copy of the License at
           8  * 
           9  *      http://www.apache.org/licenses/LICENSE-2.0
          10  * 
          11  * Unless required by applicable law or agreed to in writing, software
          12  * distributed under the License is distributed on an "AS IS" BASIS,
          13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
          14  * See the License for the specific language governing permissions and
          15  * limitations under the License.
          16  */
          17 
          18 package org.apache.jasper.runtime;
          19 
          20 import java.io.IOException;
          21 
          22 import javax.servlet.ServletConfig;
          23 import javax.servlet.ServletException;
          24 import javax.servlet.http.HttpServlet;
          25 import javax.servlet.http.HttpServletRequest;
          26 import javax.servlet.http.HttpServletResponse;
          27 import javax.servlet.jsp.HttpJspPage;
          28 
          29 import org.apache.jasper.compiler.Localizer;
          30 
          31 /**
          32  * This is the super class of all JSP-generated servlets.
          33  *
          34  * @author Anil K. Vijendran
          35  */
          36 public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
          37     
          38     private static final long serialVersionUID = 1L;
          39 
          40     protected HttpJspBase() {
          41     }
          42 
          43     @Override
          44     public final void init(ServletConfig config) 
          45         throws ServletException 
          46     {
          47         super.init(config);
          48         jspInit();
          49         _jspInit();
          50     }
          51     
          52     @Override
          53     public String getServletInfo() {
          54         return Localizer.getMessage("jsp.engine.info");
          55     }
          56 
          57     @Override
          58     public final void destroy() {
          59         jspDestroy();
          60         _jspDestroy();
          61     }
          62 
          63     /**
          64      * Entry point into service.
          65      */
          66     @Override
          67     public final void service(HttpServletRequest request, HttpServletResponse response) 
          68         throws ServletException, IOException 
          69     {
          70         _jspService(request, response);
          71     }
          72     
          73     @Override
          74     public void jspInit() {
          75     }
          76 
          77     public void _jspInit() {
          78     }
          79 
          80     @Override
          81     public void jspDestroy() {
          82     }
          83 
          84     protected void _jspDestroy() {
          85     }
          86 
          87     @Override
          88     public abstract void _jspService(HttpServletRequest request, 
          89                                      HttpServletResponse response) 
          90         throws ServletException, IOException;
          91 }

          public abstract class HttpJspBase extends HttpServlet implements HttpJspPage

          看到了一個熟悉的類,HttpServlet,我們編寫Servlet時就是繼承自該類,這里也是繼承HttpServlet,并且HttpJspBase的源碼會發現,生命周期也是有init()方法,service()方法,destory()方法,相當于_jspService()方法就是servlet的service()方法的執行,所以說JSP也是一個servlet。

          我們在JSP寫的所有html代碼,都會被轉換為servlet中的out.write(html)代碼來輸出。看圖             

                 小總結:              

          對于jsp轉換成的servlet源碼,之后我們會在進行詳細分析,現在只需要知道jsp中的內容在servlet中被轉換成什么了,在哪里被轉換了即可。其中_jspService()方法的詳細內容下面會講解

          注意:jsp 生成java源碼,默認第一次生成,之后直接執行,除非內容修改,具體點說,由于JSP只會在客戶端第一次請求的時候被編譯,因此第一次請求JSP時會感覺比較慢,而之后的請求因為不會編譯JSP,所以速度就快多了,如果將Tomcat保存的JSP編譯后的class文件刪除,Tomcat也會重新編譯JSP。在開發Web程序的時候經常需要修改JSP,Tomcat能夠自動檢測到JSP程序的改動,如果檢測到JSP源代碼發生了改動,Tomcat會在下次客戶端請求JSP時重新編譯JSP,而不需要重啟Tomcat,這種自動檢測功能默認是開啟的,檢測改動會消耗少量的時間,在部署web應用程序的時候可以在web.xml中將它關掉。這也就是為什么我們能夠在jsp頁面直接修改內容,而不用重新啟動服務器的原因。

          因為JSP就是servlet,那么生命周期也就是跟serlvet一樣。

          JSP和servlet有一點區別就在于:jsp是先部署后編譯,而servlet是先編譯后部署。

          二、JSP語法

              JSP模版數據:

                  就是JSP中的HTML代碼,它的內容給是固定的,無論程序如何運行模版數據輸出到客戶端瀏覽器時都不會發生改變,當我們創建一個JSP時,模版就已經固定了。

               元素:JSP中的java部分,包括腳本(JavaScript,或者java代碼)以及JSP指令(Directive)與JSP標簽(Tag)等,元素決定著程序的流程,元素是不會顯示到瀏覽器的。這幾個都會在接下來講解到

               JSP腳本:

                  1、使用<% 編寫java代碼 %>,中間java代碼必須遵循Java語法            

          為什么能夠使用out輸出?這里就涉及到了JSP的九大內置對象了,后面會講解到,到時候回過頭來在看看這里,就會知道為什么可以使用。

                     來看看,jsp變為servlet時的代碼是如何編寫的。            

          在JSP中JSP指令(后面會講):                <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

          這句代碼在servlet就變為了response.setContentType("text/html; charset=UTF-8");//這句代碼的意思就是通知tomcat和瀏覽器都使用UTF-8碼表,并且發送回瀏覽器的數據類型是text/html。這是有JSP指令中畫紅色部分代碼轉變的,而指令中的pageEncoding="UTF-8"的意思是JSP轉換為Servlet時采用UTF-8碼表編碼,因為可能JSP中包含中文。

          對于JSP模版數據來說,就原封不動的使用out.write()來輸出到瀏覽器

          而對于JSP元素來說,就會變成普通的java代碼,因為在servlet中,就可以直接編寫java代碼。

          2、使用<%=xxx %>來輸出結果            

                    使用<%=result %>來輸出結果,servlet中就會將其轉換為out.print(result)進行輸出。輸出各種類型數據:int、double、boolean、String、Object等



                 3、JSP注釋

                    <%-- --%>  :jsp注釋,

                    //  :java單行注釋

                    /* */  :Java多行注釋

                    <!-- -->   :這個注釋,會發送到瀏覽器端的源碼中顯示

                    注釋分別在servlet中如何顯示的?




                    JSP注釋不會在servlet文件中顯示,而java注釋則會,但其所有的注釋到了瀏覽器端,都不會出現在源碼中,只有<!-- -->這個注釋會到瀏覽器的網頁源碼中去

                4、JSP中申明方法與屬性(全局變量)  使用<%! 方法、屬性%>

                    這個就不演示了,就是在JSP中編寫方法或者屬性時,使用<%! %>括起來。

                5、在JSP中使用if語句,或者使用for循環,whilt循環等都可以實現,也就是編寫腳本而已。

          三、JSP指令

              指令用來申明JSP頁面的一些屬性,比如編碼方式,文檔類型。我們在servlet中也會申明我們使用的編碼方式和響應的文檔類型的,而JSP就是用指令來申明。上面我們也說到了一條指令,也就是page指令,

          JSP指令格式:<%@ directive {attribute=value}* %>

          解釋:directive:指令名稱,例如page指令

          attribute=value:緊跟指令名稱后面的就是各種屬性,以鍵值對的形式書寫

          *:代表后面能跟0個或多個屬性。

          例如: page指令:用來聲明JSP頁面的屬性等。

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  page指令,后面跟著三個屬性,分別是language、contentType、pageEncoding。這只是其中的幾個屬性,并沒有寫全,page指令允許的屬性如下表所示

          屬性名稱        取值范圍          描述

          language        java      解釋該JSP文件時采用的語言,一般為java語言,默認為java

          extends        任何類的全名   編譯該JSP文件時繼承哪個類,JSP為Servlet,因此當指明繼承普通類時需要實現Servlet的init、destroy等方法

          import         任何包名、類名  引入該JSP中用到的類、包等,import是唯一可以聲明多次的page指令屬性,一個import可以引用uogelei,中間用英文逗號隔開,

          如<%@ page import="java.util.List,java.util.ArrayList"%>

          session        true、false    該JSP內是否內置Session對象,如果為true,則內置Session對象,可直接使用,否則反之,默認為true

          autoFlush       true,false    是否運行緩存,如果為true,則使用out.println()等方法輸出的字符串并不是立刻到達客戶端服務器的,而是暫時存到緩存里,緩存了或者程序執行完畢或者執行out.flush()操作時才到客戶端,默認為true。

          buffer        none或者數字KB   指定緩存大小,當autoFlush設為true時有效,例如<%@ page buffer=10kb%>

          isThreadSafe      true,false    是否線程安全,如果為true,則運行多個線程同時運行該jsp程序,否則只運行一個線程,其余線程等待,默認為false

          isErrorPage      true,false     指定該頁面是否為錯誤顯示頁面,如果為true,則該JSP內置有一個Exception對象exception,可直接使用,否則沒有,默認為false

          errorPage     某個JSP頁面的相對路徑  指明一個錯誤頁面,如果該JSP程序拋出一個未捕捉的異常,則轉到errorPage指定的頁面,errorPage指定的頁面通常isErrorPage屬性為true,且內置的exception對象為未捕捉的異常

          contentType     有效的文檔類型    客戶端瀏覽器根據該屬性判斷文檔類型,例如 HTML格式為text/html、純文本格式為text/plain、JPG圖像為image/jpeg、GIF圖                              像為image/gif、WORD文檔為application/msword,該屬性常跟著charset設置編碼一起,作用是通知服務器和瀏覽器都使用同一                              個碼表

          info          任意字符串      指明JSP的信息,該信息可以通過Servlet.getServletInfo()方法獲取到

          trimDirective Whitespaces    true、false     是否去掉指令前后的空白字符,默認為false

          pageEncoding    UTF-8,ISO-8859-1等    指定一張碼表來對該JSP頁面進行編碼,include指令

          比較簡單,只有一種形式 <%@ include file="relativeURL"%>  relativeURL:本應用程序內另一個JSP文件或者HTML文件的路徑,例如,網址內所有頁面均有一個統一風格的導航欄和頁腳版權,那么就可以使用該指令將其包含進來,  

          特點:include指令會將包含頁面的源代碼添加到使用include指令的頁面中來,然后編譯成class文件,而等下會講到的一個JSP行為,<jsp:include page="relativeURL">作用跟include指令一樣,但是不同的是,include行為是運行時單獨執行包含頁面,然后把執行的結果包含到本頁面來,屬于先運行后包含。

          taglib指令 JSP支持標簽技術,后面會講到標簽的用法,jstl標簽庫的使用等,作用:用來指明JSP頁面內使用的JSP標簽庫,taglib指令有兩個屬性,uri為類庫的地址,prefix為標簽的前綴<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

          四、JSP行為

              前面講了JSP語法,介紹了JSP頁面中的內容有哪些,分別有什么作用,就兩個東西,模塊數據和元素。其中元素有包括腳本指令標簽,腳本就是JSP中嵌入java代碼,指令作用就是申明頁面的屬性,那標簽是干嘛的,標簽分為JSP自帶內置的標簽,和通過taglib指令來使用JSP標簽庫,或者自定義標簽。現在我們先來講一些JSP內置的標簽。

               JSP內置的標簽就被稱為JSP行為(JSP Actions)。只要書寫很少的標記代碼就能使用JSP提供的豐富功能,JSP行為其實是對常用的JSP功能的抽象與封裝,可以取代jsp腳本,讓JSP中就少一些嵌入java代碼的地方。

                格式:<jsp:elements {attribute="value"}* />  

                    jsp:標簽的前綴,說明是jsp內置的標簽,

                    elements:行為的名稱,

                    attribute=value:使用鍵值對來編寫屬性

                    *:能指定0個或多個屬性對

              <jsp:include />行為

                 include行為用于運行時包含某個文件,如果被包含的文件為JSP程序,則先會執行JSP程序,然后在把執行的結果包含進來。 作用是跟include指令一樣的,唯一的區別就在于,include指令是將被包含的文件的源碼加入到了本JSP程序中,然后在進行編譯,屬于靜態包含,而include行為只是將被包含的文件的運行結果包含進自己。屬于動態包含

              Java bean行為

                 是一組與Java Bean 相關的行為,包括useBean行為、setProperty行為、getProperty行為等

                 Java Bean就是普通的Java類,也被稱為POJO,只有私有的屬性與對應的getter方法和setter方法,注意其中當私有的屬性為boolean類型時,習慣上一般把getter方法寫成isXxx();而不是getXxx();

                 useBean行為  

                    <jsp:useBean id="beanObject" class="className" scope="Value">  作用:在jsp中定義一個java bean對象,   

                       id:指明Java Bean對象的名稱,JSP中可以使用該名稱引用該Java Bean對象,相當于給new出來的對象取一個變量名,

                       class:Java Bean類的全名

                       scope:該java bean對象的作用范圍,可以寫的就四個,也就是JSP的四大作用域,page、request、session、application

                            page:只能在當前JSP頁面使用,如果不在JSP頁面,那么就會失效

                            request:這個前面學過,A頁面請求轉發到B頁面,那么使用的是同一個request,那么A,B頁面都算是request的作用域,也就是通過請求轉發的頁面都是其作                       用域

                            session:該作用域在一個web項目下任何位置應該讀訪問的到,只要cookie不關閉,并且cookie設置  的訪問路徑為"/",

                            application:其實就是Servlet中的servletContext,服務器下的所有項目都能訪問到。

                 setProperty行為

                    <jsp:setProperty name="beanName" property="propertyName" value="">

                      對Java Bean對象進行屬性的設置

                      name:java bean對象的名稱,也就是在useBean行為中的id

                      property:對象中的屬性名,

                      value:要對其屬性進行賦值的值

                 getProperty行為

                    <jsp:getProperty name="beanName" property="propertyName" />

                      獲取JavaBean對象的某個屬性值

                      name:java bean 對象的名稱,也就是在useBean行為中的id

                      property:對象的屬性名

                例子:  javabean:User.java  NewFile.jsp

                User.java

          復制代碼

           1 package a;
           2 
           3 public class User {
           4     private int id;
           5     private String username;
           6     private String password;
           7     public int getId() {
           8         return id;
           9     }
          10     public void setId(int id) {
          11         this.id = id;
          12     }
          13     public String getUsername() {
          14         return username;
          15     }
          16     public void setUsername(String username) {
          17         this.username = username;
          18     }
          19     public String getPassword() {
          20         return password;
          21     }
          22     public void setPassword(String password) {
          23         this.password = password;
          24     }
          25     
          26     
          27 }

                NewFile.jsp

          復制代碼

          1 <body>
          2     <!-- 創建一個新的javabean對象user,會先判斷在page作用域內是否有叫user對象的javabean,如果有則取它,如果沒有則創建新的javabean對象  -->
          3     <jsp:useBean id="user" class="a.User" scope="page"></jsp:useBean>
          4     <!-- 對javabean對象的username進行賦值 -->
          5     <jsp:setProperty property="username" name="user" value="wu"/>
          6     <!-- 獲取javabean對象的username屬性 -->
          7     <jsp:getProperty property="username" name="user"/>
          8 </body>

                可以查看NewFile.jsp變為servlet后的源代碼,看看我們寫的javabean行為會被轉換為何種語句


                這里出現了一個JSP九大內置對象中的一個,pageContext。現在簡單提一句,pageContext就是JSP頁面的管理者(上下文),其中的getAttribute(name,scope)方法是獲取指定作用域中的數據的,如果getAttribute(name)方法的話,默認是對page作用域進行操作,findAttribute(name)依次從page、request、session、application獲得內容。 

                在第一個紅框中,就代表中我們的useBean行為,其中進行了一次判斷,就是如果在page作用域中找不到user這個對象,那么就創建一個新的,否則就使用找到的這個user對象,

                第二個紅框中,代表著我們的setProperty行為,先找到user對象,然后在對其屬性進行賦值

                第三個紅框中,代表著我們的getProperty行為,也是先找到user對象,然后在獲取其屬性的值。

                注意:對于javabean行為來說,有一個特點的地方,就是當請求過來的參數對應javabean的屬性時,可以為其一次性設置所有的值

                    <jsp:setProperty name="user" property="*" /> //設置user的所有屬性,屬性值從request中自動取得,*代表所有屬性。

              <jsp:forward />行為

                實現請求轉發功能,Servlet中通過request.getRequestDispatcher("someServlet").forward(request,response);而在JSP中也能夠實現相同的功能,只不過用的是<jsp:forward />行為,實際上forward行為就是對其進行了封裝。

                格式:

                  <jsp:forward page="someServlet">

                     <jsp:param name="param1" value="value1"/>

                     <jsp:param name="param2" value="value2"/>

                  </jsp:forward>

                  page:需要跳轉到的頁面或者servlet、 <jsp:param/>參數行為,帶一些參數過去,name、value是以鍵值對的形式帶過去的

                例如:

                   NewFile.jsp



                   MyServlet.java



                   訪問:http://localhost:8080/test01/NewFile.jsp



                    瀏覽器地址欄沒有改變,說明是請求轉發

                   NewFile_jsp.java


                    使用return的好處是執行完上面的轉發,就直接return,沒有必要在執行下面的代碼了,對參數使用了URLEncode進行編碼,說明該<jsp:param/>可以直接傳遞中文,但是前提是要設置request.setCharacterEncoding("UTF-8");為什么這樣做,看上面框起來中的代碼。

              <jsp:directive/>行為

                 directive行為,就相當于JSP指令,比如<jsp:directive.page/>相當于<%@ page %>指令,等等其它指令是一樣的書寫格式。        

          五、JSP隱藏的九大內置對象和四大作用域

              之前那么一大段內容,就是為了講解什么是JSP,JSP中的內容是怎么樣的,到這里應該知道的差不多了, 但我們還要深入了解一些東西,我們知道JSP中的內容就只有兩種,模版數據,和元素,元素就包括了指令呀,腳本呀,標簽(行為)呀,腳本會慢慢被標簽全部代替,也就是說JSP中基本上不會嵌入Java代碼,但是我們也知道JSP會轉換為servlet,在Servlet中,輸出數據時,都需要通過response.getWrite();但是在JSP中,直接使用out對象進行輸出,為什么呢?這就是因為out為JSP的一個隱藏對象,JSP中內置了9個隱藏對象,使得JSP比Servlet使用起來更簡單,更方便,

              page、config、application、request、response、session、out、exception、pageContext

                page:page對象代表當前JSP頁面,是當前JSP編譯后的Servlet類的對象。相當于this。

                config:標識Servlet配置,類型:ServletConfig,api跟Servlet中的ServletConfig對象是一樣的,能獲取該servlet的一些配置信息,能夠獲取ServletContext

                application:標識web應用上下文,類型:ServletContext,詳情就看Servlet中的ServletContext的使用

                request:請求對象,  類型:httpServletRequest

                response:響應對象  類型:httpServletResponse

                session:表示一次會話,在服務器端記錄用戶狀信息的技術

                out:輸出響應體 類型:JspWriter

                exception 表示發生異常對象,類型 Throwable,在上面我們介紹page指令中的一個errorPage屬性時就有說到他

                pageContext:表示 jsp頁面上下文(jsp管理者) 類型:PageContext

               標記了紅色的對象就是JSP獨有的,其他的都是Servlet中的老東西。


                在這個由jsp轉換為servlet的文件中,只能看到8個內置對象,少了exception對象,因為我們在將page指令時,說過一個isErrorPage屬性,默認是false,被關閉了,所以其中并沒有exception對象。

               JSP的四大作用域:page、request、session、application

                  這四大作用域,其實就是其九大內置對象中的四個,為什么說他們也是JSP的四大作用域呢?因為這四個對象都能存儲數據,比如request.setAttribute()注意和request.setParameter()區分開來,一個是存儲在域中的、一個是請求參數,session.setAttribute()、application其實就是SerlvetContext,自然也有setAttribute()方法。而page作用域的操作就需要依靠pageContext對象來進行了。在上面我們也有提到JSP的四大作用域,

                  page作用域:代表變量只能在當前頁面上生效

                  request:代表變量能在一次請求中生效,一次請求可能包含一個頁面,也可能包含多個頁面,比如頁面A請求轉發到頁面B

                  session:代表變量能在一次會話中生效,基本上就是能在web項目下都有效,session的使用也跟cookie有很大的關系。一般來說,只要瀏覽器不關閉,cookie就會一直生效,cookie生效,session的使用就不會受到影響。

                  application:代表變量能一個應用下(多個會話),在服務器下的多個項目之間都能夠使用。比如baidu、wenku等共享帳號。

               out對象:

                  類型:JspWriter

                  jsp 輸出底層使用 response.getWriter();什么意思呢?這里就要講解一下JSP緩存和Servlet緩存了,輸出的過程是這樣的



                  JSP頁面轉換為Servlet后,使用的out對象是JspWriter類型的,所以是會先將要發送的數據存入JSP輸出緩存中,然后,等JSP輸出緩存滿了在自動刷新到servlet輸出緩存,等serlvet輸出緩存滿了,或者程序結束了,就會將其輸出到瀏覽器上。除非手動out.flush()。

                  驗證servlet輸出緩存和JSP輸出緩存和我們上面所說的是正確的。


                  4、提供作用域常量


               pageContext對象:重點

                  這個功能就比較強大了,比較牛逼,基本上什么他都有,因為是它是JSP頁面的管理者(上下文),所以JSP中的內置對象呀,它統統能夠獲得,下面介紹它的api。

                  1、獲得其它八大內置對象 getXxx()

                    pageContext.getOut();  //獲得out對象

                    pageContext.getApplication();  //獲得application對象

                    等等....

                  2、對作用域的屬性進行操作(四大作用域)

                    對默認作用域的屬性進行操作。page

                    pageContext.getAttribute(name);  //獲得page作用域數據

                    pageContext.setAttribute(name,value);  //給page作用域設置內容

                    pageContext.removeAttribute(name);  //給page作用域移除內容

                  3、對指定作用域的屬性進行操作

                    getAttribute(name,scope);  //獲得 指定作用域中的數據

                    setAttribute(name,value);  //給指定作用域設置內容

                    removeAttribute(name ,scope) 移除指定作用域的內容(page/request/session/application)

                  4、提供作用域常量

                    PageContext.PAGE_SCOPE  page

                    PageContext.REQUEST_SCOPE  request      

                    PageContext.SESSION_SCOPE  response

                    PageContext.APPLICATION_SCOPE  application

                  5、一次獲得指定名稱內容

                    findAttribute(name);  //依次從page、request、session、application 獲得內容

               response對象:

                  就是響應對象,、如果不了解就看看講解request和response的這一章節的內容

               config對象:

                  類型:ServletConfig

                  能夠獲取servlet的初始化參數,獲取servletContext對象,獲取servletName

                  api詳情請看講解servlet這一章節

               exception異常對象:

                  包含了異常的信息

                  使用它,必須結合page指令中的isErrorPage屬性和errorPage屬性。

                  exception.jsp  拋異常的一個NullPointException,并且跳轉到error.jsp錯誤顯示頁面  errorPage屬性的意思是如果發生未捕捉到的異常,將會跳轉到error.jsp頁面


                  error.jsp  isErrorPage屬性說明該頁面是一個錯誤顯示頁面,則可以使用exception對象


                  訪問http://localhost:8080/test01/exception.jsp


          六、總結

              通過上面一大堆一大堆的學習,我們應該知道這些東西

              1、什么是JSP?

                JSP本質上就是一個servlet,因為servlet輸出html太麻煩了,所以就有了JSP,JSP就是專門用來書寫html的,當然其中也能寫java代碼。

              2、JSP的內容包括什么?

                模版數據和元素。其中元素有包括腳本(java代碼)、指令(頁面屬性)、和行為(標簽,為了JSP中不嵌入那么多java代碼衍生的)

              3、JSP中九大內置對象是哪九個?

                九大內置對象,page、config、appliction、request、response、session、out、exception、pageContext

              4、九大內置對象和servlet中對象的關系

                page就是jsp轉換為servletservlet對象本身,也就是this

                config -- Servlet中的servletConfig

                application -- Servlet中的ServletContext

                request  -- Servlet中的request

                response  -- Servlet中的response

                session  -- Servlet中的session    

                out  -- JspWriter

                exception  -- 異常對象

                pageContext  -- 表示 jsp頁面上下文(jsp管理者) 類型:PageContext,

                  其中pageContext對象最牛逼,有了他就擁有了天下,哈哈~

             5、JSP中的四大作用域。

                page、request、session、application

                其中操作page域中屬性需要借助pageContext對象。

             6、JSP中還有其他兩大塊內容

                一個是EL表達式,很重要,

                另一個是jstl標簽庫的使用,也很重要


          主站蜘蛛池模板: 久久一区二区三区99| 国产在线观看一区二区三区精品 | 国产视频一区二区| 国产成人一区二区三中文| 国产综合视频在线观看一区| 一区二区在线视频| 精品国产免费一区二区三区| 伊人无码精品久久一区二区| 亚洲日韩国产一区二区三区| 国产精品一级香蕉一区| 一区二区三区亚洲| 一区二区三区观看免费中文视频在线播放 | 成人区人妻精品一区二区不卡视频 | 日本一区二区三区精品国产 | 一区二区三区午夜视频| 一区二区视频传媒有限公司| 国产亚洲一区二区三区在线不卡 | 一区二区高清在线| 国产福利电影一区二区三区久久久久成人精品综合| 久久久久人妻一区精品性色av| 免费观看一区二区三区| 日本在线不卡一区| 99热门精品一区二区三区无码| 国产精品成人免费一区二区 | 中文字幕在线一区二区在线| 亚洲av无码一区二区三区网站 | 国产午夜福利精品一区二区三区| 国产精品男男视频一区二区三区| 无码人妻视频一区二区三区| 自拍日韩亚洲一区在线| 日韩一区二区三区在线精品| 国产乱码精品一区二区三区中文| 国产剧情国产精品一区| 国产福利精品一区二区| 国产日韩精品一区二区在线观看 | 性色AV一区二区三区天美传媒| 无码精品一区二区三区在线| 久久久久久人妻一区二区三区 | 男人的天堂精品国产一区| 亚洲AV无码一区二区三区系列| 激情啪啪精品一区二区|