首页 > Web开发 > 详细

技术点8:jsp页面

时间:2020-11-11 22:03:41      阅读:55      评论:0      收藏:0      [点我收藏+]

jsp页面

一、什么是 jsp,它有什么用?

  jsp的全称是java server page,也就是java的服务器页面。

  jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。

  因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。

1.1、Servlet回传html页面数据

package com.zixue.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author Mr Guo
 * @create 2020-11-11 15:58
 */
public class PrintHtml extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("<!DOCTYPE html>\r\n");
        writer.write("<html lang=\"en\">\r\n");
        writer.write("<head>\r\n");
        writer.write("    <meta charset=\"UTF-8\">\r\n");
        writer.write("    <title>Servlet回传html页面数据</title>\r\n");
        writer.write("</head>\r\n");
        writer.write("<body>\r\n");
        writer.write("    这是HTML页面数据\r\n");
        writer.write("</body>\r\n");
        writer.write("</html>\r\n");
    }
}

效果如下:

技术分享图片

 

   我们发现,回传如此简单的字符串就要使用大量的代码,非常的繁琐,开发效率极低。因此,需要使用jsp代替Servlet回传HTML页面数据。

 

1.2、jsp回传简单的html页面

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 16:13
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a.jsp页面</title>
</head>
<body>
    一个简单的jsp页面
</body>
</html>

效果如下:

技术分享图片

 

二、jsp小结

2.1、如何创建jsp页面

技术分享图片

 

技术分享图片

 

2.2、如何访问jsp页面

  jsp 页面和 html 页面一样,都是存放在 web 目录下。访问也跟访问 html 页面一样。

技术分享图片

 

访问web下的a.jsp页面:

  http://localhost:8080/08_jsp/a.jsp

 

三、jsp 的本质是什么

  jsp 页面本质上是一个 Servlet 程序。

  当我们第一次访问 jsp 页面的时候。Tomcat 服务器会帮我们把 jsp 页面翻译成为一个 java 源文件。并且对它进行编译成为.class 字节码程序。我们打开 java 源文件不难发现其里面的内容是:

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

  
  我们跟踪原代码发现,HttpJspBase 类。它直接地继承了 HttpServlet 类。也就是说。jsp 翻译出来的 java 类,它间接了继承了 HttpServlet 类。也就是说,翻译出来的是一个 Servlet 程序。

技术分享图片

 

  总结:通过翻译的 java 源代码我们就可以得到结果:jsp 就是 Servlet 程序。
  我们也可以去观察翻译出来的 Servlet 程序的源代码,不难发现。其底层实现,也是通过输出流。把 html 页面数据回传给客户端。

 

四、jsp 的三种语法

4.1、jsp 头部的 page 指令

  jsp 的 page 指令可以修改 jsp 页面中一些重要的属性,或者行为。

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

  errorPage属性的值表示当页面出错时,自动跳转去的路径。这个路径一般以"/"打头,表示请求地址为:http://ip:port/工程路径/。映射到代码的web目录。

技术分享图片

 

 

4.2、jsp 中的常用脚本

4.2.1、声明脚本(极少使用)

技术分享图片

 

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 16:13
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a.jsp页面</title>
</head>
<body>
<%--    声明类的属性--%>
    <%!
        private Integer id;
        private String name;
        private static Map<String, Object> map;
    %>
<%--    声明static静态代码块--%>
    <%!
        static {
            map = new HashMap<String, Object>();
            map.put("key1", "value1");
            map.put("key2", "value2");
            map.put("key3", "value3");
        }
    %>
<%--    声明内部类--%>
    <%!
        public static class A{
            private Integer id = 12;
            private String name = "abc";
        }
    %>
<%--    声明类方法--%>
    <%!
        public int abc(){
            return 10;
        }
    %>
</body>
</html>

声明脚本代码翻译对照:

技术分享图片

 

 

4.2.2、表达式脚本(常用) 

技术分享图片

 

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 18:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>b.jsp</title>
</head>
<body>
<%--输出整形--%>
    <%=10%> <br/>
<%--输出浮点型--%>
    <%=12.2%> <br/>
<%--输出字符串--%>
    <%="我是字符串"%> <br/>
<%--输出对象--%>
    <%=request%> <br/>
    <%=request.getParameter("username")%>
</body>
</html>

浏览器访问效果:

技术分享图片

 

翻译后的java代码:

技术分享图片

 

4.2.3、代码脚本

技术分享图片

 

代码脚本示例:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 18:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>b.jsp</title>
</head>
<body>
<%--1.代码脚本---if语句--%>
<%
    int i = 10;
    if (i == 10) {
%>
<h1>正确</h1>
<%
} else {
%>
<h1>错误</h1>
<%
    }
%>

<%--2.代码脚本---for循环语句--%>
<table border="1" cellspacing="0">
    <%
        for (int j = 0; j < 10; j++) {
    %>
    <tr>
        <td><%=j+1%></td>
    </tr>
    <%
        }
    %>
</table>

<%--3.翻译后 java 文件中_jspService 方法内的对象都可以使用--%>
<%
    String username = request.getParameter("username");
%>
    <%="用户名的请求参数值是:"+username%>
</body>
</html>

页面效果:

技术分享图片

 

翻译后的Java源文件:

技术分享图片

 

 技术分享图片

 

技术分享图片

 

 

4.3、jsp 中的三种注释 

4.3.1、html 注释

  <!-- 这是 html 注释 -->

html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。
技术分享图片

 

4.3.2、java 注释

技术分享图片

 

java 注释会被翻译到 java 源代码中。
技术分享图片

 

4.3.3、jsp 注释

技术分享图片

 

jsp 注释可以注掉,jsp 页面中所有代码。它不会被翻译到Java源代码中。
 

五、jsp 九大内置对象

  jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象,叫内置对象。

技术分享图片

 

 

六、jsp 四大域对象

技术分享图片

 

  域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
  虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。
  四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
    pageContext ====>>> request====>>> session ====>>> application

scope1.jsp页面:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 19:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope1.jsp</title>
</head>
<body>
<h1>scope1.jsp页面</h1>
<%
    //往四个域中分别保存数据
    pageContext.setAttribute("key", "pageContext");
    request.setAttribute("key", "request");
    session.setAttribute("key", "session");
    application.setAttribute("key", "application");
%>
pageContext域中是否有值:<%=pageContext.getAttribute("key")%> <br/>
request域中是否有值:<%=request.getAttribute("key")%> <br/>
session域中是否有值:<%=session.getAttribute("key")%> <br/>
application域中是否有值:<%=application.getAttribute("key")%> <br/>

<%
    request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
</body>
</html>

scope2.jsp页面:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 19:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope2.jsp</title>
</head>
<body>
<h1>scope2.jsp页面</h1>
pageContext域中是否有值:<%=pageContext.getAttribute("key")%> <br/>
request域中是否有值:<%=request.getAttribute("key")%> <br/>
session域中是否有值:<%=session.getAttribute("key")%> <br/>
application域中是否有值:<%=application.getAttribute("key")%> <br/>
</body>
</html>

浏览器效果:

技术分享图片

 

 

七、jsp 中的 out 输出和 response.getWriter 输出的区别

  response 中表示响应,我们经常用于设置返回给客户端的内容(输出)
  out 也是给用户做输出使用的。

技术分享图片

 

  由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。我们在 jsp 页面中统一使用 out 来进行输出。避免打乱页面输出内容的顺序。
    out.write() 输出字符串没有问题
    out.print() 输出任意数据都没有问题(都转换成为字符串后调用的 write 输出)
  深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print()来进行输出 。

 

八、jsp 的常用标签

8.1、jsp 静态包含

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

当我们访问body.jsp页面时,效果如下:

技术分享图片

 

 

8.2、jsp 动态包含

技术分享图片

 

动态包含的底层原理:
技术分享图片

 

8.3、jsp 标签-转发

技术分享图片

 

技术点8:jsp页面

原文:https://www.cnblogs.com/897463196-a/p/13960623.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!