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;
}