本篇总结内容如下:
前言
spring MVC添加业务数据的几种方式
HttpServletRequest
Map
Model
ModelAndView
@ModelAttribute
@SessionAttributes
总结
分享交流
前言
上一篇文章总结的是spring MVC的数据绑定,在项目开发中主要服务于数据前端到后端的传输,这一篇文章总结spring MVC视图层实现机制,在项目开发中主要服务于数据后端到前端的传输。
我们项目的运转通常都离不开数据,不论是用户数据到后端处理,还是后端数据到前端响应,都是需要一些机制处理的。
用户请求的数据后端如何去接收,后端会以什么样的形式接收,是需要我们考虑的。我们可以定义基本数据类型接收,也可以定义数组类型,集合类型或是对象类型来接收。或者我们可以通过JSON数据格式来接收。
后端的数据接收后会经过处理,有的时候还会需要返回数据给前端,那么会以什么样的类型传给前端,前端又是怎么接收这些数据的,正是本篇文章所要讲的内容。
spring MVC添加业务数据的几种方式
•HttpServletRequest
•Map
•Model
•ModelAndView
•@ModelAttribute
•@SessionAttributes
HttpServletRequest
我们之前可能写过java web的项目,用的是servlet,我们可以回想一下,当时写数据处理的时候,后端是如何将数据传给前端的,我们是在方法定义处添加HttpServletRequest,在方法体中直接对request对象进行操作,如下所示:
@Controller
public class Test {
@RequestMapping("/test")
public String hello(HttpServletRequest request){
User user=new User();
user.setName("lisi");
user.setId(101);
request.setAttribute("user",user);
return "hello";
}
}
创建hello.jsp
<body>
hi
${user.id}
${user.name}
</body>
运行tomcat,访问http://localhost/test
业务数据绑定到request域对象,前端通过el表达式获取${}。
Spring MVC在内部使用Model接口存储业务数据,在调用业务方法前会创建一个隐含的对象,作为业务数据的存储容器。我们在项目中所写的Map,Model等等都是在设置业务方法的入参类型,Spring MVC会将隐含对象的引用传递给入参,从而使开发者可以对模型中的所有数据进行管理,包括访问和添加。我们只需要在业务方法添加相应类型的入参,方法体中便可通过入参的操作来完成对业务数据的添加。
Map
我们设置业务方法的入参为Map类型。
@RequestMapping("/test1")
public String test1(Map<String,Object> map){
User user=new User();
user.setId(1001);
user.setName("张三");
map.put("user",user);
return "hello";
}
Model
@RequestMapping("/test2")
public String test2(Model model){
User user=new User();
user.setId(1002);
user.setName("李四");
model.addAttribute("user",user);
return "hello";
}
ModelAndView
与Map和Model不同的是,ModelAndView不仅包含业务数据,也包含了视图信息,如果用ModelAndView处理业务数据,业务方法的返回值必须是ModelAndView对象。
业务方法对ModelAndView进行两个操作:填充业务数据,绑定视图信息。
关于ModelAndView的使用有8种方式,具体操作如下:
@RequestMapping("/test3")
public ModelAndView test3(ModelAndView modelAndView){
User user=new User();
user.setId(1003);
user.setName("王五");
modelAndView.addObject("user",user);
modelAndView.setViewName("hello");
return modelAndView;
}
这里只演示一种项目中最常用的,其余七种我没在这里演示,主要是这八种相差不是很大,我觉得没必要去记其余七种。
@ModelAttribute
spring MVC还可以通过@ModelAttribute注解的方式添加业务数据,具体使用分两个步骤:
(1)定义一个方法,该方法用来返回填充到业务数据的对象;
(2)给该方法添加@ModelAttribute注解,注意,该方法并不是影响相应请求的方法。
@RequestMapping("/test4")
public String test4(){
return "hello";
}
@ModelAttribute
public User getUser(){ //注意该业务方法不会影响响应请求
User user=new User();
user.setId(1004);
user.setName("赵六");
return user;
}
添加@ModelAttribute注解的方法,会在spring MVC调用任何一个业务方法之前自动调用。因此在执行test4业务方法之前,会先调用@ModelAttribute注解的方法getUser,获取返回值user对象,spring MVC会自动将该对象值填充到业务数据中,进而绑定到域对象中。
域对象中的数据都是以键值对(key-value)的形式保存的,那么此时的key是什么呢?默认取业务数据对应类的首字母小写之后的类名,例如上边例子业务数据的对应类名为User,则key为user。
如果getUser没有返回值,则必须手动在该方法中填充业务数据,使用Map或Model均可。
@RequestMapping("/test4")
public String test4(){
return "hello";
}
@ModelAttribute
public void getUser(Map<String,Object> map){
User user=new User();
user.setId(1004);
user.setName("赵六");
map.put("user",user);
}
@RequestMapping("/test4")
public String test4(){
return "hello";
}
@ModelAttribute
public void getUser(Model model){
User user=new User();
user.setId(1004);
user.setName("赵六");
model.addAttribute("user",user);
}
@SessionAttributes
以上几个方法都是将业务数据保存在request对象中,如果需要将业务数据保存在session对象中,只需要在类定义出添加@SessionAttributes(value=“xxx”)注解即可,如下所示:
@Controller
@SessionAttributes(value="user")
public class Test {
//省略业务方法代码
}
此时,无论通过上面哪种方式执行业务代码,将业务数据绑定到request对象中的同时,也会将业务数据绑定到session对象中,也就是说request和session对象中会同时存在业务数据。
@SessionAttributes除了可以通过key值绑定,也可以通过业务数据的数据类型进行绑定,如下所示:
@Controller
@SessionAttributes(types = User.class)
public class Test {
//省略业务方法代码
}
@SessionAttributes可同时绑定多个业务数据,如下所示:
通过key值绑定:
@Controller
@SessionAttributes(value = {"user","address"})
public class Test {
//省略业务方法代码
}
通过业务数据的数据类型进行绑定:
@Controller
@SessionAttributes(types = {User.class,Address.class})
public class Test {
//省略业务方法代码
}
总结
spring MVC的业务数据解析,具体是指将控制器的业务方法处理结果响应给客户端的过程,及C(controller)–V(view)的映射,可以使用spring MVC自带的ModelAndView组件同时将业务数据和视图信息进行绑定,这种方式是我们开发中常用的,同时也可以使用Model或Map来完成业务数据得解析。
分享交流
以上便是我对这一部分的理解,如果有错误或者你有其他疑惑都可以留言给出,我都会一一进行回复,希望对你有所帮助,如果写的不好也请您多多包涵。欢迎在下方补充留言哟。
对SSM框架感兴趣的童鞋,可以移步这里,在这里你可以快速的搭建好一个SSM框架。
如果你在写项目的时候,遇到一些不寻常的问题,也可以关注我的博客园,上边会发布一些我在写项目中遇到的各种问题以及解决方式。