关于JSP的一些小知识

JSP小知识

  • 什么是JSP

    JSP是专门为了解决动态生成HTML文档的技术

  • JSP运行原理

    JSP的本质其实是一个servlet程序

    我们创建了一个a.jsp文件,发现每个jsp都被翻译成Java文件,而这个类继承于HttpJspBase,HttpJspBase类又继承HttpServlet类

    在这里插入图片描述

JSP语法

  • page指令介绍(一般不做修改,默认即可)

    • language属性:值只能是Java,表示翻译得到的是Java语言
    • contentType属性:设置响应头contentType的内容
    • pageEncoding属性:设置当前jsp页面的编码
    • import属性:给当前jsp页面导入需要使用的类包
    • autoFlush属性:设置是否自动刷新out缓冲区,默认为true
    • buffer属性:设置out的缓冲区大小,默认为8kb
    • errorPage属性:设置当前jsp页面发生错误后,需要跳转的页面
    • isErrorPage属性:设置当前jsp页面是否是错误页面,是的话就可以使用exception异常对象
    • session属性:设置当前jsp页面是否获取session对象,默认是true
    • extend属性:给服务器厂商预留的jsp默认翻译的servlet继承于什么类
    <!-- 这是jsp文件头部声明 -->
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
  • jsp三种脚本介绍

    • 声明脚本

      <%--1.可以定义全局变量。--%>
          <%!
              public Integer a = 123;
              private String name = "Tom";
              private static HashMap<String,String> map;
          %>
      <%--2.定义 static 静态代码块--%>
          <%!
              static {
                  map = new HashMap<String,String>();
                  map.put("key1","value1");
                  map.put("key2","value2");
                  map.put("key3","value3");
              }
          %>
      <%--3.定义方法--%>
          <%!
              public void test(){
                  System.out.println("这是定义的方法");
              }
          %>
      <%--4.定义内部类--%>
          <%!
              class A{
                  public int a = 12;
              }
          %>
      
    • 表达式脚本

      • 表达式脚本用于向页面输出内容
      • 表达式脚本翻译到servlet程序的service方法中,以out.print()打印输出
      • out是jsp的一个内置对象,用于生成html的源代码
      <%=12%>
      <%=12.12%>
      <%="我爱中国"%>
      <%=map%>
      
    • 代码脚本

      • 代码脚本里可以写任意的Java语句
      • 代码脚本中的内容会被翻译到service方法中
      <%
          int a = 12;
          if(a==12){
              System.out.println("是的");
          }else {
              System.out.println("不是的");
          }
      %>
      <!--可以通过嵌套的方法在页面输出-->    
      <%
          for (int i = 0; i < 10; i++) {
      %>
      <%=i%><br>
      <%
          }
      %>
      

JSP中的九大内置对象

在这里插入图片描述

  • request:请求对象

  • response:响应对象

  • pageContext:当前页面上下文对象

  • session:会话对象

  • exception:异常对象,只有将当前页面的isErrorPage属性设置成true才会存在

  • application:ServletContext对象实例,可以获取整个工程的一些信息

  • config:ServletConfig对象实例,可以回去Servlet的配置信息

  • out:输出流对象

  • page:表示当前Servlet对象实例

四大域对象

​ 九大内置对象中,有四大域对象,域对象可以像map一样存储键值对,以下四个域对象,效果相同,差别只是在于存储数据的范围不同。四个域对象我们使用的优先级应该从小到大,避免占用内存。

  • pageContext:保存的数据可以在同一个jsp页面中使用
  • request:保存的数据可以在同一个请求中使用
  • session:保存的数据可以在同一个会话中使用(会话:从浏览器打开开始,一直到浏览器关闭结束)
  • application:存储数据的范围在同一次部署中

out输出与response输出的区别

​ response.getWriter().write()和out.write()都可以在浏览器页面上进行输出。

​ out输出会先将输出的内容保存在out缓冲区中,response输出会将输出的内容保存在response缓冲区中,当所有代码执行完毕,会调用out.flush()方法,将out缓冲区中的内容更新到response缓冲区最下面,最后会执行response刷新操作,把response缓存区的数据传到浏览器中

​ 那么我们在输出的时候,通常使用out输出,因为底层代码使用的是out输出,如果使用response输出可能会导致数据混乱

out.write()与out.print()的区别

​ out.write()和out.print()都可以在浏览器上输出内容。输出字符串时,两者输出都是正常的,当输出整型时write()方法会出现错误,这是为什么呢?

​ 看一下write()的底层实现代码,注意一下一段语句,是将int类型强转成char类型,我们知道这虽然不会报错,但无法得到我们想要的数据,而print()的底层实现代码,无论传参是什么类型的数据,都先转换成string型,在调用out.write()进行输出。

所以我们在使用out进行输出时,请使用out.print()

    public void write(int c) throws IOException {
        synchronized (lock) {
            if (writeBuffer == null){
                writeBuffer = new char[WRITE_BUFFER_SIZE];
            }
            writeBuffer[0] = (char) c;  //注意这一段
            write(writeBuffer, 0, 1);
        }
    }

JSP中的常用标签

  • 静态包含(常用)

    先举个例子,讲述一下什么叫做包含:一个网站中,底部信息几乎都是一样的,如果我们一个一个页面写过去,后期维护会非常麻烦,所以引入包含的技术,将底部信息维护到一个页面中,在需要的地方调用即可。

    特点

    • 包含页面不会生成.java文件
    • 包含文件内容是以out.write()输出的
    <%--主体页面--%>
    <body>
        头部信息<br>
        主题内容<br>
        <%--底部信息(静态包含)--%>
    	<%@include file="/include/footer.jsp"%>
    </body>
    
    <%--包含页面--%>
    <body>
        这里是底部信息
    </body>
    
  • 动态包含

    特点

    • 包含页面也会生成对应的.Java文件
    • 包含文件的内容是主体页面调用JspRuntimeLibrary.include 方法
    • 可以传参,并在包含页面获取参数
        <jsp:include page="/include/footer.jsp" >
        </jsp:include>
    
  • 页面转发(常用)

    我们之前使用的请求转发都是调用request.getRequestDispatcher("/xxxx.jsp").forward(request, response),在JSP中可以使用如下方法代替其功能。

    <jsp:forward page=""></jsp:forward>
    

Listener监听器

  • 什么是Listener监听器

    Listener监听器是Javaweb三大组件之一,三大组件分别是Servlet程序、Filter过滤器、Listener监听器。

  • 作用

    Listener监听器可以监听某些事物的变化,然后通过回调函数,反馈给程序做一些相对应的处理

  • 如何使用?

    1. 创建一个类实现ServletContextListener接口
    2. 重写里面的方法
    3. 在web.xml文件中配置Listener
    public class MyListener implements ServletContextListener {
        @Override
        //此方法是监听servlet程序启动时
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            System.out.println("web程序启动");
        }
    
        @Override
        //此方法时监听servlet程序停止时
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            System.out.println("web程序销毁");
        }
    }
    

    配置web.xml

        <listener>
            <!--listener-class是配置文件路径-->
            <listener-class>com.yellowstar.listener.MyListener</listener-class>
        </listener>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值