Spring MVC中Action使用总结

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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 注解参数访问特定的se​​rvlet请求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

username:
pdctname:
@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") List users) {
    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 List products, 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");
        
Map model=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 Map action1()
{
    Map model=new HashMap();
    model.put("message", "hello");
    model.put("name", "my name");
    return model;
}

转载于:https://my.oschina.net/chenshuang/blog/1329769

你可能感兴趣的:(Spring MVC中Action使用总结)