响应传值方式
响应传值方式
返回void类型和共享数据 : 需要共享数据,页面跳转
//返回void类型和共享数据 : 需要共享数据,页面跳转
//必须注入请求响应对象(共享数据,页面跳转)
@RequestMapping("/method1")
public void method1(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
//共享数据
req.setAttribute("username", "小龙女");
//跳转到jsp页面要显示数据,就必须使用请求转发
req.getRequestDispatcher("/WEB-INF/response/response.jsp").forward(req, resp);
}
访问地址: http://localhost:8080/springmvc/response/method1.do
返回ModelAndView类型和共享数据
/*
* 返回ModelAndView类型和共享数据
* ModelAndView 模型和视图
* Spring提供此对象可以集中管理共享数据操作和设置跳转视图操作
* ModelAndView 只能使用请求转发
*/
@RequestMapping("/method2")
public ModelAndView method2() {
ModelAndView mv = new ModelAndView();
//共享数据,等价于 request对象共享数据的级别
//mv.addObject(attributeName, attributeValue)
mv.addObject("username", "杨过");
//页面跳转,等价于request对象的请求转发
//mv.setViewName(viewName);
mv.setViewName("/WEB-INF/response/response.jsp");
return mv;
}
访问地址: http://localhost:8080/springmvc/response/method2.do
配置视图解析器
代码分析图
视图解析器的配置
<!-- 配置SpringMVC的视图解析器: 配置前缀和后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置视图跳转的前缀 -->
<property name="prefix" value="/WEB-INF/response/"/>
<!-- 配置视图跳转的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
配置视图解析器后的代码
Controller方法返回字符串表示逻辑视图名,通过视图解析器解析为物理视图地址。
此时默认的物理视图地址为:视图前缀+返回值+视图后缀
@RequestMapping("/method2")
public ModelAndView method2() {
ModelAndView mv = new ModelAndView();
//共享数据,等价于 request对象共享数据的级别
//mv.addObject(attributeName, attributeValue)
mv.addObject("username", "杨过");
//页面跳转,等价于request对象的请求转发
//mv.setViewName(viewName);
//没有配置视图解析器之前的写法
//mv.setViewName("/WEB-INF/response/response.jsp");
//配置视图解析器之后的写法
mv.setViewName("response");
return mv;
}
注意: 配置完视图解析器以后,必须保证,前缀目录下面必须有对应逻辑视图名称所在的 页面 ,否则可能会报404错误
通过Model方式-设置共享数据
/*
* Model方式 : 直接将需要共享的数据封装到Model对象中即可
* 方法返回String字符传直接,返回需要跳转的地址即可
* 默认使用请求转发
*/
@RequestMapping("/method3")
public String method3(Model m) {
//m.addAttribute(attributeName, attributeValue)
m.addAttribute("username", "小敬哥123");
//没有配置视图解析器之前的写法
//return "/WEB-INF/response/response.jsp";
//配置视图解析器之后的写法
return "model"; //返回逻辑视图名称
}
自定义请求转发和重定向跳转的页面
- 如果直接使用视图解析器的配置开发,那么必须保证视图解析器前缀目录下面有对应的页面文件才能跳转,否则报错
- 默认页面跳转也只能使用请求转发跳转,不能使用重定向 需要解决问题: 除了使用视图解析器对应规则的开发,用户还得自定义跳转方式,和自定义跳转页面 方案:
- 使用视图解析器的 请求转发和重定向配置,可以打破默认的规则
- public static final String REDIRECT_URL_PREFIX = “redirect:”;
- public static final String FORWARD_URL_PREFIX = “forward:”;
案例代码
// 自定义请求转发页面跳转的地址 : forward: 跳转的地址
@RequestMapping("/method4")
public String method4(Model m) {
// m.addAttribute(attributeName, attributeValue)
m.addAttribute("username", "东方姑娘");
return "forward:/WEB-INF/views/index.jsp";
}
// 自定义重定向页面跳转的地址 redirect: 跳转的地址
@RequestMapping("/method5")
public String method5() {
return "redirect:http://www.jd.com";
}
返回对象类型和共享数据
方法不返回ModelAndView也不返回String类型对应的逻辑视图名称直接返回一个Pojo对象
如果直接返回Pojo对象,项目又配置了视图解析器规则
如果方法中没有返回ModelAndView对象,此时SpringMVC不知道视图在哪里.
此时需要配置视图解析器org.springframework.web.servlet.view.InternalResourceViewResolver.
物理视图路径为:前缀+请求路径(上下文路径+资源名称)+后缀
必须保证视图解析器路径下面必须有 请求路径对应的页面
@ModelAttribute作用如下:
1、设置请求参数绑定到Model对象中并传到视图页面的key名.
2、将方法返回值或请求参数绑定到Model对象中并传到视图页面
@ModelAttribute("userKey")//跳转页面使用el表达式获取的对应的属性名称
@RequestMapping("/method6")
public User method6() {
User user = new User();
user.setUsername("东方姑娘");
user.setPassword("dfgn");
user.setEmail("dfgn@qq.com");
user.setPhone("234234234324");
return user;
}
转换JSON数据
在web开发中,前台页面经常会发送ajax请求从后台请求数据,ajax请求给前台的数据一般都是json 数据。
SpringMVC支持自动将对象转换JSON格式的数据响应给客户端
SpringMVC默认使用的是 jackson 作为对象转json的工具
Fast-json Alibaba
Gson google
Json-lib Apache
步骤
导入jackson的jar包
案例代码
@Controller
public class JsonController {
@RequestMapping("/getUserJson")
@ResponseBody //把响应的内容设为普通字符串
public User getUserJson() {
User user = new User();
user.setUsername("东方姑娘");
user.setPassword("dfgn");
user.setEmail("dfgn@qq.com");
user.setPhone("234234234324");
return user;
}
@RequestMapping("/getUserJsonList")
@ResponseBody
public List<User> getUserJsonList() {
User user = new User();
user.setUsername("东方姑娘");
user.setPassword("dfgn");
user.setEmail("dfgn@qq.com");
user.setPhone("234234234324");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user);
list.add(user);
list.add(user);
return list;
}
}
小结
1,SpringMVC介绍
(1) SpringMVC是一个Spring框架下面一个基于MVC模式的 表现层/Web 框架
(2) SpringMVC 底层就是Servlet,就是对Servlet的封装
(3) SpringMVC 接受参数灵活,页面跳转,共享数据方便
2,开发步骤
(1) 引入相关依赖jar包
(2) 在web.xml中配置SpringMVC的前端控制器
① DispatcherServlet
(3) 在springmvc.xml配置文件配置包扫描,开启Springmvc的注解驱动
① <context:component-sacn basePackage=’cn.xc.springmvc’>
② <mvc:annotation-driven>
(4) 新建一个普通类型
① 在类上面贴上 @Controller注解,就是SpringMVC的控制器了
(5) 在类中新建一个方法,并且在方法上面贴上一个注解
① @RequestMapping(“url地址访问路径”)
(6) 在浏览器输入地址即可访问
3,SpringMVC的请求
(1) 请求方法的限定 GET/POST
(2) 请求参数的限定 ,必须有什么参数,必须没有什么参数,参数值必须是什么,参数值必须不是什么
(3) 数据绑定(接受请求参数)
① 表单提交参数名和方法参数名相同 -最常见
② 表单提交参数名和方法参数名不相同
- 在方法参数前面写上@RequestParam(“和表单参数名相同”)
③ 数组类型(多值)
④ 接受多个参数封装成 pojo对象 - 必须保证表单参数名称和pojo对象属性名称相同
⑤ 将接受参数封装成map集合
(4) 支持 RestFul风格
① @PathVariables()
(5) SpringMVC中文参数乱码的问题
① Post方式 设置过滤器
② Get方式 修改tomcat 配置
4,SpringMVC的相应
(1) ModelAndView 共享模型数据并且设置视图地址
(2) 方法直接返回 String 使用 Model 模型对象共享
(3) 自定义页面跳转
① redirect: 重定向
② forward:请求转发
(4) 配置视图解析器(配置视图的前缀和后缀)
(5) 返回对象类型
(6) 返回json数据
① Jackson+@ResponseBody