SpringMVC中使用servlet以及,处理模型数据(将数据存入request,session)。

一、Servlet API

1.Spring MVC可以使用Servlet API作为请求方法的参数。

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Local
  • InputStream
  • OutputStream
  • Read
  • Write

示例:将ServletAPI作为方法的参数,方法中就可以使用api所对应的方法。

@RequestMapping("/test")
	public String test(HttpServletRequest request,HttpServletResponse response,
	HttpSession session) {
		
		// 向request中存放数据。
		request.setAttribute("key", "value");
		
		return "test"; // 返回视图名称

	}

处理模型数据

Spring MVC提供一下几种途径返回模型数据:
    1.ModeAndView:将处理方法的返回类型设置为ModeAndView,方法体即可通过该模型对象添加模型数据。
    2.Map及Model形参:当形参为Map,Model,ModelMap时,处理方法返回时,Map中的数据会自动添加到模型中。
    3.@SessionAttributes:将模型中的某个属性存储到Session中,以便多个请求之间共享这个属性。
    4.@ModelAttribute:方法形参标记该注解后,形参对象就会放到模型中。

一、ModelAndView

1)控制器处理方法如果返回ModelAndView,即包含视图信息,也包含模型信息。
2)构造方法
	提供了多种构造方法的重载
3)添加模型数据:
	ModelAndView addObject(String attributeName, Object attributeValue);
	ModelAndView addAllObjects(Map<String, ?> modelMap) ;
4)添加视图
	void setView(View view);
	void setViewName(String viewName);
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){

	//set方法添加视图
	/*ModelAndView mav = new ModelAndView();
	mav.setViewName("test");*/

	// 构造方法添加视图
	ModelAndView modelAndView = new ModelAndView("hello");
	//添加单个值
	modelAndView.addObject("h","Hello Spring MVC");		
	return modelAndView;
}

Map形式

1)Spring MVC在内部使用了一个Model接口存储模型数据。
2)Spring MVC在调用方法前会创建一个隐含的模型对象作为数据模型的存储容器。如果传入的参数为Map或者Model类型,SpringMVC会自动将对象保存到模型数据中。
@RequestMapping("/testMap")
	public String testMap(Map<String,Object> map){
		map.put("key", "value");
		return "test";
	}

@SessionAttributes(将数据存入session)

1)如果希望在多个请求之间共享某个模型的数据,则可以在控制器类上标注一个@SessionAttributes,SpringMVC会将对应的属性存储到Session中。
2)@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些类型放到Session中。
    @SessionAttributes(types=User.class) :将隐含模型中所有类型为User性添加到Session中。
    @SessionAttributes(value={“user1”,“user2”}):将user1对象和user2放入Session中。
    @SessionAttributes(types={User.class,Dept.class})
    @SessionAttributes(value={“user1”,“user2”},types={Dept.class}):
@SessionAttributes只能用来修饰类。

示例:

    1)保存用户到Session中


// 会将类中所有的String类型的变量存入session
// @SessionAttributes(types= {String.class})

// 会将该类中变量名为user的变量都存入session
@SessionAttributes("user")
@Controller
@RequestMapping("world")
public class HelloWorld {
	@RequestMapping("/testSession")
	public String testSession(Map<String,Object> map){
		User user = new User();
		user.setUsername("zhangsan");
		user.setUserpass("123");
		user.setAge(20);
		map.put("user", user);
		return "hello";
	}
}

@SessionAttributes注解只能放在类的前面,而不能放在方法前。

@ModelAttribute

1.在方法定义上定义@ModelAttribute注解:
    1)SpringMVC调用方法前,会逐个调用方法上标注了@ModelAttributes的方法。
    2)将@ModelAttributes中的属性保存到map中,可以在执行表单提交生成对象之前,替换执行方法同名的形参。
2.在方法的形参上定义@ModelAttribute注解:
    1)可以从隐含对象中获取隐含的模型中获取对象,再将请求参数绑定到对象中,再传入形参。
    2)将方法形参对象添加到模型中。

@ModelAttribute
public User getUser(){
	User user = new User();
	System.out.println("调用 getUser 方法");
	//默认保存名字为类名首字母小写的user对象到Request中
	return user;
}

@ModelAttribute
public void getUserById(Integer id,Map<String,Object> map){
	User myuser = new User();
	map.put("myuser", myuser);
	//手动指定user对象的名称,到Request中
	System.out.println("调用 getUser 方法");
}

@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("user")User user){
	System.out.println(user);
	return "hello";
}

由@SessionAttributes引发的异常

1.当类使用@SessionAttributes修饰,而方法中使用了和SessionAttributes修饰同名的映射参数,确没有添加@ModelAttribute修饰时,则会报错。
在这里插入图片描述
2.解决方案
    1)参数前使用@ModelAttribute修改映射的名称。
    2)和@SessionAttributes中的名称不同。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值