一、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="" %>
<html>
<head>
<title>欢迎</title>
</head>
<body>
欢迎学习Java Web知识。如今时间是:
<%out.println(new java.util.Date());%>
</body>
</html>

  当中放在<%和%>之间的代码便是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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
faker
</body>
</html>

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<java.lang.String,java.lang.Long> _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> 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, , 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("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\tfaker\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != )
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循环等都可以实现,也就是编写脚本而已。 

JavaWeb(三)JSP概述的更多相关文章

  1. 一、 JSP概述 二、JSP的语法结构 三、JSP内置对象

    一.JSP概述###<1>概念 java服务器页面 可以编写动态页面 其内部是以HTML标签为主,可以在HTML标签嵌套java代码 jsp文件以.jsp为后缀 jsp本质上就是一个Ser ...

  2. 三 JSP 技术

    一 JSP 概述 1. 本质:在 HTML 语言中混合 Java 程序代码,由服务器端 Java 语言引擎解释执行.其中,HTML 负责描述信息显示格式,JSP 负责描述处理逻辑. 2. JSP 代码 ...

  3. javaweb 与jsp页面的交互流程 (初次接触时写)

    javaweb 与jsp页面的交互流程 javaweb项目目录 1. javaweb项目的一般目录: 2. jsp 页面一般情况下放在 top(前台页面) back(后台页面) 3. 后台代码 放在s ...

  4. JSP概述

    一.JSP页面本质上时一个Servlet,然而,用JSP开发比使用Servlet更容易,主要有两个原因,首先不必编译Servlet,其次JSP页面是一个以.jsp为扩展名的文本文件,可以使用任何编辑器 ...

  5. Netty 源码 ChannelHandler(三)概述

    Netty 源码 ChannelHandler(三)概述 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.Channel ...

  6. Intellij idea创建javaWeb:实现JSP/Servlet(转)

    转自:https://www.jianshu.com/p/9684e90cf7b5 Intellij idea创建javaWeb:实现JSP/Servlet by_love唯念 关注 2016.12. ...

  7. JavaWeb后端jsp之增删改查

    今日主题:JavaWeb后端jsp之增删改查 实体类: Student.java: package cn.itcast.model.entity; public class Student { pri ...

  8. JavaWeb(三):JSP

    JSP是JavaServer Page的缩写,也就是服务端网页. 一.概述 1.1 为什么使用JSP 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变.JSP是简化Serv ...

  9. JavaWeb总结(三)—JSP

    一.JSP简介 1.基本认识 (1)JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp. (2)在JSP页面中编写的Java代码需要嵌套 ...

随机推荐

  1. C++异常处理机制

    商业转载请联系作者获得授权,非商业转载请注明出处. 一.什么是异常 -异常是程序中可以检测到的不正常的情况. -示例:被0除.数组越界.存储空间不足等. -早期我们使用if来判断,然后进行相关处理,或 ...

  2. svn: Can't convert string from 'UTF-8' to native

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt227 svn 版本库中有文件是以中文字符命名的,在 Linux 下 chec ...

  3. Maven(二)Maven项目的创建(命令、myeclipse)及生命周期

    上一篇给大家介绍了Maven的概念和仓库的一些信息,接下来给大家分享一下使用命令和MyEclipse创建Maven项目 一.使用命令管理Maven项目 1.1.创建Maven java项目 1)创建一 ...

  4. js数组、内置对象、自定义对象

    [js中的数组] 1.数组的基本概念? 数组是在内存空间中连续存储的一组有序数据的集合 元素在数组中的顺序,称为下标.可以使用下表访问数字的每个元素. 2.如何声明一个数组? ① 使用字面量声明: 在 ...

  5. 软工+C(2017第6期) 最近发展区/脚手架

    // 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...

  6. 软件工程(GZSD2015)学生博客列表

    2015年贵州师范大学软件工程课程学生博客列表 陈小丽 郑倩 唐洁 周娟 李利思 肖俊 罗文豪 周静 徐明艳 毛涛 邓洪虹 岳庆 李盼 安坤 何亚 涂江凤 张义平 杨明颢 杨家堂 胡贵玲 寿克霞 吴明 ...

  7. 微信小程序简单入门理解

    简单的小程序示例结构: (一):理解小程序结构app.js,app.json,app.wxss ①app.js,app.json是小程序结构必要的部分,app.wxss可选择 ②app.js用于创建小 ...

  8. 201521123017 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 1.3 什么样的 ...

  9. 201521123116 《java程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jm ...

  10. 201521123029《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synch ...