Fork me on GitHub

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>


参考资料:

posted @ 2017-09-24 22:52  小a的软件思考  阅读(176)  评论(0编辑  收藏  举报