我是靠谱客的博主 威武自行车,最近开发中收集的这篇文章主要介绍尚硅谷最新版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 web零基础入门完整版(二)书城项目JSP所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部