javaweb (二)——jsp

@[TOC]

在这里插入图片描述

1.1了解jsp页面

1.1.1jsp页面的基本构成

JSP(JavaServer Pages)是一种用于创建动态Web页面的技术,它允许开发者通过在HTML中嵌入Java代码来生成动态内容。以下是一个基本的JSP页面示例和构成:



 My First JSP Page

 Hello, !

 <p>Today is .</p>

该页面由HTML标签和JSP脚本构成。其中,表示输出表达式的结果,而则表示执行一段Java代码。

页面各部分的含义如下:

  • :定义文档类型为HTML。

  • :常规HTML标签,用于定义页面的结构和标题。

  • :包含了页面的主要内容。

  • <p></p>:用于定义标题和段落的HTML标签。

  • :使用JSP表达式输出HTTP请求参数中名为"name"的值。

  • :使用JSP表达式输出当前时间。

1.1.2jsp程序的运行原理

JSP(JavaServer Pages)是一种基于Java技术的Web开发技术,它提供了一种简单的方式来创建动态Web页面。JSP程序的运行原理可以概括为以下几个步骤:

  • 客户端发送HTTP请求到Web服务器。请求可能包含一些参数,例如查询字符串或表单数据。

  • Web服务器接收到请求后,会把它交给Servlet容器进行处理。

  • Servlet容器根据URL中的扩展名判断该请求是否需要被JSP引擎处理。如果需要,就将请求交给JSP引擎处理。

  • JSP引擎首先解析JSP文件并生成相应的Java源代码,然后编译并加载该Java源代码。这个过程只在第一次访问JSP页面时进行,之后就会直接使用已编译的类。

  • 当有新请求到达时,JSP引擎会实例化一个新的Servlet,并且向其中插入处理该请求的Java代码。这些代码包括静态内容和动态内容,动态内容通常由JSP表达式、脚本和自定义标签组成。

  • 最终,Servlet生成响应并将其返回给客户端浏览器。响应可能包含HTML、CSS、JavaScript等各种类型的内容,以及动态生成的内容。

  • 总的来说,JSP程序的运行原理是:当客户端请求JSP页面时,JSP引擎将JSP文件翻译成Java代码并编译运行,最终生成HTML等内容返回给客户端。这个过程中,JSP引擎和Servlet容器协同工作,共同实现了Web应用程序的动态生成和处理。

    1.2脚本标识

    1.2.1jsp表达式

    JSP (JavaServer Pages) 表达式是一种在 JSP 页面中使用的简单语法,它允许开发人员在 HTML 页面中插入动态值。JSP 表达式通常用于将 Java 对象中的数据显示到网页上。

    JSP 表达式的语法如下:

    
    
    

    其中 expression 是要求值并输出到页面的 Java 表达式。JSP 引擎会计算表达式的值,并将其转换为字符串,然后将其插入到生成的 HTML 中。

    例如,下面的 JSP 代码示例将会在网页上显示当前时间:

    
    
        Current Time
    
        The current time is .
    
    

    在这个例子中,new java.util.Date() 是一个 Java 表达式,它将会被计算并输出当前时间。

    1.2.2声明标识

    在 JSP 页面中,声明标识用于定义一个方法或变量,该方法或变量可以在页面的其他部分中使用。

    JSP 声明标识的语法如下:

    
    
    

    其中 declaration 是 Java 代码片段,可以是类、接口、方法或变量的声明。

    例如,下面的 JSP 代码示例定义了一个名为 greeting 的变量,并将其设置为字符串 "Hello, world!":

    
    
        Declaration Example
    
    

    在这个例子中,第 7 行的声明标识定义了一个名为 greeting 的字符串变量。然后,在第 10 行的表达式中,使用 标识符输出该变量的值。

    JSP 声明标识通常用于定义在整个页面中需要使用的共享变量或方法,以避免在每个代码段中重复定义它们。声明标识也可以用于定义自己的 Java 类或接口。

    1.2.3脚本程序

    在 JSP 页面中,脚本程序块用于编写 Java 代码,可以包括任意的 Java 语句、变量声明和表达式。脚本程序块的语法如下:

    
    
    

    其中 java code 是要执行的 Java 代码片段。

    例如,下面的 JSP 代码示例使用脚本程序块计算并输出两个整数的和:

    
    
        Scriptlet Example
    
        The sum of  and  is .
    
    

    在这个例子中,第 7-9 行的脚本程序块定义了三个整数变量,并将它们相加并赋值给 sum 变量。然后,在第 11 行的表达式中,使用 标识符输出每个变量的值。

    脚本程序块也可以嵌套在其他标记中,例如循环、条件语句或函数调用中,以实现更复杂的逻辑。需要注意的是,脚本程序块中的代码会在页面被处理时执行,因此应该避免在其中包含过多的复杂逻辑和长时间运行的操作。

    1.3page指令

    在 JSP 页面中, 指令用于定义页面的属性和配置信息。该指令通常放置在页面的顶部,并包含各种属性及其值。

    以下是一些常见的 属性:

    • language:指定页面使用的编程语言,默认为 Java。

    • contentType:指定页面内容类型,如文本、HTML 等。

    • pageEncoding:指定页面编码方式,默认为 ISO-8859-1。

    • import:导入其他 Java 类或包。

    • session:指定是否启用会话跟踪。

    • errorPage:指定错误处理页面,用于捕获和处理页面发生的异常。

    • isErrorPage:指定当前页是否为错误处理页面。

    • buffer:指定页面缓冲区大小。

    • autoFlush:指定是否自动刷新缓冲区。

    • isThreadSafe:指定当前页是否线程安全。

    例如,下面的 JSP 代码示例使用 指令指定了页面的编程语言、内容类型和编码方式:

    
    
        Page Directive Example
    
    

    在这个例子中,第 1 行的 指令指定了页面的编程语言为 Java,内容类型为 HTML(使用 UTF-8 编码方式)。这些属性可以确保页面内容正确显示,并允许在页面中使用 Java 代码。

    需要注意的是, 指令只能出现一次,并且必须放置在 JSP 页面的顶部。指令的各个属性之间用空格分隔。

    1.4包含指令

    在 JSP 页面中, 指令可以使用静态包含和动态包含两种方式。

    静态包含指的是在编译时将指定的文件内容插入到当前页面中,即使被包含的文件发生了变化,也不会影响已经编译好的页面。这种方式可以提高页面的性能和可维护性,适用于一些稳定的、不常变化的文件。

    以下是静态包含的示例:

    
    
        Static Include Example
    
    

    动态包含指的是在运行时根据需要将指定的文件内容包含到当前页面中,即每次请求都会重新加载被包含的文件。这种方式可以实现页面之间的动态交互,但同时也会降低页面的性能和可维护性。

    以下是动态包含的示例:

    
    
        Dynamic Include Example
    
    

    在这个例子中, 标签会在请求页面时动态地加载指定的文件,并将其内容插入到当前页面中。因此,每次请求都会重新加载 navbar.jspfooter.jsp 文件。

    需要注意的是,静态包含和动态包含的使用场景不同,在实际开发中应该根据具体情况选择适当的方式。

    1.5跳转指令

    在 JSP 页面中, 标签用于实现页面之间的跳转和包含。

    标签用于将当前请求转发到另一个资源(JSP 页面或 Servlet),使得客户端浏览器重新请求该资源。该标签通常用于实现页面之间的流程控制和重定向。

    以下是 标签的语法:

    
    
    

    其中 page 属性指定要转发到的资源的 URL。这个 URL 可以是相对路径或绝对路径。例如:

    
    
    

    该标签可以放置在任何位置,但是必须位于 标记之间。

    标签用于将另一个 JSP 页面或 Servlet 的输出包含到当前页面中。该标签通常用于实现页面之间的模块化和代码重用。

    以下是 标签的语法:

    
    
    

    其中 page 属性指定要包含的资源的 URL。这个 URL 可以是相对路径或绝对路径。例如:

    
    
    

    该标签会在当前页面被处理时动态地执行指定资源,并将其内容嵌入到当前页面中。

    需要注意的是, 标签都是由 JSP 引擎处理的。因此,在使用这些标签时,应该确保目标资源存在,并且不会出现无限循环等问题。 ​

    2.1 jsp内置对象概览

    在这里插入图片描述 在这里插入图片描述

    2.2 4种属性范围

    四种属性范围 在 JSP 中,有四种作用域,分别是:页面作用域(page)、请求作用域(request)、会话作用域(session)和应用程序作用域(application)。

  • 页面作用域(page):变量仅在当前 JSP 页面中有效。该作用域是默认作用域,可以直接使用变量名来引用变量。

  • 请求作用域(request):变量在一次 HTTP 请求中有效,在同一次请求的多个页面或 Servlet/JSP 中共享。可以通过 request.setAttribute() 方法来设置变量,也可以通过 request.getAttribute() 方法来获取变量。

  • 会话作用域(session):变量在某个用户的会话期间有效,在同一个用户的多个请求中共享。可以通过 session.setAttribute() 方法来设置变量,也可以通过 session.getAttribute() 方法来获取变量。

  • 应用程序作用域(application):变量在整个 Web 应用程序的生命周期内有效,在所有用户的所有会话中共享。可以通过 application.setAttribute() 方法来设置变量,也可以通过 application.getAttribute() 方法来获取变量。

  • 操作方法 在 JSP 中,可以通过以下方法来操作四种作用域的属性:

  • 页面作用域(page):变量仅在当前 JSP 页面中有效。该作用域是默认作用域,可以直接使用变量名来引用变量。

    • 设置属性值:在 JSP 页面中定义变量即可。例如:

    • 获取属性值:直接使用变量名来引用变量。例如:
  • 请求作用域(request):变量在一次 HTTP 请求中有效,在同一次请求的多个页面或 Servlet/JSP 中共享。可以通过 request.setAttribute() 方法来设置变量,也可以通过 request.getAttribute() 方法来获取变量。

    • 设置属性值:在 Servlet 或 JSP 页面中调用 request.setAttribute(String name, Object value) 方法设置变量。例如:
      • 获取属性值:在 Servlet 或 JSP 页面中调用 request.getAttribute(String name) 方法获取变量。例如:
    • 会话作用域(session):变量在某个用户的会话期间有效,在同一个用户的多个请求中共享。可以通过 session.setAttribute() 方法来设置变量,也可以通过 session.getAttribute() 方法来获取变量。

      • 设置属性值:在 Servlet 或 JSP 页面中调用 request.getSession().setAttribute(String name, Object value) 方法设置变量。例如:
        • 获取属性值:在 Servlet 或 JSP 页面中调用 request.getSession().getAttribute(String name) 方法获取变量。例如:
      • 应用程序作用域(application):变量在整个 Web 应用程序的生命周期内有效,在所有用户的所有会话中共享。可以通过 application.setAttribute() 方法来设置变量,也可以通过 application.getAttribute() 方法来获取变量。

        • 设置属性值:在 Servlet 或 JSP 页面中调用 getServletContext().setAttribute(String name, Object value) 方法设置变量。例如:
          • 获取属性值:在 Servlet 或 JSP 页面中调用 getServletContext().getAttribute(String name) 方法获取变量。例如:
        • 2.3 request对象

          2.3.1访问请求参数

          在 JSP 中,请求参数可以通过 request 对象来获取。我们可以使用如下方式从 request 对象中获取请求参数:

        
        String paramName = request.getParameter("paramName");
        
        

        在上面的代码中,getParameter() 方法接收一个字符串类型的参数,该参数是要获取的请求参数的名称。该方法会返回一个字符串,即请求参数的值。

        例如,在以下 JSP 页面中,我们可以获取 name 请求参数的值:

        
        
        获取请求参数
        
            Hello !
        
        

        在这个例子中,我们使用了 标签来嵌入 Java 代码,调用了 request.getParameter() 方法来获取 name 请求参数的值,并将其显示在页面中。

        需要注意的是,如果请求参数不存在,则 getParameter() 方法会返回 null。因此,我们'需要在使用请求参数之前先进行非空判断,以避免出现空指针异常。

        2.3.2在作用域中管理信息

        在 JavaServer Pages (JSP) 中,可以使用 Servlet API 中的 HttpServletRequest 对象来获取客户端请求信息。HttpServletRequest 对象是一个接口,其实现类是由 Web 容器提供的。

        当客户端发出请求时,Web 容器会创建 HttpServletRequest 对象,并将该对象传递给 JSP 页面。在 JSP 页面中,可以通过 request 对象来访问 HttpServletRequest 对象中的所有方法和属性。

        request 对象是一种作用域对象,它可以在当前 JSP 页面中存储数据并与其他 JSP 页面共享数据。request 对象中存储的数据只在同一次请求内有效,一旦请求结束,数据就会被销毁。

        例如,我们可以使用 request 对象在 JSP 页面之间传递信息,如下所示:

        在第一个 JSP 页面中设置属性:

        
        
        

        在第二个 JSP 页面中获取属性:

        
        
        

        除了 setAttribute() 和 getAttribute() 方法之外,HttpServletRequest 还提供了许多其他有用的方法,例如 getParameter()、getMethod()、getHeader() 等,这些方法可以帮助我们获取客户端请求的各种信息。

        2.3.3获取cookie

        在 JSP 中,我们可以通过 HttpServletRequest 对象获取客户端请求中包含的 Cookie,然后将其添加到 request 作用域中以方便其他 JSP 页面访问。

        以下是一个示例代码:

        
        
        

        上述代码首先获取了 HttpServletRequest 对象,并使用它的 getCookies() 方法获取客户端请求中包含的所有 Cookie,然后使用 setAttribute() 方法将这些 Cookie 添加到 request 作用域中,以便其他 JSP 页面可以访问它们。

        接着,在其他 JSP 页面中,我们可以通过 request 对象获取这些 Cookie,例如:

        
        
        

        上述代码首先获取了 request 对象中的 Cookies,然后遍历这些 Cookie 并输出它们的名称和值。

        请注意,通过 request 作用域共享 Cookie 只适用于同一个 Web 应用程序中的 JSP 页面。如果您需要在不同的 Web 应用程序之间共享 Cookie,可以考虑使用 ServletContext 或 HttpSession 来存储和获取它们。

        2.3.4解决中文乱码

        在 JSP 中,如果客户端提交的表单中包含中文字符,那么在后台获取这些参数时可能会出现乱码问题。这个问题可以通过在 request 作用域中设置编码来解决。

        以下是一个示例代码:

        
        
        Insert title here
        
                姓名:
        
                提交
        
        

        上述代码展示了一个简单的表单页面,其中包含一个文本框用于输入姓名,并通过 POST 方法提交表单数据到 test.jsp 页面。

        接下来,在 test.jsp 页面中,我们可以使用 request 对象获取客户端提交的参数,并设置编码来解决中文乱码问题,例如:

        
        
        

        上述代码首先设置了 request 对象的编码为 UTF-8,然后使用 getParameter() 方法获取客户端提交的 name 参数,并输出它的值。

        请注意,在 JSP 中设置 request 对象的编码只适用于当前页面,如果在其他页面需要获取相同的参数时也需要进行编码设置。

        2.3.5获取客户端信息

        在 JSP 中,可以使用 HttpServletRequest 对象获取客户端的一些信息,例如客户端的 IP 地址、用户代理等。HttpServletRequest 对象是由 Servlet 容器创建并传递给 JSP 页面的,它包含了客户端请求的相关信息。

        以下是一些获取客户端信息的示例代码:

      • 获取客户端 IP 地址
      
      
      
    • 获取客户端浏览器类型