Spring MVC参数接收、参数传递

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");

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值