我是靠谱客的博主 威武自行车,这篇文章主要介绍尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)书城项目JSP,现在分享给大家,希望可以做个参考。

书城项目

JavaEE三层架构介绍

在这里插入图片描述

搭建书城项目环境

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

IDEA工具Debug的使用

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

JSP

什么是jsp

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

jsp页面的本质

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

jsp的page指令

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

  • 虽然 /浏览器解析的时候是端口号,但是jsp本质最终还是被翻译成servlet程序,所以还是被 服务器 解析,那么 /服务器解析得到的还是工程路径
    在这里插入图片描述
    在这里插入图片描述

声明脚本

在这里插入图片描述

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>

<%--1. 声明类属性--%>
    <%!
        private Integer id;
        private String name;
        private static Map<String, Object> map;
    %>

<%--2.声明static静态代码块--%>
    <%!
        static {
            map = new HashMap<String, Object>();
            map.put("key1", "value1");
            map.put("key2", "value2");
            map.put("key3", "value3");
        }
    %>

<%--3.声明类方法--%>
    <%!
        public int abc() {
            return 12;
        }
    %>

<%--4.生成内部类--%>
    <%!
        public static class A {
            private Integer id = 12;
            private String abc = "abc";
        }
    %>
</body>
</html>

  • jsp也会自动导包
  • 在声明了类的属性后,进入a.java即翻译后的程序后,发现我们定义的属性已经在源码中啦
    在这里插入图片描述

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

表达式脚本

在这里插入图片描述

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>

<%--1. 声明类属性--%>
    <%!
        private Integer id;
        private String name;
        private static Map<String, Object> map;
    %>

<%--2.声明static静态代码块--%>
    <%!
        static {
            map = new HashMap<String, Object>();
            map.put("key1", "value1");
            map.put("key2", "value2");
            map.put("key3", "value3");
        }
    %>

<%--3.声明类方法--%>
    <%!
        public int abc() {
            return 12;
        }
    %>

<%--4.生成内部类--%>
    <%!
        public static class A {
            private Integer id = 12;
            private String abc = "abc";
        }
    %>


<%--表达式脚本可以在页面输出 整型、浮点型、字符串、对象--%>

    <%=12 %> <br>
    <%=12.12 %> <br>
    <%="这是一个字符串" %> <br>
    <%=map %> <br>

</body>
</html>

在这里插入图片描述

  • 翻译后的程序中,在 _jspService 这个方法中 :
    在这里插入图片描述
<%--表达式脚本可以在页面输出 整型、浮点型、字符串、对象--%>

    <%=12 %> <br>
    <%=12.12 %> <br>
    <%="这是一个字符串" %> <br>
    <%=map %> <br>
    <%=request.getParameter("username")%>
</body>
</html>

在这里插入图片描述

代码脚本

在这里插入图片描述

在这里插入图片描述

  • _jspService方法中的现有对象都可以直接使用 :

在这里插入图片描述

  • 由多个代码脚本块组合完成一个完整的java语句 :
    在这里插入图片描述
    在这里插入图片描述
  • 代码脚本可以和表达式脚本一起使用,在jsp页面输出数据 :
    在这里插入图片描述

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
    <table border="1" cellspacing="0">
    <%
        for (int j = 0; j < 10; j ++ ) {
    %>
        <tr>
            <td><%=j + 1%></td>
        </tr>
    <%
        }
    %>
    </table>
</body>
</html>

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

jsp中的三种注释

1.html注释
<!-- 这是html注释 -->
html注释会被翻译到java源代码中。在_jspService方法里,以out.write输出到客户端

在这里插入图片描述

  • jsp注释是jsp中真正的注释

jsp中的九大内置对象

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

  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, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
      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;

在这里插入图片描述

request : 请求对象
response :响应对象
pageContext :jsp的上下文对象
session :会话对象
application :ServletContext对象(Servlet上下文对象)
config :ServletConfig对象
out :jsp输出流对象
page :指向当前jsp的对象
第九个对象需要isErrorPage为true才会出现,也就是 exception :异常对象

jsp四大域对象的演示

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>scope.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>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</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>

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

  • 整个请求转发还是 一次请求
    在这里插入图片描述
  • 关闭浏览器以后再打开scope2.jsp页面(没有关闭服务器) :
    在这里插入图片描述
  • 重新部署tomcat,再访问scope2 :
    在这里插入图片描述
  • 数据存储在域对象中需要占据空间,如果使用范围大的,可能已经被用过了,但是并没有释放空间,所以优先使用范围小的,使用完自动销毁

out和response.getWriter输出的区别

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

<%
        out.write("out 1");

        out.flush();

        out.write("out 2");

        response.getWriter().write("res 1");
        response.getWriter().write("res 2");
    %>

在这里插入图片描述

常用标签之 静态包含

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>main.jsp</title>
</head>
<body>
    头部信息 <br>
    主题内容 <br>

    <%--
        <%@include file=""%> 就是静态包含
        file属性制定你要包含的jsp页面的路径

        地址中第一个斜杠 / 表示 http://ip:port/工程路径/      映射到代码的web目录

        静态包含的特点 :
            1、静态包含不会翻译被包含的jsp页面
            2、静态包含其实是被被包含的jsp页面的代码拷贝到包含的位置执行输出
    --%>
    <%@include file="/include/footer.jsp"%>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>footer.jsp</title>
</head>
<body>
    页脚信息 <br>
</body>
</html>

在这里插入图片描述

常用标签之 动态包含

在这里插入图片描述
动态包含的底层原理 :
在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>main.jsp</title>
</head>
<body>
    头部信息 <br>
    主题内容 <br>

    <%--
        <jsp:include page=""></jsp:include> 这是动态包含

        动态包含也可以像静态包含一样把被包含的内容输出到包含位置

        动态包含的特点 :
            1、动态包含会把包含的jsp页面也翻译成为java代码
            2、动态包含底层代码使用如下去调用被包含的jsp页面执行输出
                JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
            3、动态包含,还可以传递参数
    --%>
    <jsp:include page="/include/footer.jsp">
        <jsp:param name="username" value="bbj"/>
        <jsp:param name="password" value="root"/>
    </jsp:include>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>footer.jsp</title>
</head>
<body>
    页脚信息 <br>
    <%=request.getParameter("password")%>
</body>
</html>

  • 一般用jsp只是输出页面数据,不会有太复杂代码,因此一般使用的是 静态包含

常用标签之 请求转发

在这里插入图片描述

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <table>
        <% 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>

在这里插入图片描述

练习二 :遍历输出十个学生信息到表格中

package com.atguigu.pojo;

public class Student {

    private Integer id;
    private String name;
    private Integer age;
    private String phone;

    // 构造器(无参 + 全参)+ Getter+Setter + toString

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                ", phone='" + phone + ''' +
                '}';
    }

    public Student(Integer id, String name, Integer age, String phone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Student() {
    }
}

<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
  <style>
    table {
      border: 1px pink solid;
      width: 600px;
      border-collapse: collapse;
    }

    td, th {
      border: 1px pink solid;
    }

  </style>
</head>
<body>
  <%
    List<Student> studentList = new ArrayList<Student>();

    for (int i = 0; i < 10; i++) {
      int t = i + 1;
      studentList.add(new Student(t, "name" + t, 18 + t, "phone" + t));
    }
  %>

  <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>

在这里插入图片描述

请求转发的使用说明

请求转发的使用 :
在这里插入图片描述

  • servlet程序其实是不太适合回传html数据给后端的,比较麻烦,而是jsp页面比较适合干这件事
  • 因此,我们把这件事交给jsp,专门用来显示学生信息
  • 那么,我们就需要serlet和jsp共同完成这件事情,
  • 因此,需要 请求转发,刚好请求转发共享request域数据
package com.atguigu.pojo;

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.util.ArrayList;
import java.util.List;

public class SearchStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

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

<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
  <style>
    table {
      border: 1px pink solid;
      width: 600px;
      border-collapse: collapse;
    }

    td, th {
      border: 1px pink solid;
    }

  </style>
</head>
<body>
  <%
    List<Student> studentList = (List<Student>) request.getAttribute("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>

  • 注意,写完代码以后直接访问showStudent.jsp会 空指针异常
  • 因为,我们直接访问jsp页面,没有经过servlet程序,还没有数据
  • 所以,访问的时候一定要先访问这个servlet
  • 记得给这个servlet加上地址
    在这里插入图片描述

什么是Listener监听器

在这里插入图片描述

ServletContextListener监听器

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

package com.atguigu.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListenerImpl implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext对象被创建了");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象被销毁了");
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>SearchStudentServlet</servlet-name>
        <servlet-class>com.atguigu.pojo.SearchStudentServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SearchStudentServlet</servlet-name>
        <url-pattern>/searchStudentServlet</url-pattern>
    </servlet-mapping>
    
    <!-- 配置监听器-->
    <listener>
        <listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
    </listener>
</web-app>

在这里插入图片描述

最后

以上就是威武自行车最近收集整理的关于尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)书城项目JSP的全部内容,更多相关尚硅谷最新版JavaWeb全套教程,java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(123)

评论列表共有 0 条评论

立即
投稿
返回
顶部