SpringMVC基础篇(四)

1.视图

1.基本介绍
1.视图介绍

image-20240226215319028

2.为什么需要自定义视图

image-20240226135510890

2.自定义视图实例
1.思路分析

image-20240226135931338

2.代码实例
1.view.jsp
<%--
  Date: 2024/2/26
  Time: 14:17
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4><a href="selfview">点击跳转到自定义视图解析器</a> </h4>
</body>
</html>

2.接口
    //跳转到自定义视图解析器
    @RequestMapping("/selfview")
    public String selfview() {
        return "sunView"; //返回给自定义视图解析器
    }
3.配置自定义视图解析器springDispatcherServlet-servlet.xml
    <!--视图解析器按照order的大小来决定优先级,默认的视图解析器是最低的优先级MAX_VALUE = 0x7fffffff-->
    <!--配置自定义视图解析器-->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="99"/>
    </bean>
4.自定义视图MyView.java
package com.sun.web.view;

import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.view.AbstractView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * @author 孙显圣
 * @version 1.0
 */

@Component(value = "sunView")
/**
 * 自定义视图
 */
public class MyView extends AbstractView {
    @Override
    protected void renderMergedOutputModel(Map<String, Object> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        System.out.println("自定义视图");
        //请求转发到view_result.jsp
        httpServletRequest.getRequestDispatcher("/WEB-INF/pages/view_result.jsp").forward(httpServletRequest, httpServletResponse);
    }
}

5.view_result.jsp
<%--
  Date: 2024/2/26
  Time: 14:27
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>view——result</h3>
</body>
</html>

6.结果展示

image-20240226145033351

3.自定义视图执行流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.自定义视图执行流程debug
1.打断点

image-20240226160942831

2.找到自定义视图的源码,下断点

image-20240226161535197

3.进入这个断点

image-20240226161657662

4.下一步image-20240226162054090
5.下一步

image-20240226162334256

image-20240226162806749

6.下一步

image-20240226162517874

7.在自己的视图中下一个断点

image-20240226163032060

8.下一步

image-20240226163107383

5.SpringMVC执行流程图再次理解

image-20240226163953314

6.默认视图执行流程debug
1.调整默认视图优先级

image-20240226165114466

2.下断点,跳到这个断点

image-20240226165214769

3.在默认视图解析器中下断点,跳到这个断点

image-20240226165957052

4.一直下一步到return view

image-20240226170254629

7.多个视图解析器执行流程
  • 如果默认解析器优先级低于普通解析器,则在容器中找不到视图解析器的view对象的话,就会去找默认解析器并执行,默认解析器是一定可以找到view的,所以返回执行那个view
  • 如果默认解析器的优先级高于普通解析器,则在容器中一定可以找到view对象,所以就直接返回这个view,如果报错了则不会继续找普通的解析器
  • 总结:默认视图解析器是根据适配器返回的信息创建一个view对象,所以一定可以找到这个view对象,所以返回这个view对象进行渲染而自定义视图解析器是根据适配器返回的信息从容器中查找一个view对象,所以存在找不到的情况

2.指定请求转发或重定向

1.基本介绍

image-20240226201241606

2.重定向
    //重定向
    @RequestMapping("/redirect")
    public String redirect() {
        //重定向是不能访问WEB-INF路径下的资源的
        //重定向的/也是指的上下文路径,返回给视图解析器之后,会自动将这个/解析成/工程路径/success.jsp
        return "redirect:/success.jsp";
    }
3.请求转发
    //请求转发
    @RequestMapping("/forward")
    public String forward() {
        //请求转发可以请求到WIN-INF目录下的文件
        return "forward:/WEB-INF/pages/success.jsp";
    }

3.课后练习

image-20240226212144160

1.User.java
package com.sun.web.entity;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "user{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

2.login.jsp
<%--
  Date: 2024/2/23
  Time: 20:44
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
<%--这里使用浏览器默认路径,目前在上下文路径下,所以可以直接找到/login--%>
<form action="doLogin" method="post">
    username:<input name="username" type="text">
    password:<input name="password" type="password">
    <input type="submit" value="登录">
</form>
</body>
</html>

3.接口
    //验证用户名密码
    @RequestMapping("/doLogin")
    //将用户名和密码封装到自动封装到user对象里
    public String doLogin(User user) {
        if ("sun".equals(user.getUsername()) && "123".equals(user.getPassword())) {
            System.out.println("验证通过");
            //请求转发
            return "forward:/success.jsp";
        }
        else {
            //重定向
            return "redirect:/fail.jsp";
        }
    }
4.success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>重定向成功</h1>
</body>
</html>

5.fail.jsp
<%--
  Date: 2024/2/26
  Time: 21:42
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>error!!!</h2>
<h2><a href="login.jsp">请重新登陆</a> </h2>
</body>
</html>

6.结果展示

image-20240226215205269

image-20240226215222989

image-20240226215238126

相关推荐

  1. SpringMVC基础

    2024-04-29 10:18:01       21 阅读
  2. 基础 vue条件渲染

    2024-04-29 10:18:01       49 阅读

最近更新

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

    2024-04-29 10:18:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 10:18:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 10:18:01       87 阅读
  4. Python语言-面向对象

    2024-04-29 10:18:01       96 阅读

热门阅读

  1. Ali-Sentinel-节点与度量

    2024-04-29 10:18:01       32 阅读
  2. db2 SQLCODE=-1585和SQLSTATE=54048

    2024-04-29 10:18:01       33 阅读
  3. Linux yum/环境变量/服务/进程/hash/bash/防火墙命令

    2024-04-29 10:18:01       40 阅读
  4. 23种设计模式简单记录

    2024-04-29 10:18:01       29 阅读
  5. Vue--关于v-model指令

    2024-04-29 10:18:01       31 阅读
  6. python爬虫6

    2024-04-29 10:18:01       27 阅读
  7. .NET基础入门

    2024-04-29 10:18:01       30 阅读
  8. vim中如何查找一个/

    2024-04-29 10:18:01       30 阅读
  9. 48. 【Android教程】数据库:SQLite 的使用

    2024-04-29 10:18:01       22 阅读