SpringMVC原理分析 | 数据处理:ModelAndView

news2025/2/21 20:00:29

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


重定向和转发

ModelAndView

设置ModelAndView对象,根据view的名称、视图解析器跳转到指定的页面

页面:{视图解析器前缀}+ viewName +{视图解析器后缀}

  • ​ springmvc-servlet.xml
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
  • Controller类
//实现了Controller类说明这就是控制器
public class ControllerTest1 implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //创建模型和视图对象
        ModelAndView modelAndView = new ModelAndView();
        封装数据,向模型添加属性msg与值,可以在jsp页面取出、渲染
        modelAndView.addObject("msg","ControllerTest1");
        //视图跳转
        modelAndView.setViewName("test");

        //返回视图模型对象
        return modelAndView;
    }
}

ServletAPI

设置ServletAPI,不需要视图解析器

通过HttpServletResponse进行输出、重定向、转发

@Controller
public class ModelTest1 {

    @RequestMapping("/m1/t1")
    public String test(HttpServletRequest request, HttpServletResponse response){

        HttpSession session = request.getSession();
        System.out.println(session.getId());
        return "test";
    }
}

SpringMVC

通过SpringMVC实现转发和重定向,不需要视图解析器

  • 转发
@Controller
public class ModelTest1 {

    @RequestMapping("/m1/t1")
    public String test(Model model){
        //转发
        model.addAttribute("msg","ModelTest");
        return "/WEB-INF/jsp/test.jsp";
        //return "forward:/WEB-INF/jsp/test.jsp";
    }
}
  • 重定向
@Controller
public class ModelTest1 {

    @RequestMapping("/m1/t1")
    public String test(Model model){
        //重定向
        model.addAttribute("msg","ModelTest");
        return "redirect:/index.jsp";
    }
}

数据处理

接受请求参数及数据回显,处理提交数据

处理提交数据

  • 提交的域名称和处理方法的参数名一致
@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/t1")
    public String test(String name, Model model) {

        //接受前端参数
        System.out.println("接收到前端的参数为:" + name);

        //将放回结果传递给前端
        model.addAttribute("msg",name);

        //跳转视图
        return "test";
    }
}
  • 提交的域名称和处理方法的参数名不一致
@RequestParam("username")
@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/t1")
    public String test(@RequestParam("username") String name, Model model) {

        //接受前端参数
        System.out.println("接收到前端的参数为:" + name);

        //将放回结果传递给前端
        model.addAttribute("msg",name);

        //跳转视图
        return "test";
    }
}
  • 提交是一个对象(参数名和对象名需要一致,否则返回Null)
  • User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
}
  • UserController类
@Controller
@RequestMapping("/user")
public class UserController {
    
    @RequestMapping("/t2")
    public String test2(User user){
        System.out.println(user);
        return "test";
    }
    
}
//输出结果:User(id=1, name=weishuo, age=18)

数据显示到前端

ModelAndView

//实现了Controller类说明这就是控制器
public class ControllerTest1 implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //创建模型和视图对象
        ModelAndView modelAndView = new ModelAndView();
        封装数据,向模型添加属性msg与值,可以在jsp页面取出、渲染
        modelAndView.addObject("msg","ControllerTest1");
        //视图跳转
        modelAndView.setViewName("test");

        //返回视图模型对象
        return modelAndView;
    }
}

Model

@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/t1")
    public String test(@RequestParam("username") String name, Model model) {

        //接受前端参数
        System.out.println("接收到前端的参数为:" + name);

        //将放回结果传递给前端
        model.addAttribute("msg",name);

        //跳转视图
        return "test";
    }
}

ModelMap

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/t3")
    public String test3(ModelMap map){
        map.addAttribute("msg","HELLO ModelMap");
        return "test";
    }
    
}

总结

  • Model 只有寥宴几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解
  • ModelMap 继承了 LinkedMap,除了实现了自身的一些方法,同样的继承LinkedMap 的方法和特性
  • ModelAndview 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转

过滤器解决乱码

Javaweb过滤器

  • EncodingController类
@Controller
public class EncodingController {
    
    @GetMapping("/e/t1")
    public String test1(String name, Model model, HttpServletRequest request) throws UnsupportedEncodingException {
        request.setCharacterEncoding("utf-8");
        System.out.println(name);
        model.addAttribute("msg",name);
        return "test";
    }
}
  • EncodingFilter过滤器
public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
  • web.xml配置过滤器
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>com.wei.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

SpringMVC过滤器

SpringMVC中提供了过滤器,可以在web.xml中配置

  • EncodingController类
@Controller
public class EncodingController {

    @RequestMapping("/e/t1")
    public String test1(String name, Model model, HttpServletRequest request) throws UnsupportedEncodingException {
        request.setCharacterEncoding("utf-8");
        System.out.println(name);
        model.addAttribute("msg",name);
        return "test";
    }
}
  • web.xml配置SpringMVC乱码过滤器
<!--配置SpringMVC乱码过滤器-->
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git常用命令之命令集

15. 命令集 场景1. 构造1个文件的10个commit 命令作用for i in {1..10}; do date >> 66.txt && git add . && git commit -sm "update"; done自证 场景2. 构造10个文件 命令作用for i in {1..10}; do date >> "file_$i.log&quo…

Quiz 7: Files | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 7: Files 单选题&#xff08;1-10&#xff09;编程题Exercise 7.2 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This course aims to teach everyone the basics of programming computers using Python. 本课程…

项目——学生信息管理系统1

目录 创建项目 1. 修改Eclipse的编码为UTF-8,具体参考给的文档 1.1 设置代码自动保存 2. 创建Java项目 分包 添加数据库驱动jar包依赖 复制数据库驱动jar包到lib目录下 添加依赖 创建登陆页面 在 org.xingyun.view 包下创建 LoginFrm 选择 WindowBuilder下的 Swing D…

oracle 重复启动监听程序故障

又是一起 oracle 无法连接问题&#xff0c;检查配置都是正常的。 原来是碰到一个oralce的bugl了。 还真就是这个问题&#xff0c;子进程一kill掉&#xff0c;就恢复了。

微服务实战项目-学成在线-课程发布模块

学成在线-课程发布模块 1 模块需求分析 1.1 模块介绍 课程信息编辑完毕即可发布课程&#xff0c;发布课程相当于一个确认操作&#xff0c;课程发布后学习者在网站可以搜索到课程&#xff0c;然后查看课程的详细信息&#xff0c;进一步选课、支付、在线学习。 下边是课程编辑…

视频解说小程序看点小程序搭建上线,流量主对接实现广告收益

什么是视频解说小程序&#xff1f; 影视剪辑和解说&#xff0c;我们都知道有这类的抖音号&#xff0c;这时候就用到我们小程序了&#xff0c;流量主产生了收益。把视频解说上传到小程序&#xff0c;设置为广告观看&#xff0c;这样引导用户去小程序看&#xff0c;就产生一个广告…

(一)等值线 (Spatial Analyst)

等值线 (Spatial Analyst) 1.摘要 根据栅格表面创建等值线(等值线图)的线要素类。 等值线是用于连接各类等值点(如高程、温度、降雨量、污染或大气压力)的线。线的分布显示表面值的变化方式。值的变化量越小,线的间距就越大。值上升或下降得越快,线的间距就越小。 2.…

基于单片机的厨房安全监测

功能介绍 以STM32单片机作为主控系统&#xff1b; OLED液晶显示当前检测的气体浓度&#xff0c;温度&#xff0c;是否有火等信息&#xff1b; 按键可以设置温度上限、可燃气体浓度上限&#xff1b; 当温度超过我们设置自动开启风扇进行降温&#xff1b; 当检测到天然气泄露后蜂…

ROS学习篇之基础知识(一)-环境的安装

文章目录 一.ros的安装1.ros的一键安装&#xff1a;2.ros的验证是否安装成功3.安装导航必备的库&#xff1a; 二.VScode的配置1.安装ros插件2.安装cmake插件 三.VScode的简单使用1.快速注释&#xff1a; 四.pycharm的安装 一.ros的安装 1.ros的一键安装&#xff1a; wget htt…

shiro框架 shiro补充知识MD5加密

01.在用户登录时候&#xff0c;需要输入用户名和密码。 用户名用数据库的select来查询是否存在。 密码比较私密&#xff0c;就是后台的程序员也不可以查看&#xff0c;这需要加密。 一般的加密算法是MD5 02.例如&#xff1a; SecurityUtils 类是shiro框架的一个类。SecurityUt…

LabVIEW开发牵引控制动态仿真器

LabVIEW开发牵引控制动态仿真器 车辆牵引力控制包括轮胎在横向和纵向上的牵引力控制&#xff0c;以获得所需的车辆运动。决定轮胎牵引力的力来自路面和轮胎之间的相互作用&#xff0c;它们分解为两个组成部分&#xff1a;一个在横向&#xff0c;另一个在纵向。第一个组件取决于…

MSP432学习笔记11:定时器A的结构\基地址\函数汇总理解

今日得以继续我的电赛MSP432学习之路&#xff1a;所用开发板MSP432P401R 定时器是任何单片机开发板十分重要的模块&#xff0c;在几日的学习使用过程中&#xff0c;本人也对其使用原理等产生过许多疑问&#xff0c;他究竟是怎么存储计数值、捕获值的&#xff1f;一个定时器四个…

基于Java校园车辆管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048

Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048 Proteus仿真小实验&#xff1a; Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048 功能&#xff1a; 硬件组成&#xff1a;ARDUINO -UNO-R3开发板、 LCD1602 、DHT11温湿度传感器、LED灯、电机模拟水泵、2个按键 1.单…

【详解代码】vue element el-select选择器多选下拉框实现全选功能和取消全选

目录 解决方法 下拉项增加一个【全部】⭐️效果图如下&#xff1a;默认全选情况一&#xff1a;下拉选项全都勾选时&#xff0c;【全部】自动勾选&#xff1b;情况二&#xff1a;下拉选项全都未勾选时&#xff0c;点击【全部】后&#xff0c;所有下拉选项全部勾选&#xff1b;情…

V90伺服驱动器实现一键优化的具体方法

V90伺服驱动器实现一键优化的具体方法 目的:解决运行中震动、异响等问题。 前提条件: 使用一键自动优化的前提:  对于带绝对值编码器的电机:位置限制由p29027决定,至少为180  对于带增量式编码器的电机:在开始优化时必须允许电机有2圈的自由旋转,p29027至少为720 使…

Linux挂载新磁盘到服务器新目录-干货分享

确认磁盘 新建分区 输入m查看帮助&#xff1a; 输入n新建分区&#xff0c;输入p建立分区&#xff08;其他默认将全部空间进行分配&#xff09;&#xff1a; 输入w进行保存 lsblk再次确认分配完成后的新分区&#xff1a; 格式化分区 明确文件系统格式&#xff0c;一般有xf…

十四、Jenkins打包完成后,执行python脚本,将发行包打包压缩上传禅道提交版本

十四、Jenkins打包完成后&#xff0c;执行脚本&#xff0c;将版本发行包压缩上传禅道提交禅道版本 十三、禅道登录/提交版本/编辑版本接口 &#xff0c;书接上回&#xff0c;在禅道中注册一个Jenkins账号&#xff0c;利用禅道的接口&#xff0c;提交到禅道中&#xff0c;具体代…

数据仓库系列:StarRocks 入门培训教程

文章目录 1. 什么是StarRocks?1.1. 适用场景1.2. [产品特性](https://docs.starrocks.io/zh-cn/latest/introduction/Features) 2. 系统架构2.1. 系统架构2.1.1. 整体架构2.1.2. 高可用实现方式 2.2. 数据如何管理&#xff1f; 3. 表模型3.1. 明细模型3.2. 聚合模型3.3. 更新模…

冷链NO.1技能,物流人第一天就应该学会!

储藏室的温湿度是许多行业中的关键因素&#xff0c;如医疗、食品、冷链物流等。确保储藏室内的温湿度在规定的范围内是保护物品品质和价值的关键。 储藏室温湿度远程监控是一项重要的任务&#xff0c;特别适用于需要实时掌握储藏室环境条件的场景。通过远程监控&#xff0c;可以…