SpringMvc(一)写了一点点关于@RequestMapping,这篇我们来看看它的一些属性
请求参数的绑定就是后端获取前端请求参数的过程
前端传过来的参数,可能又一个,多个,而我们处理的时候,又分为基本数据类型和String,javabean,以及集合的形式
1.一个请求参数:
jsp页面
<a href="/param/testparam?username=hehe">请求参数的绑定</a>
@RequestMapping("/testparam")
public String testparam(String username){
System.out.println("执行了");
System.out.println(username);
return "success";
}
我们发现只需要名称(username)一样,SpringMVC就可以直接获取到请求参数的值
2.请求参数封装成一个javaBean对象
怎么封装呢???
声明一个bean对象:Account,一定要记住生成set方法呀,要不然会为null,封装不进去
声明一个bean对象:User一定要记住生成set方法呀,要不然会为null,封装不进去
我们看到Account中有引用类型User,那么如何封装呢???
@RequestMapping("/savamony")
public String javabeanparam(Account account){
System.out.println(account);
return "success";
}
<form action="/param/savamony" method="post">
姓名<input type="text" name="name"/><br>
年龄<input type="text" name="age"><br>
钱<input type="text" name="money"><br>
用户的姓名<input type="text" name="user.username"><br>
用户的id<input type="text" name="user.id"><br>
<input type="submit" value="提交">
</form>
我们可以看到用户的姓名:name=“user.username”;主意"user",是Account的属性
"username"是User的属性,一定要匹配才行。
3.请求参数封装成到集合中
@RequestMapping("/savamony")
public String javabeanparam(Account account){
System.out.println(account);
return "success";
}
<form action="/param/savamony" method="post">
姓名<input type="text" name="name"/><br>
年龄<input type="text" name="age"><br>
钱<input type="text" name="money"><br>
用户的姓名<input type="text" name="list[0].username"><br>
用户的id<input type="text" name="list[0].id"><br>
用户的姓名<input type="text" name="map['one'].username"><br>
用户的id<input type="text" name="map['one'].id"><br>
<input type="submit" value="提交">
</form>
相信大家一看代码就会恍然大悟
当方法的请求方式是post的时候就会出现中文乱码的问题
之前的时候我们都是在request中设置,现在我们可以在拦截器中进行设置
在web.xml中:
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!--encoding是CharacterEncodingFilter的一个属性-->
<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>
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
System.out.println("执行了");
System.out.println(request);
HttpSession session = request.getSession();
System.out.println(session);
ServletContext servletContext = session.getServletContext();
System.out.println(servletContext);
System.out.println("response"+response);
return "success";
}
我们发现只需要将HttpServletRequest和HttpServletResponse 作为参数即可
org.apache.catalina.connector.RequestFacade@6baeb3
org.apache.catalina.session.StandardSessionFacade@1d5690d
org.apache.catalina.core.ApplicationContextFacade@1cab944
responseorg.apache.catalina.connector.ResponseFacade@d195c6
为什么要自定义转换器呢?
因为我们前端传过去的数据类型都是String类型的,但是在封装的时候springmvc会帮我们转换,
大多数情况下,都是没有问题的是,但是也有例外
eg:2000/1/23可以帮助我们转成日期类型,但是2000-1-23就会报错,对于这种格式springmvc转不了,就需要我们去定义。
解决方法:
我们自定义一个转换器,当前端控制器调用的时候,就调用我们自己编写的转换器
所有的自定义转换器都需要实现这个接口Converter
前面是字符串,后面是我们需要转换的类型
1.创建一个转换器类:
但是我们创建了一个转换器类,我们怎么让他发挥作用呢???
还记得我们的视图解析器吗??
我们是在springmvc.xml中进行配置的,那么同样我们的转换器StringToDateConverter
也一样。
<!-- 配置自定义的转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 我们现在的这个bean对象和我写的自定的转换器的类并没有什么联系啊-->
<!-- converters是ConversionServiceFactoryBean中的一个属性,是Set类型的我们为它注入值-->
<property name="converters">
<set>
<!-- 配置我们自定义的转换器的路径-->
<bean class="cn.itcast.utils.StringToDateConverter"/>
</set>
</property>
</bean>
配置了,但是怎么生效呢???
还记得<mvc:annotation-driven conversion-service="conversionService"/>
这里面我们就可以进行加入conversion-service="conversionService"
就可以让我们自己写得转换器生效了。
让我们来看一下吧!!!
<form action="/param/savauser" method="post">
用户的姓名<input type="text" name="username"><br>
用户的id<input type="text" name="id"><br>
用户的假期<input type="text" name="holiday"><br>
<input type="submit" value="提交">
</form>
@RequestMapping("/savauser")
public String savauser(User user){
System.out.println("执行了");
System.out.println(user);
return "success";
}
自定义转换器成功!!!