SpringMVC之控制器接收各类请求参数

1.接收普通请求参数
传递过来的参数名称和HTTP的一致时,无须任何注解直接可以获取参数信息;如果不一致,无法获取。(参数允许为空)

(1)接收的参数为某一字段,这里的例子是发送ajax请求,data中的id既是发送请求的参数。如果是表单中的某一个字段,则要name属性的值跟参数名一样才能接收参数信息。

$.ajax({
      type: 'get',
       url: '<%=basePath%>/account/deleteAccountById',
       data: {id: data.id},
       success: function (result) {
             if (result.code == 0) {
                   window.location.reload();//刷新当前页面
             }else {
                    layer.msg('eles:删除失败!' + result.msg, {icon: 2, time: 500});
          }
      }
   })

@RequestMapping("deleteAccountById")
    @ResponseBody
    public Map<String, Object> deleteAccountById(Integer id){
        accountService.deleteAccountById(id);
        Map<String,Object> map = new HashMap<>();
        map.put("code","0");
        map.put("count","1000");
        map.put("msg","");
        return map;
    }

(2)接受的参数为pojo对象,跟字段一样,如果是表单,则表单的name属性要与pojo对象中的每一个属性值相同。

//前端代码
$.ajax({
     type: 'POST',
     url: '<%=basePath%>/account/addAccount',
     data: data.field,
     dataType:'json',
     async: true,
     success: function (result) {
         console.log(result.code);
         if (result.code == 0) {
             layer.msg('success:保存成功', {icon: 1, time: 500});
             setTimeout(function () {
                parent.location.href = "<%=basePath%>/account/toAccount";
             }, 1000);
         } else {
            console.alert(result.code);
            layer.msg('eles:保存失败!' + result.msg, {icon: 2, time: 500});
            layer.close(index);
            }
        }
    });

//控制器代码
@RequestMapping("addAccount")
    @ResponseBody
    public Map<String,Object> addAccount(Account account){
        Integer role_id = roleService.findIdByName(account.getRole_name());
        account.setRole_id(role_id);
        accountService.addAccount(account);
        Map<String,Object> map = new HashMap<>();
        map.put("code","0");
        map.put("msg","");
        return map;
    }

2.使用@RequestParam注解获取参数
使用场景:在name属性值与字段值或者pojo的属性值不同时,获取参数;或者是想获取某个参数的值,但没有对应的字段或者pojo属性与其对应。默认参数不能为空

//前端代码
layui.form.on('submit(save)', function (data) {
        var ids = $("#userList").val();
        $.ajax({
            type: 'POST',
            url: '<%=basePath%>/assess/addAssess?ids='+ids,
            data: data.field,
            dataType:'json',
            async: true,
            success: function (result) {
                if (result.code == 0) {
                    layer.msg('success:保存成功', {icon: 1, time: 500});
                    setTimeout(function () {
                        parent.location.href = "<%=basePath%>/assess/activityInfo";
                    }, 1000);
                } else {
                    console.alert(result.code);
                    layer.msg('eles:保存失败!' + result.msg, {icon: 2, time: 500});
                    layer.close(index);
                }
            },
            error: function (result, type) {
                layer.msg('error:保存失败!'+result+":"+type, {icon: 2, time: 500});
            }
        });
        console.log(data.field)
        return false;
    })
    })

//后台代码,这里的ids是获取的一系列的信息id集合,所以需要@RequestParam获取该参数
 @RequestMapping("addAssess")
    @Transactional
    @ResponseBody
    public Map<String,Object> addAssess(@RequestParam("ids")String ids,Assess assess){

3.使用URL传递参数
该方法符合RESTFul风格,通过get请求直接发送参数值,如/params/getRole/1,其中1就是参数,该方法就是获取1的值。
{id}代表处理器需要接受一个由URL组成的参数,且参数名称为id,那么在方法中的@PathVariable(“id”)表示将获取这个在@RequestMapping中定义名称为id的参数。

@RequestMappping("/getRole/{id}")
//注解@PathVariable表示从URL的请求地址中获取参数
public String pathVariable(@PathVariable("id")int id){
     .......
}

4.传递JSON参数
针对:对于参数的传递还需要更多的参数时,如分页查询。
前端代码传递时:
(1)注意发送的请求中contentType需要指定为”application/json”,data:JSON.stringify(data)//将json转化成字段串传递
(2)在后台代码中,需要使用@ResponseBody注解分页的pojo,如果要返回ajax请求的数据,也需要使用@ResponseBody在方法的前面。

5.接收列表数据和表单序列化
接收列表数据:通过将json数据转换成字符串进行传递,使用new MappingJackson2JsonView()返回json格式数据(只对MoldeAndVIew返回形式)
表单序列化:在前端代码中,使用$(“form”).serialize();

6.重定向
场景:在新增一个角色信息后,需要将新增的数据信息展示给请求者

 @RequestMapping("/addRole")
    //Model为重定向数据模型,spring MVC会自动初始化
    public String addRole(Model model,String roleName){
        Role role = new Role();
        role.setName(roleName);
        //插入角色信息后,会回填角色编号
        roleServcice.addRole(role);
        model.addAttribute("roleName",roleName);
        return "redirect:../assess/assess_info";
    }

model是一种数据模型,然后通过返回字符串实现重定向功能。spring mvc有一个约定,当返回的字符串有redirect时,就认定该请求不是转向视图解析器,而是重定向。当然也可以通过modelAndView的addObject添加,然后进行重定向。

但对于传递的参数一般不只是一个两个,而是一个pojo类,可以通过以下方式:

@RequestMapping("/addRole")
    public ModelAndView addRole(Role role){
        ModelAndView mv = new ModelAndView();
        mv.addObject("role",role);
        mv.setViewName("redirect:../assess/assess_info");
    }

但是这个方法不能实现URL重定向的数据传递。因为HTTP的重定向传递参数是以字符串的形式传递的。这个时候需要通过另一个数据模型RedirectAttribute.

@RequestMapping("/addRole")
    //RedirectAttributes对象Spring MVC会自动初始化它
    public String addRole(RedirectAttributes rs,Role role){
        roleService.addRole(role);
        rs.addFlashAttribute("role",role);
        return "redirect:../assess/assess_info";
    }

该传递方法的原理是:使用addFlashAttribute方法后,Spring MVC会将数据保存到session中,重定向后就会将其清除,这样就可以实现对象数据的重定向。

7.保存并获取属性参数
在开发过程中,有时候我们会暂时将数据存储到HTTP的request对象或者session对象中,或者是从中获取数据。在spring mvc中,通过三个注解获取该数据:(1)@RequestAttribute:获取HTTP的请求(request)对象属性值,用来传递给控制器的参数。(该注解在参数中使用)

public String reqAttr(@RequestAttribute("id")int id)

(2)@SessionAttribute:获取HTTP的请求(session)对象属性值,用来传递给控制器的参数。参数默认不能为空,可以通过required=false修改。

public String reqAttr(@SessionAttribute("id")int id)

(3)SessionAttributes:书上解释:给它配置一个字符串数组,这个数组对应的是数据模型对应的键值对,然后将这些键值对保存到session中。通过传递的参数,会根据名称和类型保存id和角色信息。

//可以配置数据模型的名称和类型,两者取或关系
@SessionAttribute(name={"id"},types={Role.class})

8.@CookieValue和@ReuquestHeader
就是从cookie和HTTP的header中获取对应的请求信息。在方法的参数中使用。默认参数不能为空。

public String HeaderAndCookie(
                @ReuqestHeader(value="User-Agent,required=false,defaultValue="attribute")String userAgent,
                @CookieValue(value="JSESSIONID",required=false,defaultValue="MyJsessionId")String jsessionId,

猜你喜欢

转载自blog.csdn.net/qq_29340989/article/details/80543772