SpringMVC04:数据处理及跳转

news2024/11/29 4:39:33

目录

一、跳转方式ModelAndView

二、ServletAPI

三、SpringMVC

四、数据处理:处理提交数据

1、提交的域名称和处理方法的参数名一致

2、提交的域名称和处理方法的参数名不一致

3、提交的是一个对象

五、数据显示到前端

1、通过ModelAndView

2、通过ModelMap

3、通过Model

4、三种数据显示的对比

六、乱码问题

1、测试步骤:

2、处理方法:

一、跳转方式
ModelAndView

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

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

<!--视图解析器:模板引擎  Thymeleaf Freemarker  内部资源视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <!--前缀-->
   <property name="prefix" value="/WEB-INF/jsp/"/>
   <!--后缀-->
   <property name="suffix" value=".jsp"/>
</bean>

对应的controller类:

//定义控制器
//注意点:不要导错包,实现Controller接口,重写方法
public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //返回一个模型视图对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","helloController!!!");
        mv.setViewName("test");
        return mv;
    }
}

二、ServletAPI

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

  1. 通过HttpServletResponse进行输出
  2. 通过HttpServletResponse实现重定向

通过HttpServletResponse实现转发

package com.lucky.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Controller
public class HelloController4 {

    @RequestMapping("/result/t1")
    public void test1(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.getWriter().println("Hello,Spring by servlet API");
    }

    @RequestMapping("/result/t2")
    public void test2(HttpServletRequest req,HttpServletResponse resp) throws IOException {
        resp.sendRedirect("/test.jsp");
    }

    @RequestMapping("/result/t3")
    public void test3(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
        //转发
        req.setAttribute("msg","/result/t3");
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
    }
}

三、SpringMVC

1.通过SpringMVC来实现转发和重定向-无需视图解析器;测试前需要将视图解析器注释掉

@Controller
public class HelloController4 {
    @RequestMapping("/result/t1")
    public void test1(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.getWriter().println("Hello,Spring by servlet API");
    }
    @RequestMapping("/result/t2")
    public void test2(HttpServletRequest req,HttpServletResponse resp) throws IOException {
        //重定向
        resp.sendRedirect("/test.jsp");
    }
    @RequestMapping("/result/t3")
    public void test3(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
        //转发
        req.setAttribute("msg","/result/t3");
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
    }
}

2.通过SpringMVC来实现转发和重定向-有视图解析器;

重定向不需要视图解析器,本质上就是重新请求一个新地方,所以需要注意路径问题,可以重定向到另外一个请求实现

@Controller
public class ResultSpringMVC {
    @RequestMapping("/rsm/t1")
    public String test1(){
        //转发
        return "/index.jsp";
    }
    @RequestMapping("/rsm/t2")
    public String test2(){
        //转发二
        return "forward:/index.jsp";
    }
    @RequestMapping("/rsm/t3")
    public String test3(){
        //重定向
        return "redirect:/index.jsp";
    }
}

四、数据处理:处理提交数据

1、提交的域名称和处理方法的参数名一致

提交数据:访问路径:http://localhost:8080/controller/test1?name=test1
处理方法:

@RequestMapping("/test1")
public String test1(String name){
   System.out.println(name);
   return "test";
}

后台输出:test1

2、提交的域名称和处理方法的参数名不一致

提交数据:访问路径:http://localhost:8080/controller/test2?username=test2
处理方法:

@RequestMapping("/test2")
public String test2(@RequestParam("username") String name){
   System.out.println(name);
   return "hello";
}

后台输出:test2

3、提交的是一个对象

要求提交的表单域和对象的属性名一致,参数使用对象即可
1.实体类

public class User {
    private String id;
    private String name;
    private int age;
    //构造方法
    //get和set方法
    //toString方法
}

2.处理方法

@RequestMapping("/userTest")
public String userTest(User user){
   System.out.println(user);
   return "hello";
}

3.提交数据
访问路径:http://localhost:8080/controller/userTest?name=userTest&age=15&id=1234566

后台输出:User{id='1234566', name='userTest', age=15}

说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null;

五、数据显示到前端

1、通过ModelAndView

//数据显示在前端
public class DisplayPreController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","DisplayPreController!!!");
        mv.setViewName("test");
        return mv;
    }
}

通过接口Controller来实现方法,此时需要在配置文件springmvc-servlet.xml中注册bean:

<!--注册请求的bean-->
<bean name="/displayPreTest" class="com.lucky.controller.DisplayPreController"/>

2、通过ModelMap

 //访问路径:http://localhost:8080/controller/displayPreTest1?userName=displayPreTest1
@RequestMapping("/displayPreTest1")
public String DisplayPreTest1(@RequestParam("userName") String name, ModelMap model){
    model.addAttribute("msg",name);
    System.out.println(name);
    return "test";
}

3、通过Model

//访问路径:http://localhost:8080/controller/displayPreTest2?userName=displayPreTest2
@RequestMapping("/displayPreTest2")
public String DisplayPreTest2(@RequestParam("userName") String name, Model model){
   model.addAttribute("msg",name);
   System.out.println(name);
   return "hello";
}

4、三种数据显示的对比

就对于新手而言简单来说使用区别是:

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

当然更多的以后开发考虑的更多的是性能和优化,就不能单单仅限于此的了解。

六、乱码问题

1、测试步骤:

1.我们可以在首页编写一个提交的表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<%--action="/controller/encodingTest"中的controller为项目部署时设置的项目名--%>
  <form action="/controller/encodingTest" method="post">
    <input type="text" name="name">
    <input type="submit">
  </form>
  </body>
</html>

2.后台编写对应的处理类

@Controller
public class EncodingController {
    @RequestMapping("/encodingTest")
    public String encodingTest(Model model,String name){
        model.addAttribute("msg",name);//获取表单提交的值
        return "test";//跳转到test页面显示输入的值
    }
}

3.输入中文测试发现乱码

 不得不说,乱码问题是在我们开发中哦十分常见的问题,也是让我们程序员比较头大的问题!

以前乱码问题通过过滤器解决,而SpringMVC给我们提供了一个过滤器,可以在web.xml中配置。

修改了xml文件需要重启服务器!

    <!--过滤器-->
    <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>

但是我们发现,有些极端情况下,这个过滤器对get的支持不好

2、处理方法:

1.修改tomcat配置文件:设置编码

<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
          connectionTimeout="20000"
          redirectPort="8443" />

2.自定义过滤器

//自定义request对象,HttpServletRequest的包装类
public class MyRequest extends HttpServletRequestWrapper {
    private HttpServletRequest request;
    //是否编码标记
    private boolean hasEncode;
    //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行修饰
    public MyRequest(HttpServletRequest request) {
        super(request);//super必须写
        this.request = request;
    }
    //对需要增强方法进行覆盖
    @Override
    public Map getParameterMap(){
        String method = request.getMethod();
        if (method.equalsIgnoreCase("post")){
            try {
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }else if(method.equalsIgnoreCase("get")){
            //get请求
            Map<String,String[]> parameterMap = request.getParameterMap();
            if (!hasEncode) {
                for (String parameterName : parameterMap.keySet()) {
                    String[] values = parameterMap.get(parameterName);
                    if (values !=null) {
                        for (int i = 0; i < values.length; i++) {
                            try {//处理get乱码
                                values[i] = new String(values[i].getBytes("ISO-8859-1"),StandardCharsets.UTF_8);
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                hasEncode = true;
            }
            return parameterMap;
        }
        return super.getParameterMap();
    }
    //取一个值
    @Override
    public String getParameter(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values == null) {
            return null;
        }
        return values[0]; // 取回参数的第一个值
    }
    //取所有值
    @Override
    public String[] getParameterValues(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        return values;
    }
}

3.在web.xml配置文件中配置这个过滤器即可!

乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码 UTF-8!

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

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

相关文章

Nginx的使用和有关配置

&#x1f331;Nginx的基础使用和有关配置。 &#x1f4eb;相关软件:链接地址 文章目录 Nginx目录结构Nginx基本运行原理Nginx的基本配置文件 Nginx目录结构 [rootlocalhost ~]# tree /usr/local/nginx /usr/local/nginx ├── client_body_temp # POST 大文件…

dstat 好用的可视化工具

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 dstat 好用的终端工具 安装方法命令详解负载与CPU相关展示第一颗与第四颗cpu使用情况展示每秒的CPU时钟频率…

Elasticsearch:使用 Transformers 和 Elasticsearch 进行语义搜索

语义/矢量搜索是一种强大的技术&#xff0c;可以大大提高搜索结果的准确性和相关性。 与传统的基于关键字的搜索方法不同&#xff0c;语义搜索使用单词的含义和上下文来理解查询背后的意图并提供更准确的结果。 Elasticsearch 是实现语义搜索最流行的工具之一&#xff0c;它是一…

【运筹优化】元启发式算法详解:变邻域搜索算法(Variable Neighborhood Search,VNS)+ 案例讲解代码实现

文章目录 一、介绍二、基本方案三、一些扩展四、在VNS内改变配方4.1 基于变邻域的公式空间搜索4.2 变公式搜索 五、原始对偶VNS六、求解混合整数线性规划的VNS七、连续全局优化的可变邻域搜索八、可变邻域编程(VNP):自动编程的VNS九、Discovery Science十、总结十一、案例讲解&…

如何视频转语音?想知道视频转语音工具怎么用?

在教育、培训等领域中&#xff0c;有时候需要将讲解视频转化为文字来提供给学生反复阅读学习。那么&#xff0c;小伙伴们&#xff0c;你们知道怎样视频转语音吗&#xff1f;其实我们可以借助一些视频转语音的软件帮助我们实现视频转语音操作。这篇文章就给大家分享几个非常好用…

PHP学习笔记第二天

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区&#xff1a;https://bbs.csdn.net/forums/angluoanquan 目录 PHP类型比较 和 PHP中比较0、false、null …

基于SSM的酒店管理系统代码数据库文件和LW

框架&#xff1a;SSM 数据库&#xff1a;MySQL 语言&#xff1a;Java 下载链接&#xff1a; https://download.csdn.net/download/yw1990128/87853243 B站演示链接&#xff1a; 基于SSM框架的酒店管理系统_哔哩哔哩_bilibili 1.1 课题研究背景及意义 随着我国改革开放的不…

hutool文件导出

hutool文件导出 需求&#xff1a;管理员设置会议&#xff0c;参加会议会根据管理员设置的会议要求&#xff0c;用户参加会议填写相关数据&#xff0c;并且生成一个动态的excel数据并导出 示例&#xff1a; 每场都可以自定义报名字段 根据需求与前端约定 字段名称&#xff08;n…

通用读写仲裁模块(FPGA实现)

当涉及多个模块向同一个模块进行读写操作、向一个半双工模块请求读写&#xff0c;甚至综合一下&#xff0c;多个模块向一个半双工模块发起读写请求&#xff0c;那就要涉及读写仲裁。因为最近做的项目中涉及的读写仲裁太多了&#xff0c;所以就想还是要写一个通用的读写仲裁模块…

网络协议系统学习

网络为什么要分层&#xff1f; 因为是个复杂的程序就要分层 可以把网络包想象成一个buffer或者一块内存&#xff0c;是有格式的。同时&#xff0c;想象自己是一个处理网络包的程序&#xff0c;而且这个程序可以跑在电脑/服务器/路由器/交换机上&#xff0c;自己有很多网口&am…

抖音seo优化源码搭建/搜索排名系统,技术理论分析搭建中。

抖音seo系统源码SaaS&#xff0b;源码私有化部署搭建&#xff0c;抖音seo源码&#xff0c;抖音seo系统源码&#xff0c;抖音seo系统搭建部署&#xff0c;抖音已经成为了当今最为流行的短视频平台之一&#xff0c;拥有着庞大的用户群体和海量的视频资源。对于一些商家或者运营者…

26岁,几乎零基础,想从基础学习渗透测试该如何进行?

要成为一名渗透测试员&#xff0c;想从基础学习需要先掌握下面这3块&#xff08;文末有相关自学资源推荐&#xff09;&#xff1a;1、学习硬件和网络 渗透测试主要涉及网络和部分涉及硬件。 2、操作系统和系统架构 操作系统和系统架构在渗透测试中起着关键作用。系统操作涉及x…

笔试强训6

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步&#xff01; 1.下列关于ThreadLocal的描述中&#xff0c;错误的是&#xff08;&#xff09; A.ThreadLocal采用线程隔离的方式存放数据&#xff0c;可以避免多线…

社区网格化管理系统

在传统的城市管理过程中存在的问题&#xff1a; 1、问题发现不及时&#xff0c;被管理对象不清楚。 2、管理部门职责不清&#xff0c;协调成本高。 3、城市管理整体情况缺乏数据支撑。 4、基层力量薄弱。 凡尔码搭建社区网格化管理系统依托统一的城市管理以及数字化的平台&…

Codeforces Round 875 (Div. 2)(A—D)

文章目录 A. Twin Permutations1、分析2、代码 B. Array merging1、分析2、代码 C. Copil Copac Draws Trees1、分析2、代码 D. The BOSS Can Count Pairs1、分析2、代码 A. Twin Permutations A. Twin Permutations 1、分析 作者这里的构造方法是让最终的数组满足&#xff…

linux安装jdk8

1.下载jdk8 https://www.oracle.com/java/technologies/downloads/#java8 2.上传jdk &#xff08;1&#xff09;将jdk源码包&#xff0c;上传到/usr/local &#xff08;2&#xff09;进入上传jar包目录 [rootiZ2ze7vthdl3oh0n0hzlu7Z ~]# cd / [rootiZ2ze7vthdl3oh0n0hzlu…

C语言之字符串,内存操作函数详解(一)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 字符串函数 1. 前言&#x1f6a9;2…

电池管理系统 (BMS)

现今的电子设备&#xff0c;小至TWS耳机和可穿戴设备&#xff0c;大至电动汽车&#xff0c;都离不开锂离子或聚合物电池的供电。依据电子设备所需电力的大小&#xff0c;电池组可能由多个电池单元(电芯)排列而成。电池组的充电和放电、输入/输出电压和电流等状态都需要精密监控…

2023年6月DAMA-CDGP数据治理专家认证,你考了吗?

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

小白系统地学习it技术--python的心得体会

我对我所学习的IT技术的理解 一、it技术介绍——python二、我学习python前的准备工作三、学习时的具体操作1. 在pycharm练习python&#xff0c;唯手熟尔&#xff01;&#xff01;2. 在bilibili看python学习视频3. 报错了&#xff0c;CSDN是你的不二选择&#xff01;4.找代码&am…