• JSP 入门


    1. 什么是 JSP

    JSP(Java Server Page) 是 JavaWeb 服务器端的动态资源. 它与 html 页面的作用是相同的,
    显示数据和获取数据.

    1.1 Servelet, html 和 JSP 比较

    1. Servlet
      • 缺点: 不适合设置 html 响应体, 因为需要使用 response.getWriter().print("<html>"); 方法
        写入大量的 html 标签;
      • 优点: 动态资源, 可以编程
    2. html
      • 缺点: html 是静态页面, 不能包含动态信息.
      • 优点: 不用为输出 html 标签而发愁.
    3. JSP
      • 优点: 在原有 html 基础上添加 java 脚本, 构成 jsp 页面.

    1.2 JSP 和 Servlet 的分工

    1. JSP
      • 作为请求发起页面, 如显示表单, 超链接等.
      • 作为请求结果页面, 如显示数据.
    2. Servlet
      • 作为请求中处理数据的环节

    2. JSP 组成

    1. JSP = html + java 脚本 + JSP 标签(指令);
    2. JSP 中无需创建即可使用的对象一共有 9 个, 被称为九大内置对象, 如 request对象, out对象...
    3. 三种 java 脚本
    // 第一种:
    // <%...%> java 代码片段, 用于定义 0~N 条 java语句.
    // java 代码一般方法内能写什么, 它里面就可以放什么!
    // <% private int a = 10; %>  这是不可以的.
    
    // 第二种:
    // <%= ...%> java 表达式, 用于输出一条表达式(或变量)的结果.
    // response.getWriter().print(); print(..) 中能放什么, 它里面就可以放什么!!
    
    // 第三种:
    // <%!....%> 声明, 用来创建类的成员变量或成员方法 (该表达式基本不用, 但容易被考到)
    // 类体里面能放什么, 它就可以放什么!!
    class MyClass{
        类体里面可以放以下内容:
                            成员, 方法, 构造器, 构造代码块, 静态块, 内部类.
    }
    

    3. JSP 原理

    1. JSP 其实就是一种特殊的 Servlet
      • 当 JSP 页面第一次被访问时, 服务器会把 JSP 编译成 java 文件 (这个 java 文件其实是一个 Servlet 类);
      • 然后再把 java 编译成 .class, 并创建该类对象
      • 最后调用 Servlet 的生命周期 service() 方法
      • 第二次请求同一 JSP 时, 直接调用 service() 方法
    2. 在 tomcat 的 work 目录下可以找到 JSP 对应的 .java 源码

    index.jsp 编译成 java 后的内容

    4. JSP 注释

    • <%-- ... --%>: 当服务器把 JSP 编译成 java 文件时,已经忽略了注释部分!

    5. JSP 三大指令

    1. 一般都会把 JSP 指令放到 JSP 文件的最上方, 但这不是必须的;
    2. 一个 JSP 页面中, 可以定义 0~N 个指令;
    3. JSP 中有三大指令: page, include, taglib;
    4. 指令格式: <%@指令名 attr1="" attr2="" %>

    5.1 page 指令

    1. page 指令中属性:

      • pageEncoding: 指定当前 jsp 页面的编码. 服务器要把 jsp 编译成 .java 时, 需要使用 pageEncoding!
      • contentType: 表示添加一个响应头 Content-Type,
        等同于 response.setContentType("text/html; charset=utf-8");
      • import: 是唯一可以重复出现的属性, 用来导入 jar 包;
      • errorPage: 当前页面如果抛出异常, 那么要转发到哪一个页面, 由 errorPage 来指定, 这时状态码为 200;
      • isErrorPage: 表示当前页面是否为处理错误的页面! 当它的属性为 true, 这个页面会设置状态码为 500!
        而且这个页面可以使用九大内置对象中的 exception 对象.
      • autoFlush : 指定 jsp 的输出流缓冲区满时, 是否自动刷新! 默认为 true;
      • buffer: 指定缓冲区大小, 默认为 8KB;
      • isElIgnored: 是否忽略 el 表达式, 默认为 false, 即不忽略;
      • language: 指定当前 jsp 编译后的语言类型, 默认为 java;
      • info: jsp 的说明信息;
      • isThreadSafe: 当前的 jsp 是否支持并发访问, 默认为 false.表示采用线程不安全, 即支持并发访问;
      • session: 表示当前页面是否支持 session.
    2. 也可以在 web.xml 中配置错误页面

    <error-page>
        <error-code>404</error-code>
        <location>/error/errorPage.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-page>
        <location>/error/errorPage.jsp</location>
    </error-page>
    
    <error-page>
        <exception-type>java.lang.RuntimeException</exception-type>
        <location>/error.jsp</location>
    </error-page>
    
    • <error-code> : 指定响应码;
    • <location> : 指定转发的页面;
    • <exception-type>: 指定抛出的异常类型;

    5.2 include 指令 (静态包含)

    1. 与 RequestDispatcher 的 include() 方法的功能相似!!
    2. <%@include %> 它是在 jsp 编译成 java 文件时完成的!!
      • 例如: a.jsp 和 b.jsp ,它们共同生成一个 java 文件(也就是一个 Servlet), 然后再生成一个 class!!!
    3. RequestDispatcher 的 include() 方法, 涉及的是两个 Servlet, 也就是两个 .class!
      • 例如: a.jsp 和 b.jsp 只是把响应的内容在运行时合并了!
    4. 包含的作用: 把页面分解了, 使用包含的方式组合在一起, 这样一个页面中不变的部分, 就是一个独立的 jsp 页面,
      而我们只需要处理变化的页面.
    // hel.jsp
        <body>
            <%
                String name="zhangsan";
            %>
    
            <%@include file="lo.jsp";%>
        </body>
    
    // lo.jsp
        <%
            out.print(name);
        %>
    

    5.3 taglib 指令

    1. 作用: 导入标签库
    2. 常用属性:
      • prefix: 指定标签库在本页面中的前缀!! 我们自己定义即可;
      • uri: 指定标签库的地址.

    6. JSP 九大内置对象

    1. 在 jsp 页面中无需创建就可以使用的 9 个对象, 分别是:
      • out: 等同于 response.getWriter(), 用来向客户端发送文本数据;
      • config : 对应 ServletConfig;
      • page: 当前 JSP 页面的 "this", 即当前对象;
      • pageContext: 页面上下文对象; 一个顶九个!
      • exception: 只有在错误页面中可以使用这个对象;
      • request: 即 HttpServletRequest 类的对象;
      • response: 即 HttpServletResponse 类的对象;
      • application: 即 ServletContext 类的对象;
      • session: 即 HttpSession 类的对象.
        如果 JSP 页面中设置 <%@page session="fasle"%>, 说明这个页面中不能使用 session.
    2. config, page, exception 对象基本不会使用;
    3. exception, session 这两个对象不是每个 JSP 页面都可以使用;
    JSP 中四大域对象:
    • ServletContext: 这个应用程序;
    • session: 整个会话(一个会话只有一个用户);
    • request: 一个请求链;
    • pageContext: 一个 jsp 页面!!
    pageContext 对象
    • 位于 javax.servlet.jsp 包中
    • 一个顶九个!!
    • 这个域对象是在当前 jsp 页面和当前 jsp 页面中使用的标签之间共享数据!!!
    • 可以代理其他域: pageContext.setAttribute("aaa","bbb", PageContext.SESSION_SCOPE);
      把 aaa 属性存储到 session 域中;
    • 获取其他八个内置对象, 例如: getPage(), getRequest(), getResponse(), getSession()...
    • 全域查找: pageContext.findAttribute("aaa"); 查找 aaa 属性的值, 如果找到就停止查找.
      按照域的不同, 从小到大, 依次查找: pageContext < request < session < ServletContext

    7. JSP 动作标签

    1. 动作标签是由 tomcat(服务器) 来解释执行! 它与 java 代码一样, 都是在服务器端执行的!!
    2. html 标签是由浏览器执行的!
    3. 标签:
      • <jsp:forward>: 转发!! 它与 RequestDispatcher 的 forward() 方法一样.
        一个是在 Servlet 中使用, 一个是在 jsp 中使用!!
      • <jsp:include>: 动态包含!! 它与 RequestDispatcher 的 include() 方法一样.
      • <jsp:param>: 它用来作为 forward 和 include 的子标签!! 用来给 转发或包含页面传递参数!!

    8. 其他

    • 访问 jsp 页面, 其实就是访问 org.apache.jasper.servlet.JspServlet 页面
    // 查看 tomcat中的 conf/web.xml
    
        <servlet>
            <servlet-name>jsp</servlet-name>
            <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>jsp</servlet-name>
            <url-pattern>*.jsp</url-pattern>
            <url-pattern>*.jspx</url-pattern>
        </servlet-mapping>
    


    参考资料:

  • 相关阅读:
    Servlet中文件上传
    Servlet 返回Json数据格式
    Java通用oracle和mysql数据库连接
    JAVA JDBC
    Thread suspend()挂起resume()恢复
    Thread 线程池
    阿里巴巴开源框架java诊断工具--Arthas
    B Tree
    MySQL--高性能MySQL笔记二
    MySQL--高性能MySQL笔记一
  • 原文地址:https://www.cnblogs.com/linkworld/p/7589159.html
Copyright © 2020-2023  润新知