JAVA 如何获取modelandview的返回值?

JAVA 如何获取modelandview的返回值?,第1张

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"

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11548916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存