SpringMVC 学习笔记 Part4
1.Controller方法 返回值为String
Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
@Controller @RequestMapping("/user")
public class UserController {
@RequestMapping("myMVC")
public String findOne(Model model) {
User user = service.findByName("张三");
model.addAttribute("user", user);
return "success";
}
}
springmvc.xml里的视图解析器配置回顾。
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
最后视图解析出来的地址将是 /WEB-INF/pages/success.jsp
2.Controller方法 返回值为void
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。因为方法返回值写成void的话,springmvc 框架默认会解析@RequestMapping(value=”/myMVC”) 里的 value 值,并跳转到 myMVC.jsp 这个页面去。
若不想跳转到默认页面去,则可以使用请求转发或者重定向跳转到指定的页面。方法前面小节也介绍过,需要在控制器方法参数中加入 HttpServletRequest request 和 HttpServletResponse response 。
@RequestMapping("myMVC")
public String findOne( HttpServletRequest request , HttpServletResponse response ) {
/* 请求转发、重定向或着直接响应数据 */
return ;
}
// 请求转发
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
// 重定向
response.sendRedirect(request.getContextPath()+"/success.jsp");
// 直接响应数据
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("你好");
3.Controller方法 返回值为ModelAndView
ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图。 ModelAndView 可以传入视图的名称(即跳转的页面),还可以传入对象。
@RequestMapping("myMVC")
public ModelAndView findAll() throws Exception {
ModelAndView mv = new ModelAndView();
mv.setViewName("success"); // 设置方法结束后跳转到 success.jsp 的页面
List<User> users = service.findAll();
mv.addObject("users", users);// 添加对象进 ModelAndView 里
return mv;
}
在success.jsp中,可以用 jstl 来遍历mv对象,首先先要导入 jstl 包。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
查询所有的数据。
<c:forEach items="${ users }" var="user">
${ user.username }
</c:forEach>
我们在页面上上获取使用的是 requestScope.user取的,所以返回 ModelAndView 类型时,浏览器跳转只能是请求转发。
4. SpringMVC框架提供的转发和重定向
Controller方法返回String类型,想进行请求转发也可以编写成如下。forward 关键字的使用:“forward:转发的JSP路径”,不走视图解析器了,所以不能使用逻辑路径,需要编写完整的路径 。它相当于 request.getRequestDispatcher(“url”).forward(request,response) 。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
@RequestMapping("/myMVC")
public String myForward() throws Exception {
return "forward:/WEB-INF/pages/success.jsp";
}
Controller方法返回String类型,想进行重定向也可以编写成如下。它相当于 response.sendRedirect(“url”) 。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
@RequestMapping("/myMVC")
public String myRedirect() throws Exception {
return "redirect:/hello.jsp";
}
5. ResponseBody响应json数据
响应json数据我们需要用到异步技术,这时需要导入jquery的包。但在导入之前,我们需要处理一个问题。DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置。
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
< mvc:recources >属性:
location:表示webapp下的绝对路径
mapping:表示在html中写的路径
例如:
<mvc:resources location="/WEB-INF/ui/js/" mapping="js/**" /> 的意思是:html中写 src=“js/xxxx.js”,就会去/WEB-INF/ui/js文件夹下查找。
首先先来回顾一下 jquery的 异步技术使用方法。
$(function(){
// 绑定点击事件
$("#btn").click(function(){
$.ajax({
url:"user/myJson",
contentType:"application/json;charset=UTF-8",
data:'{"username":"zhangsan","password":"123","age":18}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.username);
}
});
});
});
在 json字符串 和 JavaBean对象 互相转换的过程中,需要使用jackson的jar包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
@RequestBody注解
在控制器的方法中对 String 类型参数使用 @RequestBody注解 获取请求体内容。
@RequestMapping("/myJson")
public void testJson(@RequestBody String body) {
System.out.println(body);
}
spring框架提供了为我们自动解析json封装为javabean的功能,所以我们在控制器中对 Javabean 类型参数 使用 @RequestBody注解 可以直接转换为 Javabean对象。
@RequestMapping("/myJson")
public void testJson(@RequestBody User user) {
System.out.println(user);
}
@ResponseBody注解
当需要控制器的方法响应javabean对象给页面时,我们可以使用 @ResponseBody注解 把JavaBean对象转换成json字符串,直接响应。
@RequestMapping("/testJson")
public @ResponseBody User testJson(@RequestBody User user) {
user.setAge("20");
return user;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84490.html