SpringMVC返回值及判断用户是否存在

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

如果控制器的方法返回值编写成void,可以使用请求转发或者重定向跳转到指定的页面

@RequestMapping(value = "/toIndex2.do") 
public void toIndex1(HttpServletRequest request, HttpServletResponse response) 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"; 
}
返回值为字符串操作转发和重定向
  • 转发

方式一: 直接转发到指定页面

@RequestMapping("/test04.do")
public String test04(){

    return "index";
}

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

@RequestMapping("/test05.do")
public String test05(){
    
    return "forward:/demo02/test04.do";
}
  • 重定向

方式1:重定向到页面,直接重定向转到指定页面

jsp已经放到WEB-INF文件下,只能通过转发的方式进行内部访问		

方式二: 重定向到其他controller方法

注意,重定向时,如果是绝对路径应该是从项目名称开始,也就是"redirect:/项目名 称/toIndex.do",但是Spring框架会自动加项目名称,所以不写,应该写 成"redirect:/toIndex.do"

//springmvc对于重定向的路径有做优化,不需要写项目名了!!!
@RequestMapping("/test06.do")
public String test06(){
    //纯servlet的路径不一样
    return "redirect:/demo02/test05.do";
}
静态资源访问配置
  • 概述
    当web.xml中将DispatcherServlet的url-parttern设置为”/”,意味着所有的请求都会由 SpringMvc容器进行拦截处理,也包括静态资源(js,图片等等),会导致无法正常访问静态资源, 静态资源只需直接访问就好了。那么,就需要对静态资源进行放行。

  • 解决方案

    • 在spring-mvc.xml 中配置DefaultServletHttpRequestHandler

      • 像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请 求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求, 才由DispatcherServlet继续处理。

          <!-- 放行静态资源 -->
          <mvc:default-servlet-handler></mvc:default-servlet-handler>
        
      • 由Spring MVC框架自己处理静态资源

          <mvc:resources mapping="/js/**" location="/js/" />
          <mvc:resources mapping="/css/**" location="/css/" />
          <mvc:resources mapping="/img/**" location="/img/"/>
        
      • 将前端控制器的访问路径修改为*.do,这样前端控制器就只处理后缀名为.do的请求

          <servlet‐mapping> 
          		<servlet‐name>mvc</servlet‐name> 	
          		<url‐pattern>*.do</url‐pattern> 
          </servlet‐mapping>
        
@ResponseBody响应json数据
  • 需求
    • 校验用户名是否存在
  • 方案:
    • 方案1:请求参数为json字符串
    • 方案2:请求参数为普通键值对

导入jar包:

jackson-annotations-2.9.9.jar
jackson-core-2.9.9.jar
jackson-databind-2.9.9.jar

方案一 界面代码

<head>
<title>test01</title>
<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
<script>

    function checkUsername() {
        //方案1:请求参数是json字符串 , 它就没有name属性 ,不是一个name-value模型
        //contentType:浏览器告诉服务器,请求参数是json
        //dataType:服务器告诉浏览器,返回的数据是json
        var username = $("#username").val();
        var jsObj = {"username":username};
        var jsonStr = JSON.stringify(jsObj);
        $.ajax({
            type:"post",
            url:"${pageContext.request.contextPath}/demo01/checkUsername1.do",
            data: jsonStr,
            contentType:"application/json;charset=utf-8",
            success: function (data) {
                console.log(data);
                if (data.isExist) {
                    $("#spn").html("<font color='red'>"+data.msg+"</font>")
                } else {
                    $("#spn").html("<font color='blue'>"+data.msg+"</font>")
                }
            },
            dataType:"json"

        })
    }

</script>
</head>
<body>

<%--校验用户名是否存在--%>
<input type="text" id="username" onchange="checkUsername()"><span id="spn"></span>

</body>

方案一controller方法初级版

@ResponseBody//操作响应正文
@RequestMapping("/checkUsername.do")
public void checkUsername(@RequestBody String jsonStr, HttpServletResponse response) throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    //1,解析json字符串  -> User对象
    User user = objectMapper.readValue(new StringReader(jsonStr), User.class);
    //2,判断用户名是否存在
    boolean isExist = false;
    String msg = "用户名不存在";
    if ("root".equals(user.getUsername())) {
        isExist = true;
        msg = "用户名已存在";
    } else {
        isExist = false;
        msg = "用户名不存在";
    }
    HashMap<String, Object> map = new HashMap<>();
    map.put("isExist", isExist);
    map.put("msg", msg);
    //手动解决响应正文中文乱码问题
    response.setContentType("application/json;charset=utf-8");
    //手动将map集合转换成json字符串
    String jsonStr1 = objectMapper.writeValueAsString(map);
    response.getWriter().write(jsonStr1);
}

// 以上代码虽然可以运行,但是存在以下问题: 
	//请求参数中的json字符串是手动解析 
	// 响应正文的json字符串也是手动产生 
	// 响应正文中文乱码问题也是手动解决

方案一contronller方法优化版

  • SpringMVC可以自动解析请求参数中的json字符串,依赖于@RequestBody

  • SpringMVC可以自动根据对象生成json字符串,依赖于@ResponseBody

  • SpringMVC可以自动解决响应中文乱码,依赖于@ResponseBody

      @ResponseBody // 加了这个注解方法,该方法的返回值就是响应正文
      @RequestMapping("/checkUsername1.do")
      public Object checkUsername1(@RequestBody User user, HttpServletResponse response) throws Exception {
      System.out.println(user);
      //2,判断用户名是否存在
      boolean isExist = false;
      String msg = "用户名不存在";
      if ("root".equals(user.getUsername())) {
          isExist = true;
          msg = "用户名已存在";
      } else {
          isExist = false;
          msg = "用户名不存在";
      }
      HashMap<String, Object> map = new HashMap<>();
      map.put("isExist", isExist);
      map.put("msg", msg);
      //手动解决响应正文中文乱码问题
      return map;
      }
    

方案二界面代码

<head>
<title>test01</title>
<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
<script>

    function checkUsername() {
        //方案1:请求参数是json字符串 , 它就没有name属性 ,不是一个name-value模型
        //contentType:浏览器告诉服务器,请求参数是json
        //dataType:服务器告诉浏览器,返回的数据是json
        var username = $("#username").val();
        $.ajax({
            type:"post",
            url:"${pageContext.request.contextPath}/demo01/checkUsername2.do",
            data: {
                "username":username
            },
            success: function (data) {
                console.log(data);
                if (data.isExist) {
                    $("#spn").html("<font color='red'>"+data.msg+"</font>")
                } else {
                    $("#spn").html("<font color='blue'>"+data.msg+"</font>")
                }
            },
            dataType:"json"

        })
    }

</script>
</head>
<body>

<%--校验用户名是否存在--%>
<input type="text" id="username" onchange="checkUsername()"><span id="spn"></span>

</body>

方案二controller代码

@ResponseBody //当需要操作响应正文的时候
@RequestMapping("/checkUsername2.do")
public Object checkUsername2(User user) {
    boolean isExist = false;
    String msg = "用户名不存在";

    if ("root".equals(user.getUsername())) {
        isExist = true;
        msg = "用户名已存在";
    } else {
        isExist = false;
        msg = "用户名不存在";
    }
    HashMap<String, Object> map = new HashMap<>();
    map.put("isExist", isExist);
    map.put("msg", msg);
    return map;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值