Spring MVC参数接收、参数传递

发布时间:2024年01月09日

Springmvc中,接收页面提交的数据是通过方法形参来接收:

  • 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参

  • springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换器)在特殊情况下需要自定义converter,如对日期数据

1.基本数据类型

编写controller

  @RequestMapping("/controller3")
    public String controller3(String name,Model model){
        model.addAttribute("msg",name);
        return "success";
    }

?在index.jsp里面定义超链接

<a href="/Account/controller3?name=Tom">接收参数—基本数据类型</a><br>

结果:

2.POJO类型参数绑定

编写pojo

package com.by.pojo;



import java.io.Serializable;
import java.util.Date;

public class Account implements Serializable {
    private Integer id;
    private String name;
    private Float money;
    private Address address;
    private Date date;


    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                ", address=" + address +
                ", date=" + date +
                '}';
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}
package com.by.pojo;

import java.io.Serializable;

public class Address implements Serializable {
    private String provinceName;
    private String cityName;
     //省略get set toString方法


    @Override
    public String toString() {
        return "Address{" +
                "provinceName='" + provinceName + '\'' +
                ", cityName='" + cityName + '\'' +
                '}';
    }

    public String getProvinceName() {
        return provinceName;
    }

    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }
}

?编写controller

 @RequestMapping("/controller9")
    public String controller9(Account account, Model model){
        model.addAttribute("msg",account);
        return "success";
    }

在index.jsp里面添加表单

 <form action="/Account/controller9" method="post">
    账户名称:<input type="text" name="name"><br>
    账户金额:<input type="text" name="money"><br>
    账户省份:<input type="text" name="address.provinceName"><br>
    账户城市:<input type="text" name="address.cityName"><br>
    <input type="submit" value=" 保  存 ">
  </form>

结果:

3.restful风格

  • restful概述:

(Representational State Transfer,表现层状态转移):URL定位资源时,用HTTP动词(GET,POST,DELETE,PUT)描述操作

3.1restful风格URL

3.2@PathVaribale

  • 作用

    用于绑定url中的占位符。例如:/account/{id},这个{id}就是url占位符

    url支持占位符是spring3.0之后加入的,是springmvc支持rest风格url的重要标志。

  • 描述需要使用指定的请求方式来请求该方法

 @RequestMapping("/controller10/{id}")
    public String controller10(@PathVariable("id") Integer id,Model model){
        model.addAttribute("msg",id);
        return "success";
    }

?测试:在index.jsp里面定义超链接

  <a href="/Account/controller10/111">restful</a><br>

结果:

4.请求参数乱码问题

4.1POST请求方式解决乱码问题

在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>
    </filter>
    <filter-mapping>
<!--        过滤所有的请求-->
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

?测试

4.2GET请求方式解决乱码问题

tomcat对GET和POST请求处理方式是不同的,GET请求的编码问题,要改tomcat的 配置信息,如下:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <port>8080</port>
        <path>/</path>
        <!--按UTF-8进行编码-->
        <uriEncoding>UTF-8</uriEncoding>
    </configuration>
</plugin>

5.自定义类型转换器

5.1使用场景

?在index.jsp里面添加日期类型

 <form action="/Account/controller11" method="post">
    账户名称:<input type="text" name="name"><br/>
    账户金额:<input type="text" name="money"><br/>
    账户省份:<input type="text" name="address.provinceName"><br/>
    账户城市:<input type="text" name="address.cityName"><br/>
    开户日期:<input type="text" name="date"><br/>
    <input type="submit" value=" 保  存 ">
  </form>

在pojo里面添加日期类型

public class Account implements Serializable {
    private Integer id;
    private String name;
    private Float money;
    private Address address;
    //添加日期类型
    private Date date;
    //省略get set toString方法
} 

测试

  • 原因

    我们前台传递的是字符串类型的参数,但是后台使用的是Date类型接收的。我们期望springmvc可以帮我们做数据类型的自动转换,显然没有做,所以我们需要自己自定义类型转换器。

5.2自定义类型转换器

?Converter接口说明:

?

定义一个类,实现Converter接口

package com.by.converter;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String str) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse(str);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

?在 springmvc.xml配置文件中配置类型转换器

<!--    开启SpringMVC的注解支持-->
<!--    注册类型转换器工厂-->
<mvc:annotation-driven conversion-service="cs"></mvc:annotation-driven>

<!--    配置类型转换器工厂-->
    <bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!-- 给工厂注入一个新的类型转换器 -->
        <property name="converters" >
            <set>
                <!-- 配置自定义类型转换器 -->
                <bean class="com.by.converter.DateConverter"></bean>
            </set>
        </property>
    </bean>

结果:

6.使用ServletAPI接收参数

?编写controller

  @RequestMapping("/controller12")
    public String controller12(HttpServletRequest request){
        String name = request.getParameter("name");
        Float money = Float.valueOf(request.getParameter("money"));
        request.setAttribute("msg",name+"===="+money);
        return "success";
    }

?在index.jsp里面定义超链接

<a href="/Account/controller12?name=Tom&money=999">servlet接收参数</a><br>

结果:

?

7.参数传递

7.1ModelAndView传递

编写controller

  @RequestMapping("/controller13")
    //也可以不创建ModelAndView,直接在参数中指定
    public ModelAndView controller13(ModelAndView mv){
        mv.addObject("msg","李寒衣");
        mv.setViewName("success");
        return mv;
    }

?在index.jsp里面定义超链接

<a href="/Account/controller13">ModelAndView参数传递</a><br>

结果:

7.2Model传递

?编写controller

 @RequestMapping("/controller14")
    public String controller10(Model model){
      model.addAttribute("msg","天女蕊");
        return "success";
    }

?在index.jsp里面定义超链接

<a href="/Account/controller14">Model参数传递</a><br>

结果:

7.3ServletAPI传递

?编写controller

  @RequestMapping("/controller15")
    public String controller15(HttpServletRequest request){
        request.setAttribute("msg","唐莲");
        return "success";
    }

??在index.jsp里面定义超链接

  <a href="/Account/controller15">Servlet API 参数传递</a><br>

结果

8.总结:

接收参数
? ? 1、基本类型(少量)
? ? ? ? <a href="/account/findAccount7?name=tom">

? ? ? ? public String findAccount7(String name, Model model){
? ? ? ? }
? ? 2、pojo(多个)
? ? ? ? <a href="/account/findAccount8?name=tom&id=18">

? ? ? ? public String findAccount8(Account account, Model model){
? ? ? ? }
? ? 3、restful
? ? ? ? <a href="/account/findAccount10/123">

? ? ? ? @RequestMapping("/findAccount10/{id}")
? ? ? ? public String findAccount10(@PathVariable Integer id){

? ? ? ? }
? ? 4、日期类型转换器
? ? ? ? public class DateConverter implements Converter<String, Date> {
? ? ? ? }

? ? ? ? <!--注册转换器工厂-->
? ? ? ? <mvc:annotation-driven conversion-service="cs"></mvc:annotation-driven>

? ? ? ? <!--配置类型转换器工厂-->
? ? ? ? <bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean">
? ? ? ? ? ? <property name="converters">
? ? ? ? ? ? ? ? <set>
? ? ? ? ? ? ? ? ? ? <bean class="com.by.converter.DateConverter"></bean>
? ? ? ? ? ? ? ? </set>
? ? ? ? ? ? </property>
? ? ? ? </bean>

? ? 3、中文乱码
? ? ? ? 1)post方式
? ? ? ? ? ? <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>
? ? ? ? ? ? </filter>
? ? ? ? ? ? <filter-mapping>
? ? ? ? ? ? ? ? <filter-name>CharacterEncodingFilter</filter-name>
? ? ? ? ? ? ? ? <url-pattern>/*</url-pattern>
? ? ? ? ? ? </filter-mapping>
? ? ? ? 2)get方式
? ? ? ? ? ? new String(name.getBytes(),"UTF-8");

文章来源:https://blog.csdn.net/qq_62965575/article/details/135488387
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。