表单中请求参数都是基于 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"; }SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
如果是 POJO 类型,或者它的关联对象:要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
如果是集合类型,有两种方式:方式一:要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
给 List 集合中的元素赋值,使用下标。给 Map 集合中的元素赋值,使用键值对。
方式二:接收的请求参数是 json 格式数据。需要借助一个注解实现。
注意:
它还可以实现一些数据类型自动转换。如遇特殊类型转换要求,需要我们自己编写自定义类型转换器。关于 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"即可。
在 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/>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/>自定义类型转换不是用在与数据库交互,而是用在前后端交互。
举个例子:假如前段传来的日期格式: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"; }