SpringMVC-2-(Controller)
一)参数类型
@RequestMapping("hello4") @ResponseBody public ModelAndView Hello4( // Servlet的三个参数 HttpServletRequest request, HttpServletResponse response, HttpSession session, // 传入接本数据类型和引用数据类型,注意要和前端同名 String name, People people, // 和前端不同命的解决办法 @RequestParam("address1")String address, // 前段没有传值,设置默认值 @RequestParam(defaultValue = "27") int age, // 设置这个值一定要有,没有就报错 @RequestParam(required = true) String email, // 接前端传过来的复选框的值 @RequestParam("likes")List<String> list, // 前端写法 // <input type="text" name="peo.name"/> // <input type="text" name="peo.age"/> // 另外再写一个实体类,属性就是前端传值的名 // public class Test { // private People people; Test test, // 前端写法 // <input type="text" name="peo[1].name"/> // <input type="text" name="peo[1].age"/> // 另外要写一个实体类,属性就是前端传值的list集合 // public class Test { // private People people; // private List<People> peoples; Test test1, // 其实model和ModelAndView还有session都产不多用法,只是返回一个数据参见下边的代码 Model model ) throws ServletException, IOException { ModelAndView hello = new ModelAndView("main"); Model model1 = model.addAttribute("name", "xupeilei"); return hello; }
restful风格:
<a href="hello1?name=aaa&age=27">普通风格</a> <a href="hello2/bbb/17">result风格</a>
@RequestMapping("hello1/{name}/{age}") public ModelAndView Hello1(@PathVariable String name,@PathVariable String age) { System.out.println(name+" "+age); System.out.println("hello springMVC控制器"); ModelAndView hello = new ModelAndView("main"); return hello; }
参数绑定到实体类:
有时间在写
自定义参数绑定
有事件在写
二)返回值类型及重定向和转发(默认方式都是请求转发)
理解重定向和转发:
重定向:
相当于是浏览器发出请求,返回一个url浏览器再去请求这个url,这时浏览器是知道他请求到哪里去了,所以地址栏可以看到url的改变
转发:
服务器的行为,浏览器发出请求之后,服务器可能又去请求了其他的资源最终只返回一个数据或者模型,这时浏览器并不知道服务器到底做了什么,他只能显示他请求的url;
@RequestMapping:会去找视图解析器
String
@RequestMapping("hello2") public String hello2(){ // 转发 // return "forward:/html/err.html"; // return "forward:/hello1"; // 重定向 // return "redirect:/html/err.html"; return "redirect:/hello1"; // 通过视图解析器 // return "main"; }
ModelAndView:
@Controller public class HelloController { @RequestMapping("hello1") public ModelAndView hello1(){ // 自定义视图解析器找到main.jsp // ModelAndView modelAndView = new ModelAndView("main"); // 服务器转发, // 跳转到err.html // ModelAndView modelAndView = new ModelAndView("forward:/html/err.html"); // 跳转到其他controller(hello2) // ModelAndView modelAndView = new ModelAndView("forward:/hello2"); // 浏览器重定向, // 重定向到err.html // ModelAndView modelAndView = new ModelAndView("redirect:/html/err.html"); // 重定向到其他controller(hello2) ModelAndView modelAndView = new ModelAndView("redirect:/hello2"); // 会使用自定义视图解析器,结果找不到报错404 // ModelAndView modelAndView = new ModelAndView("hello2"); return modelAndView; }
void(没有返回值,只能重定向和转发)
@RequestMapping("hello3") public void hello3(HttpServletRequest request, HttpServletResponse response) throws IOException { // 重定向 request.getRequestDispatcher("/html/err.html"); // request.getRequestDispatcher("/hello1"); // 转发 // response.sendRedirect("/html/err.html"); // response.sendRedirect("/hello1"); }
@RequestMapping:
@ResponseBody:
String
void
ModelAndView
对象:(坑!大坑!!巨坑!!!超级坑!!!)(使用jackSon的时候要用高版本不然报错406,无法转换json格式)
@RequestMapping("/hello4") @ResponseBody public People hello4(HttpServletResponse response){ People p=new People(); p.setName("sss"); p.setAddress("www"); p.setAge(1); p.setEmail("ee"); return p; }
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
三)自定义视图解析器
表示在返回值的前边加上/路径和后边加上.jsp,表示所要找的jsp所在德位置,就不需要在controller中手写了,作用就是偷懒;
但是注意:自定义视图解析器controller中的返回值不能加前缀,加的话就走默认的视图解析器,
存在的意义:当我们需要转发的时候
看图:
图一: 图二:
看图一:因为前边没有加任何东西,并且我又自定义视图解析器,那他走的就是自定义视图解析器,回去找一个demo11.jsp的东西,但是会发现找不到报错404
看图二:因为前边加了forward:这时候自定义的视图解析器就失效了,走默认视图解析器,解析出来要转发到dome11,就不去找demo11.jsp了
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
四)请求方法限定
@RequestMapping(value = {"/hello123","/456",method = RequestMethod.POST)}
五)@ResponseBody注解
做了两件事情:
一:将返回值变成json字符串;
二:同时设置响应头为application/json
加上这个之后就不跳转了,以流的形式输出出去,也就不走视图解析器了,并且是直接填充到body中去了
String:
ModelAndView:
考虑一下返回值为ModelAndView 却得到一个json字符串的方式
Void:
对象:
六:拦截器