栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC详解(四)核心技术

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC详解(四)核心技术

文章目录
  • 第四章 SpringMVC核心技术
    • 1.转发和重定向
      • 1.1 java代码
      • 1.2 jsp页面other.jsp
    • 2. 异常处理
    • 3.拦截器
      • 3.1 第一个拦截器
        • 1)preHandle 中可以进行 登录验证 和 权限判断。
        • 2)postHandle 对请求做二次的处理
        • 4)afterCompletion 最后执行
      • 3.2 多个拦截器
        • 1)两个拦截器,第一个preHandler=true,第二个拦截器preHandler=true
        • 2)两个拦截器,第一个preHandler=true,第二个拦截器preHandler=flase
        • 3)两个拦截器,第一个preHandler = false,第二个拦截器preHandler = true | flase
        • 为什么要使用多个拦截器?
        • 简单实现验证功能
      • 3.3 拦截器和过滤器的对比

第四章 SpringMVC核心技术 1.转发和重定向

forward:视图完整路径

redirect:视图完整路径

1.1 java代码
@Controller
public class  MyController {

     * 控制器方法返回的是MOdelAndView实现转发forward
     * 语法: mv.setViewName("forward:视图完整路径")
     *
     * forward特点 : 不和视图解析器一同工作的。就当项目中没有视图解析器。
     *
     * 这种方法的意义在于当show.jsp不在视图解析器规定的路径下比如在webapp目录下 就可以用forward来找到
     * */
         
    @RequestMapping(value = "/doForward.do")
    public ModelAndView doForward(){
        System.out.println("执行了MyController的doSome方法");

        ModelAndView mv = new ModelAndView();
//        添加数据
        mv.addObject("msg","处理了some.do请求");
        mv.addObject("fun","执行了doSome方法");

//        mv.setViewName("forward:/WEB-INF/view/show.jsp");
        mv.setViewName("forward:/hello.jsp");
//        返回结果
        return mv;

    }


     * 当控制器发方法返回ModelAndView实现重定向
     * 语法:mv.setViewName("redirect:视图完整路径")
     * redirect特点:不和视图解析器一同工作,就当项目中没有视图解析器
     *
     * 框架提供的重定向的功能
     * 1.框架可以实现两次请求之间的数据传递,把第一个请求中的Model里面
     *   简单类型的数据,转为字符串,附加到目标页面的后面,做get参数传递。
     *   可以在目标页面中获取参数值使用。
     *
     * 2.在目标页面中,可以使用${para.参数名} 获取参数的值
     * */
         
    @RequestMapping("/doRedirect.do")
    public ModelAndView doRedirect(String name,Integer age){
        System.out.println("doRedirect,name=="+name+",age="+age);
        ModelAndView mv = new ModelAndView();
//        这种无法取到值 因为这个放在了第一个request作用域
        mv.addObject("myname",name);
        mv.addObject("myage",age);
//        这里是第二个request作用域。
        mv.setViewName("redirect:/other.jsp");

//        http://localhost:8080/ch08_forward_redirect/other.jsp?myname=lisi&myage=22

//        重定向不能访问/WEB-INF
//        mv.setViewName("redirect:/WEB-INF/view/other.jsp");
        return mv;
    }

}

1.2 jsp页面other.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    show


    other.jsp,显示request作用域中的数据

myname数据: ${myname}

myage数据: ${myage}

myname数据: ${param.myname}

myage数据: ${param.myage}

获取get请求中的参数:<%=request.getParameter("myname")%>



    请求方式


    发起doForward.do的get请求
    

重定向redirect

姓名
年龄
操作
2. 异常处理

​ SpringMVC框架处理异常的常用方式:使用@ExceptionHandler注解处理异常。

​ 框架使用的是集中的异常处理。把各个Controller中抛出的异常集中到一个地方处理。处理异常的叫做异常处理器。框架中使用两个注解完成异常的集中处理。这样每个controller不用单独处理异常了。注解是:

  1. @ExceptionHandler:放在方法的上面,表示此方法可以处理某个类型的异常。当异常发生时执行这个方法。

  2. @ControllerAdvice :放在类的上面,表示这个类中有异常的处理方法。相当于aop中的@Aspect

    @ControllerAdvice :看作是控制器增强,就是给Controller类增加异常(切面)的处理功能。

  1. 修改springmvc配置




    

    

        

        
    


    

    


  1. Controller

@Controller
public class  MyController{

    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name,Integer age) throws MyUserException {
        System.out.println("执行了MyController的doSome方法");

//        抛出异常
        if(!"zs".equals(name)){
            throw new NameException("姓名不正确");
        }

        if(age == null|| age.intValue()>80){
            throw new AgeException("年龄太大了");
        }

        ModelAndView mv = new ModelAndView();
//        添加数据
        mv.addObject("myname",name);
        mv.addObject("myage",age);

//        mv.setViewName("forward:/WEB-INF/view/show.jsp");
        mv.setViewName("show");
//        返回结果
        return mv;
    }

}

  1. exception
public class AgeException extends MyUserException {

    public AgeException() {
        super();
    }

    public AgeException(String message) {
        super(message);
    }
}
public class MyUserException extends Exception {
//    ctrl + 0

    public MyUserException() {
        super();
    }

    public MyUserException(String message) {
        super(message);
    }
}
public class NameException extends MyUserException {
//    ctrl + o 重写父类的方法
    public NameException() {
        super();
    }

    public NameException(String message) {
        super(message);
    }
}
  1. handle

package com.sunny.handle;

import com.sunny.exception.AgeException;
import com.sunny.exception.NameException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.naming.Name;


 *@ControllerAdvice : 表示当前类是异常处理类。给controller增加功能的
 *              位置 : 在类的上面
 * */
@ControllerAdvice
public class GlobalExceptionHandler {
//    定义处理异常的方法,当异常发生后,执行这个方法
//    方法定义和Controller类中方法的定义


     * 处理NameException类型的异常
     * 参数:
     *   Exception : 表示Controller抛出的异常对象
     *
     * @ExceptionHandler: 表示此方法处理异常
     *         属性:value 表示异常类型
     *         位置:方法的上面
     *
     * */
    @ExceptionHandler(value = NameException.class)
    public ModelAndView doNameException(Exception e){
        System.out.println("donameException===="+e);
 
         * 发生异常:
         *  1.记录异常,记录到日志文件。
         *  2.发送通知,邮件,短信等等
         *  3.给用户友好的提示
         * */
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips","姓名只能是zs");

        mv.setViewName("nameError");
        return mv;
    }

//    处理AgeException
    @ExceptionHandler(value = AgeException.class)
    public ModelAndView doAgeException(Exception e){

        System.out.println("doAgeException===="+e);
    
         * 发生异常:
         *  1.记录异常,记录到日志文件。
         *  2.发送通知,邮件,短信等等
         *  3.给用户友好的提示
         * */
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips","年龄不能大于80");

        mv.setViewName("ageError");
        return mv;
    }
//    处理其他异常    不添加value值就能处理任何异常
    @ExceptionHandler
    public ModelAndView doOtherException(Exception e){

        System.out.println("doOtherException===="+e);
    
         * 发生异常:
         *  1.记录异常,记录到日志文件。
         *  2.发送通知,邮件,短信等等
         *  3.给用户友好的提示
         * */
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips","请稍后重试");

        mv.setViewName("defaultError");
        return mv;
    }
}

  1. jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


    ageError.jsp , ${tips}



<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    请求方式


    发起doForward.do的get请求
    

异常处理

姓名
年龄
操作
3.拦截器

​ 拦截器:是springmvc框架中的一种对象,需要实现接口HandlerInterceptor。拦截用户的请求。连接到cintroller的请求。

​ 作用:拦截用户的请求,可以预先对请求做处理,决定是否执行Controller。也可以把多个controller中共用的功能定义到拦截器。

特点:

  1. 拦截器可以分为系统拦截器和自定义拦截器。
  2. 一个项目可以有多个拦截器。0,或多个自定义拦截器。
  3. 拦截器侧重拦截用户的请求。
  4. 拦截器是在请求处理之前先执行的。

拦截器的定义:

  1. 创建类实现拦截器接口HandlerInterceptor,实现接口中的方法(3个)。
  2. 在springmvc配置文件中,声明拦截器对象,并指定拦截的uri地址。
3.1 第一个拦截器
package com.sunny.handler;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;


public class MyInterceptor implements HandlerInterceptor {
//    ctrl+o


  
     * preHandler:预先处理请求的方法。 总的开关
     *    参数 :
     *      Object handler : 被拦截的控制器对象(MyController)
     *    返回值: boolean
     *      true: 请求是正确的,可以被controller处理的。
     *          MyInterceptor拦截器的preHandle====
     *          执行了MyController的doSome方法
     *          MyInterceptor拦截器的postHandle====
     *          MyInterceptor拦截器的afterCompletion====
     *
     *      false:请求不能被处理,控制器方法不会执行。请求到此截止。
     *          MyInterceptor拦截器的preHandle====
     *
     * 特点:
     *   1.预处理方法他的执行时间:在控制器方法之前先执行的。
     *   2.可以对请求做处理,可以做登录的检查,权限的判断,统计数据等等。
     *   3.决定请求是否执行。
     * */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        System.out.println("MyInterceptor拦截器的preHandle====");
//        request.getRequestDispatcher("/tips.jsp").forward(request,response);
        return true;
    }

   
     * postHandler:后处理方法
     *    参数:
     *        Object handler : 被拦截的控制器对象(MyController)
     *        ModelAndView mv: 控制器方法的返回值 (请求的执行结果)
     *
     *    特点:
     *        1.在控制器方法之后执行的。
     *        2.能获取到控制器方法的执行结果。可以修改为原来的执行结果。
     *          可以修改数据,也可以修改视图。
     *        3.可以对请求的二次处理。
     *
     *
     * */

    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView mv) throws Exception {
        System.out.println("MyInterceptor拦截器的postHandle====");

//        对请求做二次的处理
        if(mv != null){
//            修改数据
            mv.addObject("mydate",new Date());
//            修改视图
            mv.setViewName("other");
        }

    }


     * afterCompletion:最后执行的方法
     *  参数:
     *      Object handler : 被拦截的控制器对象 (MyController)
     *      Exception ex; 异常对象
     *
     *  特点:
     *      1.在请求处理完成后执行的。
     *       请求处理完成的标志是 视图处理完成。对视图执行forward操作后。
     *
     *      2.可以做程序最后要做的工作,释放内存,清理临时变量。
     *
     *      3.方法的执行条件:
     *          1)当前的拦截器他的preHandle()方法必须执行。
     *          2)preHandler()必须返回true
     *
     * */

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) throws Exception {
        System.out.println("MyInterceptor拦截器的afterCompletion====");

//        获取数据
        HttpSession session = request.getSession();
        Object attr = session.getAttribute("attr");
        System.out.println("attr="+attr);

//        删除数据
        session.removeAttribute("attr");

//        确定数据是否删除
        attr = session.getAttribute("attr");
        System.out.println("删除后,再次检查数据==="+attr);
    }

}

配置文件:springmvc.xml中添加

    

        


        System.out.println("MyInterceptor111拦截器的preHandle====");

//        获取登录的账号信息
        String username= "";
        Object attr = request.getSession().getAttribute("username");
        if(attr!=null){
            username = (String) attr;
        }

//        判断账号
        if("zhangsan".equals(username)){
            return true;
        }else{
            request.getRequestDispatcher("/tips.jsp").forward(request,response);
            return false;
        }
    }

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    登录


    登录操作!!!
    <%
        session.setAttribute("username","zhangsan");
    %>


    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    退出操作


    退出系统!!!
    <%
        session.removeAttribute("username");
    %>

    
3.3 拦截器和过滤器的对比
  1. 拦截器是springmvc框架中的对象。过滤器是servlet中的对象。

  2. 拦截器对象是框架容器创建的,过滤器对象是tomcat创建的对象。

  3. 拦截器是侧重对请求做判断,处理的,可以截断请求。过滤器是侧重对request,response对象设置值的。例如request.setCharacterEncoding(“utf-8”)

  4. 拦截器的执行时间有三个,控制器方法之前,之后,请求完成后。过滤器是在请求之前。

  5. 拦截器是拦截对controller,动态资源请求的。过滤器可以过滤所有请求动态的和静态的。

  6. 拦截器和过滤器一起执行的,先执行的过滤器,后面是中央调度器,后面才是拦截器,再后面是控制器方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489841.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号