zoukankan      html  css  js  c++  java
  • JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】

    什么是JSP

    JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在

    为什么需要JSP

    JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的。

    简单使用一下JSP

    • 在idea下生成一个JSP,我们来看一下JSP长什么样子
    
    		<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    		<html>
    		<head>
    		    <title>简单使用JSP</title>
    		</head>
    		<body>
    		
    		</body>
    		</html>
    
    
    • 看起来就像一个HTML页面,前面也说了:JSP的特点就是HTML和Java代码共同存在
    • 我们向浏览器输出一句HelloWorld,至于<%%>这个东西,我先不解释!
    
    		<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    		<html>
    		<head>
    		    <title>简单使用JSP</title>
    		</head>
    		<body>
    		<%
    		    String s = "HelloWorld";
    		    out.println(s);
    		%>
    		</body>
    		</html>
    
    
    
    

    JSP的工作原理

    • 在Tomcat博客中我提到过:Tomcat访问任何的资源都是在访问Servlet!,当然了,JSP也不例外!JSP本身就是一种Servlet。为什么我说JSP本身就是一种Servlet呢?其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)
    • 刚才我简单使用了一下JSP,它被编译成了这么一个Servlet:
    
    
    package org.apache.jsp;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;
    import java.util.Date;
    
    public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent {
    
      private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
    
      private static java.util.List<String> _jspx_dependants;
    
      private javax.el.ExpressionFactory _el_expressionfactory;
      private org.apache.tomcat.InstanceManager _jsp_instancemanager;
    
      public java.util.List<String> 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 HttpServletRequest request, final HttpServletResponse response)
            throws java.io.IOException, ServletException {
    
        final PageContext pageContext;
        HttpSession session = null;
        final ServletContext application;
        final ServletConfig config;
        JspWriter out = null;
        final Object page = this;
        JspWriter _jspx_out = null;
        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("
    ");
          out.write("
    ");
          out.write("<html>
    ");
          out.write("<head>
    ");
          out.write("    <title>简单使用JSP</title>
    ");
          out.write("</head>
    ");
          out.write("<body>
    ");
    
        String s = "HelloWorda";
        out.println(s);
    
          out.write("
    ");
          out.write("</body>
    ");
          out.write("</html>
    ");
        } catch (Throwable t) {
          if (!(t instanceof 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);
          }
        } finally {
          _jspxFactory.releasePageContext(_jspx_page_context);
        }
      }
    }
    
    
    
    • 编译过程是这样子的:浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求
    • 以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的
    • 既然JSP是一个Servlet,那JSP页面中的HTML排版标签是怎么样被发送到浏览器的?我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了。
    
          out.write("
    ");
          out.write("
    ");
          out.write("<html>
    ");
          out.write("<head>
    ");
          out.write("    <title>简单使用JSP</title>
    ");
          out.write("</head>
    ");
          out.write("<body>
    ");
    
    • 有人可能也会问:JSP页面的代码服务器是怎么执行的?再看回1_jsp.java文件,java代码就直接在类中的service()中。
    
        String s = "HelloWorda";
        out.println(s);
    
    
    • JSP比Servlet更方便更简单的一个重要原因就是:内置了9个对象!内置对象有:out、session、response、request、config、page、application、pageContext、exception,这几个内置对象不在这里讲。现在先知道一下即可!

    JSP生命周期

    JSP也是Servlet,运行时只有一个实例,JSP初始化和销毁时也会调用Servlet的init()和destroy()方法。另外,JSP还有自己初始化和销毁的方法

    
      public void _jspInit() {
        _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
      }
    
      public void _jspDestroy() {
      }
    
    

    JSP的语法

    JSP代码可以分为两部分:

    1. 模板数据:就是HTML代码
    2. 元素:JSP页面中的java代码、JSP指令、JSP标签

    JSP脚本

    • JSP的脚本就是JSP页面中的java代码,也叫做scriptlet。JSP的脚本必须使用<%%>括起来,不然会被当成是模板数据的!

    • JSP脚本有三种方式:

      • <%%>【定义局部变量,编写语句】
      • <%!%>【定义类或方法,但是没人这样用!
      • <%=%>(也称之为表达式输出)【输出各种类型的变量,int、double、String、Object等】
    • 如果过多地使用<%%>会导致代码混乱,JSP还提供了一种scriptlet标签,使用此标签和<%%>有相同的功能,只不过它更美观了一些

    
    	<jsp:scriptlet>
    	
    	    String s = "HelloWorld";
    	    out.println(s);
    	
    	</jsp:scriptlet>
    
    
    

    JSP注释##

    	
    	<%--这是JSP注释--%>
    	<%--%>
    
    	//这是java的当行注释
    	//
    
    	
    	/*这是java的多行注释*/
    	/**/
    	
    
    

    JSP指令

    JSP指令用来声明JSP页面的相关属性,例如编码方式、文档类型等等

    JSP指令的语法:

    
    	<%@指令  属性名="值"  %>
    
    

    page指令

    • 我在idea生成的JSP页面就有page指令了。
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    • page指令常见属性:

    • language="java"

    • extends="package.class"

    • import="{package.class | package.*}, ..."

    • session="true | false"

    • buffer="none | 8kb | sizekb"

    • autoFlush="true | false"

    • isThreadSafe="true | false"

    • info="text"

    • errorPage="relative_url"

    • isErrorPage="true | false"

    • contentType="mimeType ;charset=characterSet " | "text/html ; charset=ISO-8859-1"

    • pageEncoding="characterSet | ISO-8859-1"

    • isELIgnored="true | false"

    • 一般地,在eclipse或idea这些高级开发工具上开发,我们只需要在page指令中指定contentType="text/html;charset=UTF-8",就不会出现中文乱码问题!

    • 当然了contentType 不仅仅可以指定以text/html的方式显示,还可以使用其他的形式显示出来。在conf/web.xml文件中可以查询出来

    • 比如,我以doc形式显示jsp的数据
    
    	<%@ page contentType="application/msword;charset=UTF-8" language="java" %>
    	<html>
    	<head>
    	    <title>简单使用JSP</title>
    	</head>
    	<body>
    	
    	    1111
    	</body>
    	</html>
    
    
    • 效果是这样子的:

    • 我们上网的时候,如果我们操作不当,或者服务器出错了,页面都是会出现友好提示的!这个也能通过page指令来实现跳转到友好提示页面上
    • page指令errorPage=和isErrorPage这两个属性,下面我们来看一下怎么使用!
    • 1.jsp出现了错误,通过page指令的errorPage属性跳转到error.jsp页面
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
    	<html>
    	<head>
    	    <title>该页面出错了!</title>
    	</head>
    	<body>
    	    <%--模拟页面出错了!!!--%>
    	    <%
    	        int result = 2 / 0;
    	    %>
    	    你好呀
    	</body>
    	</html>
    
    
    • error.jsp页面要通过page指令的isErrorPage属性设置页面就是错误页面
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true"   %>
    	<html>
    	    <head>
    	        <title>友好提示页面</title>
    	    </head>
    	    <body>
    	        服务器正忙着呢!
    	    </body>
    	</html>
    
    
    • 下面是效果:

    • 当然了,细心的朋友可以发现地址栏是没有变化的,所以属于是服务器跳转。以上的做法是单个页面设置的,如果我会有很多错误(JSP多的情况下,错误就会多),单个设置太麻烦了!
    • 我们可以在web.xml文件中全局设置错误页,只要发生了404错误或者空指针异常的错误都会跳转到error.jsp页面上
    
        <error-page>
            <error-code>404</error-code>
            <location>/error.jsp</location>
        </error-page>
    
        <error-page>
            <exception-type>java.lang.NullPointerException</exception-type>
            <location>/error.jsp</location>
        </error-page>
    
    
    • 随便输个资源进行,会发生发404错误的,跳转到错误页面。下面是效果:


    include指令

    • 在讲解request对象的时候,我们曾经使用过request.getRequestDispatcher(String url).include(request,response)来对页头和页尾面进行包含

    • inclue指令也是做这样的事情,我们来试验一下吧!

    • 这是页头

    
    	<%@ page contentType="text/html;charset=UTF-8" language="java"   %>
    	<html>
    	    <head>
    	        <title>页头</title>
    	    </head>
    	    <body>
    	    我是页头
    	    <br>
    	    <br>
    	    <br>
    	    </body>
    	</html>
    
    
    • 这是页尾
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    	<html>
    	<head>
    	    <title>页尾</title>
    	</head>
    	<body>
    	
    	我是页尾
    	
    	</body>
    	</html>
    
    
    • 在1.jsp中把页头和页尾包含进来
    
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    	<html>
    	<head>
    	    <title>包含页头和页尾进来</title>
    	</head>
    	<body>
    	
    	
    	<%@include file="head.jsp" %>
    	<%@include file="foot.jsp" %>
    	</body>
    	</html>
    
    
    • 访问1.jsp

    • include指令是静态包含。静态包含的意思就是:把文件的代码内容都包含进来,再编译!,看一下jsp的源代码就知道了!

    • jsp还提供另一种包含文件的方式:JSP行为---动态包含。jsp行为在下面会讲到!

    taglib指令

    • JSP支持标签技术,要使用标签技术就先得声明标签库和标签前缀。taglib指令就是用来指明JSP页面内使用标签库技术。
    • 这里就不详细说明了,等到学习JSP标签的时候再使用吧!现在记住有这个指令即可。

    JSP行为

    JSP行为(JSP Actions)是一组JSP内置的标签,只书写少量的标记代码就能够使用JSP提供丰富的功能,JSP行为是对常用的JSP功能的抽象和封装

    为什么我不把它直接称为JSP标签呢?我把这些JSP内置的标签称之为JSP行为,能够和JSTL标签区分开来。当然了,你也可以把它称之为JSP标签,你不要搞混就行了。我个人喜欢把这些JSP内置标签称之为JSP行为。

    include行为

    • 上面已经提及到了,include指令是静态包含,include行为是动态包含其实include行为就是封装了request.getRequestDispatcher(String url).include(request,response)
    • include行为语法是这个样子的
    
    	<jsp:include page=""/>
    
    
    • 我们先来使用一下把,在1.jsp页面中也将页头和页尾包含进来
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    	<html>
    	<head>
    	    <title>包含页头和页尾进来</title>
    	</head>
    	<body>
    	    <jsp:include page="head.jsp"/>
    	    <jsp:include page="foot.jsp"/>
    	</body>
    	</html>
    
    
    • 访问1.jsp页面看一下效果:

    • 使用jsp行为来包含文件,jsp源文件是这样子的:

    • jsp行为包含文件就是先编译被包含的页面,再将页面的结果写入到包含的页面中(1.jsp)

    • 当然了,现在有静态包含和动态包含,使用哪一个更好呢?答案是:动态包含

    • 动态包含可以向被包含的页面传递参数(用处不大),并且是分别处理包含页面的(将被包含页面编译后得出的结果再写进包含页面)【如果有相同名称的参数,使用静态包含就会报错!】

    • 模拟一下场景吧,现在我的头页面有个名为s的字符串变量

    
    	<%@ page contentType="text/html;charset=UTF-8" language="java"   %>
    	<html>
    	    <head>
    	        <title>页头</title>
    	    </head>
    	    <body>
    	    
    	    <%
    	        String s = "zhongfucheng";
    	    %>
    	    我是页头呀
    	    <br>
    	    <br>
    	    <br>
    	    </body>
    	</html>
    
    
    • 我的页尾也有个名为s的字符串变量
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    	<html>
    	<head>
    	    <title>页尾</title>
    	</head>
    	<body>
    	<%
    	    String s = "zhongfucheng";
    	%>
    	
    	我是页尾呀
    	
    	</body>
    	</html>
    
    
    • 现在我使用静态包含看看会发生什么,出现异常了。

    • 出现异常的原因很简单,就是同一个文件中有两个相同的变量s

    • 使用动态包含就可以避免这种情况


    param行为

    forward行为

    • 在讲解request对象的时候,我们使用request.getRequestDispatcher(String url).forward(request,response)进行跳转。其实forward行为就是对其封装
    • 我们来看一下forward的语法:
    	<jsp:forward page=""/>
    
    
    • 好的,我们来使用一下吧。访问1.jsp页面就跳转到head.jsp页面中
    
    	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    	<html>
    	<head>
    	    <title>访问1.jsp就跳转到head.jsp</title>
    	</head>
    	<body>
    	
    	<jsp:forward page="head.jsp"/>
    	
    	
    	</body>
    	</html>
    
    
    • 看一下效果

    • 如果我要传递参数,就要在forward行为嵌套param行为
    • 在跳转到head.jsp时传入参数username值为zhongfucheng
    	<jsp:forward page="head.jsp">
    	    <jsp:param name="username" value="zhongfucheng"/>
    	</jsp:forward>
    
    
    • 在head.jsp页面中获取到传递过来的参数
    
    	    <%
    	        String ss = request.getParameter("username");
    	    %>
    	
    	    获取到的参数是:
    	    <%=ss%>
    
    
    
    • 效果如下图所示

    directive行为

    • directive的中文意思就是指令该行为就是替代指令<%@%>的语法的

    • 我们来试一下能不能用的

    
    	<jsp:directive.include file="head.jsp"></jsp:directive.include>
    	<jsp:directive.include file="foot.jsp"></jsp:directive.include>
    
    
    • 看下效果,正常可以包含页面:

    • 使用该指令可以让JSP页面更加美观
    • 使用scriptlet行为<jsp:scriptlet>替代<%%>是同样一个道理

    javaBean行为

    • JSP还提供了操作javaBean对象的行为在这里就不详细说明了,后面会讲到的!现在记住JSP提供了javaBean行为来操作简单类即可!
      • <jsp:useBean id=""/>
      • <jsp:setProperty name="" property=""/>
      • <jsp:getProperty name="" property=""/>

    如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y

  • 相关阅读:
    Windows JScript 在 游览器 中运行 调试 Shell 文件系统
    autohotkey 符号链接 软连接 symbolink
    软链接 硬链接 测试
    SolidWorks 修改 基准面 标准坐标系
    手机 路径 WebDAV 映射 驱动器
    Win10上手机路径
    explorer 命令行
    单位公司 网络 封锁 屏蔽 深信 AC
    cobbler自动化部署原理篇
    Docker四种网络模式
  • 原文地址:https://www.cnblogs.com/Java3y/p/8419001.html
Copyright © 2011-2022 走看看