jsp基本语法及运行原理

时间:2022-08-27 21:38:45

一、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基本语法及运行原理

四、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运行原理&comma;九大隐式对象和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. Javascript小括号&OpenCurlyDoubleQuote;&lpar;&rpar;”的多义性

    摘要:本文主要介绍JavaScript中小括号有五种语义. Javascript中小括号有五种语义 语义1,函数声明时参数表 function func(arg1,arg2){ // ... } 语义 ...

  2. Python学习笔记1—模块

    模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11   (module11是module的子模块) 例: ...

  3. perl命令批量替换文件内容

    转自:http://www.jbxue.com/article/12638.html 使用perl命令批量替换文件内容. 对linux下的文件内容进行替换,有时不用编写perl脚本,用perl命令就可 ...

  4. 1040&period; Longest Symmetric String &lpar;25&rpar;

    题目链接:http://www.patest.cn/contests/pat-a-practise/1040 题目: 1040. Longest Symmetric String (25) 时间限制 ...

  5. &lbrack;补档&rsqb;&lbrack;Tvyj 1729&rsqb;文艺平衡树

    [Tvyj 1729]文艺平衡树 题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结 ...

  6. collections deque队列及其他队列

    from collections import deque dq = deque(range(10),maxlen=10) dq.rotate(3)#队列旋转操作接受一个参数N,让N>0时,队列 ...

  7. MVC模型注解

    首先,model是通过ef自动是生成的实体. 添加模型注解的意思就是在注册的时候自动验证用户所填信息是否符合我们规定的要求(这是我们做这个例子的要求) 首先给大家先展示一下效果吧. 然后Email是点 ...

  8. spring cloud config svn仓库配置

    之前快速入门了一下spring cloud config 但是仓库用的别人博客上的git仓库,公司用的是svn项目管理中心,下面这个自己配置的时候出现的错误 You need to configure ...

  9. java 基本原则

    开闭原则:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求. 可以通过“抽象约束.封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一 ...

  10. C&num;中关闭子窗口而不释放子窗口对象的方法

    1 在主窗口中实例化子窗口 在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象. Form2 f2 = new Form2(); 2 通过按钮来显示主窗口 在按钮中需要实现的是窗口的显示 priv ...