Java框架_SpringMVC_day02_请求参数的绑定

目录

三、请求参数的绑定

3.1 请求参数的绑定机制

3.2 基本数据类型和字符串类型

3.2.1 index.jsp

3.2.2 ParamController.java

3.3 实体类型(JavaBean)

3.3.1 封装 Account 类

3.3.2 index.jsp

3.3.3 Controller

3.3.4 Post 请求参数中文乱码问题的解决

3.4 给集合属性数据封装

3.4.1 index.jsp

3.4.2 Account.java

3.4.3 Controller

3.5 自定义类型转换器

3.5.1 User.java

3.5.2 index.jsp

3.5.3 Controller

3.5.4 自定义类型转换器(StringToDateConverter.java)

3.5.5 springmvc.xml 配置注册自定义类型转换器

3.6 在控制器中使用原生的 ServletAPI 对象

3.6.1 index.jsp

3.6.2 Controller


三、请求参数的绑定

3.1 请求参数的绑定机制

(1)绑定机制

       【1】表单提交的数据都是k=v格式的 username=haha&password=123

       【2】SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的

       【3】要求:提交表单的name和参数的名称是相同的

(2)支持的数据类型

       【1】基本数据类型和字符串类型

       【2】实体类型(JavaBean)

       【3】集合数据类型(List、map集合等)

3.2 基本数据类型和字符串类型

注意:

(1)提交表单的name和参数的名称是相同的

(2)区分大小写

3.2.1 index.jsp

<h3>传递参数</h3>
<a href="param/testParam?username=张三&age=18">传递参数(字符串和基本数据类型)</a>

3.2.2 ParamController.java

@Controller
@RequestMapping(value = "/param")
public class paramController {

    @RequestMapping(value = "/testParam")
    public String testParam(String username,Integer age){
        System.out.println("执行了 paramController 中的 testParam 方法!! username:"+username+"   age:"+age);
        return "success";
    }

3.3 实体类型(JavaBean)

(1)提交表单的name和JavaBean中的属性名称需要一致

(2)如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

3.3.1 封装 Account 类

package com.cpz.domain;

import java.util.List;
import java.util.Map;

public class Account {
    private String name;
    private String password;
    private Double money;
    private User user;


}

3.3.2 index.jsp

<form action="param/saveAccount" method="post">
    账号:<input type="text" name="name"/><br>
    密码:<input type="text" name="password"/><br>
    金额:<input type="text" name="money"/><br>
    用户姓名:<input type="text" name="user.username"/><br>
    用户年龄:<input type="text" name="user.age"/><br>
    <input type="submit" value="提交"/>
</form>

3.3.3 Controller

    @RequestMapping(value = "/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了 paramController 中的 testParam 方法!! account:"+account);
        return "success";
    }

3.3.4 Post 请求参数中文乱码问题的解决

在 web.xml 中配置 Spring 提供的过滤器类:

    <!-- 配置过滤器,解决中文乱码的问题 -->
    <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>

3.4 给集合属性数据封装

3.4.1 index.jsp

<form action="param/saveAccount" method="post">

    用户姓名(list):<input type="text" name="list[0].username"/><br>
    用户年龄(list):<input type="text" name="list[0].age"/><br>
    用户姓名(list):<input type="text" name="list[1].username"/><br>
    用户年龄(list):<input type="text" name="list[1].age"/><br>

    用户姓名(map):<input type="text" name="map['one'].username"/><br>
    用户年龄(map):<input type="text" name="map['one'].age"/><br>
    用户姓名(map):<input type="text" name="map['two'].username"/><br>
    用户年龄(map):<input type="text" name="map['two'].age"/><br>
    <input type="submit" value="提交"/>
</form>

3.4.2 Account.java

public class Account {
    private String name;
    private String password;
    private Double money;
    private User user;
    private List<User> list;
    private Map<String,User> map;
}

3.4.3 Controller

    @RequestMapping(value = "/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了 paramController 中的 testParam 方法!! account:"+account);
        return "success";
    }

3.5 自定义类型转换器

3.5.1 User.java

public class User {
    private String username;
    private Integer age;
    private Date birthday;
}

3.5.2 index.jsp

<form action="param/saveUser" method="post">
    姓名:<input type="text" name="username"/><br>
    年龄:<input type="text" name="age"/><br>
    生日:<input type="text" name="birthday"/><br>
    <input type="submit" value="提交"/>
</form>

3.5.3 Controller

    @RequestMapping(value = "/saveUser")
    public String saveUser(User user){
        System.out.println("执行了 paramController 中的 saveUser 方法!! user:"+user);
        return "success";
    }

结论:默认支持的日期格式是:yyyy/MM/dd,如果输入yyyy-MM-dd呢?则会报错,怎么办呢?

3.5.4 自定义类型转换器(StringToDateConverter.java)

package com.cpz.utils;



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

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

//把字符串转换成日期的转换器
public class StringToDateConverter implements Converter<String,Date> {
    //进行类型转换的方法
    public Date convert(String source) {
        // 判断,或者return null;
        if (source == null){
            throw new RuntimeException("参数不能为空");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = df.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

3.5.5 springmvc.xml 配置注册自定义类型转换器

    <!-- 注册自定义类型转换器 -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.cpz.utils.StringToDateConverter"></bean>
            </set>
        </property>    

    <!-- 3:配置spring开启注解mvc的支持,自动开启处理器映射器和处理器适配器 -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

3.6 在控制器中使用原生的 ServletAPI 对象

3.6.1 index.jsp

<a href="param/testServlet">测试ServletAPI</a>

3.6.2 Controller

    @RequestMapping(value = "/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println("执行了 paramController 中的 testServlet 方法!! request:"+request);
        System.out.println("session:"+request.getSession());
        System.out.println("application:"+request.getSession().getServletContext());
        System.out.println("response:"+response);
        return "success";
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMVC 中,我们可以通过 ResponseBody 注解返回音频流,具体步骤如下: 1. 在 Controller 中定义一个返回类型为 ResponseEntity<byte[]> 的方法,该方法需要使用 @ResponseBody 注解标注。 2. 在方法中获取音频文件的字节数组,并将其放入 ResponseEntity 对象中返回。 3. 在 ResponseEntity 对象中设置 Content-Type、Content-Disposition 等响应头,以便浏览器正确解析音频流并进行播放。 示例代码如下: ```java @RequestMapping("/audio") @ResponseBody public ResponseEntity<byte[]> getAudio() throws IOException { // 读取音频文件字节数组 InputStream in = getClass().getResourceAsStream("/static/audio/sample.mp3"); byte[] audioBytes = IOUtils.toByteArray(in); // 设置响应头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("audio/mpeg")); headers.setContentDispositionFormData("attachment", "sample.mp3"); // 返回音频流 return new ResponseEntity<>(audioBytes, headers, HttpStatus.OK); } ``` 上述代码中,我们将音频文件 sample.mp3 放在了项目的 /static/audio 目录下。在方法中,我们使用 IOUtils.toByteArray() 方法将音频文件转换为字节数组,并将其放入 ResponseEntity 对象中返回。在设置响应头时,我们使用 MediaType.parseMediaType() 方法设置 Content-Type,使用 setContentDispositionFormData() 方法设置 Content-Disposition。最后,我们通过 new ResponseEntity<>(audioBytes, headers, HttpStatus.OK) 创建 ResponseEntity 对象并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值