转发_重定向

1.Servlet/JSP单独使用的弊端

当我们用Servlet或者JSP单独处理请求的时候

  • Servlet:拼接大量的html字符串 造成可读性差、难以维护
  • JSP:使得html和Java代码互相交织 也造成了可读性差、难以维护的后果

最合适的做法就是两者结合使用

2.Servlet+JSP处理请求的常见过程

在这里插入图片描述

  • 以上过程就是典型的MVC开发模式 即Model(数据)-View(页面展示)-Controller(控制器)模式 分别对应着上图中的数据库-JSP-Servlet

3.实现

  • 有了前面这层铺垫 再加上Servlet_JSP中介绍的EL和JSTL 那么我们就可以开始实现以下我们的crm项目了 即customer relationship management(客户关系管理系统) 我们采用的方式就是Servlet和JSP结合使用
  • 我们首先先来实现一下Servlet中不拼接html字符串、JSP中不内嵌Java代码的需求 即Servlet转发到JSP这一步
    Customer.java
    package com.mj.bean;
    
    public class Customer {
        // 定义成员变量
        // 姓名
        private String name;
        // 年龄
        private Integer age;
        // 身高
        private Double height;
    
        public Customer(String name, Integer age, Double height) {
            this.name = name;
            this.age = age;
            this.height = height;
        }
    
        public Customer() {
        }
    
        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 Double getHeight() {
            return height;
        }
    
        public void setHeight(Double height) {
            this.height = height;
        }
    
        @Override
        public String toString() {
            return "Customer{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", height=" + height +
                    '}';
        }
    }
    
    ListServlet.java
    import com.mj.bean.Customer;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    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;
    @WebServlet("/list")
    public class ListServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 将用户信息集合以键值对的形式储存到request中
            request.setAttribute("customers", getCustomers());
            // 然后将请求发送给JSP 并且跳转到JSP页面
            request.getRequestDispatcher("page/list.jsp").forward(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
        // 定义一个获取用户信息的方法
        private List getCustomers(){
            // 首先我们创建一个List集合 用于储存用户信息
            List<Customer> customers = new ArrayList<>();
            // 我们还是假设有10个用户
            for(int i = 0; i < 10; ++i){
                customers.add(new Customer("张三" + i, 10 + i, 1.70 + i));
            }
            // 返回用户信息集合
            return customers;
        }
    }
    
    List.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <head>
        <title>展示用户信息</title>
        <!-- 设置表格单元格的样式 -->
        <style>
            th td {
                border: 1px solid black;
            }
        </style>
    </head>
    <body>
    <!-- 我们要以表格的形式来展示用户信息 -->
    <table>
        <thead>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>身高</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${customers}" var="customer">
            <tr>
                <td>${customer.name}</td>
                <td>${customer.age}</td>
                <td>${customer.height}</td>
            </tr>
        </c:forEach>
        </tbody>
    </table>
    </body>
    </html>
    
    • 一些小细节:
      • Customer.java中的成员变量统统设置为包装类的原因在于方便判空 我举个例子 比如我设置了一个price成员变量 如果设置为int基本类型 那么就无法判空 相反 如果设置为了包装类Integer的话 那么判空操作就十分容易
      • getRequestDispacher() 可以接收一个参数 表示的是转换的目的地 由于转发操作只能在同一个context中进行 所以你只需要写明Servlet/JSP在当前context中的路径即可
      • 我们在jsp中导入标签库的时候 语句为<%@taglib prefix="c" uri="xxx"%> 其中uri指的是导入的标签库路径 而prefix则为使用标签库中的标签时所加的前缀 设置前缀的意义在于可以区分不同标签库中的相同标签 避免产生歧义
      • 我们利用el获取了customers集合 他的本质为request.getAttribute(“customers”) 但是接下去获取集合中每一个元素的属性时 我们也利用了el 但是他的本质就不是request.getAttribute() 我想说的是el有自己的一套解析方式 他会根据不同的场合做出不同的举动

4.转发

  • 所谓转发 其实就是将请求发送给指定的接收方 并且跳转到接收方的界面
  • 转换操作只能在同一个context(项目 context就是用来定位部署到服务器软件上的项目的) 即只允许你在同一个项目中的不同Servlet/JSP(JSP的本质就是Servlet)进行转发操作

1.转发链条

  • 在同一个请求中 可以转发多次 形成一个转发链条
    • 在一个转发链条上 可以通过request.setAttribute、request.getAttribute进行数据共享(不同的context之间肯定是不可能发生数据共享的 原因在于转发操作只允许在同一个context中进行)
      在这里插入图片描述

相关推荐

  1. SpringMVC转发定向

    2024-05-10 15:14:09       36 阅读
  2. 会话技术+请求转发+定向

    2024-05-10 15:14:09       56 阅读
  3. 定向(Redirect)和转发(Forward)

    2024-05-10 15:14:09       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-10 15:14:09       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-10 15:14:09       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-10 15:14:09       87 阅读
  4. Python语言-面向对象

    2024-05-10 15:14:09       96 阅读

热门阅读

  1. 十二届蓝桥杯Python组3月中/高级试题 第五题

    2024-05-10 15:14:09       34 阅读
  2. MySQL变量的浮点数问题处理

    2024-05-10 15:14:09       27 阅读
  3. Boolean test介绍

    2024-05-10 15:14:09       34 阅读
  4. oracle数据归档方案

    2024-05-10 15:14:09       29 阅读
  5. ==与===的区别

    2024-05-10 15:14:09       35 阅读
  6. leetcode 并查集

    2024-05-10 15:14:09       35 阅读
  7. stable diffusion教程

    2024-05-10 15:14:09       32 阅读