JSP知识点

 1、JSP概述

1.1 什么是JSP

html + java代码 + JSP动态标签 = jsp

JavaServer page

在静态页面上添加动态信息就可以了,如果是Servlet还需要一行一行的输出。

通常在前台开发人员给出静态页面后,后台开发人员只需在静态页面中添加动态信息即可,而不用再使用Servlet一行一行的去输出了。

1.2  JSP真身:Servlet

当客户请求的是JSP页面时,服务器会查看JSP对应的Servlet是否存在,如果存在,那么直接调用Servlet的service()方法来处理请求。如果不存在,那么服务器会先把JSP编译成.java,再把.java编译成.class,然后调用service()方法。当这个JSP页面,第二处理请求时,就直接调用直身的service()方法了。

JSP是Servlet,JSP与我们编写的Servlet有什么不同呢?通常我们编写的Servlet就不需要输出HTML代码了,而是转发到JSP页面。

即Servlet不再负责显示页面,而由JSP来完成!而Servlet专注与控制层内容!

2.  JSP的scriptlet

从单词上分析script是脚本:let在JAVA中表示的小程序,scriptlet表示脚本小程序。

JSP中的Java代码块就是最常见的动态信息。它分为三种:

<%...%> :java代码片段

代码片段会原模原样的出现在真身中,不会有变动。正常的Java代码都可以在代码片段中出现;

<%= …%>:表达式在页面上打印数据

表达式会在“真身”中输出,例如:,对应真身中的out.print(a)。只能出现常量、变量,以及有返回值的方法调用,而且不能出现分号!即在out.println()的合法参数都可以!

对应out.println(a);

”a”%>对应out.println(“a”);

对应out.println(fun());

对应out.println(a;),所以出错;

“hello”)%>对应out.println(System.out.println(“hello”)),所以出错。

<%!...%> :声明

声明对应“真身”中的属性和方法!

3.  JSP注释

语法:<%--… --%>

其中JSP只有一种注释:<%--… --%>,注释中的内容会被JSP编译系统忽略!

  •  java片段中的代码注释依然遵守java的注释//,/*...*/, /**.../
  •  html片段中的代码依然遵守html的注释,注意的是此注释不能注释带有jsp的scriptlet的脚本,虽然页面上不展示注释掉的代码,但是查看网页源代码可以发现jsp脚本已经生效只不过产出的html代码被注释掉了。(在jsp中不建议使用这种注释)

Html注释和jsp注释二者的区别!

  •  :Tomcat不把它当注释,和其他东西一样,会发送到客户端。但浏览器不会去显示它,因为浏览器知道它是注释;
  • :Tomcat在生成“真身”时,就会忽略它,因为Tomcat认识它,知道它是注释。所以在“真身”中就没有它,也不会发现到客户端。也就是说,客户端永远看不到它!

4.  JSP内置对象

4.1.  什么是内置对象

内置对象是在JSP页面中无需创建就可以直接使用的变量。在JSP中一共有9个这样的对象!它们分别是:

  • out:最为常用的方法是print(),向页面输出!它与response.getWriter()基本相同!
  •  config:在页面中基本没有什么用,但如果JSP在web.xml中存在配置,而且存在初始化参数,那么可以使用config来获取;config对象的功能是:getServletContext()、getServletName()、getInitParameter(),这三个方法在JSP中都没什么用。所以config就没什么用了。JSP也可以在web.xml中配置,但我们没有配置它的必要!
  •  page:基本没用!表示当前JSP页面的当前实例!在页面中使用this和使用page是相同的;也没什么用。
  • request:与Servlet中的request一样,没有区别;
  •  response:与Servlet中的response一样,没有区别;
  •  application:就是ServletContext对象;
  • session:就是HttpSession对象;
  •  exception:虽然名字叫exception,但类型为Throwable。它只能在错误页中可以使用!
  •  pageContext:以后可能不会经常直接使用它,但一定间接使用它

4.2.  内置对象概述

  1. out(JspWriter):用于向客户端发送内容。它是JspWriter接口的一个实例,主要用于输出内容到客户端。
  2. config(ServletConfig):提供关于Servlet配置的信息。通过它,可以获取在web.xml文件中为该JSP页面配置的初始化参数。
  3. page(当前JSP的真身类型):表示当前JSP页面的Java类。由于JSP本质上是Servlet,所以这个对象实际上就是当前JSP页面的实例。
  4. pageContext(PageContext):提供了对其他所有页面范围的访问。它可以让你访问request、response、session等其他内置对象,还提供了其他一些有用的功能,如属性范围管理。
  5. exception(Throwable):当JSP页面抛出异常时,可以通过此对象获取异常信息。这个对象主要用于错误和异常处理。
  6. request(HttpServletRequest):代表客户端发送的请求。你可以使用它来获取请求参数、头部信息、cookies等。
  7. response(HttpServletResponse):代表服务器的响应。你可以使用它来设置响应的内容类型、cookies、重定向等。
  8. application(ServletContext):代表整个web应用程序的上下文。与request和response不同,ServletContext在整个web应用程序中都是相同的,而request和response则对每个请求都是新的。
  9. Session(HttpSession):代表与特定用户关联的会话信息。用户在整个会话期间都可以通过这个对象存储和获取数据。

4.3.  对照JSP真身查看内置对象

我们发现,在JSP中的内容会出现在“真身”的_jspService()方法中,而且在_jspService()方法上方还有一些其他代码:

 

public void _jspService(HttpServletRequest
request, HttpServletResponse response)
            throws java.io.IOException, ServletException {

        PageContext pageContext = null;
        HttpSession session = null;
        ServletContext application = null;
        ServletConfig config = null;
        JspWriter out = null;
        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;

        从这里开始,才是JSP页面的内容
        }…

JSP中的内容都出现在try块中,而且在try块的正文!上方是对隐藏对象的初始化!!!

上面代码只是给出普通页面的“真身”,而错误页面的“真身”你会看到exception对象的出现。

4.4.  JSP四个域对象

4.4.1.  域的范围和属性管理

  • pageContext范围; 当前页面之内有效
  •  request范围;当前的请求内有效
  •  session范围;当前的会话内有效
  •  application范围;当前这次服务器生命周期内有效

域对象的共同特点是都管理域中的属性,他们有着相同的方法:

  1. void setAttribute(String name, Object value);: 这个方法用于设置域对象的属性值。它接受两个参数:属性的名称(name)和属性的值(value)。通过调用这个方法,你可以将属性及其值存储在域对象中。
  2. Object getAttrbiute(String name, Object value);: 这个方法用于获取域对象中指定属性的值。它接受一个参数:属性的名称(name)。通过传递属性的名称作为参数,你可以从域对象中检索与该名称关联的值。这个方法返回一个Object类型的值,表示属性的值。
  3. void removeAttribute(String name, Object value);: 这个方法用于从域对象中删除指定的属性。它接受一个参数:属性的名称(name)。通过传递属性的名称作为参数,你可以从域对象中删除与该名称关联的属性。

4.4.2.  pageContext详细分析

pageContext 对象是PageContext类型,它不只是域对象,而且还可以操作所有域对象,还可以获取其他隐藏对象。

①本身是域对象:pageContext是JSP中的域对象,而在Servlet中不能使用它!它表示的当前页面中可以使用,是最小的范围!

  •  voidsetAttribute(Stringname, Object value);
  •  Object getAttrbiute(String name, Object value);
  •  voidremoveAttribute(String name, Object value);

②操作所有域(四个域):可以使用pageContext对象操作所有域对象,在getAttribute()、setAttribute()、removeAttribute()三个方法中多添加一个参数,int scope来指定范围。在PageContext类中包含四个int类型的常量表示四个范围:

  •  PAGE_SCOPE:pageContext范围;
  •  REQUEST_SCOPE:request范围;
  •  SESSION_SCOPE:session范围;
  •  APPLICATION_SCOPE:application范围;
  •  void setAttribute(String name,Object value, int scope):设置数据到指定的范围中,例如:pageContext.setAttribute(“hello”, “hello world”, PageContext.REQUEST),这个方法调用等同与:request.setAttribute(“hello”, “hello world”);
  •  Object getAttribute(Stringname, int scope):获取指定范围的数据;
  •  void removeAttribute(Stringname, int scope):移除指定范围的数据;
  •  Object findAttribute(String name):在所有范围内查找数据,依次为page、request、session、application。如果在前一个范围内查找到数据,那么就返回,而不会在到下一个范围中去查找!

③获取其他隐藏对象:可以使用pageContext获取其他隐藏对象。

  •  JspWriter getOut():获取out隐藏对象;
  •  ServletConfiggetServletConfig():获取config隐藏对象;
  •  Object getPage():获取page隐藏对象;
  •  HttpServletRequest  getRequest():获取request隐藏对象;
  •  HttpServletResponse getResponse:获取response隐藏对象;
  •  HttpSession getSession():获取session隐藏对象;
  •  ServletContext getServletContext():获取application隐藏对象;
  •  JspException getException():获取exception隐藏对象转换后的JspException对象。 

5.  JSP指令

5.1  什么是JSP指令

JSP指令的格式:指令名 attr1=”” attr2=”” %>,一般都会把JSP指令放到JSP文件的最上方,但这不是必须的。

JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了。

指令在“真身”中不存在,生成“真身”时需要使用指令!

Tomcat编译系统会根据JSP的指令信息来编译JSP,生成Java文件。

在生成的Java文件中,不存在指令信息!

5.2  page指令的pageEncoding和contentType

pageEncoding指定的是当前JSP页面的编码!Tomcat编译系统会使用这个编码把JSP编译成Java文件。所以这个编译只需要与真实的页面编译一致即可!

contentType指定的是响应给我客户端时使用的编码,即对应response.setConteType()方法的参数值! Tomcat都会把响应正文转换成UTF-8编译,然后发送给我客户端,并且会在响应头中设置Content-Type头信息为text/html;charset=utf-8,这样浏览器就知道使用服务器发送过来的正文使用了什么编码。

其实pageEncoding和contentType这两个属性的关系很暧昧:

  • 当设置了pageEncoding,而没设置contentType时:表示contentType的取值为pageEncoding的值;
  •  当设置了contentType,而没设置pageEncoding时:表示pageEncoding的取值与contentType的值;

也就是说,当pageEncoding和contentType只出现一个时,那么另一个的值与出现的值相同。如果两个都不出现,那么两个属性的值都是ISO-8859-1。

处理乱码的方案:

  • 把JSP页面的编码设置为UTF-8;
  •  把contentType和pageEncoding都设置为UTF-8。

5.3  page指令的import属性

  •  import是page指令中一个很特别的属性!
  •  import属性值对应“真身”中的import语句。
  •  import属性值可以使逗号:
    • ”java.net.*,java.util.*,java.sql.*”%>
  •  import属性是唯一可以重复出现的属性:

但是,我们一般会使用多个page指令来导入多个包:

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

5.4  page指令的errorPage和isErrorPage

5.4.1  errorPage

我们知道,在一个JSP页面出错后,Tomcat会响应给我用户错误信息!如果你不希望Tomcat给用户输出错误信息,那么可以使用page指令的errorPage来指定错误页!例如:

<%@ page errorPage="error.jsp"%>

这时,在当前JSP页面出现错误时,会转发到error.jsp页面。

pageError的路径,由于是服务器端的跳转,所以绝对路径不需要加项目名,直接指定项目名称后面的路径即可

5.4.2  isErrorPage

如果希望在error.jsp页面中获得异常对象,那么就需要把error.jsp标记为错误页!这需要设置page指令的isErrorPage属性为true。

<%@ page  isErrorPage="true" %>
<html>
<head>
    <title>错误页面</title>
</head>
<body>
    出错了!!!
    <%=exception.getMessage() %>
</body>
</html>

5.4.3  error-page

还可以在web.xml文件中配置错误页面,在出现某种错误时跳转到对应的页面处理。

<error-page>
    <error-code>404</error-code>
    <location>/error404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error500.jsp</location>
</error-page>

当出现404时,会跳转到error404.jsp页面;

当出现500时,会跳转到error500.jsp页面。

还可以配置更多,更细致的异常类型。

5.5.  page指令的isELIgnored

page指令的isElIgnored属性表示当前JSP页面是否忽略EL表达式,默认值为false,表示不忽略(即支持)。

EL(Expression Language)表达式语言是一种用于在Java服务器端页面(JSP)中访问和操作数据的简洁、强大的语言。它允许在JSP页面中使用表达式来获取和操作数据,而无需编写复杂的Java代码。

EL表达式的语法类似于JavaScript或XPath表达式,它使用方括号[]来访问对象的属性和集合的元素。例如,${user.name}可以获取名为user的对象的name属性的值。

EL表达式可以用于访问JSP页面中的各种数据,包括请求参数、会话属性、上下文属性、JavaBean属性等。它还支持基本的数学运算、字符串操作和条件判断等。

5.6.  include指令(*****)

include指令表示静态包含!

include指令只有一个属性:file,指定要包含的页面,例如:”b.jsp”%>。

静态包含:当hel.jsp页面包含了lo.jsp页面后,在编译hel.jsp页面时,需要把hel.jsp和lo.jsp页面合并成一个文件,然后再编译成Servlet(Java文件)。

 

在上面代码中,lo.jsp中没有定义username变量,所以lo.jsp不能处理请求,只有hel.jsp才能处理请求!当访问hel.jsp时,hel.jsp会包含lo.jsp,所以两个会合并成一个文件后再编译成Java文件。在合并之后,因为在hel.jsp中定义了username变量,所以lo.jsp中也就不会出现错误了。

5.7.  taglib指令

在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:

http://java.sun.com/jsp/jstl/core" %>

其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri。

在下面我们讲解JSTL标签库时会说明taglib指令的使用方式。

 

6.  JSP动态标签

JSP自己的标签,不用导包!

JSP动态标签是JSP自己的标签,不是由第三方提供的,所以使用JSP动态标签时无需使用taglib指令“导包”。

JSP动态标签的格式为:…>

无论是自定义的JSP标签,还是JSP自己的动态标签,还有第三方的标签,最终都会对应一组方法的调用!!!

6.1  include标签

include标签是动态包含,与include指令不同,include标签与RequestDispatcher.include()方法的功能是相同的。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>    
    <title>a.jsp</title>
</head>
<body>
    <h1>a.jsp</h1>
    <jsp:include page="b.jsp"/>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>b.jsp</title>
</head>
<body>
    b.jsp
</body>
</html>

动态包含是会为两个JSP页面都生成“真身”,然后a.jsp的“真身”中会调用b.jsp的“真身”的_jspService()方法而已。

6.2.  forward标签

forward标签的作用是请求转发!forward标签的作用与RequestDispatcher#forward()方法相同。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>c.jsp</title>
</head>
<body>
<h1>c.jsp</h1>
<jsp:forward page="d.jsp"/>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>d.jsp</title>
</head>
<body>
    d.jsp
</body>
</html>

注意,显示结果中没有<h1>c.jsp</h1>即c.jsp中的所有输出都会被清除!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/386770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法学习——LeetCode力扣回溯篇3

算法学习——LeetCode力扣回溯篇3 491. 非递减子序列 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。…

鸿蒙视频播放器,主要包括视频获取和视频播放功能:

鸿蒙视频播放器&#xff0c;主要包括视频获取和视频播放功能&#xff1a; 1 获取本地视频或者网络视频。 2 通过media.createAVPlayer创建播放器AVPlayer&#xff0c;然后进行视频播放。 3 通过VideoController进行AVPlayerState的状态管理&#xff0c;如开始&#xff0c;停止&…

【Linux】yum软件包管理器

目录 Linux 软件包管理器 yum 什么是软件包 Linux安装软件 查看软件包 关于rzsz Linux卸载软件 查看yum源 扩展yum源下载 Linux开发工具 vim编辑器 上述vim三种模式之间的切换总结&#xff1a; 命令模式下&#xff0c;一些命令&#xff1a; vim配置 Linux 软件包管理…

【VTKExamples::PolyData】第二十七期 KochanekSpline

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例KochanekSpline & KochanekSplineDemo,并解析接口vtkParametricSpline & vtkParametricFunctionSource,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,…

ros自定义msg记录

文章目录 自定义msg1. 定义msg文件2. 修改 package.xml3. 修改 CMakeLists.txt4. message_publisher.py5. message_subscriber.py6. 运行 catkin build 测试 自定义msg ros 版本&#xff1a;kinetic 自定义test包的文件结构如下 |-- test | |-- CMakeLists.txt | |-- msg…

x86汇编通用寄存器用途一览

文章目录 写在前面通用寄存器参考资料 写在前面 intel官方文档链接&#xff1a;Intel64和IA-32架构软件开发者手册 具体在Combined Volume Set of Intel 64 and IA-32 Architectures Software Developer’s Manuals这本手册 &#xff08;五千页我的天。。。&#xff09; 不想…

代码随想录算法训练营DAY17 | 二叉树 (4)

一、LeetCode 110 平衡二叉树 题目链接: 110.平衡二叉树https://leetcode.cn/problems/balanced-binary-tree/ 思路&#xff1a;设置深度计算函数&#xff0c;进行递归处理。 class Solution {public boolean isBalanced(TreeNode root) {if(root null){return true;}boolean…

maven创建webapp+Freemarker组件的实现

下载安装配置maven Maven官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Maven最新版正式版官方版绿色版下载,Maven安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com/s/9QRqVv-TcUY.html链接为3.6.2-3.6.3的版本 下载解…

【FPGA】VHDL:八段码到8421BCD码转换电路

目录 EDA设计基础练习题 &#xff1a; 实验要求如下&#xff1a; 代码 八段码到8421BCD码转换电路 8421BCD码到八段码转换电路 八段码到8421BCD~运行结果展示 8421BCD转八段码~运行结果展示 特别注意 软件&#xff1a;Quartus II 13.0 (64-bit) 语言&#xff1a;VHDL E…

【网络攻防实验】【北京航空航天大学】【实验三、口令破解(Password Cracking)实验】

实验三、口令破解(Password Cracking)实验 一、 L0phtCrack破解实验 1、 注册L0phtCrack: 2、 设置口令: (1) 创建3个新账户: 帐户创建过程(以test-1为例): 帐户创建结果: (2) 使用L0phtCrack破解口令:(使用管理员账号运行程序) 口令破解结果: 正确破解口令…

【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

AMD FPGA设计优化宝典笔记(4)复位桥

高亚军老师的这本书《AMD FPGA设计优化宝典》&#xff0c;他主要讲了两个东西&#xff1a; 第一个东西是代码的良好风格&#xff1b; 第二个是设计收敛等的本质。 这个书的结构是一个总论&#xff0c;加上另外的9个优化&#xff0c;包含的有&#xff1a;时钟网络、组合逻辑、触…

【数据结构】计算节点个数和二叉树高度(C语言版)

数据结构——计算节点个数、二叉树高度 一、计算各种节点 &#xff08;1&#xff09;计算总节点&#xff1a;&#xff08;2&#xff09;计算单分支节点&#xff1a;&#xff08;3&#xff09;计算双分支节点&#xff1a; 二、计算二叉树高度 代码实现&#xff1a; 一、计算各种…

react【五】redux/reduxToolkit/手写connext

文章目录 1、回顾纯函数2、redux2.1 redux的基本使用2.2 通过action修改store的数值2.3 订阅state的变化2.4 目录结构2.5 Redux的使用过程2.6 redux的三大原则2.7 Redux官方图 3、redux在React中的使用4、react-redux使用4.1 react-redux的基本使用4.2 异步请求 redux-thunk4.3…

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务&#xff0c;确保高优先级任务优先执行&#xff0c;它内部基于优先级堆实现&#xff0c;保证了元素的有序性&#xff0c;同时&#xff0c;作为BlockingQueue接口的实现&#xff0c;它提供了线程安全的队列操作&#xff0…

系统架构26 - 软件架构设计(5)

特定领域软件体系结构 定义不同定义必备特征领域 基本活动领域分析领域设计领域实现 参与人员建立过程 特定领域软件体系结构的主要目的是在一组相关的应用中共享软件体系结构。 定义 DSSA (Domain Specific Software Architecture) 就是在一个特定应用领域中为一组应用提供组…

算法-16-并查集

并查集简介 并查集&#xff1a;一开始&#xff0c;把a&#xff0c;b&#xff0c;c放入并查集&#xff0c;a自己一个集合&#xff0c;b自己一个&#xff0c;c自己一个 提供的方法 1.boolean isSameSet(a,b)&#xff0c;判断ab是否在同一个集合 2.void union(a,b),把a所…

基于PHP的学生管理系统

前言 基于PHP的学生管理系统&#xff1b; 实现 登录、注册、学生信息、修改学生、删除学生、查询学生、添加学生等功能 &#xff1b; 环境准备 开发平台&#xff1a;PhpStrom2022.1.2 、Phpstudy_pro 数据库&#xff1a;MySQL5.7.26 技术架构 Bootstrap PHP7.3.4html5css3 项目…

vue安装使用less,解决与webpack的冲突

第077个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

C++-带你深度理解string类的常见接口

1. 为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需…