2019独角兽企业重金招聘Python工程师标准>>>
Spring MVC中每个控制器中可以定义多个请求处理方法即Action,Action可以有多个不同的参数,有多种类型的返回结果。
可以作为Action的参数类型有:
表单对象
基本数据类型,包括包装类
复杂数据类型,如自定义数据模型
java.util.TimeZone 时区
java.util.Locale 当前请求的语言环境
java.io.InputStream或java.io.Reader
java.io.OutputStream或java.io.Writer
org.springframework.http.HttpMethod
HttpEntity >参数用于访问Servlet的HTTP请求的标题和内容
org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap 视图隐含模型
org.springframework.web.servlet.mvc.support.RedirectAttributes 重定向
HandlerAdapter
org.springframework.validation.Errors / org.springframework.validation.BindingResult 验证结果
org.springframework.web.bind.support.SessionStatus 会话状态
org.springframework.web.util.UriComponentsBuilder
@PathVariable 注解参数访问URI模板变量。
@MatrixVariable 注释参数用于访问位于URI路径段键值对对,矩阵变量。
@RequestParam 注解参数访问特定的Servlet请求参数,请求参数绑定。
@RequestHeader 注解参数访问特定的servlet请求HTTP标头,映射请求头。
@RequestBody 注解参数访问HTTP请求主体,注解映射请求体
@RequestPart 注解参数访问“的multipart / form-data的”请求部分的内容。处理客户端上传文件,多部分文件上传的支持
@SessionAttribute 注解参数会话属性
@RequestAttribute 注解参数访问请求属性
参数为基本数据类型,且名称与请求参数名称相同,则会进行自动映射, 如访问地址:http://localhost:8080/springmvctest/action?id=1&name=abc
@RequestMapping("/action") public String action(Model model, int id, String name) { model.addAttribute("message", "id=" + id+" name="+name); return "jsp/index"; }
参数为自定义数据类型, 访问地址:http://localhost:8080/springmvctest/action?id=1&name=Tom&age=10
@RequestMapping("/action") public String action(Model model, User user) { model.addAttribute("message", user); return "jsp/index"; }
表单数据 http://localhost:8080/springmvctest/action?name=sss&role.name=admin
@RequestMapping("/action") public String action(Model model, User user) { model.addAttribute("message", user.getUsername() + "," + user.getRole().getName()); return "jsp/index"; }
@RequestParam注解可以实现请求参数绑定,Spring MVC会自动查找请求中的参数转类型并将与参数进行绑定,共有4个属性:
public @interface RequestParam { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean required() default true; String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n"; }
required属性表示是否为必须,默认值为true,如果请求中没有指定的参数会报异常
defaultValue属性指定参数的默认值,如:
@Controller @RequestMapping("/my") public class MyController { @RequestMapping("/action") public String action(Model model, @RequestParam(required = false, defaultValue = "0") int id) { model.addAttribute("message", id); return "jsp/index"; } }
使用@RequestParam绑定数组和List,如访问路径:http://localhost:8080/springmvctest/action?users=u1&users=u2&users=u3
@RequestMapping("/action") public String action(Model model, @RequestParam("users") Listusers) { model.addAttribute("message", users); return "jsp/index"; }
@RequestBody注解
将HTTP请求正文转换为适合的HttpMessageConverter对象。
AnnotationMethodHandlerAdapter初始化7个转换器,通过getMessageConverts()方法获取转换器集合,分别是:
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
@RequestBody默认接收的Content-Type是application/json,因此发送POST请求时需要设置请求报文头信息,否则Spring MVC在解析集合请求参数时不会自动转换成JSON数据再解析成相应的集合,
Spring默认的json协议解析由Jackson完成,需要加入Jackson的依赖:
com.fasterxml.jackson.core jackson-core 2.5.2 com.fasterxml.jackson.core jackson-databind 2.5.2
ajax请求时需要设置属性dataType为json,contentType为'application/json;charse=UTF-8',如:
@RequestMapping("/action") public void action(@RequestBody Listproducts, HttpServletResponse response) throws IOException { response.setCharacterEncoding("UTF-8"); response.getWriter().write("success"); }
-ajax发送对象
$.ajax({ type : "POST", url : "show/action", data : JSON.stringify(users), //将对象转换成json字符串 contentType : "application/json;charset=UTF-8", //发送信息至服务器时内容编码类型,默认为application/x-www-form-urlencoded dataType : "text", //预期服务器返回的数据类型 success : function(result) { $("#msg").html(result); } });
-ajax接受对象
$.ajax({ type : "POST", url : "bar/action22", data : JSON.stringify(products), //将对象转换成json字符串 contentType : "application/json;charset=UTF-8",//发送信息至服务器时内容编码类型 dataType : "json", //预期服务器返回的数据类型 success : function(result) { var str = ""; $.each(result, function(i, obj) {str += "id:" + obj.id + " 名称:" + obj.name + "
"; }); $("#msg").html(str); } });
重定向:将对action2的请求重定向到action1
@RequestMapping("/action1") public String action1(Model model) { return "jsp/index"; } @RequestMapping("/action2") public String action2(Model model) { model.addAttribute("message", "action1"); return "redirect:action1"; }
此时访问http://localhost:8080/springdemo/show/action1?message=action2,结果如下:
重定向会发起第二次请求,同时将第一次请求结果作为第二次请求的参数
Action返回值类型可以为:
基本数据类型
自定义模型
void
ModelAndView
Model
Map
View
String
HttpServletResponse
HttpEntity>
ResponseEntity>
HttpHeaders
action返回类型为String,默认代表视图名称,然后通过视图解析器找到资源
@ResponseBody注解是将内容或对象作为HTTP响应正文,调用适合HttpMessageConverter的Adapter转换对象,然后写入输出流,可以返回各种基本数据类型和自定义类型(调用json转换器,非常方便)
@RequestMapping("/action") @ResponseBody public String action() { return "aaaaaaa"; }
返回类型为void,且输出流中内容时,则不会去查找视图,而是将输入流中的内容直接返回到客户端,内容类型是纯文本
@RequestMapping("/action") public void action(HttpServletResponse response) throws IOException { response.getWriter().write("plain text
"); }
返回类型为ModelAndView,可以同时指定视图和数据,也可以只指定其中之一, ModelAndView拥有很多构造方法:
new ModelAndView("/bar/index"); Mapmodel=new HashMap (); model.put("message", "ModelAndView action35"); new ModelAndView("/bar/index",model); new ModelAndView("/bar/index","message","action35 ModelAndView "); ModelAndView modelAndView=new ModelAndView(); modelAndView.setViewName("/bar/index"); modelAndView.addObject("message", " Hello ModelAndView
");
如果返回视图未指定,则相当于返回视图为:控制器路径+方法名称,如下访问路径为:http://localhost:8080/springdemo/show/action1
@RequestMapping("/action") public Mapaction1() { Map model=new HashMap (); model.put("message", "hello"); model.put("name", "my name"); return model; }