SpringMVC-Controller处理器方法的返回值

  • Servlet

    • 接收请求数据
      • 同步请求
      • 异步请求
    • 处理请求
    • 响应用户
      • 同步响应:
        • 数据存储到request域,转发到页面,页面使用模板引擎(EL,JSTL,Freemark,thymeleaf)解析数据
      • 异步响应:
        • JSON—页面—dom操作:拼标签,添加到页面指定的位置
  • Controller处理器方法的参数

    • HttpServletRequest HttpServletResponse HttpSession Model 用户请求参数(基本类型,String对象)

1. Controller理器方法的返回值-ModelAndView

一般用在同步请求

Model就是request域中的数据

View就是要跳转的视图或者其他处理器方法

@RequestMapping("/my.do")
	public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp){
		ModelAndView mv = new ModelAndView();
		// 从前端获取数据
		String sname = req.getParameter("sname");
		int sage = Integer.parseInt(req.getParameter("sage"));
		char ssex = req.getParameter("ssex").charAt(0);
		int cid = Integer.parseInt(req.getParameter("cid"));
		Student student = new Student(sname, sage, ssex, cid);
		// 执行添加学生方法
		studentService.addStudent(student);
		mv.addObject("msg", "插入成功");
		mv.setViewName("/jsp/index.jsp");
		return mv;
	}

只需要跳转,不需要向request域中存储数据

return new ModelAndView(“/视图页面”);

@RequestMapping("/my.do")
	public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp){
		
		return new ModelAndView("/jsp/mvctest.jsp");
	}

2.** Controller理器方法的返回值-String

一般用在同步请求

String就是视图名

//Controller处理器方法的返回值—String
	@RequestMapping("/test01.do")
	public String test01(HttpServletRequest req, HttpServletResponse resp,Model model){
		model.addAttribute("msg", "测试");
		//String就是视图名
		return "/jsp/mvctest.jsp";
	}

3. Controller理器方法的返回值-void

同步请求:

​ 使用原生的ServletAPI

//Controller处理器方法的返回值—void
	@RequestMapping("/test02.do")
	public void test02(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
		//同步请求,使用原生的ServletAPI
		req.setAttribute("msg", "测试");
		req.getRequestDispatcher("/jsp/mvctest.jsp").forward(req, resp);
	}

异步请求:

​ 序列化JSON:

jsonlib:老

gson:google

fastjson:阿里

Jackson:

jackson jar包:

​ jackson-annotations-2.7.0.jar

​ jackson-core-2.7.0.jar

​ jackson-databind-2.7.0.jar

//Controller处理器方法的返回值—void
	@RequestMapping("/test03.do")
	public void test03(HttpServletRequest req, HttpServletResponse resp) throws JsonGenerationException, JsonMappingException, IOException{
		//异步请求,序列化json
		Student s1 = new Student(1,"张三",18,'女',2);
		Student s2 = new Student(2,"李四",20,'女',2);
		List<Student> students = new ArrayList<Student>();
		students.add(s1);
		students.add(s2);
		//序列化json的核心类:ObjectMapper
		ObjectMapper objectMapper = new ObjectMapper();
		//List集合
		objectMapper.writeValue(resp.getWriter(), students);
		//对象
		//objectMapper.writeValue(resp.getWriter(), s1);
	}
<script type="text/javascript">
	$(function(){
		$.post("<c:url value='/test03.do'/>",
				null,
				function(data){
					/* 该方法把data转换成json */
					/* data=JSON.parse(data) */
					/* alert(data.sname) */
					/* alert(typeof(data)) */
					$(data).each(function(){						
						alert(this.sname);
					})
		},"json")
	})
</script>

4.Controller理器方法的返回值-Object

异步请求

​ 使用@ResponseBody注解+Jacksonjar包+注解驱动配置

​ SpringMVC底层默认使用这个Jacksonjar包+@ResponseBody,将JSON串注入到响应体中

<!-- 配置MVC注解驱动,自动生成底层需要的核心类:
			Jackson+@ResponseBody:底层需要HttpMessageConvert
		 -->
		<mvc:annotation-driven/>
//Controller处理器方法的返回值—Object
	@RequestMapping("/test04.do")
	@ResponseBody
	public Object test04(HttpServletRequest req, HttpServletResponse resp){
		//异步请求,序列化json
		//使用@ResponseBody注解+Jacksonjar包+注解驱动配置(<mvc:annotation-driven/>)
		//SpringMVC底层默认使用这个Jacksonjar包+@ResponseBody,将JSON串注入到响应体中
		Student s1 = new Student(1,"张三",18,'女',2);
		Student s2 = new Student(2,"李四",20,'女',2);
		List<Student> students = new ArrayList<Student>();
		students.add(s1);
		students.add(s2);
		Map<String, Student> m = new HashMap<String, Student>();
		m.put("s1", s1);
		m.put("s2", s2);
		//返回List对象
//		return students;
		//返回对象
//		return s1;
		//返回map
		return m;
	}
Spring MVC框架,后置拦截器(Post-Handle Interceptor)主要用于处理控制器方法处理后的结果,通常用于对数据进行额外的操作,例如缓存、日志记录等。如果你想要将Controller方法返回值放入Redis,可以按照以下步骤设置: 1. 首先,在Spring配置文件`applicationContext.xml`或`application.yml`创建一个后置处理器 bean,并指定它实现`HandlerInterceptor`接口: ```xml <bean id="redisInterceptor" class="com.example.RedisInterceptor"> <!-- 这里配置Redis连接信息 --> </bean> <!-- 将Interceptor配置到DispatcherServlet --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <ref bean="redisInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 2. 创建一个实现了`HandlerInterceptor`的类,如`RedisInterceptor`,并在其的`postHandle()`方法操作返回值: ```java import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class RedisInterceptor implements HandlerInterceptor { @Override public boolean postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { if (modelAndView != null && modelAndView.getViewName() != null) { String key = "your_cache_key:" + modelAndView.getViewName(); // 将视图渲染后的数据放入Redis,这里假设modelAndView.getModel().containsKey(key) String data = (String) modelAndView.getModel().get(key); // 使用JedisTemplate等工具将数据保存到Redis redisTemplate.opsForValue().set(key, data); // 如果需要返回响应,可以移除ModelAndView,让直接返回的数据通过HTTP发送 modelAndView = null; } return true; } // 其他方法如preHandle()和afterCompletion()可根据需求定制 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值