一、jsp简介

  JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

  它实现了Html语法中的java扩张(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。(360百科)

二、jsp优缺点

  优点

  (1)一次编写,到处运行。除了系统之外,代码不用做任何更改。

  (2)系统的多平台支持。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展。相比ASP/.net的局限性是显而易见的。

  (3)强大的可伸缩性。从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数台服务器,Java显示了一个巨大的生命力。

  (4)多样化和功能强大的开发工具支持。这一点与ASP很像,Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。

  (5)支持服务器端组件。web应用需要强大的服务器端组件来支持,开发人员需要利用其他工具设计实现复杂功能的组件供web页面调用,以增强系统性能。JSP可以使用成熟的JAVA BEANS 组件来实现复杂商务功能。

  缺点

  (1) 与ASP一样,Java的一些优势正是它致命的问题所在。正是由于为了跨平台的功能,为了极度的伸缩能力,所以极大的增加了产品的复杂性。

  (2) Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列的.java文件和.class文件,以及对应的版本文件。

三、jsp运行原理

  jsp本质上是一种简化的servlet,jsp页面运行时首先由编译成servlet,然后再响应用户请求,返回给用户一个HTML页面。

  因而可以知道,第一次访问时速度较慢,需要等待jsp编译完。

  例如下面是一个jsp页面

  

 <%@page import="java.util.UUID"%>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 <!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>
 <%--     <a href="${pageContext.request.contextPath }/Cookie">${pageContext.request.contextPath }</a> --%>
     <%
         System.out.println(session.getId());
         String uuid = UUID.randomUUID().toString().replace("-", "");
         session.setAttribute("seUUID", uuid);
     %>
     <form action="${pageContext.request.contextPath }/Cookie?oper=login" method="post">
         <input type="hidden" name="reUUID" value="<%=uuid%>"> <br>
         <br> <input type="text" name="username"><br>
         <br> <input type="password" name="password"><br> <br>
         <input type="submit" value="提交">
     </form>
 </body>
 </html>

  以下是编译成servlet后的代码

 

 /*
  * Generated by the Jasper component of Apache Tomcat
  * Version: Apache Tomcat/7.0.79
  * Generated at: 2017-08-16 02:12:01 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.*;
 import java.util.UUID;

 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;

     //html标签编译后的内容
       out.write("\r\n");
       out.write("\r\n");
       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('\r');
       out.write('\n');
       out.write('    ');
     //<%%>编译后的内容
         System.out.println(session.getId());
         String uuid = UUID.randomUUID().toString().replace("-", "");
         session.setAttribute("seUUID", uuid);

       out.write("\r\n");
       out.write("\t<form action=\"");
       out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${pageContext.request.contextPath }", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
       out.write("/Cookie?oper=login\" method=\"post\">\r\n");
       out.write("\t\t<input type=\"hidden\" name=\"reUUID\" value=\"");
       out.print(uuid);
       out.write("\"> <br>\r\n");
       out.write("\t\t<br> <input type=\"text\" name=\"username\"><br>\r\n");
       out.write("\t\t<br> <input type=\"password\" name=\"password\"><br> <br>\r\n");
       out.write("\t\t<input type=\"submit\" value=\"提交\">\r\n");
       out.write("\t</form>\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() != 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);
     }
   }
 }

  编译后的文件保存在tomcat的work\Catalina\localhost\项目名\org\apache\jsp\目录下

  eclipse下可以添加tc插件,百度云连接

  解压后将links和tc_server两个目录复制到eclipse安装目录下就可以使用了

  使用方法在server窗口单击鼠标右键即可进入wtpwebapps目录,work目录在其上一级目录

  

四、jsp基本语法

  (1)HTML

      与中html使用方法一样

  (2)指令      

      page指令   <%@page language="java" contentType="text/html; charset=UTF-8" extends=""  import="" session="true" errorPage="" pageEncoding="utf-8" buffer="8kb" autoFlush="true" isThreadSafe="true" info="" isErrorPage="false"%>

        - page 指令主要是告诉jsp引擎如何解析jsp文件。

          - 可能会用到的属性
          - import 用来导包
          - language指定jsp文件被翻译为哪种语言 ,该属性只有一个值就是 java
          - contentType 指定当前网页的编码 ,"text/html;charset=utf-8", 给浏览器看的(相当于响应编码)
          - pageEncoding 指定当前页面的编码,jsp引擎会根据该编码解析jsp文件, 给服务器看的(相当于请求编码)
          - errorPage 指定页面出现错误以后转发到的页面,这个属性的地址不加项目名。
          - isErrorPage 当前页面是否为一个错误页面,如果为true则可以在页面中使用exception对象。

        - 基本不使用的属性
          - autoFlush 是否自动刷新缓存,默认值是true,一般不去修改这个属性
          - buffer 缓存的大小 默认8kb 一般不修改
          - extends 指定jsp对应的java类所要基础的父类。
          - info 设置当前jsp的信息,可以通过Servlet.getServletInfo()获取,jsp可以直接使用getServletInfo()获取
          - isELIgnored 是否自动忽略EL表达式,默认为false,不忽略,一般不修改
          - session 是否可以直接使用session对象,默认值为true,一般不修改

     include指令<%@ include file="" %>        

         - 静态包含指令(不会被filter拦截)
         - include指令主要用来将其他网页包含进当前JSP页面
         - 他会将被包含页面原封不动复制到目标页面的指定位置。
         - 它只会翻译目标页面,而不会翻译被包含页面
         - 比如 1.jsp include 2.jsp, 相当于将2.jsp复制进1.jsp的指定位置,然后只会翻译包含了2.jsp的1.jsp(动态包含会翻译两个jsp然后再包含) 

     taglib指令

       用于定义和访问自定义标签,如jstl标签<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

  (3)声明

      <%! java代码 %>可以声明属性和方法,正常java代码,需要结尾的分号     ;

  (4)程序代码

      <%  java代码 %>java代码,正常java代码,需要结尾的分号     ;

  (5)表达式

      <%=  java表达式 %>不需要结尾的分号     ;

  (6)注释

      <%-- --%>
        - jsp注释中的内容不会被翻译到jsp对应java文件中
   
        - 在JSP中可以使用三种注释
        - html注释           java注释                 jsp注释
         <!-- 片段 -->      //java注释!             <%-- --%>
    
        - 三种注释的可见范围
           

 

jsp源码

java源文件

网页的源码

html注释

可见

可见

可见

java注释

可见

可见

不可见

jsp注释

可见

不可见

不可见

五、jsp动作指令

  (1)jsp:forward指令:执行页面转向,将请求的处理发到下一个页面

  (2)jsp:param指令:用于传递参数,必须和其他支持参数的标签一起使用,如jsp:include指令传入被导入的页面,jsp:forward指令传入被指向的页面,jsp:plugin传入页面中的JavaBean实例或Applet实例

  (3)jsp:include:用于动态引入一个jsp页面

  (4)jsp:plugin:用于下载JavaBean或Applet到客户端执行

  (5)jsp:useBean:创建一个JavaBean实例

  (6)jsp:setProperty:设置JavaBean实例的属性值

  (7)jsp:getProperty:输出JavaBean实例的属性值

六、jsp九大内置对象

   在JSP中一共有9个隐含对象,这个9个对象我可以在JSP中直接使用。
      因为在service方法已经对这个九个隐含对象进行声明及赋值,所以可以在JSP中直接使用。
      - pageContext
        类型:PageContext
        代表:当前页面的上下文
        作用:可以获取到页面中的其他隐含对象,同时它还是一个域对象。
   
     - request
        类型:HttpServletRequest
        代表:请求
        作用:可以获取用户发送的请求信息,它也是一个域对象。
   
     - session
        类型:HttpSession
        代表:当前会话
        作用:可以作为域对象,用来共享数据。
   
     - application
        类型:ServletContext
        代表:代表整个WEB应用
        作用:是JavaWeb中最大的域对象。
   
     - response
        类型:HttpServletResponse
        代表:响应
        作用:向浏览器发送响应信息
    
     - out
        类型:JspWriter
        代表:输出流
        作用:可以向页面输出内容
   
     - config
        类型:ServletConfig
        代表:当前JSP的配置信息
        作用:可以获取到Servlet标签中初始化参数
   
     - page
        类型:Object 在service方法中有如下代码 Object page = this;
        代表:代表当前JSP的对象
        作用:通常能用page的地方就可以用this,因而通常没什么作用
   
     - exception
        类型:Throwable
        代表:异常信息
        作用:获取页面中的异常

jsp基本语法及运行原理的更多相关文章

  1. Unit04: JSP基本语法 、 JSP运行原理

    Unit04: JSP基本语法 . JSP运行原理 hello.jsp <%@page pageEncoding="utf-8"%> <!doctype html ...

  2. jsp学习--JSP运行原理,九大隐式对象和JSP常用标签

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  3. JSP起源、JSP的运行原理、JSP的执行过程

    JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...

  4. JavaWeb(二)jsp运行原理,九大内置对象

    JSP运行原理: 每个JSP页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ...

  5. JSP基本语法总结【1】(jsp工作原理,脚本元素,指令元素,动作元素)

    时隔半年,回头对jsp复习整理一下,温故而知新. jsp工作原理: jsp服务器管理jsp页面分两个阶段:转换阶段(translation phase)和执行阶段(execution phase). ...

  6. jsp jsp运行原理

    JSP的运行原理  每个jsp页面在第一次被访问时,WEB容器都会把请求交给jsp引擎(一个java程序).Jsp 引擎先将jsp翻译成一个_jspServlet实质上也是一个servlet,然后按照 ...

  7. Tomcat之JSP运行原理之小试牛刀

    最近空闲看了下JSP/Servlet,以前只知道用JSP,但是对其运行原理知之甚少,今在此做些笔记,以备查阅. 首先简要描述下其运行过程,然后结合Tomcat源码作简要分析. JSP运行过程: 第一步 ...

  8. html、JSP运行原理

    HTML运行原理 1.本地运行      所谓本地运行就是直接用 浏览器打开 2.远程访问的原理示意图: 何为协议?计算机互相通信(网络)的规则.常见的协议有 http .smtp. ftp.pop等 ...

  9. JSP语法,运行机理等

    JSP是几年前就接触了,但是用归用,很多实际的意义含义等还是不太明白,借此机会,梳理一下. 1.JSP运行原理:当浏览器web应用服务器请求一个JSP页面时,Web应用服务器将其转换成一个Servle ...

随机推荐

  1. Linux基础(八)

    一.shell shell一般代表两个层面的意思,一个是命令解释器,比如BASH,另外一个就是shell脚本.Python也是一种解释语言. 1.   Linux中命令是按照下面的优先级执行的 ==& ...

  2. maven - 引用本地jar,进行jar包移动

    背景: 项目为maven工程,部分jar需要需用项目单独修改的本地jar包. 配置好scope后发现构建后引用的jar没有移动到对应的目录,百度后发现需要配置以下依赖 <plugin> & ...

  3. Mybaits简诉

    先组织一下语言!Mybatis是一个框架,一个数据持久化的框架,作用就是SQL语句的映射!减少了JDBC繁琐的数据操作与类型转换!简而言之,就是方便.轻巧!什么是持久化,持久,恩,JDBC就是一个数据 ...

  4. 关于PHP魔术方法__call的一点小发现

    好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...

  5. 用Node.JS+MongoDB搭建个人博客(成品展示)

    在博客里可以随意畅写和分享自己喜欢的技术,和网友分享知识也是一种提升.根据自己所发表的博客也能更加加深印象. 与此同时写博客也可以提高自己的写作能力(虽然不咋地),但我相信博客只会越写越有质量的. 博 ...

  6. iOS开发实战-时光记账Demo 网络版

    之前写了一个本地数据库版本 戳这里 现在这个就是增加了后台 登录注册页面以及web的上传记录展示页面 含有少量php有兴趣可以看下 另外demo中包括数据库操作.json.网络请求等都没有用到第三方库 ...

  7. 【HTML】canvas学习小结

    1. 绘制基本图形 -----上下文---------------------------------------------------------- canvas.getContext('2d') ...

  8. CentOS安装配置MySql数据库

    CentOS版本7.2,MySql版本5.7 1.下载MySql安装源     wget https://dev.mysql.com/get/mysql57-community-release-el7 ...

  9. 使用Node.js搭建静态资源服务器

    对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解.那就开始吧,让我们的双手沾满网络请求! Note: 当然在项目中如 ...

  10. centos 7 下面安装oracle 11g r2 过程分享

    本人对LINUX等很多还不熟悉,如果有不对的地方还请各位指正.谢谢. 打算学习下ORACLE,RMAN备份与还原功能,所以安装了虚拟机,用的是centos7 X86_64-1611版本,oracle用 ...