1 全注解
<mvc:annotation-driven>
1:自动注册基于注解风格的处理器需要的DefaultAnnotationHandlerMapping、
AnnotationMethodHandlerAdapter
2:支持ConversionService自动注册(类型转换)
3:支持验证框架的自动探测并注册
4:支持@RequestBody 和 @ResponseBody,支持JSON数据转换(只
需将Jackson实现放置到classpath)
<context:component-scan base-package="">
组件扫描器,会扫描base-package下的类,标识为@Component类会被ioc容器创建
2 Model ModelMap Map
返回数据范畴
这3个类型的对象其实为同一个对象,以后使用Model即可
controller中获取的数据可以以key-value方式放在这个3个对象里面,页面通过el表达式获取
获取数据的时候,先Model对象获取,没有找到再到request
Model对应于Struts2中valuestack。struts2处理对象颗粒度为类级别,springmvc处理对象为方法
@RequestMapping("/update")//通过注解完成请求url到Controller方法的映射
public ModelAndView update(HttpServletRequest request,Model model, ModelMap modelMap,Map map) throws Exception {
//收集组织
//调用
//切换
// model.addAttribute("a", 1);
modelMap.addAttribute("b", 2);
map.put("c", 3);
request.setAttribute("a", 22);
System.out.println(model==modelMap);
System.out.println(modelMap==map);
System.out.println("update");
ModelAndView modelAndView = new ModelAndView();//ModelAndView 模型视图对象
modelAndView.addObject("info", "hello springmvc");//返回数据,给模型视图对象添加数据
modelAndView.setViewName("list");//给模型视图对象设置逻辑视图名
return modelAndView;
}
3 Model和ModelAndView
ModelAndView作为返回对象,会合并、覆盖Model中保存的相同key的数据
4 切换页面
l ModelAndView
设置ModelAndView对象逻辑视图,切换页面
l String
controller-controller
一次请求(转发)
“forward:toList”
2次请求(重定向)
“redirect:toList”
controller-jsp
一次请求(转发)
直接返回页面的逻辑视图名字符串
2次请求(重定向)
没有
5 静态资源处理
静态资源:js、css、图片等叫做静态资源
/static/js/test.js /static/js/test2.js
/static/css/test.css
/static/*
l test.js
l list.jsp
l Controller
l springmvc配置
6 类型转换
定义一个自定义转换器
注册转换器
7 对json的支持
@ResponseBody
index.jsp
在页面插入一条商品的记录,前台页面需要将刚刚插入的数据展示
用TaskTimer隔一段时间重新查询数据库记录,将更新后数据展示在前台首页
TaskTimer对象什么创建,任务什么启动
8 拦截器
//一般开发中,有接口和父类供选择,选择父类。因为父类提供公共的方法
public class MyHandlerInterceptor1 implements HandlerInterceptor{
/**
* 前置处理,执行处理器方法之前回调preHandle方法
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("====MyHandlerInterceptor1 preHandle");
return false;
}
/**
* 后置处理,执行处理器方法后回调postHandle方法
*/
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("====MyHandlerInterceptor1 postHandle");
}
/**
* 视图渲染完毕后,回调这个方法
*/
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("====MyHandlerInterceptor1 afterCompletion");
}
}
//一般开发中,有接口和父类供选择,选择父类。因为父类提供公共的方法
public class MyHandlerInterceptor2 implements HandlerInterceptor{
/**
* 前置处理,执行处理器方法之前回调preHandle方法
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("====MyHandlerInterceptor2 preHandle");
return true;
}
/**
* 后置处理,执行处理器方法后回调postHandle方法
*/
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("====MyHandlerInterceptor2 postHandle");
}
/**
* 视图渲染完毕后,回调这个方法
*/
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("====MyHandlerInterceptor2 afterCompletion");
}
}
list.jsp
正常执行流程
9 文件上传
请求表单类型
配置文件中设置文件上传解析器
处理器方法绑定MultiPartFile对象,方法中将对象指向文件转移到自己指定文件里面即可
10 今日总结
核心操作