JSP_1th_第一個JSP程式
1、為什麼需要JSP?
Servlet:
優點:邏輯處理方便。
缺點:頁面表現麻煩。
JSP:
優點:頁面表現方便。
缺點:邏輯處理麻煩。
所以要互補使用,一般專案採用:
jsp(頁面表現)+servlet(業務邏輯)+javabean(資料處理)
(當然,學了ssh後,可以採用ssh框架)
2、舉例
新建一個Web專案,取名為TestJSP,在其WebContent目錄下,新建一個1.jsp檔案,寫入如下html程式碼:
<strong>aaaaaaaa</strong>
<p>bbbbbbbb</p>
這裡就不再講怎麼部署專案,啟動伺服器的過程了,在瀏覽器訪問:http://localhost:8080/TestJSP/1.jsp(在WebContent目錄下的檔案都位於Web專案的根目錄下,jsp也是如此,不像Servlet一樣還要指定<url-pattern></url-pattern>),頁面效果:
可能第一印象都會覺得jsp就是html,好像沒啥區別。
其實jsp和servlet的關係很密切:jsp就是servlet。
jsp是無法直接在頁面被顯示出來的,之所以會顯示出jsp的部分是因為jsp經過轉換變成了servlet,而servlet通過resp.getWriter().println()即可以字串形式打印出html程式碼)
第一次訪問某jsp檔案時,才會對該jsp檔案進行編譯。(這也是為什麼訪問一個未被訪問過的jsp會比較慢,而第二次訪問就很快的原因)
JSP編譯後生成的Java檔案和Java類檔案(即Servlet)都存放在Tomcat伺服器的work目錄下,在我的環境中是:
...\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\MyJSP\org\apache\jsp目錄下,有一個_1_jsp.java和_1_jsp.class
在_1_jsp.java檔案中,_1_jsp這個類繼承了HttpJspBase,可以猜測HttpJspBase繼承了HttpServlet:
public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
_1_jsp中有幾個方法,其中最重要的方法是public void _jspService():
總結:public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod(); if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD"); return; } 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"); 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("<strong>aaaaaaaa</strong>\r\n"); out.write("<p>bbbbbbbb</p>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)) { out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { 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); } }
可以看到我們寫的1.jsp中的兩個標籤變成了:
out.write("<strong>aaaaaaaa</strong>\r\n");
out.write("<p>bbbbbbbb</p>");
也就是說jsp中寫的html程式碼並不能直接顯示到頁面中,而是要經過jsp引擎轉譯為servlet,通過servlet來out.write()出jsp中的內容。jsp引擎,將jsp檔案轉譯為上述形式的java檔案。
3、伺服器內部是怎樣處理使用者對jsp檔案的請求?
在C:\apache-tomcat-8.0.17\conf\web.xml中有如下程式碼:
...
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
...
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
即對於所有的jsp請求,伺服器都會呼叫org.apache.jasper.servlet.JspServlet類物件,然後根據請求的名字1.jsp去找相對應的_1_jsp.java檔案,如果還沒有這個檔案,建一個,如果已經有了,直接用。二、JSP本質
1、JSP是一種動態網頁技術。
1)動態生成網頁資料,而不是由動態效果的網頁。
2)常見的幾種動態網頁技術:
①JSP(Java Server Page)
②ASP(Active Server Page)
③PHP(Hypertext Preprocessor)超文字預處理語言
2、jsp就是servlet,所以jsp也是java類,通過jsp引擎把jsp轉譯成了servlet。
總結:
JSP工作過程:
①瀏覽器輸入:http://localhost/MyJSP/1.jsp
②Tomcat收到*.jsp請求,則會到org.apache.jasper.servlet.JspServlet處理(Tomcat的web.html中有配置)
③JspServlet呼叫相應的java類,即jsp引擎根據1.jsp生成的java類(位於Tomcat目錄work下面或是Eclipse的工程目錄的work目錄下:_1_jsp.java、_1_jsp.class)。
④執行_1_jsp.class,將HTML資料輸出給Tomcat,Tomcat再將這些資料輸出給客戶端。
二、語法
之前,我們在1.jsp檔案中隨意寫了兩個標籤,而沒有寫<html></html>、<body></body>等標籤,就能被轉義為對應的html檔案,說明不論在jsp檔案中寫什麼,都會被轉義為文件的內容,如果直接寫java程式碼,那程式碼的內容就會被顯示在頁面上,因為在jsp引擎來看,java程式碼就是沒有任何語法意義的普通字串。
所以要告訴JSP引擎這是一段Java程式碼,使用<%開頭,以%>結束來把一段Java程式碼新增到jsp的html程式碼中。
在寫第一個jsp程式之前,先來做點準備工作,因為我們在eclipse中做後臺開發,此時也要寫一些前端的程式碼,而eclipse對前端程式碼編寫效率不高,為了讓eclipse能更加高效的編輯前端程式碼,首先安裝一款外掛:Emmet。本來是想安裝Aptana的,但是搞VPN翻牆去找官網的外掛也是無法訪問,報503,可能伺服器在維修還是怎的,Emmet不需要翻牆也可以下載,具體怎樣安裝,百度eclipse安裝emmet外掛。 安裝完後會提示重啟eclipse,重啟後就可以使用Tab鍵作為快捷鍵來寫html、css了,但是jsp裡好像不支援,這是因為在jsp中快捷鍵預設是ctrl+e,為了方便,在eclipse中找window - preferences,如下圖所示輸入em,找到emmet,然後把英文狀態下的逗號和jsp加到那欄後面,點選確定,無需重啟eclipse,直接就可以在jsp檔案中敲html程式碼。在first.jsp第一行敲一個感嘆號!,然後敲Tab,html的doc、head和body都出來了。 完成如下程式碼:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>first JSP</title>
</head>
<body>
<%
out.println("Hello World");
out.println(new java.util.Date());
%>
</body>
</html>
頁面效果:
總結:
①JSP本身就是一個servlet。
②直接在HTML中內嵌JSP程式碼。
③JSP程式由JSP引擎先將它轉換成Servlet程式碼,接著將它編譯成類檔案載入執行。
④只有當客戶端第一次請求JSP時,才需要將其轉換、編譯。
相關推薦
JSP_1th_第一個JSP程式
一、JSP(Java Server Page) 1、為什麼需要JSP? Servlet: 優點:邏輯處理方便。 缺點:頁面表現麻煩。 JSP: 優點:頁面表現方便。 缺點:邏輯處理麻煩。 所以要互補使用,一般專案採用: jsp(頁面表現)+servlet(業務邏輯)+jav
Java EE入門教程系列第二章JSP(一)——第一個JSP程式
2、1JSP概述 2.1.1JSP簡介 JSP,全稱是Java Server Pages,是在Servlet技術的基礎上形成的,主要完成網頁中伺服器動態部分的編寫。 有如下特點: (1)一次編寫,隨處執行 (2)可重用元件技術 (3)標記化頁面開發:JSP將許多常用功能封裝起
我的第一個JSP程式
我tm爽爆 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head&g
第一個Jsp程式,Hello World
1、安裝Tomcat伺服器,具體參考這裡 2、開啟Tomcat安裝目錄,開啟webapps目錄,在裡面新建一個專案資料夾,比如myHome,然後在myHome裡新建一個index.jsp和WEB-INF資料夾 3、在index.jsp新增如下程式碼 &
JSP學習---------------第一個JSP程式
學習記錄:範例:編寫第一個JSP程式<html> <head> <title>the first jsp</title> </head> <body> <
我的第一個JSP程式 eclipse
首先新建一個動態web專案,New->others->web->Dynamic Web Project,然後在WebContent中新建一個index.jsp。 程式碼如下: <%@ page language="java" contentTy
MyEclipse配置Tomcat 並編寫第一個JSP程式
安裝myeclipse之後配置tomcat伺服器,在window裡選擇servers 選擇tomcat的資料夾路徑(我的是從別人那裡考過來的資料夾) 選中上enable即可 出現了這個介面 在這裡可以開啟或關閉伺服器 開啟伺服器之後可以開啟瀏覽器看看 tomcat
三大框架(ssh)學習——第一個Struts2程式
第一個struts2程式 建立web專案 2. 解壓struts2/apps/struts-blank.war包。 3. 引入strut2相關jar包 將struts-blank專案下的依賴庫coypy到自己專案中 4. 配置web.
第一個PWA程式-聊天室
本文已授權微信公眾號:鴻洋(hongyangAndroid)在微信公眾號平臺原創首發。 好久沒寫部落格了, 為了治療懶癌, 今天我們來學習一下Google的Progressive Web App, 什麼是Progressive Web App(簡稱PWA)? 文件上有這
00005第一個java程式
使用記事本編寫以下程式碼 public class Welcome{ public static void main(String[]args){ System.out.println(“Hello World”); } } 在d:\mycode儲存
00006第一個java程式的總結和提升
java對大小寫敏感,如果出現大小寫拼寫錯誤,程式無法執行 關鍵字public被稱作訪問修飾符,用於控制程式的其它部分對這段程式碼的訪問級別 關鍵字class的意思是類,java是面向物件的語言,所有程式碼必須位於類的裡面 一個原始檔最多隻能宣告一個public的類
Java Netty 學習(七) - 第一個Netty程式
介紹 Netty是由JBOSS提供的一個java開源框架。Netty提供非同步的、事件驅動的網路應用程式框架和工具,它簡化了程式設計師的工作,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。 本系列文章講慢慢一起走進學習Netty 本篇文章就以一個Hello Word程式開始。
java基礎(1)-----編寫並執行第一個java程式
下面是一個簡單的java程式,將在控制檯輸出hello world public class HelloWorld { public static void main(String[] args) { System.out.println("Hello Wor
第一個SpringMVC程式詳解
建立一個java類: package com.myproject.cn; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org
vs2017 開始自己的第一個C++程式
這是針對於部落格vs2017安裝和使用教程(詳細)的C++專案新建示例 1.點選選單欄-->檔案-->新建-->專案,我這裡以C++為例,右邊欄選擇Visual C++,中間選擇空專案,改變預設路徑 2.右鍵點選右邊欄helloworld工程下的“原始檔”
我的第一個Hibernate程式
今天開始學習Hibernate,開啟我的第一個Hibernate程式 首先,建立一個數據庫student 第二步,在student資料庫中建立一張表student 第三步,開啟 myeclipse10,開啟MyEclipse Hibernate pre
python 第三課 第一個python程式
什麼是命令列模式和Python互動模式。 命令列模式 在Windows開始選單選擇“命令提示符”,就進入到命令列模式,它的提示符類似C:\>: ┌────────────────────────────────────────────────────────┐ │Microsoft Windows
第一個Ribbon程式Cannot access com.netflix.client.ClientFactory 編譯報錯
開發工具:idea 2018.2 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:
我的第一個Golang程式
本程式參考:GO語言實戰 GO IN ACTION package main import ( "fmt" "runtime" "sync" ) func main(){ //分配一個邏輯處理器給排程器使用 runtime.GOMAXPROCS(1) /
執行第一個Spark程式
我們這裡使用官方的Spark自帶的一個程式來體驗一下Spark的執行 Spark自帶的例子是利用蒙特·卡羅演算法求PI 在Spark目錄下執行下面命令 bin/spark-submit \ >--master spark://cdh0:7077 \ >--class org.