JSP

  • Servlet和JSP是同一种编程效果所使用的不同的实现方式

JSP内部运行机制

  • 浏览器向服务器发送请求,调用JSP页面

  • 服务器将请求传递给Web容器,Web容器将JSP文件转化为Servlet的源文件,并对源文件进行编译,生成class文件

  • 转化和编译的过程发生在第一次调用JSP文件时,因此第一次加载JSP文件会比较慢


  • JSP转化和编译得到的.java文件和.class文件在Tomcat的work目录下

  • JSP转化后的Servlet要重写三个方法: jspInit、JSPDestroy和jspService,本质上和Servlet是一样的

JSP代码注释

一共有种方式

  • // 单行注释(只能出现在jsp文件的java代码区)

  • /* */ 多行注释(只能出现在jsp文件的java代码区)

  • <%-- --%> (转化时会忽略这部分代码)

  • (会发送到客户端)

指令标记

一共有6个(page, include, taglib, tag, attribute, variable),只影响当前JSP页面

(1) page: 提供当前JSP文件的有关信息

例如

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

(2) include: 设置当前JSP页面包含其他JSP或html页面,被包含页面中的Java代码和JSP元素会正确执行。包含的过程发生在JSP页面转化成Servlet的时候,包含的过程是静态的(被包含的内容是插入到JSP页面中include的位置的)

(3) taglib: 使用定制标记

声明标记

定义当前JSP页面中使用的变量和方法,定义的变量为JSP页面全局变量

语法

<%!
    ....
%>

其中....部分只能包含属性和方法的声明(java代码声明和实现是在一起的,所以这里声明==实现),不能直接嵌入Java代码片段和JSP内置对象

Scriptlet标记

包括任意多行的Java代码,标记中可以定义变量、方法和输出表达式的数值,以及使用JSP内置对象

语法

<%
    ....
%>

表达式标记

直接输出一个表达式的值,如果不是String类型,则调用toString方法

<%="...."%>

动作

本质是jsp内置的定制标记库,常用的有5个,分别是 include, useBean, getProperty, setProperty和forward

(1) <jsp:include>

  • 如果包含的是静态文件,则直接把内容包含到include动作所在的位置上

  • 如果包含的是动态文件,则把调用所包含JSP网页的输出内容插入到输出的内容中

  • <jsp:include>可以传递参数,通过 request.getParameter(String name)可以获得被包含文件传递的参数值

  • 示例

      <jsp:include page="/header.jsp">
          <jsp:param name="author" value="vv.com"/>
      </jsp:include>
    
  • include指令和<jsp:include>动作的区别:

    include指令发生在JSP转化为Servlet的阶段,只产生一个Servlet的.java文件和.class文件,把两个JSP内容的文件何在一起;

    <jsp:include>的本质是调用被包含文件的Servlet帝乡的jspService方法,因此会有多个Servlet的.java和.class文件

(2) <jsp:forward>

  • 作用是由当前JSP页面转到同一个Web应用的其他html页面或JSP页面,不能转到其他Web服务器页面(类似于 Servlet中的 RequestDispatcher.forward()方法)

  • 转发的时候可以传递参数,通过 request.getParameter(String name)可以获得参数

  • 示例

      <jsp:forward page="/register.jsp">
          <jsp:param name-"author" value="vv.com"/>
      </jsp:forward>
    

JSP内置对象

一共有9个内置对象

(1) out

  • 用于在浏览器上输出

  • 默认设置缓冲,当缓冲区没有满之前,数据不会真正被送出至客户端

(2) request

  • 相当于Servlet中的request

(3) response

  • 相当于Servlet中的response

  • 可以重定向 <% response.sendRedirect("www.baidu.com") %>

(4) session

  • 相当于Servlet中的HTTPSession

  • 当访问同一个Web应用的Servlet和JSP页面时,使用的是同一个session对象

(5) application

  • 相当于 javax.servlet.ServletContext

  • 可以跨用户的传递参数(而Session只能保存绑定单个用户)

    eg.

      <%
        application.setAttribute("website", "www.baidu.com");
        out.println(application.getAttribute("website"));
      %>
    
  • 可以设置context初始参数

    eg.

      <%
        out.println(application.getInitParameter("website"));
      %>
    
  • 使用log方法记录日志

    eg.

      <%
        application.log("I'm here")
      %>
    

(6) page

  • 代表当前所在的JSP页面,相当于this

(7) pageContext

  • 作用是获得其他内置对象,提供单一接口方便管理

    eg.

      getRequst()获得ServletRequest对象
      getServletConfig()获得ServletConfig对象
      ......
    

(8) exception

  • page指令(不是page内置对象)可以设定 errorPage属性指定专门处理异常的JSP页面

  • 专门处理异常的JSP页面需要设定 page指令中 isErrorPage 属性为true

  • 专门处理异常的JSP页面中需要使用 exception 对象

  • 示例

      <%@page contentType="text/html;charset="UTF-8" isErrorPage="true"%>
      <%@page import="java.io.PrintWriter%>
      <html>
          <head>
              <title>display error</title>
          </head>
          <body>
              网页发生异常信息:<%=exception%>
              <br>
              显示异常的堆栈信息:
              <br>
              <%
                exception.printStackTrace(new PrintWriter(out));
              %>
          </body>
      </html>
    

(9) config

  • 相当于 javax.servlet.ServletConfig

HTTP常见错误代码

(1) 401

  • 用户验证失败

(2) 403

(3) 404

  • 找不到请求的文件资源

(4) 405

  • 不允许访问该资源,例如Servlet只写了doPost没写doGet却用浏览器输入地址访问了

(5) 500

  • 服务器内部运行错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值