JSP整理ver2.0


JSP



1. 什么是jsp,它有什么用?

  • jsp的全称是java server pages(Java的服务器页面)。
  • jsp的主要作用是代替 Servlet 程序回传html页面的数据。
    因为servlet 程序回传html页面数据是一件非常繁锁的事情。开发成本和维护本都极高。

2. jsp的本质是什么

  • jsp页面本质上是一个servlet程序。

    当我们第一次访问jsp页面的时候。Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件。并且对它进行编译成为.class字节码程序。

    打开java源文件会发现它继承了HttpServlet类。


3. jsp的三种语法


A)jsp头部的page 指令

​ jsp的page指令可以修改sp页面中一些重要的属性,或者行为。


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

language属性

​ 表示jsp翻译后是什么语言文件。暂时只支持java。

contentType属性

​ 表示jsp返回的数据类型是什么。也是源码中response.setContentType()参数值

pageEncoding 属性

​ 表示当前jsp页面文件本身的字符集。

import 属性

​ 跟java源代码中一样。用于导包,导类。


*问题:IDEA提示 Cannot resolve class or package 'utill

<%@ page import="java.util.*" %>

-解决:

修改设置File->Project Structure->Project,把该改的改了


  • 这两个属性是给out 输出流使用,一般不修改

autoFlush属性

​ 当out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true。

buffer属性

​ 设置out缓冲区的大小。默认是8kb


*修改后 :报错500 jsp.error.autoFlush.invalid


errorPage属性:设置当jsp页面运行时出错,自动跳转去的错误页面路径。

设置错误页面为同目录下的errorPage.jsp,发生错误即可跳转到这个页面。

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

isErrorPage属性

​ 设置当前sp页面是否是错误信息页面。默认是false。如果是true可以通过源代码获取异常信息。

session属性

​ 设置访问当前jsp页面,是否会创建HttpSession对象。默认是true。

extends属性

​ 设置jsp翻译出来的java类默认继承谁。


B)jsp中常用的脚本

a)声明脚本(极少用)

​ 格式:<%! ... %>


​ 1.声明类属性

<%!
    private Integer id;
	private String name;
	private static Map<String,Object> map;
%>

​ 2.声明static静态代码块

<%!
		static {
			map=new HashMap<String,Object>();
			map.put("key1","value1");
			map.put("key2","value2");
			map.put("key3","value3");
		}
%>

​ 3.声明类方法

<%!
    public int abc() {
    	return 0;
	}
%>

​ 4.声明内部类

<%!
	public static class A{
		private Integer id = 1;
		private String name = "aaa";
	}
%>

b)表达式脚本(常用)

  • ​ 表达式脚本的格式是:<%=表达式%>

  • ​ 表达式脚本的作用是:在jsp页面上输出数据。


  • ​ 表达式脚本的特点:

    • 所有的表达式脚本都会被翻译到_jspService()方法中

    • 表达式脚本都会被翻译成为out.print()输出到页面上

    • 由于表达式脚本翻译的内容都在jspService()方法中,所以jspService()方法中的对象都可以直接使用。

      • <%=request.getParameter("username") %>
        

    • 表达式脚本中的表达式不能以分号结束。


  • ​ 练习:

1.输出整型
2.输出浮点型
3.输出字符率
4.输出对象

<%=12 %><br>
<%=12.12 %><br>
<%="String" %><br>
<%=map %><br>


c)代码脚本

  • 代码脚本的格式是:<%java语句%>

  • 代码脚本的作用是:

    可以在jsp页面中,编与我们自己需要的功能(写的是java语句)。


  • 代码脚本的特点是:

    • 1、代码脚本翻译之后都在_jspService()方法中
      2、代码脚本由于翻译到_jspService()方法中,所以在_jspService方法中的现有对象都可以直接使用。
      3、还可以由多个代码脚本块组合完成一个完成的java语句。

    4、代码脚本还可以和表达式脚本一起组合使用。在jsp页面上输出数据

<%
	for(int j=0;j<5;j++){
%>
<%= j %>
<%
	}
%>

image-20200417095813580


  • 示例

    1.代码脚本--if语句
    2.代码脚本----for循环语句
    3.翻译后java文件中_jspService方法内的代码都可以写

    <%
    	for(int j=0;j<3;j++){
    		System.out.println(j);
    	}
    %>
    
    <%
    	String username=request.getParameter("username");
    	System.out.println("用户的请求参数是:"+username);
    %>
    



C)jsp中三种注释

1.html注释

<!--这是html注释-->

​ html 注释会被翻译到java源代码中。在jspService方法里,以out.writer输出到客户端。


2.java注释

<%
    //单行java注释
    /*多行java注释*/
%>

​ java 注释会被翻译到java源代码中。

3.jsp注释

<%--这是jsp注释--%>

​ jsp注释可以注掉jsp页面中所有代码。



4. jsp九大内置对象


jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中可以直接使用这9个对象

名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 得到用户请求信息,
response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.servlet.http.HttpSession 用来保存用户的信息
application javax.servlet.ServletContext 所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例
pageContext javax.servlet.jsp.PageContext JSP的页面容器
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用

5. jsp四大域对象

  • 四个的数据存取范围不同

    • pageContext域:当前jsp页面范围

    • request域:一次请求内

    • session域:一次会话内(打开浏览器访问服务器,直到关闭该浏览器)

    • application域:整个web工程范围内(只要web工程不停止,数据都在)


  • 四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
    pagecontexI --> request -->session --> application

  • 测试用:

    • scope.jsp
    <h1>scope页面</h1>
    
    <!-- 存数据 -->
    <%
        pageContext.setAttribute("key", "pageContext");
        request.setAttribute("key", "request");
        session.setAttribute("key", "session");
        application.setAttribute("key", "application");
    %>
    	
    <!-- 取数据 -->
        pageContext取数据:<%= pageContext.getAttribute("key")%><br>
        request取数据:<%= request.getAttribute("key")%><br>
        session取数据:<%= session.getAttribute("key")%><br>
        application取数据:<%= application.getAttribute("key")%><br>
    	
    <!-- 一次转发 -->
    <%
      request.getRequestDispatcher("/scope2.jsp").forward(request,response);
    %>
    
    • scope.jsp
    <!-- 取数据 -->
        pageContext取数据:<%= pageContext.getAttribute("key")%><br>
        request取数据:<%= request.getAttribute("key")%><br>
        session取数据:<%= session.getAttribute("key")%><br>
        application取数据:<%= application.getAttribute("key")%><br>
    


6. jsp中的out输出和response.getWriter输出的区别

  • response中表示响应,我们经常用于设置返回给客户端的内容(输出)

    out 也是给用户做输出使用的。

  • 当jsp页面中所有代码执行完成后会做以下两个操作:

    • 执行out.flush()操作,会把out缓冲区中的数据追加写入到response缓冲区末尾

    • 会执行response的刷新操作。把全部数据写给客户端。

  • 由于jsp翻译之看,底层源代码都是使用out 来进行输出。所以一般情况下。我们在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序。


  • 示例:不管out写在responese的前面还是后面,最后显示out都会在后面。

<%
    out.write("out输出1 <br>");
    out.write("out输出2 <br>");
%>

<%
    response.getWriter().write("response输出1 <br>");
    response.getWriter().write("response输出2 <br>");
%>


  • 在jsp页面中,统一使用out.print()来进行输出
    • out.write() :只能输出字符串
      out.print() :输出任意数据类型都没有问题(先转换为字符串,再调用write输出)

7.jsp的常用标签

a) 静态包含

<%@ include file=" "%>

​ file属性指定要包含的jsp页面的路径

  • 静态包含的特点:
    1.静态包含不会翻译被包含的jsp页面。
    2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出。

  • 例子:

    main.jsp(指向同目录下的footer.jsp)

    头<br> 
    身体<br>
    <%@ include file="./footer.jsp"%>
    

    footer.jsp

    尾巴
    



b)动态包含

  • <jsp:include page=""></jsp:include>

    page属性指向要包含的jsp页面路径

  • 动态包含的特点:

    1. 动态包含会把包含jsp页面翻译成java代码
    2. 动态包含 底层使用如下代码去调用 被包含jsp页执行输出。
      JspRuntimetibrary.incLude(request,response,"/include/footer.jsp",out,false);
    3. 动态包含,可以传递参数。
  • 示例:

    main.jsp

    头<br>
    身体<br>
    <jsp:include page="./footer.jsp">
        <jsp:param name="username" value="hell" />
        <jsp:param name="psw" value="root" />
    </jsp:include>
    

    footer.jsp

    尾巴<br>
    <%=request.getParameter("psw")%>
    

    image-20200417135518299


2)请求转发:<jsp:forward page="要转发的资源" />


c)请求转发

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

  • 示例:

    <jsp:forward page="/scope2.jsp"></jsp:forward>
    
    • 和这个作用一样

      <%
      request.getRequestDispatcher("/scope2.jsp").forward(request,response);
      %>
      


8. 什么是Listener监听器?

  • Listener 监听器,它是lavaWeb的三大组件之一。JavaWeb的三大组件分别是:Servlet 程序、Filter 过滤器、Listener监听器。
  • Listener它是JavaEE的规范,就是接口。
  • 监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

8.1 ServletContextListener 监听器

  • ServletContextListener 它可以监听 ServletContext对象的创建和销毁。

    ServletContext 对象在web工程启动的时候创建,在web工程停止的时候销毁。

    监听到创建和销毁之后都会分别调用 ServletContextListener监听器的方法反馈。

  • 示例:

    注意要加上注解@WebListener

    @WebListener
    public class MyServletContextListenerImpl implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("ServletContext对象被创建了");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("ServletContext对象被销毁了");
        }
    
    }
    
posted @ 2020-04-18 10:56  musecho  阅读(170)  评论(0编辑  收藏  举报