SpringMVC 参数绑定之视图传参到控制器的实现代码

作者:Java 时间:2021-12-29 11:54:17 

SpringMVC 参数绑定之视图传参到控制器的实现代码

⛳️ 基本类型做形式参数(零散参数的数据接收)

1、基本数据类型

要求前台页面的表单输入框的name属性值与对应控制器方法中的形式参数名称与类型一致,控制器方法就能接收到来自前台表单传过来的参数,即请求参数与方法形参要完全相同,这些参数由系统在调用时直接赋值,程序员可在方法内直接使用。

项目案例: 输入学生姓名、年龄和分数,提交成功则跳转到提交成功的界面并展示数据。

关键步骤:

【1】在 Controller 层新建一个 TestController1 类,并添加一个方法,代码如下:

package cn.hh.test02.controller;

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

@Controller
@RequestMapping("testc1")
public class TestController1 {

@RequestMapping("login")
   public ModelAndView login(String sName,int sAge, double sScore ){
       ModelAndView mv = new ModelAndView();
       mv.setViewName("test1/show");
       mv.addObject("currentShow",sName+"年龄:"+sAge+",分数:"+sScore);
       return mv;
   }
}

【2】在 webapp 目录下,新建一个目录 test1,在 test1 中新建 test1.jsp 文件,代码如下:

<%--
 Created by IntelliJ IDEA.
 User: hhzb100
 Date: 2023/2/28
 Time: 10:23
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
<form action="../testc1/login">
   姓名:<input type="text" name="sName">
   年龄:<input type="text" name="sAge">
   分数:<input type="text" name="sScore">
   <input type="submit" value="提交数据">
</form>
</body>
</html>

【3】再在上面的目录里新建 show.jsp 文件,代码如下:

<%--
 Created by IntelliJ IDEA.
 User: hhzb100
 Date: 2023/2/26
 Time: 11:29
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
<h1>提交成功!${currentShow}</h1>
</body>
</html>

【4】在浏览器中输入 http://localhost:8080/testspringmvc02/test1/test1.jsp,如下图:

SpringMVC 参数绑定之视图传参到控制器的实现代码

添加数据并提交,展示效果如下:

SpringMVC 参数绑定之视图传参到控制器的实现代码

1.1 表单 name 属性值与方法参数名称不一致解决方案

当表单的 name 属性值与方法参数的名称不同时,会出现如下图所示的500错误:

SpringMVC 参数绑定之视图传参到控制器的实现代码

表单的 name 属性值内容修改如下:

<form action="../testc1/login">
   姓名:<input type="text" name="stuName">
   年龄:<input type="text" name="stuAge">
   分数:<input type="text" name="stuScore">
   <input type="submit" value="提交数据">
</form>

而 TestController1 处理器中的方法参数分别为:sName、sAge、sScore;

则在接受方法的形参前面加个 @RequestParam(&ldquo;表单 name 属性值&rdquo;), TestController1 类代码修改如下:

//1、表单 name 属性值与方法参数名称不一致解决方案
   @RequestMapping("login")
   public ModelAndView login(@RequestParam("stuName") String sName, @RequestParam("stuAge")int sAge, @RequestParam("stuScore")double sScore ){
       ModelAndView mv = new ModelAndView();
       mv.setViewName("test1/show");
       mv.addObject("currentShow",sName+"年龄:"+sAge+",分数:"+sScore);
       return mv;
   }

1.2 表单 name 属性值为空时解决方案

当表单某个 name 属性值为空时,运行效果如下:

SpringMVC 参数绑定之视图传参到控制器的实现代码

解决办法: 设置基本参数类型的默认值 @RequestParam(defaultValue = &ldquo;xx&rdquo;);修改 TestController1 类代码如下:

package cn.hh.test02.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("testc1")
public class TestController1 {

@RequestMapping("login")
   public ModelAndView login(@RequestParam(defaultValue = "张三") String sName, @RequestParam(defaultValue = "20") int sAge,
                             @RequestParam(defaultValue = "88.8") double sScore ){
       ModelAndView mv = new ModelAndView();
       mv.setViewName("test1/show");
       mv.addObject("currentShow",sName+"年龄:"+sAge+",分数:"+sScore);
       return mv;
   }
}

修改后的运行效果如下:

SpringMVC 参数绑定之视图传参到控制器的实现代码

2、包装数据类型(推荐使用)

使用基本类型的包装类,实现参数接收,避免使用基本类型接收参数时,将null值赋予基本类型变量抛出异常的问题。之前基本数据类型会报500错误,包装数据类型不会报错。

@RequestMapping("login")
   public ModelAndView login(String sName, Integer sAge, Double sScore ){
       ModelAndView mv = new ModelAndView();
       mv.setViewName("test1/show");
       mv.addObject("currentShow",sName+"年龄:"+sAge+",分数:"+sScore);
       return mv;
   }

当不赋值时的运行效果如下,不会报500错误。

SpringMVC 参数绑定之视图传参到控制器的实现代码

3、@RequestParam() 属性

@RequestParam()有三个属性:

  • value:指定请求参数的名称。

  • required:指定该注解所修饰的参数是否是必须的,boolean 类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为false,则表示有没有均可。

  • defaultValue:指定当前参数的默认值。若请求 URI 中没有给出当前参数,则当前方法参数将取该默认值。即使required为true,且URI中没有给出当前参数,该处理器方法参数会自动取该默认值,而不会报错。

⛳️ 数组类型做形式参数

接收数组参数的关键点有两个:

  • 前台表单有多个表单域的name属性相同;

  • 控制器方法用这个name值命名的数组作为参数。

项目案例: 页面有多个兴趣爱好供选择,选择好后,控制台能显示出来。

关键步骤:

【1】在 cn.hh.test02.controller 目录下添加 TestController2 类,代码如下:

package cn.hh.test02.controller;

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

@Controller
@RequestMapping("testc2")
public class TestController2 {

@RequestMapping("interest")
   public String interest(String[] myInterest){
       System.out.println("我的兴趣爱好有:");
       for (String s : myInterest) {
           System.out.println("interest = " + s);
       }
       return "test1/interest";
   }
}

【2】在 src/main/webapp/test1 目录下新建 interest.jsp,代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
我的兴趣爱好<br/>
<form action="../testc2/interest">
   摄影:<input type="checkbox" name="myInterest" value="摄影"/><br/>
   跳舞:<input type="checkbox" name="myInterest" value="跳舞"/><br/>
   旅游:<input type="checkbox" name="myInterest" value="旅游"/><br/>
   阅读:<input type="checkbox" name="myInterest" value="阅读"/><br/>
   <input type="submit" value="确定"/>
</form>
<br/>观测控制台的输出
</body>
</html>

【3】运行测试:

SpringMVC 参数绑定之视图传参到控制器的实现代码

确定兴趣爱好,观察控制台,控制台打印如下:

SpringMVC 参数绑定之视图传参到控制器的实现代码

⛳️ 实体 Bean 做形式参数

方法 Delete5(User user) 可只用一个实体类作形式参数,前提是这个实体类的各个属性要与前台表单穿过来的各个 name 属性值相同。

关键步骤:

【1】创建实体类 User 类,代码如下:

package cn.kgc.springmvc02.entity;

import lombok.Data;

@Data
public class User {
   private String uName;
   private Integer uAge;
}

【2】在 cn/kgc/springmvc02/controller 目录下,新建 ParamController 类,代码如下:

package cn.kgc.springmvc02.controller;

import cn.kgc.springmvc02.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("param")
public class ParamController {
   @RequestMapping("delete")
   public String Delete5(User user) {
       System.out.println("user = " + user);
       return "show";
   }
}

【3】在 src/main/webapp 目录下创建 show.jsp,代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
   <h1>删除成功!</h1>
</body>
</html>

【4】页面展示效果

SpringMVC 参数绑定之视图传参到控制器的实现代码

【5】控制台打印效果

SpringMVC 参数绑定之视图传参到控制器的实现代码

⛳️ RESTful 风格编程

什么是REST风格:把请求参数变为请求路径的一种编程风格。 通过路径变量的使用,可以实现REST风格的编程。

传统的编程风格中,某项事物列表Web页面,要想一个个编辑,需要每一项中有类似这种超链接:
/restfuls?id=1
其中每一项的id不同。而采用RESTful风格后,超链接将变成:
/ restfuls/1 或者 1/restfuls 意义一样。

restful风格请求方式说明
/usersget查询全部列表数据
/users/1get根据 id 查询一条数据
/users/1delete根据 id 删除一条数据
/userspost添加数据,参数以json格式进行传递
/usersput修改数据

@PathVariable 映射 URL 绑定的占位符:

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过

@PathVariable(&ldquo;xxx&rdquo;) 绑定到操作方法的入参中。

一般与 @RequestMapping(&ldquo;xxx&rdquo;) 一起使用

项目代码:

package cn.kgc.springmvc02.controller;

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

@Controller
@RequestMapping("restfuls")
public class RestfulController {

//1、列表查询
   @GetMapping
   public String getList(){
       System.out.println("列表数据展示");
       return "show";
   }

//2、查询一个
   @GetMapping("{id}")
   public String getDataById(@PathVariable Integer id){
       System.out.println("查询id = " + id);
       return "show";
   }

//3、根据 id 删除一条数据
   @DeleteMapping("{id}")
   public String deleteById(@PathVariable Integer id){
       System.out.println("删除id = " + id);
       return "show";
   }

//4、添加数据
   @PostMapping
   public String addData(){

return "show";
   }

//5、修改数据
   @PutMapping("{id}")
   public String updateData(@PathVariable Integer id){
       System.out.println("修改id = " + id);
       return "show";
   }
}

运行测试:

【1】列表查询(请求地址:/restfuls;请求方式:GET)

SpringMVC 参数绑定之视图传参到控制器的实现代码

控制台打印:

SpringMVC 参数绑定之视图传参到控制器的实现代码

【2】查询一个(请求地址:/restfuls/1;请求方式:GET)

SpringMVC 参数绑定之视图传参到控制器的实现代码

控制台打印:

SpringMVC 参数绑定之视图传参到控制器的实现代码

【3】根据 id 删除一条数据(请求地址:/restfuls/1;请求方式:DELETE)

SpringMVC 参数绑定之视图传参到控制器的实现代码

控制台打印:

SpringMVC 参数绑定之视图传参到控制器的实现代码

【4】添加数据(请求地址:/restfuls;请求方式:POST)

SpringMVC 参数绑定之视图传参到控制器的实现代码

控制台打印:

SpringMVC 参数绑定之视图传参到控制器的实现代码

【5】修改数据(请求地址:/restfuls/1;请求方式:PUT)

SpringMVC 参数绑定之视图传参到控制器的实现代码

控制台打印:

SpringMVC 参数绑定之视图传参到控制器的实现代码

⛳️ 常见报错

1、中文乱码问题

对于上面案例所请求的参数,若含有中文,可能会出现中文乱码问题,SpringMVC 对于请求参数中的中文乱码问题,提供了专门的字符集过滤器,只需要在web.xml配置文件中注册字符串过滤器即可解决中文乱码问题。上面项目若要解决乱码问题,只需在 web.xml 中添加如下配置即即可:

<!--注册字符集过滤器-->
<filter>
       <filter-name>characterEncodingFilter</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>
       <init-param>
<!--强制使用指定字符集-->
           <param-name>forceEncoding</param-name>
           <param-value>true</param-value>
       </init-param>
   </filter>
   <filter-mapping>
       <filter-name>characterEncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

2、使用 ModelAndView,页面却获取不到值

有时候我们使用 ModelAndView 添加模型数据的时候,页面用${ } 获取不到相应的值,也面效果如下:

SpringMVC 参数绑定之视图传参到控制器的实现代码

造成这个问题的原因是项目中的 web.xml 文件内容有问题,先看看未修改前的头部内容:

<!DOCTYPE web-app PUBLIC
       "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
       "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
 <display-name>Archetype Created Web Application</display-name>

修改后的web.xml内容:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <display-name>Archetype Created Web Application</display-name>

修改之后,便可以解决这个问题!

来源:https://blog.csdn.net/hh867308122/article/details/129255336

标签:SpringMVC,参数,绑定,视图传参
0
投稿

猜你喜欢

  • C#中WinForm控件的拖动和缩放的实现代码

    2023-09-27 23:54:08
  • Java设计模式之Strategy模式

    2023-11-21 03:58:22
  • Fluent Mybatis零xml配置实现复杂嵌套查询

    2022-02-03 19:34:32
  • idea中同一SpringBoot项目多端口启动

    2023-05-09 06:39:27
  • java中javaBean与Bean的深入理解

    2021-11-27 13:19:11
  • Java如何提供给第三方使用接口方法详解

    2022-07-22 19:59:19
  • java 中类似js encodeURIComponent 函数的实现案例

    2023-03-20 13:13:50
  • Springboot实现动态定时任务流程详解

    2022-09-28 02:26:55
  • Java的Socket网络编程基础知识入门教程

    2021-11-19 10:10:37
  • Java 手写LRU缓存淘汰算法

    2023-03-03 00:11:19
  • Java实现小型图书馆管理系统

    2021-06-14 04:27:35
  • 教你C#将CSV转为Excel的实现方法

    2021-09-18 00:42:03
  • java8中的默认垃圾回收器(GC)

    2021-12-01 04:27:30
  • Android四种常见布局方式示例教程

    2022-05-25 09:35:03
  • C# web.config之<customErrors>节点说明案例详解

    2023-07-06 20:20:15
  • Spring Cloud Gateway 默认的filter功能和执行顺序介绍

    2021-07-01 21:31:46
  • Spring MVC通过添加自定义注解格式化数据的方法

    2023-11-06 09:05:32
  • 关于springboot集成swagger及knife4j的增强问题

    2023-11-29 00:43:50
  • Android WebView使用的技巧与一些坑

    2022-10-18 12:57:23
  • Java 对HashMap进行排序的三种常见方法

    2022-11-04 19:02:10
  • asp之家 软件编程 m.aspxhome.com