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 格式数据。需要借助一个注解实现。
注意:
- 它还可以实现一些数据类型自动转换。
- 如遇特殊类型转换要求,需要我们自己编写自定义类型转换器。
代码示例
<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";
}
}
如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客