文章目录
1.转发和重定向的区别
- 转发是同次请求(由服务器请求下一个资源),即request.getRequestDispatcher().forward(),是一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端;
- 重定向是多次请求(由服务器重定向到客户端,由客户端请求下一个资源),即response.sendRedirect(),是一种客户端行为,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏中的URL会改变。
- 一句话总结:转发是由服务器发出请求,重定向是由客户端发出请求 。
1.1basePath路径
说明:Jsp和html中的所有的超链接地址都是基于basePath路径,即当前web项目在服务器的根目录:basePath = http://localhost:8080/项目名/。
###1.2 绝对路径与相对路径
- 绝对路径是指文件硬盘上真正存在的路径。如"hh.jpg"这张照片是存放在硬盘的"D:\image"目录下,那么"hh.jpg"这张照片的绝对路径是"D:\image\hh.jpg"。
- 相对路径就是指由这个文件所在的路径引起的跟其它文件或文件夹的路径关系,使用相对路径可以为我们带来非常多的便利。
- 注意:相对路径使用"/“字符作为目录的分隔字符,而绝对路径可以使用”“或”/“字符作为目录的分隔字符。由于"img"目录是"image"目录下的子目录,因此在"img"前不用再加上”/“字符,而且在相对路径里常使用”…/"来表示上一级目录。
1.3URLString前有加 /
注意:转发和重定向的URLString前有加 / 为绝对路径,反之为相对路径。
1.4 重定向的相对路径和绝对路径
- 假设通过表单请求指定的Url资源:action=“LoginServlet”,则表单生成的请求地址为:http://localhost:8080/项目名/LoginServlet。
- 在servlet处理请求之后重定向到下面指定资源,参数可以指定为相对路径或绝对路径或web应用程序。
- ①相对路径:response.sendRedirect(“Manager/index.jsp”),生成的地址:原来请求地址+参数生成完整的URL即:http://localhost:8080/项目名/Manager/index.jsp
- ②绝对路径:response.sendRedirect("/Manager/index.jsp"),生成的地址:web服务器本身地址+参数生成完整的URL 即:http://localhost:8080/Manager/index.jsp
- ③其他web应用地址:response.sendRedirect(“http://www.baidu.com”), 容器直接定向到该URL。
1.5 转发的相对路径和绝对路径
- 在servlet处理请求之后转发到以下指定资源,参数可以指定为相对路径或绝对路径。
- ①相对路径:相对路径情况下生成的完整URL与重定向方法相同。
- ②绝对路径:绝对路径与重定向不同,容器将相对于Web应用的根目录加参数生成完整的URL,生成的地址: 原来请求地址+参数生成完整的URL,即:http://localhost:8080/项目名/Manager/index.jsp
- 转发用相对路径和绝对路径地址都一样。注意:ServletContext.getRequestDispatcher(UrlString)中,参数只能指定为绝对路径,生成的完整URL与HttpServletRequest.getRequestDispatcher(String)相同。
2. 在servlet调用方法
- 1.Servlet中有两种方式获得转发对象(RequestDispatcher):
一种是通过HttpServletRequest的getRequestDispatcher(UrlString)方法获得。
一种是通过ServletContext的getRequestDispatcher(UrlString)方法获得。 - 2.重定向的方法只有一种:HttpServletResponse的sendRedirect(UrlString)方法。
3.spring MVC中的转发和重定向写法
3.1 请求转发
3.1.1 ModelAndView
@RequestMapping(value="/model",method=RequestMethod.GET)
public ModelAndView testForward(ModelAndView model,@RequestParam(value="id",defaultValue="1",required=false)Long id){
User u = getBaseService().get(User.class, id);
model.addObject("user", u);
model.setViewName("forward:index.jsp");
return model;
}
如上代码,如果返回modelAndView 则可以如红色标注,添加forward即可,若想重定向,可把forward替换成redirect便可达到目的。
3.1.2 String
@RequestMapping(value="/forward",method=RequestMethod.GET)
public String testForward(){
return "forward:/index.action";
}
3.2 重定向
####3.2.1 带参数
@RequestMapping(value="/redirect",method=RequestMethod.GET)
public String testRedirect(RedirectAttributes attr){
attr.addAttribute("a", "a");
attr.addFlashAttribute("b", "b");
return "redirect:/index.action";
}
带参数可使用RedirectAttributes参数进行传递:
注意:
-
使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面,如上代码即为http:/index.action?a=a
-
使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,这验证了上面说的,b被访问后就会从session中移除。对于重复提交可以使用此来完成.
3.2.2不带参数
@RequestMapping(value="/redirect",method=RequestMethod.GET)
public String testRedirect(){
return "redirect:/index.action";
}
4 springboot转发重定向
参考:
http://blog.csdn.net/liboyang71/article/details/72846527
项目结构:
4.1 默认文件夹
首先解释一下每个文件夹的作用,如果你是用的是idea创建的springboot项目,会在项目创建的一开始resources文件夹下自动创建static以及templates文件夹。也就是说项目初始时有java、resource、static以及templates 这几个文件夹。
一般static下存放js以及css样式文件,templates存放html页面。
4.2 转发和重定向
4.3 受保护的文件
首先static文件夹以及templates文件夹是受保护的,也就是说相当于你将文件放到了传统的ssh或ssm项目的WEB-INF下了。所以也就是说这两个文件夹下的文件是无法通过url直接访问的,以至于在springmvc下使用重定向会报404。
4.4 直接访问的html或者css该如何存放呢?
- 方式一
可以在resources下创建一个名为public的文件夹,顾名思义,放在此文件夹下的文件是共有的,可以直接通过url访问,当然也可以springmvc重定向访问啦。 - 方法二
在main下创建webapp文件夹,将文件放到此文件夹下,效果同上
4.5 转发写法
@Controller
public class ThymeleafController {
@RequestMapping(value = "cs")
public String cs(Model model) {
return "index";
}
}
4.6 重定向写法
@Controller
public class ThymeleafController {
@RequestMapping(value = "cs")
public String cs(Model model) {
return "redirect:index.html";
}
4.7@RestController使用重定向redirect
@RestController注解相当于@ResponseBody + @Controller合在一起的作用 。
使用该注解后上述重定向只能返回一个字符串,解决办法:
@RestController
public class FooController{
@RequestMapping(value = "/foo")
public void cs(HttpServletResponse reponse ) {
response.sendRedirect("some-url");
}
}