表单中请求参数都是基于 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 中集合属性名称相同。
给 List 集合中的元素赋值,使用下标。给 Map 集合中的元素赋值,使用键值对。
方式二:接收的请求参数是 json 格式数据。需要借助一个注解实现。
注意:
<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";
}
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-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"即可。
在 springmvc 的配置文件中可以配置,静态资源不过滤:
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
或者:
<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">getServleta><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";
}
//@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";
}
}