SpringMVC的使用


 

后台接收前端传递的参数

以表单参数的传递、接收为例
 

1、使用普通类型接收

<!-- 表单 -->
用户名:<input name="username" type="text" /><br />
密码:<input name="password" type="password" /><br />
年龄:<input name="age" type="number" /><br />
// controller使用普通类型接收,同名赋值
public String xxx(String username, String password, int age){

}

// 如果变量名不一致,用@RequestParam("xxx")绑定
public String xxx(String username, @RequestParam("password") String pwd, int age){

}

 

2、使用pojo类接收

// pojo类
@Setter
@Getter
public class User {
    private String username;
    private String password;
    private int age;
}
//controller使用pojo类接收。如果没有传递某些成员变量,为该类型的默认值
public String xxx(User user){

}
<!-- 表单字段的name使用pojo的成员变量 -->
用户名:<input name="username" type="text" /><br />
密码:<input name="password" type="password" /><br />
年龄:<input name="age" type="number" /><br />

 

3、使用扩展类接收

// 扩展类
@Setter
@Getter
public class UserExt {
    private User user;
    //...  //其它成员
}
// controller使用扩展类接收
public String xxx(UserExt userExt){

}
<!-- 表单字段的name使用扩展类的成员变量。注意:是扩展类的成员变量,不是controller中的扩展类形参 -->
用户名:<input name="user.username" type="text" /><br />
密码:<input name="user.password" type="password" /><br />
年龄:<input name="user.age" type="number" /><br />

 

4、其它

  • 单选框用String接收,复选框用String[ ]接收,复选框的name使用数组名

  • 日期使用Date接收,表单使用type=“date”。如果不进行相关计算,也可使用String接收。表单也可使用type=“text”,但使用text日期格式只能是 年/月/日 ,需要严格校验格式。

  • 批量操作,用数组或List接收。比如视图以表格形式列出了多个商品的信息,管理员在页面上修改了多个商品的信息,提交修改时可以使用Goods[ ]或List来传递数据。注意:如果数组、List的元素是自定义的类,比如Goods、User,后台不能直接使用数组、List接收,需要包装一下数组、List

// 使用包装类包装数组|List
@Setter
@Getter
public class GoodsArrayVO {
	private Goods[] goodsArray;
    // private List<Goods> goodsList;
}
// controller使用数组|List的包装类来接收
public String xxx(GoodsArrayVO goodsArrayVO){
	Goods[] goodsArray = goodsArrayVO.getGoodsArray();
	//.....

}
<!-- 和普通扩展类一样,表单字段使用扩展类的成员变量 -->
Goods1:<br />
<input type="hidden" name="id" value="001" />
商品名称:<input name="goodsArray[0].name" type="text"><br />
商品价格:<input name="goodsArray[0].price" type="number"><br /><br />

Goods2:<br />
<input type="hidden" name="id" value="002" />
商品名称:<input name="GoodsArray[1].name" type="text"><br />
商品价格:<input name="goodsArray[1].price" type="number"><br /><br />

 

controller向视图传递数据

// 方式一 使用Model作为形参,返回视图名,会自动传递Model,不用返回Model
public String xxx(Model model){
    model.addAttribute("username", "chy");
    return "index";
}

// 方式二 使用ModelAndView,需返回ModelAndView
public ModelAndView xxx(){
    ModelAndView mav = new ModelAndView("index");  //指定视图名
    mav.addObject("username", "chy1");  //传递数据
    return mav;
}

传递的数据,key是String,value可以是任何类型

 

controller的返回值类型

  • string 视图名
  • ModelAndView
  • 如果使用@ResponseBody,返回值可以是任何类型,会自动转换为json对象、json数组返回给浏览器

 

url映射

@GetMapping("/api/v1/xxx")  //只处理get方式的请求
@PostMappping("/api/v1/xxx")  //只处理post方式的请求

@RequestMapping("/api/v1/xxx")  //可处理所有请求方式


// 可指定要处理的请求方式、映射路径,都是数组{ }
@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST}, path = {"/api/v1/xxx1","/api/v1/xxx2"})

// 只有1个值时,可以缺省{ }
@RequestMapping(method = RequestMethod.GET, path = "/api/v1/xxx1")

// 只配置path时,可以缺省属性名,默认就是path
@RequestMapping({"/api/v1/xxx1","/api/v1/xxx2"})

 

restful风格

@GetMapping("/user/{id}")
public String findUser(@PathVariable int id){ //@PathVariable修饰变量
}

@GetMapping("/user/{user_id}")
public String findUser(@PathVariable("user_id") int userId){ //名称不一致时,要指定绑定哪个{}
}

@GetMapping("/product/{type}/{id}")
public String findProduct(@PathVariable String type,@PathVariable int id) { //有多个时,1个@PathVariable修饰1个变量
    
}

 
常用的请求方式

请求方式 应用 说明 对应CRUD
GET 获取资源 安全、幂等 R(Retrieve 读取)
POST 创建资源 非安全、非幂等 C
PUT 更新资源 非安全、幂等 U
DELETE 删除资源 非安全、幂等 D

其实post、put都可以创建、更新资源

  • post主要用于创建资源,如果资源已存在会覆盖,即更新;
  • put主要用于更新资源,如果资源不存在会先创建,比如根据id更新用户信息,如过指定id的用户不存在,会先创建该id的记录(其它字段使用默认值),再更新
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章