SpringmMVC
响应数据和结果视图
返回值分类
String
在控制器方法中:
return "jsp页面路径";
void
使用HttpServletRequest做请求转发;
使用HttpServletResponse做请求重定向;
使用HttpServletResponse向浏览器写数据;
ModelAndView
ModelAndView是SpringMVC为我们提供的一个对象,该对象可以用作控制器方法的返回值;
在控制器方法中:
ModelAndView对象.addObject(String key, Object obj);
ModelAndView对象.setViewName("jsp页面路径"");
return ModelAndView对象;
转发与重定向
转发
return "forward:URL";
重定向
return "redirect:URL";
@ResponseBody
位置: 控制器方法返回值上;
作用: 用于将控制器方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如: json,xml等,然后通过Response响应给客户端;
前提
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
SpringMVC实现文件上传
1.依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2.配置解析器: applicationContext-controller.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>524288</value>
</property>
</bean>
3.启动页面: /WEB-INF/jsp/items/editItems.jsp
a. 表单请求方式为: method="post"
b. 表单数据提交方式为: enctype="multipart/form-data"
c. 提供type为file的input;
4.修改ItemsController的updateItems的方法
@RequestMapping("/updateItems")
public String updateItems(Items items, MultipartFile imageFile) throws Exception {
if (imageFile != null && imageFile.getSize() > 0) {
// 1、文件重命名
String filename = imageFile.getOriginalFilename();
String suffix = FilenameUtils.getExtension(filename);
String uuid = UUID.randomUUID().toString().replace("-", "");
String newName = uuid + "." + suffix;
// 2、文件上传
File file = new File("D:\\SOFTWARE_WORKSPACE\\heima_v65\\ssm_case\\WebContent\\image\\" + newName);
imageFile.transferTo(file);
items.setImage(newName);
}
itemsService.updateItems(items);
return "redirect:/items/itemsList.action";
}
SpringMVC中的异常处理
1.自定义异常: cn.itheima.exception.CommonsException
public class CommonsException extends Exception {
private static final long serialVersionUID = 1L;
private String message;
public CommonsException(String message) {
super(message);
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.自定义异常处理器: cn.itheima.exception.CommonsExceptionResolver
public class CommonsExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
e.getMessage();
CommonsException commonsException = null;
if (e instanceof CommonsException) {
commonsException = (CommonsException) e;
} else {
commonsException = new CommonsException("系统异常,请与管理员联系!");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/error.jsp");
modelAndView.addObject("message", commonsException.getMessage());
return modelAndView;
}
}
3.注册异常处理器: applicationContext-controller.xml
<bean class="cn.itheima.exception.CommonsExceptionResolver"></bean>
SpringMVC中的拦截器
认识拦截器
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理;
拦截器链就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用;
拦截器与过滤器的区别
过滤器是servlet规范中的一部分,任何JavaWeb工程都可以使用;
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用;
过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截;
拦截器它是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的;
使用
1.自定义拦截器: HelloInterceptor(cn.itheima.web.interceptor.HelloInterceptor)
public class HelloInterceptor implements HandlerInterceptor {
/**
* controller执行前执行;
* true: 继续执行;
* false: 中止执行;
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("controller执行前");
return true;
}
/**
* controller执行后但 DispatcherServlet 返回响应前执行;
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
System.out.println("controller执行后但 DispatcherServlet 返回响应前执行");
}
/**
* controller执行后且 DispatcherServlet 完全处理完请求后执行;
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
System.out.println("controller执行后且 DispatcherServlet 完全处理完请求后执行");
}
}
2.配置HelloInterceptor: applicationContext-controller.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="cn.itheima.web.interceptor.HelloInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.测试
http://localhost:8080/ssm_case/items/updatePage/001