0、为什么要使用域对象
我们现在能获取请求参数了,那我们下一步处理请求的过程就是将请求参数作为条件,去调用service层处理业务逻辑,service去调用dao访问数据库,最后将我们的结果返回给service,最后再返回给我们的控制层,有数据的话是要往页面中去发送的,所以我们需要将这些数据在域对象中进行共享。
1、request一次请求2、session一次会话,浏览器到浏览器关闭的过程,session中的数据跟服务器是否关闭没关系,只跟浏览器是否关闭有关系,因为session里有钝化和活化,钝化就是当我们的服务器关闭了,浏览器没有关闭,会话仍然在继续,这时session中的数据就会经过序列化到我们的子盘上,浏览器仍然没有关闭,这时将服务器开启了,将钝化后的内容,重新读取到session中3、(最大的域对象)servletcontext也叫application,指的是整个应用的范围(服务器开启到服务器关闭),服务器开启时创建,服务器关闭时销毁。因为域对象用的都是同一个,所以才能够获取共享数据。
例如通过转发获取请求域中的数据,因为转发也属于一次请求。
只要是JSESSIONID的Cookie存在,那我们Session里创建的都是同一个session,所以可以在工程*享数据。
如果说把数据放在请求域中,比如说查询列表,表单回显的时候用的是request。
也可以放在session或者application中,但是没有必要,因为我们查询每一次查询数据的时候,都要重新查询,因为我们既有查询功能也有增删改功能,所以我们的数据一直在发生变化的状态,所以说我们每次获取都需要重新获取,才能获取到一个最新的状态。
考虑时需要考虑能实现功能的,范围最小的域对象。
一、我们如何向域对象*享数据
之前在原生的Servlet*享数据,我们就需要相对应的对象,例如要有request,才能往request域对象存储数据等。
一、使用原生ServletAPI向我们的域对象共享数据
图片
request.setAttribute();
request.getAttribute();
request.removeAttribute();
下面的return “success”就是转发,如果不是转发现在访问的页面就是index.html。WebINF下面的内容重定向访问不了,只能用转发去访问。
二、SpingMVC提供的API,向我们提供四种方法
1、使用ModelAndView向request域对象共享数据
控制器方法返回值必须返回ModelAndView,Model与View是两个功能,一个是模型数据,用来向例如request请求域*享数据,另一个是视图,可以用来设置视图跳转,咱们要封装模型和视图的两个功能,就需要把这个对象交给我们的Dispatcher,这样Diapatcher(前端控制器)才可以去解析它。
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
/**
* ModelAndView有Model和View的功能
* Model主要用于向请求域共享数据
* View主要用于设置视图,实现页面跳转
*/
ModelAndView mav = new ModelAndView();
//向请求域共享数据
mav.addObject("testScope", "hello,ModelAndView");
//设置视图,实现页面跳转
mav.setViewName("success");
return mav;
}
ModelAndView类中有可以设置视图名称mav.setViewName("success"),这就相当于以往控制器方法中返回的字符串return “success”;
因为必须要返回对象,所以不能放在形参上,而且需要在控制器方法内new ModelAndView对象。
2、使用Model向request域对象共享数据
@RequestMapping("/testModel")
public String testModel(Model model){
model.addAttribute("testScope", "hello,Model");
return "success";
}
3、使用Map向request域对象共享数据
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
map.put("testScope", "hello,Map");
return "success";
}
4、使用ModelMap向request域对象共享数据
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("testScope", "hello,ModelMap");
return "success";
}
三、SpringMVC提供的源码分析
Model、ModelMap、Map的关系
利用反射获取Model(接口),ModelMap(类),Map(接口)控制器方法中的实例化对象的实例化类的全类名
model.getClass().getName(); map.getClass().getName(); modelMap.getClass().getName();
上面这些方法是获取对象的实例化类名,后来发现上面的实现类都是下面的这个:
org.springframework.validation.support.BindingAwareModelMap
不管我们用什么方式,最终都会把我们的模型数据与视图信息封装到ModelAndView中
源码自己看视频。
Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的
public interface Model{}
public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}
四、向session域共享数据
@RequestMapping("/testSession")
public String testSession(HttpSession session){
session.setAttribute("testSessionScope", "hello,session");
return "success";}
五、向application域共享数据
@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
ServletContext application = session.getServletContext();
application.setAttribute("testApplicationScope", "hello,application");
return "success";
}