博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb(三)JSP概述
阅读量:6543 次
发布时间:2019-06-24

本文共 11056 字,大约阅读时间需要 36 分钟。

一、JSP概述

1.1、JSP简介

  一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。JSP是一种Java servlet,主要用于实现JavaWeb应用程序的用户界面部分。

  网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

  JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

  简单的说就是:JSP(Java Server Pages)是以Java语言为基础的动态网页开发技术。它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。

  从特点分析:

    Servlet特点:在Java源码中嵌入html源码

    JSP特点:在html源码中嵌入java代码

  总结分析:servlet:擅长java代码的编写,JSP:擅长页面显示

  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页面内容主要包括两部分:

    静态部分:标准的HTML标签、静态的页面内容。这些内容与静态HTML页面同样;

    动态部分:受Java程序控制的内容,这些内容由Java脚本动态生成。

  如:

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>欢迎欢迎学习Java Web知识。如今时间是:<%out.println(new java.util.Date());%>

 

  当中放在<%和%>之间的代码便是Java脚本,动态部分,这样就把Java代码嵌入HTML页面中,构成一个动态的JSP页面。   

1.2、为什么使用JSP

  JSP程序与CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下优势:

    1)性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
    2)服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。
    3)JSP基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。
    4)JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持。
  最后,JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。

1.3、JSP工作原理

  

  分析:  

    JSP文件必须在JSPserver内运行;

    JSP文件必须生成Servlet才干运行;
    每一个JSP 页面的第一个訪问者速度非常慢,由于要等待JSP编译成Servlet;
    JSP页面的訪问者无需安装不论什么client。甚至不须要能够运行Java的运行环境,由于JSP页面输送到client的是标准HTML页面。

1.4、JSP运行流程

    
  网络服务器需要
一个JSP引擎(Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和运行JSP页面。),也就是一个容器来处理JSP页面。容器
负责截获对JSP页面的请求使用内嵌JSP容器的Apache来支持JSP开发
  JSP容器与Web服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于JSP网页的特殊元素。
  JSP处理流程:  
     就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
    JSP引擎从
磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
    Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
    最终,
Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。
     一般情况下,JSP引擎会检查JSP文件对应的servlet是否已经存在,并且检查JSP文件的修改日期是否早于servlet。如果JSP文件的修改日期早于对应的servlet,那么容器就可以确定JSP文件没有被修改过并且servlet有效。
    这使得整个流程与其他脚本语言(比如PHP)相比要高效快捷一些。
    总的来说,JSP网页就是用另一种方式来编写servlet而不用成为Java编程高手。除了解释阶段外,JSP网页几乎可以被当成一个普通的servlet来对待。

1.5、JSP生命周期

  编译阶段:servlet容器编译servlet源文件,生成servlet类。
  初始化阶段:加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法。
  执行阶段:调用与JSP对应的servlet实例的服务方法。
  销毁阶段:调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例。

1.6、简单的使用JSP

  创建一个jsp,查看其转换后的servlet代码。
  1)NewFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here faker
NewFile.jsp

   2)NewFile_jsp.java

/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.53 * Generated at: 2017-02-22 02:09:08 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 NewFile_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
_jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map
getDependants() { return _jspx_dependants; } public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } 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("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("
\r\n"); out.write("
Insert title here\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\tfaker\r\n"); out.write("\r\n"); out.write(""); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { 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); } }}
NewFile_jsp.java
  可以看到public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent
  NewFile_jsp.java继承自HttpJspBase。来看看HttpJspBase的源码。
  3)HttpJspBase.java
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jasper.runtime;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.HttpJspPage;import org.apache.jasper.compiler.Localizer;/** * This is the super class of all JSP-generated servlets. * * @author Anil K. Vijendran */public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {        private static final long serialVersionUID = 1L;    protected HttpJspBase() {    }    @Override    public final void init(ServletConfig config)         throws ServletException     {        super.init(config);        jspInit();        _jspInit();    }        @Override    public String getServletInfo() {        return Localizer.getMessage("jsp.engine.info");    }    @Override    public final void destroy() {        jspDestroy();        _jspDestroy();    }    /**     * Entry point into service.     */    @Override    public final void service(HttpServletRequest request, HttpServletResponse response)         throws ServletException, IOException     {        _jspService(request, response);    }        @Override    public void jspInit() {    }    public void _jspInit() {    }    @Override    public void jspDestroy() {    }    protected void _jspDestroy() {    }    @Override    public abstract void _jspService(HttpServletRequest request,                                      HttpServletResponse response)         throws ServletException, IOException;}
HttpJspBase.java

  public abstract class HttpJspBase extends HttpServlet implements HttpJspPage 

  看到了一个熟悉的类,HttpServlet,我们编写Servlet时就是继承自该类,这里也是继承HttpServlet,并且HttpJspBase的源码会发现,

  生命周期也是有init()方法,service()方法,destory()方法,相当于_jspService()方法就是servlet的service()方法的执行,所以说JSP也是一个servlet。

  4)我们在JSP写的所有html代码,都会被转换为servlet中的out.write(html)代码来输出。看图:

  

1.7、JSP概述总结

  

  对于jsp转换成的servlet源码,之后我们会在进行详细分析,现在只需要知道jsp中的内容在servlet中被转换成什么了,在哪里被转换了即可。

  注意: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是先编译后部署。

  从上面分析得出:    

    Servlet:控制器。重点编写java代码逻辑 (获取表单数据、处理业务逻辑、分发转向)

    JSP:代码显示模板。重点在于显示数据

二、JSP基本语法

2.1、JSP模板数据 

   就是JSP中的HTML代码,它的内容给是固定的,无论程序如何运行模版数据输出到客户端浏览器时都不会发生改变,当我们创建一个JSP时,模版就已经固定了。

    元素:JSP中的java部分,包括脚本(JavaScript,或者java代码)以及JSP指令(Directive)与JSP标签(Tag)等,元素决定着程序的流程,元素是不会显示到浏览器的。

2.2、JSP脚本

  1)使用<% 编写java代码 %>,中间java代码必须遵循Java语法

      

      来看看,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注释

      // :java单行注释

      /*  */ :Java多行注释

      <!-- -->:这个注释,会发送到浏览器端的源码中显示

      注释分别在servlet中如何显示:

        

        在servlet中

        

      总结:JSP注释不会在servlet文件中显示,而java注释则会,但其所有的注释到了浏览器端,都不会出现在源码中,只有<!-- -->这个注释会到浏览器的网页源码中去。

  4)JSP中申明方法与属性(全局变量)  使用<%!  方法、属性%>

      在JSP中编写方法或者属性时,使用<%! %>括起来

  5)在JSP中使用if语句,或者使用for循环,whilt循环等都可以实现,也就是编写脚本而已。 

 

转载地址:http://qiodo.baihongyu.com/

你可能感兴趣的文章
小tips:JS中的children和childNodes
查看>>
二叉树的遍历
查看>>
Oracle的FIXED_DATE参数
查看>>
PostgresSQL中的限制和级联删除
查看>>
NDK配置
查看>>
(转)@ContextConfiguration注解说明
查看>>
docker in centos error
查看>>
c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex
查看>>
[置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)...
查看>>
Log4perl 的使用
查看>>
Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用
查看>>
《http权威指南》阅读笔记(十)
查看>>
JQuery UI Widget Factory官方Demo
查看>>
Atlas揭秘 —— 绑定(Binding)
查看>>
install xcode_3.2.5_and_iOS_sdk_4.2 _final with mac lion10.7.3
查看>>
JavaScript权威指南(第6版)
查看>>
sql 自定義百分比轉換小數函數
查看>>
一起谈.NET技术,C# 委托,事件和Lambda表达式
查看>>
远离云计算风险三步走
查看>>
Silverlight 游戏开发小技巧:技能冷却效果2(Cool“.NET研究”down)2
查看>>