Spring MVC返回值

一:Controller方法返回值之ModelAndView

ModelAndView对象是Spring提供的一个对象
可以用来调整具体的JSP视图,也可以存储数据
实现代码

@RequestMapping(”/selectUserList“)
public ModelAndView selectUserList()throws Exception {
ModelAndView modelAndView = new ModelAndView();
List<User> userList = userService.selectUserList(); modelAndView.addObject("userList",userList); modelAndView.setViewName("userList.jsp"); 
return modelAndView; 
}

二:Controller方法返回值之void


@RequestMapping(value = "/toIndex2.do")
 public void toIndex1(HttpServletRequest request) throws Exception { List<User> userList = new ArrayList<>();
  userList.add(new User(1,"张三"));
   userList.add(new User(2,"李四")); request.setAttribute("userList",userList); request.getRequestDispatcher("jsp/index.jsp").forward(request,response);
    } 

三:Controller方法返回值之字符串

Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
需求使用返回字符串的方式替换上一个章节的入门案例
代码实现


@RequestMapping(value = "/toIndex1.do") 
public String toIndex1(Model model){
 List<User> userList = new ArrayList<>();
  userList.add(new User(1,"张三")); 
  userList.add(new User(2,"李四")); model.addAttribute("userList",userList);
   return "index"; 
   } 

四:返回值为字符串操作转发和重定向


转发
方式1: 直接转发到指定页面 
@RequestMapping(value = "/toIndex3.do") 
public String toIndex3(Model model){
 List<User> userList = new ArrayList<>(); 
 userList.add(new User(1,"张三")); 
 userList.add(new User(2,"李四")); model.addAttribute("userList",userList); return "forward:/WEB‐INF/jsp/index.jsp"; } 

方式2:转发到其他controller方法,由其他controller方法进行跳转

@RequestMapping(value = "/toIndex4.do")
 public String toIndex4(){ 
 return "forward:/toIndex.do"; 
 } 

重定向
方式1:重定向到页面,直接重定向转到指定页面
jsp已经被放到WEB-INF文件夹下,只能通过转发的方式进行内部访问
方式2:重定向到其他controller方法
注意,重定向时,如果是绝对路径应该是从项目名称开始,也就是"redirect:/项目名 称/toIndex.do",但是Spring框架会自动加项目名称,所以不写,应该写 成"redirect:/toIndex.do"

@RequestMapping(value = "/toIndex5.do")
 public String toIndex5(){ 
 return "redirect:/toIndex.do";
  } 

五:静态资源访问配置

概述
当web.xml中将DispatcherServlet的url-parttern设置为”/”,意味着所有的请求都会由 SpringMvc容器进行拦截处理,也包括静态资源(js,图片等等),会导致无法正常访问静态资源, 静态资源只需直接访问就好了。那么,就需要对静态资源进行放行。
解决方案
在spring-mvc.xml中配置DefaultServletHttpRequestHandler,
像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请 求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求, 才由DispatcherServlet继续处理。

<!‐‐放行静态资源‐‐>
 <mvc:default‐servlet‐handler />
 b由Spring MVC框架自己处理静态资源
  <mvc:resources mapping="/js/**" location="/js/" />
   <mvc:resources mapping="/css/**" location="/css/" /> 
   <mvc:resources mapping="/html/**" location="/html/" /> 
   c.将前端控制器的访问路径修改为*.do,这样前端控制器就只处理后缀名为.do的请求 <servlet‐mapping> 
   <servlet‐name>mvc</servlet‐name> 
   <url‐pattern>*.do</url‐pattern> </servlet‐mapping

六:@ResponseBody响应json数据

需求
校验用户名是否存在
方案:
方案1:请求参数为json字符串
方法2:请求参数为普通键值对
导入jar包
Jackson-annotation-2.9.9.jar
jackson-core-2.9.9.jar
jackson-databind-2.9.9.3.jar
方案一界面代码

在这里插入代码片
function checkUsername() { //1、获取输入框中的值 var username = $("#username").val(); //2、获取对应的js对象 var js = {"username":username}; //3、获取对应的json字符串 var jsonStr = JSON.stringify(js); $.ajax({ type: "POST", url: "${pageContext.request. contextPath}/checkUsername.do", contentType:"application/json;charset=UTF‐8", data: jsonStr, success: function(msg){ alert( "Data Saved: " + msg ); } }); }

方案一controller方法初级版


@RequestMapping(path = "/test04.do")
 public void test04(@RequestBody String jsonStr ,HttpServletResponse response) throws Exception { 
 ObjectMapper objectMapper = new ObjectMapper();
  User user = objectMapper.readValue(new StringReader(jsonStr), User.class);
   Map<String,Object> map = new HashMap<>(); 
   boolean flag = true; 
   String msg = "用户不存在";
    if (user.getUsername().equals("root")) { 
    flag = false; 
    msg = "用户存在"; 
    } else {
     flag = true;
      msg = "用户不存在"; 
      }map.put("flag",flag); 
      map.put("msg",msg); 
      String jsonStr2 = objectMapper.writeValueAsString(map); response.setContentType("application/json;charset=utf‐8"); response.getWriter().write(jsonStr2);
 } 

以上代码虽然可以运行,但是存在以下问题:
请求参数中的json字符串是手动解析
响应正文的json字符串也是手动产生
响应正文中文乱码问题也是手动解决
方案一controller方法优化版
SpringMVC可以自动解析请求参数中的json字符串,依赖于@RequestBody SpringMVC可以自动根据对象生成json字符串,依赖于@ResponseBody SpringMVC可以自动解决响应中文乱码,依赖于@ResponseBody

@ResponseBody
 @RequestMapping(path = "/test04.do") 
 public Object test04(@RequestBody User user) throws Exception { Map<String,Object> map = new HashMap<>(); 
 boolean flag = true; 
 String msg = "用户不存在";
  if (user.getUsername().equals("root")) { 
  flag = false; msg = "用户存在";
   } else { 
   flag = true; msg = "用户不存在"; 
   }
   map.put("flag",flag);
    map.put("msg",msg); 
    return map; 
    } 

方案二界面代码


<input id="username" type="text" onchange="checkUsername()">
 function checkUsername() {
  //1、获取输入框中的值 
  var username = $("#username").val();
   $.ajax({ 
   type: "POST", 
   url: "${pageContext.request.contextPath}/checkUsername.do", contentType:"application/json;charset=UTF‐8", 
   data: { 
   "username":username 
   },
   success: function(msg){
    alert( "Data Saved: " + msg ); 
               } 
         }); 
    }

方案二controller代码


@ResponseBody
 @RequestMapping(path = "/test04.do")
  public Object checkUsername(User user ) throws Exception { Map<String,Object> map = new HashMap<>(); 
  boolean flag = true;
   String msg = "用户不存在"; 
   if (user.getUsername().equals("root")) {
    flag = false; 
    msg = "用户存在";
     } else { 
     flag = true; 
     msg = "用户不存在";
      }
      map.put("flag",flag); 
      map.put("msg",msg); 
      return map;
       }
发布了17 篇原创文章 · 获赞 0 · 访问量 152

猜你喜欢

转载自blog.csdn.net/weixin_46101397/article/details/105127471