1、使用ModelAndView作为返回值,首先在方法头中进行声明:
public ModelAndView getNameById(HttpServletRequest request,HttpServletResponse response) throws Exception{}
2、然后在方法体中实例化ModelAndView。
ModelAndView mv=this.getAutoView().addObject("object",object)
3、最后在方法中的末尾加上return mv
那么mv中的值是什么呢?
ModelAndView: reference to view with name '/officeoa/test/bjqGetNameById.jsp'model is {bjq=com.hotent.officeoa.model.test.Bjq@1d001c5c[id=10000007960011,name=课本,password=12ab,department=测试3,departmentID=,leader=22222,leaderID=]}
解析:mv中有一个view值和一个model值。view是我们条转到的页面的地址,model则是页面中会用到的数据。
4、最后附上一个完整的方法及后台输出的值。
ModelAndView的构造方法有7个。但是它们都是相通的。这里使用无参构造函数来举例说明如何构造ModelAndView
实例。
ModelAndView类别就如其名称所示,是代表了MVC Web程序中Model与View的对象,不过它只是方便您一次返回这两个对象的holder,Model与View两者仍是分离的概念。
最简单的ModelAndView是持有View的名称返回,之后View名称被view resolver,也就是实作org.springframework.web.servlet.View接口的实例解析,例如 InternalResourceView或JstlView等等:
ModelAndView(String viewName)
如果您要返回Model对象,则可以使用Map来收集这些Model对象,然后设定给ModelAndView,使用下面这个版本的ModelAndView:
ModelAndView(String viewName, Map model)
Map对象中设定好key与value值,之后可以在视图中取出,如果您只是要返回一个Model对象,则可以使用下面这个ModelAndView版本:
ModelAndView(String viewName, String modelName, Object modelObject)
藉由modelName,您可以在视图中取出Model并显示。
ModelAndView类别提供实作View接口的对象来作View的参数:
ModelAndView(View view)
ModelAndView(View view, Map model)
ModelAndView(View view, String modelName, Object modelObject)
一个例子是org.springframework.web.servlet.view.RedirectView,ModelAndView预设是使用forward来转发请求结果至视图,使用RedirectView的话,则会使用redirect将请求重导至视图,例如:
…
public ModelAndView handleRequest(....) … {
....
return new ModelAndView(new RedirectView(this.getViewPage()))
}
....
在这边,viewPage的地址是从服务器网页根目录开始指定,而不是Web应用程序的根目录,所以您的getViewPage()传回的地址必须像是 /springapp/pages/index.htm这样的地址,其中springapp是您的Web应用程序目录。
使用forward的话,网址列上并不会出现被转发的目标地址,而且forward是在Web应用程序之内进行,可以访问Web应用程序的隐藏目录,像是WEB-INF,然而forward只能在Web应用程序中进行,不能指定至其它的Web应用程序地址。
使用redirect的话,是要求客户端浏览器重新发出一个指定的请求地址,因此网址列上会出现被重导的目录地址,重导的请求是由浏览器发出,所以不能访问Web应用程序中的隐藏目录,像是WEB-INF,然而重导是重新要求一个网页,所以可以指定至其它的Web应用程序地址。
DispatcherServlet会根据传回的ModelAndView来解析View名称,并处理给予的Model。View名称的解析是委托给实作org.springframework.web.servlet.ViewResolver接口的实例,ViewResolver接口定义如下:
public interface ViewResolver {
public view resolveViewName(String, Locale locale) throws ServletException
}
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(ModelAndViewmodel,@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=a
2. 使用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"
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)