forward转发

重定向是客户端的两次请求
转发是客户端只请求一次服务端做转发,url是不变的
转发是服务器行为,不能转发到本web应用之外的页面和网站
方式一:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/test")
public class Forward {
@RequestMapping("Beijin")
public ModelAndView test1(String name) {
    ModelAndView modelAndView = new ModelAndView();
    if (!name.equalsIgnoreCase("Beijin")) {
    //与重定向一样,只需要将关键字redirect改为forward即可
        modelAndView.setViewName("forward:/test/Other?name=" + name);
    } else {
        modelAndView.setViewName("/my/Beijin");
    }
    return modelAndView;
}


@RequestMapping("Other")
public ModelAndView test2() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/my/Other");
    return modelAndView;
}
}

/my/Beijing.ftl中的内容
练习转发,本次请求的参数是Beijin

/my/Other.ftl中的内容
练习练习转发,本次请求的参数不是Beijin,是其他字符串,url不变

请求地址:
http://127.0.0.1:8080/test/Beijin?name=xxx
在这里插入图片描述

请求地址:
http://127.0.0.1:8080/test/Beijin?name=Beijin
在这里插入图片描述
上述例子可以看出:请求的参数与规定的参数不匹配,页面会跳转至/my/Other.ftl的页面,但是请求路径不变,如果是相同情况,重定向的地址就会变为/test/Other

方式二:
通过httpServletRequest获取到请求路径做转发

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Controller
@RequestMapping("/test")
public class Forward {
@RequestMapping("Other")
public ModelAndView test2() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/my/Other");
    return modelAndView;
}

@RequestMapping("forward")
public ModelAndView forward(String name,HttpServletRequest httpServletRequest,
                    HttpServletResponse httpServletResponse){
    ModelAndView modelAndView=new ModelAndView();
    if(!name.equalsIgnoreCase("Beijin")){
        try {
            /**
             * 通过httpServletRequest获取到请求路径做转发,
             * 调用forward方法,传入Request与Response
             */
            httpServletRequest.getRequestDispatcher("/test/Other?name=" + name).
                    forward(httpServletRequest,httpServletResponse);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else {
        modelAndView.setViewName("/my/Beijin");
    }
    return modelAndView;
}
}

请求与方式一相同
第二种方式是第一种的底层实现,如果没有到控制层的情况下,只能用第二种,例如在拦截器中只能用第二种

猜你喜欢

转载自blog.csdn.net/qq_41767337/article/details/89314631
今日推荐