一、springmvc怎么redirect
1. 需求背景需求:spring MVC框架controller间跳转,需重定向。
有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示。本来以为挺简单的一件事情,并且个人认为比较常用的一种方式,一百度全都有了,这些根本不是问题,但是一百度居然出乎我的意料,一堆都不是我想要的结果。
无奈啊,自己写一篇比较全都供以后大家一百度吧,哈哈哈。
。是这些写的不是很全都人们给了我写这篇博客的动力。
2. 解决办法需求有了肯定是解决办法了,一一解决,说明下spring的跳转方式很多很多,我这里只是说一些自我认为好用的,常用的,spring分装的一些类和方法。(1)我在后台一个controller跳转到另一个controller,为什么有这种需求呢,是这样的。
我有一个列表页面,然后我会进行新增操作,新增在后台完成之后我要跳转到列表页面,不需要传递参数,列表页面默认查询所有的。方式一:使用ModelAndViewreturn new ModelAndView("redirect:/toList");这样可以重定向到toList这个方法方式二:返回Stringreturn "redirect:/ toList ";其它方式:其它方式还有很多,这里不再做介绍了,比如说response等等。
这是不带参数的重定向。(2)第二种情况,列表页面有查询条件,跳转后我的查询条件不能丢掉,这样就需要带参数的了,带参数可以拼接url方式一:自己手动拼接urlnew ModelAndView("redirect:/toList?param1="+value1+"¶m2="+value2);这样有个弊端,就是传中文可能会有乱码问题。
方式二:用RedirectAttributes,这个是发现的一个比较好用的一个类这里用它的addAttribute方法,这个实际上重定向过去以后你看url,是它自动给你拼了你的url。使用方法:attr.addAttribute("param", value);return "redirect:/namespace/toController";这样在toController这个方法中就可以通过获得参数的方式获得这个参数,再传递到页面。
过去的url还是和方式一一样的。(3)带参数不拼接url页面也能拿到值(重点是这个)一般我估计重定向到都想用这种方式:@RequestMapping("/save")public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)throws Exception {String code = service.save(form);if(code.equals("000")){attr.addFlashAttribute("name", form.getName());attr.addFlashAttribute("success", "添加成功!");return "redirect:/index";}else{attr.addAttribute("projectName", form.getProjectName());attr.addAttribute("enviroment", form.getEnviroment());attr.addFlashAttribute("msg", "添加出错!错误码为:"+rsp.getCode().getCode()+",错误为:"+rsp.getCode().getName());return "redirect:/maintenance/toAddConfigCenter";}}@RequestMapping("/index")public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)throws Exception {return "redirect:/main/list";}页面取值不用我说了吧,直接用el表达式就能获得到,这里的原理是放到session中,session在跳到页面后马上移除对象。
所以你刷新一下后这个值就会丢掉。3. 总结最底层还是两种跳转,只是spring又进行了封装而已,所以说跳转的方式其实有很多很多种,你自己也可以封一个,也可以用最原始的response来,也没有问题。
好了,就到这儿。其实也没有什么,但是知道了这个就很简单了,之前没搞懂,现在搞懂了,和大家分享。
有问题的给我留言。spring mvc3中的addFlashAttribute方法url: http://www.software8.co/wzjs/java/2943.html记得在spring mvc2中,当保存POJO到数据库后,要返回成功页面,如果这个时候要带点信息, 则要这样: Java代码: //第三个参数(UserModel user)默认为绑定对象 @RequestMapping(value = "/user/save", method = RequestMethod.POST) public ModelAndView saveUser(HttpServletRequest request, HttpServletResponse response,UserModel user) throws Exception { ModelAndView mv = new ModelAndView("/user/save/result");//默认为forward模式 // ModelAndView mv = new ModelAndView("redirect:/user/save/result");//redirect模式 mv.addObject("message","保存用户成功!"); return mv; } 而在spring mvc 3.1后,可以这样 Java代码: @RequestMapping(value = "/user/save", method = RequestMethod.POST) public ModelAndView saveUser(UserModel user, RedirectAttributes redirectAttributes) throws Exception { redirectAttributes.addFlashAttribute("message", "保存用户成功!");//使用addFlashAttribute,参数不会出现在url地址栏中 return "redirect:/user/save/result"; } 来个稍微完整点的例子,首先是一个表单,在其中填入一些信息: Java代码:
spring forward春天降临;拨快一个小时;向前进例句1.His friends spring forward to help him.他的朋友们跳起来去想要去帮他。 2.Spring forward to this annual thought, emotion will came over in life, or light or dark to linger heart.思想着这一年一度的春色,人生的感慨便会油然而起,或淡或浓地萦回心头。3.But so many people like to "spring forward" that it might be hard for officials to end the tradition, even if they determined it's wasteful.但很多人已经习惯了“钟表向前拨动”,这就对政府终结这一传统造成了困难,虽然他们都知道这是浪费。 4.Stop slacking spring forward.停止松艏倒缆。5.When did my colds a forward spring remove?我的冰冷何时曾扼杀早来的春季?。 1. return modelAndView例子@RequestMapping(value="/login", method=RequestMethod.GET)public ModelAndView loginPage(HttpSession session) {ModelAndView modelAndView = new ModelAndView("user/login");return modelAndView; //访问 WEB-INF/jsp/user/login.jsp文件}2. return “redirect:/index.jsp”例子@RequestMapping(value="/", method=RequestMethod.GET)public String index(HttpSession session){session.setAttribute("message", null);return "redirect:/index.jsp"; 访问根目录下index.jsp文件。 redirect为直接url 访问。 }如果 return “redirect:”+”a”; //则返回当前控制器方法对应a.jsp页面如果 return “redirect:/nademo/user/”+”user”; //则会返回不同控制器方法对应user.jsp页面. 注意:nademo/user为另一个控制器组件名,且前面必须加正斜杠3. spring mvc 请求转发和重定向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便可达到目的。 (2)返回字符串@RequestMapping(value="/forward",method=RequestMethod.GET)public String testForward(){return "forward:/index.action";}3.2 请求重定向对于请求转发可以分为:1.带参数 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参数进行传递:注意:1. 使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如上代码即为http:/index.action?a=a2. 使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,这验证了上面说的,b被访问后就会从session中移除。 对于重复提交可以使用此来完成。另外,如果使用了RedirectAttributes作为参数,但是没有进行redirect呢?这种情况下不会将RedirectAttributes参数传递过去,默认传forward对应的model,官方的建议是:p:ignoreDefaultModelOnRedirect="true" />设置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect属性,这样可以提高效率,避免不必要的检索。 (2)无参数@RequestMapping(value="/redirect",method=RequestMethod.GET)public String testRedirect(){return "redirect:/index.action";}。 SpringMvc请求方式分为转发、重定向两种,是用forward和redirect关键字在controller层进行处理。 下面代码实现了这两种不同的请求方式:import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.servlet.mvc.support.RedirectAttributes;@Controllerpublic class HelloController {/*** 转发形式* @param name* @param model* @return*/@RequestMapping("/helloForward") public String helloForward(@RequestParam(value="name", required=false, defaultValue="World2017") String name, Model model) {model.addAttribute("name", name); return "hello";}@RequestMapping("/hello") public String hello() {return "hello";}/*** 使用RedirectAttributes类* @param name* @param redirectAttributes* @return*/@RequestMapping("/helloRedirect") public String helloRedirect(@RequestParam(value="name", required=false ) String name, RedirectAttributes redirectAttributes) {redirectAttributes.addFlashAttribute("name", name);return "redirect:/hello";}@RequestMapping("/hello2") public String hello2(Model model,HttpServletRequest request) {HttpSession session = request.getSession();model.addAttribute("name",session.getAttribute("name")); return "hello";}/*** 常规做法,重定向之前把参数放进Session中,在重定向之后的controller中把参数从Session中取出并放进ModelAndView* @param name* @param request* @return*/@RequestMapping("/helloRedirect2") public String helloRedirect2(@RequestParam(value="name", required=false ) String name, HttpServletRequest request) {request.getSession().setAttribute("name", name);return "redirect:/hello2";}}在使用redirect进行重定向时请求的URL链接发生了改变,并且在controller中如果像reward一样 model.addAttribute("name", name)放置的参数,重定向之后是无法获取到的,所以重定向需要另外的方式进行参数的传递,上面的程序介绍了两种重定向传参的方式:①、重定向之前把参数放进Session中,在重定向之后的controller中把参数从Session中取出并放进ModelAndView②、使用RedirectAttributes类,这种实现方式比较简单。再总结一下servlet中转发request.getRequestDispatcher().forward()和重定向response.sendRedirect()的区别:①、转发是一次请求,一次响应,而重定向是两次请求,两次响应②、转发:servlet和jsp共享一个request,重定向:两次请求request独立,所以前面request里面setAttribute()的任何东西,在后面的request里面都获取不到③、转发:地址栏不会改变,重定向:地址栏发生变化。 转载请注明出处51数据库 » springmvcforword二、Spring Forward是什么意思
三、Springmvc中的return modelAndView和return "xxxx"的区别
四、spring mvc怎么重定向
有一个部位和马一样长