1、参数绑定
- 在controller方法 形参中 添加HttpServletRequest request参数,通过request接收查询条件参数。
- 在形参中让包装类型的pojo接收查询条件参数。
1.1、pojo属性绑定
- 页面参数
<input name="itemsEx.name" />
注意:
itemsEx
和包装
pojo
中的属性一致即可。
- controller方法形参
public ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo)throws Exception
public class ItemsQueryVo {
//商品信息
private Items items;
//原始生成的商品po进行扩展
private ItemsEx itemsEx;
1.2、集合类型绑定
1.2.1、数组绑定
- 页面参数
<c:forEach items="${itemsList }" var="item">
<tr>
<td><input type="checkbox" name="items_id" value="${item.id}"/></td>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/items/editItems.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
- controller方法接收页面参数
@RequestMapping("/deleteItems")
public String deleteItems(Integer[] items_id) throws Exception {
.....
}
1.2.2、list绑定
- 页面参数
<c:forEach items="${itemsList }" var="item" varStatus="status">
<tr>
<td><input name="itemsList[${status.index }].name" value="${item.name }"/></td>
<td><input name="itemsList[${status.index }].price" value="${item.price }"/></td>
<td><input name="itemsList[${status.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
<td><input name="itemsList[${status.index }].detail" value="${item.detail }"/></td>
</tr>
</c:forEach>
- controller方法接收页面参数
public ModelAndView editItemsQuery(HttpServletRequest request,
ItemsQueryVo itemsQueryVo) throws Exception {
- ItemsQueryVo定义
public class ItemsQueryVo {
//商品信息
private Items items;
//原始生成的商品po进行扩展
private ItemsEx itemsEx;
//批量商品信息
private List<ItemsEx> itemsList;
1.2.3、map绑定
- 页面参数
<td>
姓名:<inputtype="text"name="itemInfo['name']"/>
年龄:<inputtype="text"name="itemInfo['price']"/>
.. .. ..
</td>
- controller接收参数
public String useradd (Model model,QueryVo queryVo)throws Exception{
}
- QueryVo 定义
Public class QueryVo {
private Map<String, Object> itemInfo = new HashMap<String, Object>();
//get/set方法..
}
2、数据回显
pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)
使用@ModelAttribute指定pojo回显到页面在request中的key
使用@ModelAttribute指定pojo回显到页面在request中的key
使用最简单方法使用model,可以不用@ModelAttribute
model.addAttribute("id", id);
3、文件上传
3.1、配置SpringMVc.xml
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property><!-- 最大上传文件大小 -->
<property name="maxInMemorySize" value="10960"></property>
</bean>
3.2、jar包
commons-fileupload-1.2.2.jar
commons-io-2.4.jar
3.3、页面代码
<body>
<form action="${pageContext.request.contextPath }/congxing/ssm/user/upload.action" method="post" enctype="multipart/form-data">
<input type="file" name="pic" /></br>
<input type="submit" value="上传">
</form>
</body>
3.4、controller
@RequestMapping("upload")
public ModelAndView upload(MultipartFile pic) throws Exception{
String originalFilename = pic.getOriginalFilename();
//上传图片
if(pic!=null && originalFilename!=null && originalFilename.length()>0){
//存储图片的物理路径
String pic_path = "F:\\upload\\";
//新的图片名称
String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
//新图片
File newFile = new File(pic_path+newFileName);
//将内存中的数据写入磁盘
pic.transferTo(newFile);
}
ModelAndView mv = new ModelAndView();
mv.setViewName("upload");
return mv;
}
另一种
@RequestMapping("upload")
public ModelAndView upload(@RequestParam("pic") CommonsMultipartFile pic) throws Exception{
String originalFilename = pic.getOriginalFilename();
//上传图片
if(pic!=null && originalFilename!=null && originalFilename.length()>0){
//存储图片的物理路径
String pic_path = "F:\\upload\\";
//新的图片名称
String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
//新图片
File newFile = new File(pic_path+newFileName);
//将内存中的数据写入磁盘
pic.transferTo(newFile);
}
ModelAndView mv = new ModelAndView();
mv.setViewName("upload");
return mv;
}
4、json数据交互
4.1、常见用法
1、请求json、输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。
4.2、jar包
springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用jackson进行json转换)
下载地址:http://download.csdn.net/detail/hxskmx/8833313
4.3、配置json转换器
在注解适配器中加入messageConverters
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<span style="white-space:pre"> </span><bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
如果使用<mvc:annotation-driven /> 则不用定义上边的内容。
4.4、json交互测试
4.4.1、请求json串,返回json串
- 页面
//请求json,输出是json
function requestJson(){
$.ajax({
type:'post',
url:'${pageContext.request.contextPath }/requestJson.action',
contentType:'application/json;charset=utf-8',
//数据格式是json串
data:'{"username":"mx","address":"广州"}',
success:function(data){//返回json结果
alert(data.username);
}
});
}
- controller
@RequestMapping("/requestJson")
public @ResponseBody User requestJson(@RequestBody User user){
System.out.println(user);
return user;
}
4.4.2、 请求Key/Value数据,返回Json串
- 页面
//请求key/value,输出是json
function responseJson(){
$.ajax({
type:'post',
url:'${pageContext.request.contextPath }/responseJson.action',
//请求是key/value这里不需要指定contentType,因为默认就 是key/value类型
//contentType:'application/json;charset=utf-8',
//数据格式是json串
data:'username=mx&address=广州',
success:function(data){//返回json结果
alert(data.username);
}
});
}
- controller
<span style="font-weight: normal;"><span style="font-size:12px;"> @RequestMapping("/responseJson")
public @ResponseBody User responseJson(User user){
System.out.println(user);
return user;
}</span></span>
4、拦截器
4.1、拦截器定义
<span style="font-weight: normal;">//定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。
public class HandlerInterceptor1 implements HandlerInterceptor {
//进入 Handler方法之前执行
//用于身份认证、身份授权
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//return false表示拦截,不向下执行
//return true表示放行
return false;
}
//进入Handler方法之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
//执行Handler完成执行此方法
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}</span>
4.2、拦截器配置
4.2.1、针对HandlerMapping配置
springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该 拦截器。
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
4.2.2、类似全局的拦截器
springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<!-- 登陆认证拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.congxing.ssm.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- /**表示所有url包括子url路径 -->
<mvc:mapping path="/**"/>
<bean class="cn.congxing.ssm.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.congxing.ssm.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
<span style="font-weight: normal;"><span style="font-size:12px;"> @RequestMapping("/responseJson")
public @ResponseBody User responseJson(User user){
System.out.println(user);
return user;
}</span></span>
4、拦截器
4.1、拦截器定义
<span style="font-weight: normal;">//定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。
public class HandlerInterceptor1 implements HandlerInterceptor {
//进入 Handler方法之前执行
//用于身份认证、身份授权
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//return false表示拦截,不向下执行
//return true表示放行
return false;
}
//进入Handler方法之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
//执行Handler完成执行此方法
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}</span>
4.2.1、针对HandlerMapping配置
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<!-- 登陆认证拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.congxing.ssm.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- /**表示所有url包括子url路径 -->
<mvc:mapping path="/**"/>
<bean class="cn.congxing.ssm.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.congxing.ssm.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>