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