JavaWeb開發

java web開發學習筆記。

1、jsp簡介

JSP與 PHP、ASP、ASP.NET 等語言相似,運行在服務端的語言。html

JSP(全稱Java Server Pages)是由 Sun Microsystems 公司倡導和許多公司參與共同建立的一種使軟件開發者能夠響應客戶端請求,而動態生成 HTML、XML 或其餘格式文檔的Web網頁的技術標準。java

JSP 技術是以 Java 語言做爲腳本語言的,JSP 網頁爲整個服務器端的 Java 庫單元提供了一個接口來服務於HTTP的應用程序。web

JSP文件後綴名爲 *.jspexpress

JSP開發的WEB應用能夠跨平臺使用,既能夠運行在 Linux 上也能運行在 Windows 上。apache

JSP是一種Java servlet, 主要用於實現Java web應用程序的用戶界面部分。網頁開發者們經過結合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操做和命令來編寫JSP。

Java學習路線圖:
Java學習路線圖-20191223.jpgtomcat

2、Tomcat服務器的目錄結構

clipboard.png

Tomcat目錄文件
clipboard.png安全

WEB-INF
classes 目錄下爲生成的字節碼文件
lib 目錄下爲jar包服務器

Tomcat安裝目錄session

➜  tomcat pwd
/WEB/java/tomcat

啓動Tomcat命令:app

➜  sudo sh ./bin/startup.sh

WEB-INF目錄結構

  1. WEB-INF 是Java的WEB應用的安全目錄。所謂安全目錄就是客戶端沒法訪問,只有服務端能夠訪問的目錄。
  2. web.xml,項目部署文件
  3. classes文件夾,用以放置*.class文件
  4. lib文件夾,用於存放須要的jar包

web.xml 配置默認歡迎文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

    <welcome-file-list>
        <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

3、JSP語法

一、jsp指令

clipboard.png

clipboard.png

如例:index.jsp

<%--
  Created by IntelliJ IDEA.
  User: kaiyiwang
  Date: 18/3/5
  Time: 00:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  </body>
</html>

二、jsp註釋

clipboard.png

// html註釋
<!-- HTML 註釋,頁面不顯示,在客戶端代碼中可見 -->

// jsp 註釋
<%-- jsp 註釋,頁面不顯示,在客戶端代碼中也不可見 --%>

<%
// 單行註釋

/* 多行註釋 */
%>

三、jsp腳本

在jsp腳本中執行的代碼

語法:

<% Java 代碼 %>

例子:

<%--
  Created by IntelliJ IDEA.
  User: kaiyiwang
  Date: 18/3/5
  Time: 00:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%
    // 單行註釋
    /*
      多行註釋
     */

    out.println("這裏是腳本代碼測試");

  %>
  </body>
</html>

四、jsp聲明

在jsp頁面中聲明變量或方法
語法:

<%! Java代碼 %>
<body>

  <%!
    
    
    String name = "張學友";  // 聲明一個字符串變量


      /**
       *  聲明一個返回整型值的函數
       * @param x
       * @param y
       * @return
       */
    int add(int x, int y)
    {
       return x + y;
    }
  %>

  <%
    // 單行註釋
    /*
      多行註釋
     */

    out.println("這裏是腳本代碼測試,哈哈");

    out.println(name);
    int sum = add(2, 3);
    out.println(sum);


  %>
  </body>

五、jsp表達式

一個JSP表達式中包含的腳本語言表達式,先被轉化成String,而後插入到表達式出現的地方。

因爲表達式的值會被轉化成String,因此您能夠在一個文本行中使用表達式而不用去管它是不是HTML標籤。

表達式元素中能夠包含任何符合Java語言規範的表達式,可是不能使用分號來結束表達式。

在JSP頁面中執行的表達式
語法:

<%=表達式 %>  // 注意:表達式不以分號結束

示例:

<body>

  <%!


    String name = "張學友";  // 聲明一個字符串變量


      /**
       *  聲明一個返回整型值的函數
       * @param x
       * @param y
       * @return
       */
    int add(int x, int y)
    {
       return x + y;
    }
  %>

  <%
    // 單行註釋
    /*
      多行註釋
     */

    out.println("這裏是腳本代碼測試,哈哈");

    out.println(name);
    int sum = add(2, 3);
    out.println(sum);
  %>
  <br/>

  你好,<%=name %><br/>
  x+y=<%=add(1, 10)%>

  </body>

4、JSP頁面生命週期

clipboard.png

clipboard.png

問答題:
當用戶第一次請求一個jsp頁面時,首先被執行的方法是( )

  • A:構造方法
  • B: jspInit()
  • C:jspService()
  • D:jspDestroy()


答案選A。
解析:
當用戶第一次請求一個jsp頁面時,首先被執行的方法是 構造方法。
就是轉換爲class文件後,他會建立一個Servlet的實例,而後調用Servlet的構造方法,再調用jspInit()方法

​(1)JSP引擎先把該JSP文件轉換成一個Java源文件(Servlet),在轉換時若是發現JSP文件有任何語法錯誤,轉換過程將中斷,並向服務端和客戶端輸出出錯信息。

(2)若是轉換成功,JSP引擎用javac把該Java源文件編譯成相應的class文件。

(3)建立一個該Servlet(JSP頁面的轉換結果)的實例,該Servlet的jspInit()方法被執行,jspInit()方法在Servlet的生命週期中只被執行一次。

小試牛刀

分別使用表達式和腳本實現打印九九乘法表

clipboard.png

示例:

<%--
  Created by IntelliJ IDEA.
  User: kaiyiwang
  Date: 18/3/5
  Time: 00:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>打印九九乘法表</title>
  </head>
  <body>

  <%!

      /**
       *  打印九九乘法表
       * @return
       */
    String printMultiTable()
    {
      String s = "";

      for(int i=1; i <= 9; i++)
      {
        for(int j=1; j <= i; j++)
        {
          s += i + "*" + j + "=" + (i * j) + "&nbsp;&nbsp;&nbsp;&nbsp;";
        }

        s += "<br/>";
      }

      return s;

    }
    
    
      /**
       * JSP內置out對象,使用腳本方式調用,打印九九乘法表
       *
       * @param out
       */
    void printMultiTable2(JspWriter out) throws Exception
    {
      for(int i=1; i <= 9; i++)
      {
        for(int j=1; j <= i; j++)
        {
          out.println(i + "*" + j + "=" + (i * j) + "&nbsp;&nbsp;&nbsp;&nbsp;");
        }

        out.println("<br/>");
      }

    }


  %>

<span>表達式打印</span>
<%=printMultiTable() %>
  
  
<br/>
 <span>腳本打印,注意函數調用後邊有分號 </span>
<% printMultiTable2(out); %>


  </body>
</html>

打印結果:

1*1=1    
2*1=2    2*2=4    
3*1=3    3*2=6    3*3=9    
4*1=4    4*2=8    4*3=12    4*4=16    
5*1=5    5*2=10    5*3=15    5*4=20    5*5=25    
6*1=6    6*2=12    6*3=18    6*4=24    6*5=30    6*6=36    
7*1=7    7*2=14    7*3=21    7*4=28    7*5=35    7*6=42    7*7=49    
8*1=8    8*2=16    8*3=24    8*4=32    8*5=40    8*6=48    8*7=56    8*8=64    
9*1=9    9*2=18    9*3=27    9*4=36    9*5=45    9*6=54    9*7=63    9*8=72    9*9=81

5、JSP內置對象

JSP內置對象又稱爲隱式對象,是JSP容器爲每一個頁面提供的Java對象,開發者能夠直接使用它們而不用顯式聲明。JSP隱式對象也被稱爲預約義變量

JSP所支持的九大隱式對象:

clipboard.png

JSP內置對象是 Web 容器建立的一組對象,不適用new關鍵在建立就可使用的內置對象。

<%
    int[] value = {60, 20, 25};
    
    for(int i:value){
      out.println(i);
    }
  %>

6、JSP基本原理

JSP的本質是Servlet,當用戶向指定 Servlet 發送請求時,Servlet利用輸出流動態生成 HTML 頁面,包括每個靜態的 HTML 標籤和全部在HTML頁面中出現的內容。

示例代碼:
http://localhost:8080/webDemo/index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
     <meta charset="UTF-8">
    <title>個人第一個JSP頁面</title>
</head>
<body>
<h1>歡迎你們訪問個人第一個JSP頁面。</h1>

<!-- 下面是Java 腳本 -->
<%
for(int i = 0; i < 5; i++)
{
    // out.println("<font size='" + i + "'>");
    // out.println(i);
%>
JSP 原理分析</font><br/>
<%}%>


</body>
</html>

輸出結果:

clipboard.png

從表面上看,JSP 頁面已經不須要 Java 類, 彷佛徹底脫離了 Java 面向對象的特徵。事實上,JSP 的本質依然是 Servlet(一個特殊的JAVA類),每一個JSP 頁面就是一個 Servlet 實例-JSP頁面由系統編譯成 Servlet,Servlet再負責響應用戶的請求。對於Tomcat而言,JSP 頁面生成的 Servlet 放在 work 路徑對應的 Web 應用下。

當啓動 Tomcat 以後,能夠在 Tomcat 的 work/Catalina/localhost/webDemo/org/apache/jsp目錄下找到以下文件(本web應用名爲 webDemo, 上面 JSP 頁的名爲 index.jsp):index_jsp.javaindex_jsp.class

clipboard.png

這兩個文件都是由 Tomcat 生成的, Tomcat 根據 JSP 頁面生成對應 Servlet 的 Java 文件和 class 文件

下面是 index_jsp.java 文件的源代碼,這是一個特殊的 Java 類,是一個 Servlet 類。
index_jsp.java

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.73
 * Generated at: 2018-04-15 16:46:57 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
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 volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

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

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  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("\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("\t <meta charset=\"UTF-8\">\n");
      out.write("\t<title>個人第一個JSP頁面</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("<h1>歡迎你們訪問個人第一個JSP頁面。</h1>\n");
      out.write("\n");
      out.write("<!-- 下面是Java 腳本 -->\n");

for(int i = 0; i < 5; i++)
{
    // out.println("<font size='" + i + "'>");
    // out.println(i);

      out.write("\n");
      out.write("JSP 原理分析</font><br/>\n");
}
      out.write("\n");
      out.write("\n");
      out.write("\n");
      out.write("</body>\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 {
            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);
    }
  }
}

相關文章:Java Web基礎學習

相關文章
相關標籤/搜索