Spring-mvc核心技术

一、url-patten
在使用Spring-MVC的框架时我们一般保持为*.do 这时图片会正常显示,但是如果我们是拦截所有请求 / ,这时我们的静态资源页面将无法显示 图片等。
这时我们需要使用<mvc:default-servlet-handler />

2、<mvc:default-servlet-handler>
声 明 了 <mvc:default-servlet-handler /> 后 , springmvc 框 架 会 在 容 器 中 创 建DefaultServletHttpRequestHandler 处理器对象。它会像一个检查员,对进入 DispatcherServlet的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的Servlet 处理。一般的服务器都有默认的 Servlet。
在 Tomcat 中,有一个专门用于处理静态资源访问的 Servlet 名叫 DefaultServlet。其
为 default。可以处理各种静态资源访问请求。该 Servlet 注册在 Tomcat 服务
器的 web.xml 中。在 Tomcat 安装目录/conf/web.xml。
3、<mvc:resource >
Spring 定义了专门处理静态资源访问请求的处理器ResourceHTTPRequestHandler。用于解决静态资源无法访问的问题
在这里插入图片描述
4、声明注解驱动
解决动态资源和静态资源冲突的问题,在SpringMVC的配置文件中添加
<mvc:annotation-driver/>

5、SpringMVC请求转发和重定向
当处理器对请求处理完毕后 ,向其他资源进行跳转的时候,会使用到 请求转发和重定向机制。
1、请求转发
处理器方法返回值ModelAndView 需setViewName()指定的视图前添加forward:,且此时的视图不再与视图解析器一同工作这样可以在配置了解析器时指定不同位置的视图,视图路径一般都是写绝对路径、
在这里插入图片描述
2、重定向
在处理器方法返回的视图字符串的前面添加redirect . 则可实现重定向跳转
在这里插入图片描述
【注意】请求转发和重定向 的 理解
HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的 访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复, “浏览器”也知道他借到的钱出自李四之手。RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发 出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。

6、HandlerExceptionResolver接口
异常处理,SpringMVC的项目中我们可以自定义异常处理器,需要实现HandlerExceptionResolver接口

package com.bjpowernode.handle;

import com.bjpowernode.expe.AgeException;
import com.bjpowernode.expe.NameException;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 2019/09/02
 *  MyExceptionResolver实现HandlerExceptionResolver,
 *  所以MyExceptionResolver是异常处理器, 能够处理异常。
 *
 */
@Component
public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    //resolveException  : 当controller中抛出异常时,会执行该方法
    // Object handler:发生异常的controller对象
    // Exception ex : 抛出的异常对象
    //
    // ModelAndView:表示发生异常后,给用户看到的视图和数据, 也就是异常的处理结果。
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object handler,
                                         Exception ex) {

//处理异常   做什么 ?
        /**发送通知 例如给开发人员发送短信  邮件等
         * 记录异常  记录日志文件 数据库等
         * 给用户一个友好提示
         */
        ModelAndView mv = new ModelAndView();
        //根据抛出的异常的不同  给出不同的提示信息
        if(ex instanceof NameException){
            mv.addObject("tips", "只有zs能够查看");
            mv.setViewName("NameError");
        }else if(ex  instanceof AgeException){
            mv.addObject("tips", "年龄有点偏大");
            mv.setViewName("AgeError");
        }else{
            mv.addObject("tips", "系统已经处理,请稍候访问");
            mv.setViewName("defaultError");
        }

        mv.addObject("ex", ex);
        return mv;
    }
}

7、异常处理的注解
使用@ExceptionHandler可以将一个方法指定为异常处理方法。该该注解只有一个可选属性 value,为一个 Class<?>数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常。而被注解的方法,其返回值可以ModelAndView、String,或 void,方法名随意,方法参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会自动为这些方法参数赋值。对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中。

猜你喜欢

转载自blog.csdn.net/qq_42963930/article/details/102296733