springmvc请求参数绑定 | 中文乱码 | 自定义类型转换器

1. 绑定的机制

表单中请求参数都是基于 key=value 的。
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑的。

例如:
<a href="account/findAccount?accountId=10">查询账户</a>
	中请求参数是:accountId=10
/**
* 查询账户
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId) {
	System.out.println("查询了账户。。。。"+accountId);
	return "success";
}

2. 支持的数据类型

  • 基本类型参数:包括基本类型和 String 类型。
  • POJO 类型参数:包括实体类,以及关联的实体类。
  • 数组和集合类型参数:包括 List 结构和 Map 结构的集合(包括数组)

SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

使用要求

  • 如果是基本类型或者 String 类型:

要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)

  • 如果是 POJO 类型,或者它的关联对象:

要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。

  • 如果是集合类型,有两种方式:

方式一:要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。

给 List 集合中的元素赋值,使用下标。给 Map 集合中的元素赋值,使用键值对。

方式二:接收的请求参数是 json 格式数据。需要借助一个注解实现。

注意:

  1. 它还可以实现一些数据类型自动转换。
  2. 如遇特殊类型转换要求,需要我们自己编写自定义类型转换器。

代码示例

<form action="success/getBean" method="post">
  id:  <input type="text" name="id"/><br/>
   name: <input type="text" name="user.name"/><br/>
    age:<input type="text" name="user.age"/><br/>
    <input type="submit" value="submit"/><br/>
</form>

<form method="post" action="success/getCollection">
    name:  <input type="text" name="list[0].name"/><br/>
    age: <input type="text" name="list[1].age"/><br/>
    name: <input type="text" name="map[0].name"/><br/>
    age: <input type="text" name="map[1].age"/><br/>
    <input type="submit" value="submit"/>
</form>
/**
 * 参数绑定1:
 * bean中包含bean
*/
@RequestMapping("/getBean")
public String getBean(Person person){
  System.out.println("getBean()...");
  System.out.println(person);
  return "success";
}

/**
 * 参数绑定2
 * 集合类型
*/
@RequestMapping("/getCollection")
public String getList(MyCollection collection){
  System.out.println("getList()....");
  System.out.println(collection);
  return "success";
}

3. 中文乱码问题

<!-- 编码过滤器,必须放在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>

在这里插入图片描述

关于 get 请求

tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml

配置文件,如下:

<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>
改为:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>

如果遇到 ajax 请求仍然乱码,请把:useBodyEncodingForURI="true"改为URIEncoding="UTF-8"即可。

4. 关于静态资源处理

在 springmvc 的配置文件中可以配置,静态资源不过滤:

<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>

或者:
<!--让springmvc 不处理静态资源-->
<mvc:default-servlet-handler/>

5. 使用servletAPI对象作为方法参数

springMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。

支持原始 ServletAPI 对象有:

    /**
     * 获取原生ServletAPI
     */
    @RequestMapping("/getServlet")
    public String getServlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("getServlet()...");
        return "success";
    }
<a href="success/getServlet">getServlet</a><br/>

6. 自定义类型转换器

自定义类型转换不是用在与数据库交互,而是用在前后端交互。

举个例子:假如前段传来的日期格式:2017-02-21 能封装成功;但是假如前段传来的是:2017/02/21 呢?

代码如下

jsp页面

<form action="success/date" method="post">
    <input type="text" name="date"/><br/>
    <input type="submit" value="submit"/>
</form>

转换器类

public class StringToDate implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        if (s==null||"".equals(s)){
            throw new RuntimeException("输入不能为空");
        }
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            return format.parse(s);
        } catch (Exception e) {
            throw new ClassCastException("类型转换异常");
        }
    }
}

自定义类型转换器

spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。

<!--自定义类型转换-->
<!-- 配置类型转换器工厂 -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!-- 给工厂注入一个新的类型转换器 -->
        <property name="converters">
            <set><!-- 配置自定义类型转换器 -->
                <bean class="com.atguigu.utils.StringToDate"></bean>
            </set>
        </property>
    </bean>
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

控制器

/**
 * 自定义数据类型转换
 * 1.编写类型转换类,实现 Converter 接口,该接口有两个泛型。
 * 2.配置文件中配置转换器,并在注解支持里面注册。
 * 3.控制层参数列表传入转换类
*/
@RequestMapping("/date")
public String getDate(Date date){
  System.out.println(date.toString());
  return "success";
}

7. 自定义视图解析器

在这里插入图片描述

  • 程序员可以选择一种视图解析器或混用多种视图解析器 。
  • 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。
  • SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。

代码如下

//@Component 其他的组件
@Component
public class HelloView implements View {

	@Override
	public String getContentType() {
		// TODO Auto-generated method stub
		return "text/html;charset=utf-8";
	}
	@Override
	public void render(Map<String, ?> arg0, HttpServletRequest req, HttpServletResponse res) throws Exception {
		
		res.setContentType("text/html;charset=utf-8");
		PrintWriter out = res.getWriter();
		System.out.println(" HelloView render 方法 执行 >>>>");
		out.print("你好 自定义View");
		out.flush();
		out.close();
	}

}
<!-- 配置自定义视图 适配器 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" >
 <property name="order" value="100"></property>
</bean>
@Controller
public class HelloController  {

	@RequestMapping("/testzdyview")
	public String testView(){
		System.out.println("vie自定义 view >>>>>>>");
		return "helloView";
	}
}

如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值