在处理请求时,控制器的处理函数返回值类型可以决定其怎么响应该请求。
当返回值为string类型,会根据返回值,到视图解析器指定的路径寻找指定类型的文件显示出来。
控制器处理方法
@RequestMapping("/hello") public String testJson() { System.out.println("执行了"); return "success"; }视图解析器配置
<!-- 配置视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean>处理/hello请求时就会向视图解析器指定的路径,classpath/WEB-INT/pages/去找到success.jsp文件然后显示到浏览器。
如果返回值void,并且控制器处理请求方法不做任何转发和重定向,则默认会向视图解析器指定的路径寻找请求名称.类型名文件。
@RequestMapping("/hello") public void testJson() { System.out.println("执行了"); }如上,就会去找hello.jsp文件,找不到会直接报404。 一般返回值为void类型时,都会在控制器处理方法中做转发和重定向。 下述代码包含三种方法
@RequestMapping("/testVoid") public void testVoid(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { System.out.println("执行了"); // 第一种:编写请求转发程序 // httpServletRequest.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(httpServletRequest,httpServletResponse); // 第二种:重定向 // httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/index.jsp"); //设置中文乱码问题 httpServletResponse.setCharacterEncoding("UTF-8"); httpServletResponse.setContentType("text/html;charset=UTF-8"); // 第三种:直接会响应。直接打印出以下字符 httpServletResponse.getWriter().println("你好"); }对HttpServletRequest和HttpServletResponse不了解的,可以看下这篇博客:HttpServletRequest与HttpServletResponse的实现类
通过创建ModelAndView对象对数据进行封装,让后跳转到视图解析系指定路径的指定类型文件,以String为返回值类型的底层就是以ModelAndView来实现的。
@RequestMapping("/testModelAndView") public ModelAndView testModelAndView() { System.out.println("执行了"); User user = new User(); user.setName("美美"); user.setPassword("123"); user.setAge(18); ModelAndView mv = new ModelAndView(); mv.addObject("user",user); mv.setViewName("success"); return mv; }在jsp主页面发送json数据给服务器,控制器处理方法通过@RequestBody来将json数据封装成JavaBean类型,最后通过@ResponseBody将JavaBean类型再转换成json数据。 Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包。
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.11.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.11.2</version> </dependency>首先导入jquery.js文件放在类路径下js文件夹中 注意:我们在创建前端控制器的时候是拦截所有请求,包括这些静态文件。
<servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>所以我们需要在springmvc的配置文件中设置过滤掉这些静态文件。
<!-- 设置静态资源不过滤 --> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="/img/" mapping="/img/**"/> <mvc:resources location="/css/" mapping="/css/**"/>发送json数据
<button id="btn">按钮</button> <script> $(function () { $("#btn").click(function () { $.ajax({ url:"request/testJson", contentType:"application/json;charset=UTF-8", data:'{"name":"aa","password":100}', dataType:"json", type:"post", success:function(data){ alert(data); alert(data.name); } }); }) }) </script>控制器处理方法
// ResponseBody 将JavaBean对象转换成JSON数据 @RequestMapping("/testJson") public @ResponseBody User testJson(@RequestBody User user) { System.out.println("执行了"); System.out.println("user:" + user); return user; }成功封装成JavaBean类型
成功转换为json数据