1. 程式人生 > >JSP_1th_第一個JSP程式

JSP_1th_第一個JSP程式

一、JSP(Java Server Page)
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.