1
java web开发学习笔记。

一、jsp简介

JSP与 PHP、ASP、ASP.NET 等语言类似,运行在服务端的语言。

JSP(全称Java Server Pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。

JSP 技术是以 Java 语言作为脚本语言的,JSP 网页为整个服务器端的 Java 库单元提供了一个接口来服务于HTTP的应用程序。

JSP文件后缀名为 *.jsp

JSP开发的WEB应用可以跨平台使用,既可以运行在 Linux 上也能运行在 Windows 上。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

Java学习路线图:
Java学习路线图-20191223.jpg

二、Tomcat服务器的目录结构

clipboard.png

Tomcat目录文件
clipboard.png

WEB-INF
classes 目录下为生成的字节码文件
lib 目录下为jar包

Tomcat安装目录

➜  tomcat pwd
/WEB/java/tomcat

启动Tomcat命令:

➜  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>

三、JSP语法

1、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>

2、jsp注释

clipboard.png

// html注释
<!-- HTML 注释,页面不显示,在客户端代码中可见 -->

// jsp 注释
<%-- jsp 注释,页面不显示,在客户端代码中也不可见 --%>

<%
// 单行注释

/* 多行注释 */
%>

3、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>

4、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>

5、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>

四、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    

五、JSP内置对象

JSP内置对象又称为隐式对象,是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量

JSP所支持的九大隐式对象:

clipboard.png

JSP内置对象是 Web 容器创建的一组对象,不适用new关键在创建就可以使用的内置对象。

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

六、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基础学习


Corwien
6.3k 声望1.6k 粉丝

为者常成,行者常至。