第四節 請求方法的參數和请求类型

第四節 請求方法的參數和请求类型 方法定义 方法的参数 1. 基础类型和包装类型 2. Date 类型 3. 实体类 4. 集合(页面一次接收多个相同对象) Servlet的API 6. SpringMVC 文件上传類型 方法请求类型 限定访问的方法类型
方法定义
使用 ModelAndView 对象 ModelAndView 對象可以進行視圖的設置和數據設置
使用 Model 對象 Model 对象可以设置数据,方法的返回值则是视图的名称
ajax 方法 ajax 方法需要注解: @ResponseBody,这个注解想要正常工作需要 JackSon的jar包 这个是返回字符串类型
@RequestMapping(“f1”) public ModelAndView func1() { ModelAndView mav = new ModelAndView(); // 将数据保存起来,可以在页面获取到 mav.addObject(“say”, “Hello , World”); // 设置跳转的视图名称,这里只有视图名,没有扩展名称 mav.setViewName(“index”); return mav; }
@RequestMapping(“f2”) public String func2(Model model) { // 将数据保存起来,可以在页面获取到 model.addAttribute(“say”, “你好,世界”); return “index”; }

返回 JSON 格式 , 直接將返回值改爲使用的類就可以了
如果要返回 list 集合,就将返回值类型改为 list
方法的参数
常用的参数类型

  1. 基础类型和包装类型 2. 时间日期 3. 实体类 4. 集合 5. Servlet的API 6. SpringMVC 文件上传類型 1. CommonsMultipartFile 2. MultipartFile 1. 基础类型和包装类型
    两者的区别:

  2. 基础类型没有值的话,服務器会抛异常,无法运行到方法 2. 包组类型没有值的话,可以运行到方法,但是变量的值为 null
    @RequestMapping(“ajax1”) @ResponseBody public String ajax1() { return “你好,世界”; }
    @RequestMapping(value = “consumes”) @ResponseBody public User consumesDemo(String name) { System.out.println(“name = “+ name); User user = new User(name , "aa@126.com”); return user; }
    @RequestMapping(value = “consumes”) @ResponseBody public List consumesDemo() { List users = new ArrayList<>(); User user = new User(name , "aa@126.com”); users.add(user); return users; }

  3. Date 类型

  4. @DateTimeFormat(pattern=“yyyy-MM-dd”) 从页面得到的数据需要知道格式化的格式
    2.@JsonFormat(pattern=“yyyy-MM-dd”) 把后台的数据发送到页面并且格式化
    在实体类中的时间格式,可以直接使用注解。使用中只要把对象返回就可以了,得到的就是经过格式化的字符串
    实体类
    @RequestMapping(“p1”) public String param1(int width , Integer height) { System.out.println(“宽 = “+ width +” , 高 =”+ height); return “index”; }
    @RequestMapping(“p2”) public String param2(@DateTimeFormat(pattern=“yyyy-MM-dd”) Date birthday) { System.out.println(“生日是 =”+ birthday); return “index”; }
    public class User {
    private String uname; private String email; /** * @DateTimeFormat 从页面接受数据 * @JsonFormat 把后台的数据发送到页面并且格式化 */ @DateTimeFormat(pattern=“yyyy-MM-dd”) @JsonFormat(pattern=“yyyy-MM-dd”) private Date date; public User() { // TODO Auto-generated constructor stub }
    public User(String uname, String email) { super(); this.uname = uname; this.email = email; }
    public User(String uname, String email, Date date) { super(); this.uname = uname; this.email = email;
    Controller的方法定义

  5. 实体类
    这个和 struts2 的模型驱动是一样的使用方式 , 要注意表单元素的name 值是怎么写的
    this.date = date; }
    public String getUname() { return uname; }
    public void setUname(String uname) { this.uname = uname; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public Date getDate() { return date; }
    public void setDate(Date date) { this.date = date; }
    @Override public String toString() { return “User [uname=” + uname + “, email=” + email + “]”; } }
    @RequestMapping(“p3”) @ResponseBody public User param3() { return new User(“jack” , null , new Date()); }
    @RequestMapping(“p4”) public String param4(User user) { System.out.println( user ); return “index”;
    }
    页面代码

  6. 集合(页面一次接收多个相同对象)
    解决方案:
    在表单提交之前,把表单序列化成JSON格式传到后台 为实体对象进行增强封装
    这里采用第二种,将实体类对象进行封装
    示例1 实体类:User
    User的增强类
    页面:

UserName:
Email:
Date:
public class User { // 用户名 private String username; // 密码 private String password; /**get , set 方法省略**/ } public class UserModel { private List users; public List getUsers() { return users; } public void setUsers(List users) { this.users = users; } }

控制器方法:
示例2 实体类:Commodity , Type
SpringMVC 的控制器方法的参数需要注解:@RequestBody @requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比 如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型
页面 js 提交数据的方式

用户名:
密码:
用户名:
密码:
@RequestMapping("/user") public void test(UserModel userModel ){ logger.debug(JSONArray.toJSON(userModel)); } public class Commodity { private Integer cid; private String cname; private List types; // GET , SET .... } @RequestMapping("/demo") public void demo(@RequestBody Commodity commodity) { System.out.println( commodity ); } function demo() { var commodity = {} commodity.cname = "Jack" var type1 = {"type1":10001,"type2":10000 , "type3":10000,"typename": "喵星人"} var type2 = {"type1":10002,"type2":10000 , "type3":10000,"typename": "汪星人"} var types = [] types[0] = type1; types[1] = type2;

示例3 在示例2的基础上进修改 , 但是要注意下标的问题。如果页面的元素会添加删除,那么下标修改起来就 一定要注意顺序。否则后台接收到的列表对象中,会出现很多对象没有值的情况。
控制器中的方法修改 ,删除了@RequestBody注解
Servlet的API
这里仅演示了 HttpServletRequest,像HttpSession和HttpServletResponse等都可以正常使用。但是除了 HttpSession ,我们并不推荐使用 Servlet 的API。因为这样不能进行解耦,在测试代码的时候也不方便。 但是如果需要获取服务器路径等,还是需要使用 Servlet的API的。
commodity.types = types $.ajax({ url: “…/demo”, type: “post”, dataType : “json”, contentType : “application/json”, data: JSON.stringify(commodity) }); }


第一组 第二组 @RequestMapping("/demo") public void demo(Commodity commodity) { System.out.println( commodity ); } @RequestMapping("p5") public String param5(HttpServletRequest request) { request.getSession().setAttribute("name", "Mark"); return "index"; } 6. SpringMVC 文件上传類型 这个看之后的文件上传...... 方法请求类型 学习前,我们需要知道 HTTP的请求方法定义。框架的方法请求类型就是根据协议进行实现的。 HTTP请求的方法 HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式 1. OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送'*' 的请求来测试服务器的功 能性 2. HEAD 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的 情况下,就可以获取包含在响应小消息头中的元信息。 3. GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中, 其中一个原因是GET可能会被网络蜘蛛等随意访问 4. POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能 会导致新的资源的建立和/或已有资源的修改。 5. PUT 向指定资源位置上传其最新内容 6. DELETE 请求服务器删除Request-URL所标识的资源 7. TRACE 回显服务器收到的请求,主要用于测试或诊断 8. CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 注意: 方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码 405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。 HTTP服务器至少应该实现GET / POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支 持扩展自定义的方法。 限定访问的方法类型 org.springframework.web.bind.annotation.RequestMethod 是==枚举类型==,不是注解 @RequestMapping(value="m1" ,method= {RequestMethod.GET}) public String method1() { System.out.println("ParameterController.method1()"); return "index"; } @RequestMapping 中参数 method 可以设置请求方式。因为值是数组结构,所以可以使用{},在里面写多个请求 类型 注意: 1. 没有写 method 属性的时候,意味所有的请求类型都可以接收 2. 限制了请求类型后,其他的请求类型发起的请求都会被服务器拒绝
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值