zoukankan      html  css  js  c++  java
  • JSP详解

    什么是JSP?

    JSP(Java Server Pages) : 是以Java语言为基础的动态网页开发技术,其中既可以写html代码,也可以写java代码

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

    为什么说JSP就是Servlet?

    JSP页面会被编译成Servlet后才被执行.可以在tomcat根目录下work文件夹内找到项目的JSP编译成的Servlet文件

    打开后就可以看到

    public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent,
                     org.apache.jasper.runtime.JspSourceImports {
    

      

    其中HttpJspBase类继承自HttpServlet

    我们编写的所有html代码,都会被转换成servlet中的out.write(html)代码输出.

    JSP什么时候被编译成Servlet?

    JSP只有在第一次客户端发送请求的时候才会被编译,之后的请求都是直接调用编译后的文件

    如果JSP文件发生改动,tomcat会动态地检测到,然后在下一次收到请求的时候重新编译,所以改动jsp代码无需重新启动服务器.

    因为JSP就是servlet,那么生命周期也就是跟serlvet一样

    JSP和servlet有一点区别就在于:jsp是先部署后编译,而servlet是先编译后部署

    一.JSP语法

    JSP页面包括模板数据和元素

    模板数据 : 就是JSP中的HTML代码,编译后的内容实例如下:所有模板数据都会用out.write()方法原样输出

          out.write("\t\t\t<input class=\"submit\" type=\"submit\" value=\"登陆\"/>\r\n");
          out.write("\t\t</form>\r\n");
          out.write("\t</div>\r\n");
          out.write("\t\r\n");
          out.write("</div>\r\n");
          out.write("<footer>你好啊!</footer>\r\n");
          out.write("</body>\r\n");
          out.write("</html>\r\n");
    

      

    元素 : 包括脚本(JS和Java代码),JSP指令(Directive)和JSP标签(Tag).元素决定着程序的流程,元素是不会显示到浏览器的

    所有jsp的模板数据和元素,都被编译在Servlet文件的_jspService()方法内,具体内容可以自己查看编译后的文件.

    jsp元素在编译后变成普通的java代码

    JSP脚本

    1. 格式 : <% java代码 %>

    所有jsp的模板数据和元素,都被编译在Servlet文件的_jspService()方法内,

    所以,

    JSP脚本中的代码就是在方法内部写代码.符合Java方法内的代码格式即可!

    <% java代码 %>写在什么位置,编译后仍然在那个位置.(比如原来写在<h1>标签内部,那么编译后仍在那个位置)

          out.write("<footer>你好啊!</footer>\r\n");
          // 编译后示例
          int a = 11;
          out.println(a);
          out.write("</body>\r\n");
    

    2.格式 : <%=xxx %>  

    用来输出结果,不做赘述

    3.格式 : <%!  方法或属性%>

    在JSP中声明方法或属性(全局变量).

    4.格式 : <%-- 注释内容 --%>

    JSP注释

    JSP指令

    指令用来申明JSP页面的一些属性,比如编码方式,文档类型等等

    格式 : <%@指令名 key="value"%>

    常用指令有三种 : page指令, include指令, taglib指令

    page指令 : 

    -------------------------------------------------------------------------------

            属性名称        取值范围          描述

            language        java      解释该JSP文件时采用的语言,一般为java语言,默认为java

            extends        任何类的全名   编译该JSP文件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等方法

            import         任何包名、类名  引入该JSP中用到的类、包等,import是唯一可以声明多次的page指令属性,一个import可以引用uogelei,中间用英文逗号隔开,

                                  如<%@ page import="java.util.List,java.util.ArrayList"%>

            session        true、false    该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使用,否则反之,默认为true

            autoFlush       true,false    是否运行缓存,如果为true,则使用out.println()等方法输出的字符串并不是立刻到达客户端服务器的,而是暂时存到缓存里,缓存满

                                 了或者程序执行完毕或者执行out.flush()操作时才到客户端,默认为true。

            buffer        none或者数字KB   指定缓存大小,当autoFlush设为true时有效,例如<%@ page buffer=10kb%>

            isThreadSafe      true,false    是否线程安全,如果为true,则运行多个线程同时运行该jsp程序,否则只运行一个线程,其余线程等待,默认为false

            isErrorPage      true,false     指定该页面是否为错误显示页面,如果为true,则该JSP内置有一个Exception对象exception,可直接使用,否则没有,默认为false

            errorPage     某个JSP页面的相对路径  指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面,errorPage指定的页面通常

                                   isErrorPage属性为true,且内置的exception对象为未捕捉的异常

            contentType     有效的文档类型    客户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html、纯文本格式为text/plain、JPG图像为image/jpeg、

                                 GIF图像为image/gif、WORD文档为application/msword,该属性常跟着charset设置编码一起,作用是通知服务器和浏览器都使用同一个码表

            info          任意字符串      指明JSP的信息,该信息可以通过Servlet.getServletInfo()方法获取到

        trimDirective Whitespaces    true、false     是否去掉指令前后的空白字符,默认为false

            pageEncoding    UTF-8,ISO-8859-1等    指定一张码表来对该JSP页面进行编码,

    ------------------------------------------------------------------------------

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

      其中,pageEncoding="UTF-8是指以UTF-8编码编译为Servlet

      contentType="text/html; charset=UTF-8"会在Servlet中变成 : response.setContentType("text/html; charset=UTF-8");

    include指令

       <%@ include file="relativeURL"%> 静态包含

    taglib指令

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 引入标签库

    JSP行为

    元素有包括脚本指令标签,标签分为内置标签和taglib标签库标签以及自定义标签,

    其中内置标签就是JSP行为

    JSP行为其实是对常用的JSP功能的抽象与封装,可以取代jsp脚本,让JSP中就少一些嵌入java代码的地方

    格式 : <jsp:行为名 key="value">

    include行为

    <jsp:include page=" " flush="true"/> 动态引入

    ------------------------------------------------------------

    JavaBean行为包括 useBean行为, setProperty行为, getProperty行为

    useBean行为

    <jsp:useBean id="beanObject" class="className" scope="Value"> 声明一个JavaBean对象(是对象)

    id : 变量名

    class : javabean路径

    scope : 作用域(request, page, session, application)

    setProperty行为

    <jsp:setProperty name="beanName" property="propertyName" value="xxx">给指定bean属性赋值

    <jsp:setProperty name="user" property="*" />

    可以自动给JavaBean对象的属性赋值,值从request中取,*代表所有属性

    getProperty行为

    <jsp:getProperty name="beanName" property="propertyName" /> 获取指定属性的值

    --------------------------------------------------------

    <jsp:forward />行为

    Servlet中的请求转发代码 : request.getRequestDispatcher("someServlet").forward(request,response);

    forward行为可以实现同样的效果(forward行为其实是对请求转发代码的封装)

    格式如下:

    <jsp:forward page="someServlet">

        <jsp:param name="param1" value="value1"/>    //携带请求参数

        <jsp:param name="param2" value="value2"/>

    </jsp:forward>

    ---------------------------------------------------------

    <jsp:directive/>行为

    directive行为,就相当于JSP指令,比如<jsp:directive.page/>相当于<%@ page %>指令,等等其它指令是一样的书写格式

    二.JSP隐藏的九大内置对象和四大作用域

    JSP九大内置对象分别是:

    page、config、application、request、response、session、out、exception、pageContext

          page:page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。相当于this。

          config:标识Servlet配置,类型:ServletConfig,api跟Servlet中的ServletConfig对象是一样的,能获取该servlet的一些配置信息,能够获取ServletContext

          application:标识web应用上下文,类型:ServletContext,详情就看Servlet中的ServletContext的使用

          request:请求对象,  类型:httpServletRequest

          response:响应对象  类型:httpServletResponse

          session:表示一次会话,在服务器端记录用户状信息的技术

          out:输出响应体 类型:JspWriter, JspWriter继承了java.io.Writer类

          exception 表示发生异常对象,类型 Throwable,在上面我们介绍page指令中的一个errorPage属性时就有说到他

          pageContext:表示 jsp页面上下文(jsp管理者) 类型:PageContext

         标记了红色的对象就是JSP独有的,其他的都是Servlet中的老东西。

    少了exception对象,因为我们在将page指令时,说过一个isErrorPage属性,默认是false,被关闭了,所以其中并没有exception对象

     ------------------------------------------------------------------------------------

    out对象:

    类型是JspWriter, JspWriter继承自java.io.Writer类

    out输出方法 : 

      out.write() ==>是继承自Writer类里的方法

      out.println()/out.print() ==>是JspWriter自己的方法

    JSP缓存和Servlet缓存

    out对象是JspWriter类型的,所以是会先将要发送的数据存入JSP输出缓存中,等JSP输出缓存满了在自动刷新到servlet输出缓存

    等serlvet输出缓存满了,或者程序结束了,就会将其输出到浏览器上。除非手动out.flush()。

    而jsp 输出底层使用 response.getWriter(),则是直接将数据存储到servlet输出缓存.

    这时,输出顺序会是 bbbaaaccc,

    如果把out.flush()的注释消掉,那么结果会是 : aaabbbccc.

    pageContext对象

    它是JSP页面的管理者(上下文),所以JSP中的内置对象呀,它统统能够获

    1.获得其它八大内置对象 : getXxx()

    2.操作page作用域的属性 : getAttribute(), setAttribute(), removeAttribute()

    3.操作指定作用域的属性 : 在上边方法的形参中加入scope参数(4个作用域的scope值分别是1,2,3,4).

    4.提供作用域常量 : PageContext.PAGE_SCOPE 值为1, 其他三个值分别为2,3,4

    5.获取指定属性 : findAttribute(name) ===>从page,request,session,application中依次查询,直到获取为止

    四大作用域

    page、request、session、application

    其中,request,session,application都有setAttribute()和getAttribute()方法,可以在域中存取数据,request的setParameter()方法是设置请求参数,不是存储到域中

    page的存取数据依靠pageContext对象来执行.

    page : 变量的作用域只在当前页面

    request : 变量在一次请求中,可能包含多个页面,比如页面转发

    session : 变量在一次会话中,是要cookie不关闭,session就会起作用

    application : 代表变量能一个应用下的多个会话, 在服务器下的多个项目之间都能够使用.

    参考修改 : https://www.cnblogs.com/whgk/p/6427759.html

  • 相关阅读:
    171 01 Android 零基础入门 03 Java常用工具类02 Java包装类 01 包装类简介 01 Java包装类内容简介
    170 01 Android 零基础入门 03 Java常用工具类01 Java异常 08 Java异常总结 01 异常总结
    169 01 Android 零基础入门 03 Java常用工具类01 Java异常 07 异常链 01 异常链简介
    168 01 Android 零基础入门 03 Java常用工具类01 Java异常 06 自定义异常 01 自定义异常类
    167 01 Android 零基础入门 03 Java常用工具类01 Java异常 05 使用throw和throws实现异常处理 02 使用throw抛出异常对象
    166 01 Android 零基础入门 03 Java常用工具类01 Java异常 05 使用throw和throws实现异常处理 01 使用throws声明异常类型
    165 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 05 return关键字在异常处理中的使用
    DevExpress WPF v20.2版本亮点放送:全新升级的PDF Viewer
    界面控件DevExpress使用教程:Dashboard – 自定义导出
    DevExpress WinForms帮助文档:表单控件
  • 原文地址:https://www.cnblogs.com/jinyu59/p/10736306.html
Copyright © 2011-2022 走看看