一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发

Model-View-controller,即模型-视图-控制三层结构,三层每层负责不同的功能,其中,model层用于封装简单的javaBean和复杂的javaBean,包括业务层,甚至dao层,只要是个javabean都属于model(java仅仅只是pojo对象,也可以是一个包含复杂逻辑的service),pojo对象的代码都是包含的,视图层主要是页面,用于返回给用户的,直观的一种可视化的界面,比如jsp,html,包扩c/s的等,而Controller主要到控制,并且和用户交流的作用,比如,如果你要登陆,那么控制层就会返回一个登陆的页面给你,当你提交页面后,控制层就会调用model的业务
逻辑方法来验证你的输入是否正确。这就是一个mvc简单的调用过程
Spring MVC - 图1

注解:

  1. @Controller 控制器
  1. @RequestMapper"user")可以定义一个以/user/路径
  2. public class HelloController {
  3. @RequestMapper"请求对应方法名"
  4. }

@RequestParam
value: 参数名字 请求中的参数名字
required :必须的,默认为true
defaultValue 默认值

  1. public String getId(Model model,@RequestParam("id") int ids) {
  2. }

转发和重定向

转发 return forward:
重定向: redirect:

配置web.xml

  1. <servlet>
  2. <servlet-name> SpringMvc</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:springmvc.xml</param-value>
  7. </init-param>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>SpringMvc</servlet-name>
  11. <url-pattern>*.do</url-pattern>
  12. </servlet-mapping>

springmvc.xml文件
读取包

  1. <context:component-scan base-package="包名"/>

配置映射器

  1. <!-- 手动配置处理器映射器
  2. Spring3.1 后就废弃了DefaultAnnotationHandlerMapping的使用,推荐使用
  3. RequestMappingHandllerMapping
  4. -->
  5. <!-- <bean class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> </bean>
  6. 那么所对应的适配器也要使用

配置视图解析器

  1. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> -->
  2. <!-- 视图解析器配置
  3. InternalResourceViewResolver默认使用
  4. z最终路径 前缀+视图+后缀
  5. -->
  6. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  7. <!-- 视图的前缀-->
  8. <property name="prefix" value="/WEB-INF/page/"></property>
  9. <!-- 视图的后缀-->
  10. <property name="suffix" value=".jsp"></property>
  11. </bean>

转换器

定义一个类继承接口Converter (需要转换的类型)
数据类型转换

  1. public class DateConverter implements Converter<String, Date> {
  2. /**比如,页面
  3. s:需要转换的数据类型
  4. T:需要转换的目标数据类型
  5. */
  6. @Override
  7. public Date convert(String str) {
  8. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  9. try {
  10. Date date = sdf.parse(str);
  11. return date;
  12. } catch (ParseException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }
  16. return null;
  17. }
  18. }

xml文件配置

  1. <mvc:annotation-driven conversion-service="conversionService"/>
  2. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
  3. <property name="converters">
  4. <set>
  5. <bean class="com.zhiyou100.mvc.util.DateConverter"/>
  6. <bean class="com.zhiyou100.mvc.util.SplitString"/>
  7. </set>
  8. <!-- <set>
  9. <bean class="com.zhiyou100.mvc.util.SplitString"/>
  10. </set> -->
  11. </property>
  12. </bean>

拦截器

实现HandlerInterceptor 接口

  1. public class MyInterceptor implements HandlerInterceptor {
  2. /**
  3. * Handler执行完毕之后执行
  4. * 如果配置多个拦截器,那么会按照配置文件的配置顺序的逆序执行
  5. * 处理异常,记录日志等
  6. */
  7. @Override
  8. public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
  9. throws Exception {
  10. // TODO Auto-generated method stub
  11. System.out.println("这是方法执行完毕之后执行");
  12. }
  13. /**
  14. * Handler 方法体中业务代码执行完毕之后,返回ModelAndView之前
  15. * 如果配置多个拦截器,那么会按照配置文件的配置顺序的逆序执行
  16. * 清理页面已用参数
  17. */
  18. @Override
  19. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
  20. throws Exception {
  21. // TODO Auto-generated method stub
  22. System.out.println("这是提交之前执行");
  23. }
  24. /**
  25. * Handler方法执行之前执行,按照配置文件的配置顺序依次执行
  26. * 返回true,表示放行 ,false 拦截
  27. * 登录拦截,权限认证
  28. */
  29. @Override
  30. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  31. String path = request.getRequestURI();
  32. HttpSession session = request.getSession();
  33. if(session.getAttribute("USER_IN_SESSION")==null) {
  34. if(path.endsWith("login.do")||path.endsWith("inLogin.do")||path.endsWith("login.jsp")||path.endsWith("regist.do")||path.endsWith("re.do")||path.endsWith("regist.jsp")) {
  35. return true;
  36. }else {
  37. //return false;
  38. request.getRequestDispatcher("WEB-INF/page/login.jsp").forward(request, response);
  39. }
  40. }else{
  41. /*if(path.endsWith("login.do")||path.endsWith("inLogin.do")||path.endsWith("login.jsp")||path.endsWith("regist.do")||path.endsWith("re.do")||path.endsWith("regist.jsp")) {
  42. return true;
  43. }else {
  44. return false;
  45. }*/
  46. }
  47. //System.out.println("这是Handler之前执行");
  48. return true;
  49. }
  50. }

拦截器在xml中设置

exclude-mapping path=””

  1. <!-- 配置拦截器-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!-- path:/**表示拦截所有的请求,包括二级以上目录,,/*拦截所有请求,不包括二级以上目录 -->
  5. <mvc:mapping path="/**"/>
  6. <!-- 表示配置那些请求不拦截 -->
  7. <mvc:exclude-mapping path="/user/*"/>
  8. <bean class="com.zhiyou.mv.controller.MyInterceptor"></bean>
  9. </mvc:interceptor>
  10. </mvc:interceptors>

异常处理

定义接口实现 接口HandlerExceptionResolver

  1. public class CustomeExceptionHandler implements HandlerExceptionResolver {
  2. @Override
  3. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object arg2,
  4. Exception e) {
  5. e.printStackTrace();
  6. //如果你能够识别异常信息,那么就处理。不能显示未知错误
  7. String message = null;
  8. if(e instanceof CutomException ) {
  9. message = e.getMessage();
  10. }else {
  11. message="未知错误";
  12. }
  13. ModelAndView mav = new ModelAndView();
  14. mav.addObject("message",message);
  15. mav.setViewName("error");
  16. return mav;
  17. }
  18. }

xml配置

  1. <!--配置全局的异常处理bean -->
  2. <bean class="com.zhiyou.mv.controller.CustomeExceptionHandler"></bean>

事例 登录
throw new CutomException(“ “)
异常需要抛出 try catch 会出错

  1. @RequestMapping("login")
  2. public String login(Model model,String name ,String password,HttpSession session) throws Exception {
  3. User user = userService.login(name, password);
  4. if(user ==null) {
  5. throw new CutomException("登录失败");
  6. }else {
  7. session.setAttribute("USER_IN_SESSION", user);
  8. return "forward:list.do";
  9. }
  10. }