欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-06 22:06:00
controller方法的返回值可以有以下几种:1、返回modelandview返回modelandview时最常见的一种返回结果。需要在方法结束的时候定义一个modelandview对象,并对mod...

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

1、返回modelandview

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

2、返回string

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

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

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

public string testcontroller(model model){
model.addattribute(attrname,attrvalue);//相当于modelandview的addobject方法
return "逻辑视图名";
 }

2):代表redirect重定向

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

案例:

public string testcontroller(model model){
 return "redirect:path";//path代表重定向的地址
 }

3):代表forward转发

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

案例:

 public string testcontroller(model model){
 return "forward:path";//path代表转发的地址
 }

3、返回void

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

1)使用request转发页面

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

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

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

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

response.setcharacterencoding("utf-8"); 
response.setcontenttype("application/json;charset=utf-8"); 
 response.getwriter.write("json串"); 

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

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

1)modelandview

@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(最常用,最方便,建议)

@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

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的注解

例:

@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这个对象。

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