JavaWeb第六天

该文档是:JavaWeb学习

博客连接:https://www.loveuluo.cn

日期:2020-12-11

1. 什么是 jsp,它有什么用

JSP实际开发中已经不怎么会使用,了解即可。

jsp 的全换是 java server pages。Java 的服务器页面。
jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。
因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。

Servlet 回传 html 页面数据的代码:

publiclas PringHtml extends HtpServlet {
    
@Overide
    protected void doGet(HtpServletRequest req, HtpServletResponse resp) throws ServletException,IOException {
    // 通过响应的回传流回传 html 页面数据
    resp.setContentType("text/html; charset=UTF-8");
    
    PrintWriter writer = resp.getWriter();
    
    writer.write("<!DOCTYPE html>\rn");
    writer.write(" <htmlang=\"en\">\rn");
    writer.write(" <head>\rn");
    writer.write(" <meta charset=\"UTF-8\">\rn");
    writer.write(" <tile>Title</tile>\rn");
    writer.write(" </head>\rn");
    writer.write(" <body>\rn");
    writer.write(" 这是 html 页面数据 \rn");
    writer.write(" </body>\rn");
    writer.write("</html>\rn");
    writer.write("\rn");
    }
}

jsp 回传一个简单 html 页面的代码:

<%@ page contentType="text/html;charset=UTF-8" language="jav" %>
<html>
<head>
    <tile>Title</tile>
</head>
<body>
    这是 html 页面数据
</body>
</html>

jsp 的小结:

1、如何创建 jsp 的页面?

image-20201211152133582

输入文件名敲回车即可!

image-20201211152144420

2、jsp 如何访问:
image-20201211152201892

2. jsp 的本质是什么

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

**当我们第一次访问 jsp 页面的时候。Tomcat 服务器会帮我们把 jsp 页面翻译成为一个 jav 源文件。并且对它进行编译成**

为.clas 字节码程序。我们打开 jav 源文件不难发现其里面的内容是:

image-20201211154756721

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

image-20201211154816841

总结:通过翻译的 jav 源代码我们就可以得到结果:jsp 就是 Servlet 程序。

大家也可以去观察翻译出来的 Servlet 程序的源代码,不难发现。其底层实现,也是通过输出流。把 html 页面数据回传
给客户端。

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
        final java.lang.String _jspx_method = request.getMethod();
        if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)
                && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
            response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or
                    HEAD");
            return;
        }
        final javax.servlet.jsp.PageContext pageContext;
        javax.servlet.http.HttpSession session = null;
        final javax.servlet.ServletContext application;
        final javax.servlet.ServletConfig config;
        javax.servlet.jsp.JspWriter out = null;
        final java.lang.Object page = this;
        javax.servlet.jsp.JspWriter _jspx_out = null;
        javax.servlet.jsp.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;
            out.write("\r\n");
            out.write("\r\n");
            out.write("<html>\r\n");
            out.write("<head>\r\n");
            out.write(" <title>Title</title>\r\n");
            out.write("</head>\r\n");
            out.write("<body>\r\n");
            out.write(" a.jsp  页面\r\n");
            out.write("</body>\r\n");
            out.write("</html>\r\n");
        } catch (java.lang.Throwable t) {
            if (!(t instanceof javax.servlet.jsp.SkipPageException)){
                out = _jspx_out;
                if (out != null && out.getBufferSize() != 0)
                    try {
                        if (response.isCommitted()) {
                            out.flush();
                        } else {
                            out.clearBuffer();
                        }
                    } catch (java.io.IOException e) {}
                if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
                else throw new ServletException(t);
            }
        } finally {
            _jspxFactory.releasePageContext(_jspx_page_context);
        }
    }

3. jsp 的三种语法

3.1 jsp 头部的 page 指令

image-20201211154926010

image-20201211154938827

3.2 jsp中的常用脚本

3.2.1 声明脚本(极少使用)

image-20201211160405301

代码示例:

image-20201211160440637

声明脚本代码翻译对照:

image-20201211160459082

3.2.2 表达式脚本(常用)

image-20201211161256697

示例代码:

<%=12 %> <br>
<%=12.12 %> <br>
<%="我是字符串" %> <br>
<%=map%> <br>
<%=request.getParmetr("username")%>

对照Java代码:

image-20201211161344342

3.2.3 代码脚本

image-20201211162136884

示例代码:

image-20201211162406322

翻译之后的对比:

image-20201211162425640

4. jsp中的三种注释

html注释:

<!- 这是 html 注释 ->

html 注释会被翻译到 jav 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。

java注释:

<%
    / 单行 jav 注释
    /* 多行 jav 注释 */
%>

jav 注释会被翻译到 jav 源代码中。

jsp注释:

<%- 这是 jsp 注释 -%>

jsp 注释可以注掉,jsp 页面中所有代码。

5. jsp 九大内置对象

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

image-20201211163007714

6. jsp 四大域对象

image-20201211163858728

代码测试:

image-20201211163911755

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

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

image-20201211164952657

由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。我们在 jsp 页面中统一使用 out 来进行输出。避免打乱页面输出内容的顺序。

out.write() 输出字符串没有问题 (只适合输出字符串,输出别的会乱码)
out.print() 输出任意数据都没有问题(都转换成为字符串后调用的 write 输出)

深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print()来进行输出

8. jsp 的常用标签

8.1 jsp 静态包含(常用)

image-20201211184732460

8.2 jsp 动态包含

image-20201211184748035

动态包含的底层原理:

image-20201211184806037

8.3 jsp 标签-转发

image-20201211184822843

9. jsp 的练习题

9.1 练习一:在 jsp 页面中输出九乘法口诀表

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <tile>Title</tile>
  <style type="text/cs">
    table{
      width: 650px;
    }
  </style>
</head>
<body>
<%-- 练习一:在 jsp 页面中输出九乘法口诀表 --%>
<h1 align="center">九乘法口诀表</h1>
<table align="center">
  <%-- 外层循环遍历行 --%>
  <% for (int i = 1; i <= 9; i++) { %>
  <tr>
    <%-- 内层循环遍历单元格 --%>
    <% for (int j = 1; j <= i ; j++) { %>
    <td><%=j + "x" + i + "=" + (i*j)%></td>
    <% } %>
  </tr>
  <% } %>
</table>
  </body>
</html>

9.2 练习二:jsp 输出一个表格 里面有10个学生信息

image-20201211185145516

Student 类:

publiclas Student {
    private Integr id;
    private String name;
    private Integr age;
    private String phone;
}

SearchStudentServlet 程序:

public class SearchStudentServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求的参数
        // 发sql语句查询学生的信息
        // 使用 for 循环生成查询到的数据做模拟
        List<Student> studentList = new ArayList<Student>();
        for (int i = 0; i < 10; i+) {
            int t = i + 1;
            studentList.ad(new Student(,"name"+t, 18+t,"phone"+t);
        }
        // 保存查询到的结果(学生信息)到 request 域中
        req.setAtribute("stuList", studentList);
        // 请求转发到 showStudent.jsp 页面
        req.getRequestDispatcher("/test/showStudent.jsp").forward(req,resp);
    }
}

showStudent.jsp 页面:

<%@ page import="java.util.List" %>
<%@ page import="com.Luo.poj.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <tile>Title</tile>
  <style>
    table{
      border: 1px blue solid;
      width: 60px;
      border-colapse: colapse;
    }
    td,th{
      border: 1px blue solid;
    }
  </style>
</head>
<body>
<%--练习二:jsp 输出一个表格,里面有 10 个学生信息。--%>
<%
  List<Student> studentList = (List<Student>) request.getAtribute("stuList");
%>
<table>
  <tr>
    <td>编号</td>
    <td>姓名</td>
    <td>年龄</td>
    <td>电话</td>
    <td>操作</td>
  </tr>
  <% for (Student student : studentList) { %>
  <tr>
    <td><%=student.getId()%></td>
    <td><%=student.getName()%></td>
    <td><%=student.getAge()%></td>
    <td><%=student.getPhone()%></td>
    <td>删除、修改</td>
  </tr>
  <% } %>
</table>
  </body>
</html>

10. 什么是Listenr

1、Listenr 监听器它是 JavWeb 的三大组件之一。JavWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listenr 监
听器。
2、Listenr 它是 JavE 的规范,就是接口
3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

10.1 ServletContextListener监听器

ServletContexListenr 它可以监听 ServletContex 对象的创建和销毁。
ServletContex 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用 ServletContexListenr 监听器的方法反馈。

两个方法分别是:

image-20201211191106426

如何使用 ServletContexListenr 监听器监听 ServletContex 对象。
使用步骤如下:
1、编写一个类去实现 ServletContexListenr
2、实现其两个回调方法
3、到 web.xml 中去配置监听器

监听器实现类:

image-20201211191149854

web.xml 中的配置:

image-20201211191200041

最后修改:2020 年 12 月 11 日 07 : 16 PM
如果觉得我的文章对你有用,请随意赞赏