• springmvc


    1.Springmvc的基础知识

    1、什么是springmvc

    是一个类似于struts2的一个前端web框架。

    2、springmvc的框架结构

    a) 请求先到前端控制器是一个ServletDispatcherServlet)并不处理请求。接收请求,并负责整个处理的流程

    b) 到处理器映射器中查找handler处理映射器根据url查找对应的handler。返回HandlerExecutionChain,包含拦截器及handler

    c) 根据不同的handler选择不同的处理器适配器。执行handler

    d) Handler的功能。处理用户请求返回ModelAndView对象。ModelAndView中包含处理后的数据及逻辑视图名。

    e) 根据逻辑视图名转换成物理视图,需要视图解析器。逻辑视图就是一个字符串,物理视图就是jsp的完整路径。

    f) 视图可以有多种类型,常用的就是jspfreemakerpdfexcel

    3、参数绑定

    a) Springmvc默认支持的参数类型

    1. HttpServletRequest
    2. HttpServletResponse
    3. HttpSession
    4. ModelModelMap

    b) 简单数据类型的绑定

    1. IntegerStringFloatDouble
    2. 要求请求的参数名称和方法的形参要一致
    3. 如果名称不一致时可以使用@RequestParam注解。

    c) 使用pojo类型进行参数绑定。

    要求请求的参数名称要和pojo对象的属性名称要一致。

    4、@RequestMapping

    把请求url和对应处理此urlhandler进行绑定。Handler就是一个处理方法。

    可以指定请求方法,可以GETPOST。如果不指定默认都支持。

    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>
  • 相关阅读:
    .net core 负载均衡取客户端真实IP
    淘宝api接口,淘宝开放平台api接口
    c# RSA加密解密,与java代码互通问题
    剑指Offer算法题
    Mybatis
    JVM调优
    tp6使用cli(cmd)命令行模式调用访问控制器
    php实现可逆加密函数
    HRBP
    工作其实很像一场游戏
  • 原文地址:https://www.cnblogs.com/hcl1991/p/6594175.html
Copyright © 2020-2023  润新知