springmvc
1.Springmvc的基础知识
1、什么是springmvc?
是一个类似于struts2的一个前端web框架。
2、springmvc的框架结构
a) 请求先到前端控制器是一个Servlet(DispatcherServlet)并不处理请求。接收请求,并负责整个处理的流程
b) 到处理器映射器中查找handler。处理映射器根据url查找对应的handler。返回HandlerExecutionChain,包含拦截器及handler。
c) 根据不同的handler选择不同的处理器适配器。执行handler。
d) Handler的功能。处理用户请求返回ModelAndView对象。ModelAndView中包含处理后的数据及逻辑视图名。
e) 根据逻辑视图名转换成物理视图,需要视图解析器。逻辑视图就是一个字符串,物理视图就是jsp的完整路径。
f) 视图可以有多种类型,常用的就是jsp、freemaker、pdf、excel
3、参数绑定
a) Springmvc默认支持的参数类型
- HttpServletRequest
- HttpServletResponse
- HttpSession
- Model、ModelMap
b) 简单数据类型的绑定
- Integer、String、Float、Double
- 要求请求的参数名称和方法的形参要一致
- 如果名称不一致时可以使用@RequestParam注解。
c) 使用pojo类型进行参数绑定。
要求请求的参数名称要和pojo对象的属性名称要一致。
4、@RequestMapping
把请求url和对应处理此url的handler进行绑定。Handler就是一个处理方法。
可以指定请求方法,可以GET、POST。如果不指定默认都支持。
2.springmvc常用注解
@Controller
@service
@repository
@RequestMapping()
@Autowired
@Pathviriable
@RequestParam
@ReponseBody
@CookieValue
@SessionAttributes
@ModelAttribute
@Controller @RequestMapping("/user/") public class RelativePathUriTemplateController {
//@Autowired默认通过属性类型注入by type(UserService),spring支持
@Autowired
@Qualifier("userService")
private UserService userService;
//@Resource默认通过名称注入by name(userService2),一个借口多个实现类推荐这种写法.J2EE提供
@Resource
private UserService userService2;
@RequestMapping(value="/showAllUser/{userId}", method=RequestMethod.POST)
public void showAllUser(HttpServletRequest request,
HttpServletResponse reponse,
HttpSession session,
@PathVariable String userId,
@RequestParam(value="username", required=false) String username
Model model) {
}
}
3.Validator自定义校验器(略)
4.全局异常处理
1.1 处理思路
Springmvc中提供了一个全局异常处理接口HandlerExceptionResolver接口。只需要实现此接口,然后在springmvc的配置文件中配置即可。整个系统只有一个生效。
可以自定义一个异常,把所有的异常都包装起来。
1、自己抛出的异常
2、系统运行时异常。
1.2 处理的步骤
第一步:创建一个全局异常处理类,实现HandlerExceptionResolver。
1、判断此异常是否是自定义异常
2、如果自定义的可以把错误消息取出来
3、如果是运行时异常,把错误堆栈取出来。
4、给用户显示一个错误页面,把错误消息显示出来。如果没有错误消息可以显示网络异常,请重试。
第二步:在springmvc.xml配置全局异常处理类。
/** * 自定义异常 * <p>Title: CustomerException</p> * <p>Description: </p>*/ public class CustomerException extends Exception { public CustomerException() { super(); } private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
/** * 全局异常处理器 * <p>Title: GlobalExceptionResolver</p> * <p>Description: </p>*/ public class GlobalExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ex.printStackTrace(); //错误消息 String message = null; //判断异常是否是自定义的异常 if (ex instanceof CustomerException) { //取自定义消息 message = ((CustomerException)ex).getMsg(); } else { //系统运行时异常 //取堆栈的信息 StringWriter stringWriter = new StringWriter(); PrintWriter s = new PrintWriter(stringWriter); ex.printStackTrace(s); message = stringWriter.toString(); } //使用ModelAndView返回结果 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", message); modelAndView.setViewName("error"); return modelAndView; } }
5.拦截器Interceptor
/** * 拦截器的实现 * <p>Title: Interceptor1</p> * <p>Description: </p>*/ public class Interceptor1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 方法执行之前处理 //返回值true:放行 false:拦截 System.out.println("Interceptor1 preHandle...."); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 方法执行完毕,ModelAndView返回之前 System.out.println("Interceptor1 postHandle...."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 方法执行完毕,ModelAndView返回之后 System.out.println("Interceptor1 afterCompletion...."); } }
修改springmvc配置文件
<!--拦截器 --> <mvc:interceptors> <!--多个拦截器,顺序执行 --> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.springmvc.interceptor.Interceptor1"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.springmvc.interceptor.Interceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>