好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

浅谈springMVC中controller的几种返回类型

Controller方法的返回值可以有以下几种:

1、返回ModelAndView

返回ModelAndView时最常见的一种返回结果。需要在方法结束的时候定义一个ModelAndView对象,并对Model和View分别进行设置。

2、返回String

1):字符串代表逻辑视图名

真实的访问路径=[前缀]+逻辑视图名+[后缀]

注意:如果返回的String代表逻辑视图名的话,那么Model的返回方式如下:

?

1

2

3

4

public String testController(Model model){

model.addAttribute(attrName,attrValue); //相当于ModelAndView的addObject方法

return "逻辑视图名" ;

  }

2):代表redirect重定向

redirect的特点和servlet一样,使用redirect进行重定向那么地址栏中的URL会发生变化,同时不会携带上一次的request

案例:

?

1

2

3

public String testController(Model model){

  return "redirect:path" ; //path代表重定向的地址

  }

3):代表forward转发

通过forward进行转发,地址栏中的URL不会发生改变,同时会将上一次的request携带到写一次请求中去

案例:

?

1

2

3

public String testController(Model model){

return "forward:path" ; //path代表转发的地址

}

3、返回void

返回这种结果的时候可以在Controller方法的形参中定义HTTPServletRequest和HTTPServletResponse对象进行请求的接收和响应

1)使用request转发页面

?

1

request.getRequestDispatcher( "转发路径" ).forward(request,response);

2)使用response进行页面重定向

?

1

response.sendRedirect( "重定向路径" );

3)也可以使用response指定响应结果

?

1

2

3

response.setCharacterEncoding( "UTF-8" );

response.setContentType( "application/json;charset=utf-8" );

  response.getWriter.write( "json串" );

以上三种返回值没有什么重要和不重要的分别,一般来说都会使用到, 只不过有的时候使用的方式会有一些细微的差别

补充:SpringMvc中,Controller方法的多种实现方式(指定返回到哪个页面,指定返回到页面的数据)

1)ModelAndView

?

1

2

3

4

5

6

7

8

9

10

11

@RequestMapping ( "/list" )

  public ModelAndView itemsList() throws Exception{ 

  List<Items> list = itmesService.list();

  //创建ModelAndView视图

  ModelAndView modelAndView = new ModelAndView();

  //将list数据添加到试图里

  modelAndView.addObject( "itemList" , list);

  modelAndView.setViewName( "itemList" ); //设置视图的名称,即返回到哪个页面

  //由于有视图解析器的作用,省去了前缀和后缀,其实访问的页面为("/WEB-INF/jsp/itemList.jsp")

  return modelAndView;

  }

2) String(最常用,最方便,建议)

?

1

2

3

4

5

6

7

8

9

10

11

12

@RequestMapping ( "/itemEdit/{id}" )

  public String itemEdit( @PathVariable ( "id" ) Integer id, HttpServletRequest reuqest,

   Model model) throws Exception{

 

  //String idStr = reuqest.getParameter("id");

  Items items = itmesService.findItemsById(id);

  //将items数据加到视图中

  model.addAttribute( "item" , items);

 

  //这里返回editItem,在@Controller的注解下,回自动添加前缀和后缀,实则是返回到页面("/WEB-INF/jsp/editItem.jsp")

  return "editItem" ;

  }

3) 返回void

?

1

2

3

4

5

6

7

8

9

10

11

12

public void update(Items items,HttpServletRequest request,HttpServletResponse response) throws Exception{

  //返回数据,将items的内容放入items里,jsp页面调用items就行

  request.setAttribute( "items" , items);

  //返回指定的页面

  //如果是void类型的话,就不会去调用SpringMvc的架构,因此无法自动加载视图解析器,所以跳转的

  //网页名称应该为其全路径名称

  request.getRequestDispatcher( "/WEB-INF/jsp/success.jsp" ).forward(request, response);

  }

就不会去调用SpringMvc的架构,因此无法自动加载视图解析器,所以跳转的

  //网页名称应该为其全路径名称

  request.getRequestDispatcher( "/WEB-INF/jsp/success.jsp" ).forward(request, response);

  }

4)关于方法中所需要的参数定义

举3)中的例子,我在update方法中定义了:

Items items,HttpServletRequest request,以及HttpServletResponse response这三个类型.

但是大家可以发现,其实我在方法中是没有用到response的,因此,可以把其删掉,对于程序来说,并不会

产生影响。

因此,大家在定义方法的时候,可以根据自己的实际需要来定义所需要的类,或者大家怕以后代码需要改麻烦的话,

全部定义上也是可以的。

更新

5)若如果想要接口不是跳转页面,而是返回数据,则需要添加@ResponseBody的注解

例:

?

1

2

3

4

5

6

7

8

9

@RequestMapping ( "atimynyc/getUser" )

@ResponseBody

public User getUser(String id){

   User user = new User();

   user.setUserName = "Atimynyc" ;

   user.setUserAge = 18 ;

   user.setUserPhone = "123456789" ;

   return User;

}

通过加上ResponseBody,springmvc就知道该接口是返回数据,例,当我们用ajax调用上面的接口url时atimynyc/getUser,就可以获得user这个对象。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/qq_16071145/article/details/51222372

查看更多关于浅谈springMVC中controller的几种返回类型的详细内容...

  阅读:36次