1.请求参数为单独字符串等单独格式
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 请求参数绑定入门
* @return
*/
@RequestMapping("/testParam")
public String testParam(String username,String password){
System.out.println("执行了...");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
return "success";
}
<a href="param/testParam?username=hehe&password=123">请求参数绑定</a>
如上,在请求参数中带有username和password的参数,可在请求方法中添加形参,若名称对应,其值会自动封存在形参中。
2.请求参数封装入javabean实体(封装类)中
●将请求参数封装在一个实体类中,让类的属性与其相对应进行封装。
把数据封装Account类中
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
金额:<input type="text" name="money" /><br/>
<input type="submit" value="提交" />
</form>
public class Account implements Serializable{
private String username;
private String password;
private Double money;
/**
* 请求参数绑定把数据封装到JavaBean的类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了...");
System.out.println(account);
return "success";
}
把数据封装Account类中,注意要生成对应的get、set方法,若要输出内容,则生成tostring方法。在请求方法的形参中添加同名实体类,即可调用其封装内容。
●若引用其他类,比如封装类中再引入封装类。
把数据封装Account类中
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
金额:<input type="text" name="money" /><br/>
用户姓名:<input type="text" name="user.uname" /><br/>
用户年龄:<input type="text" name="user.age" /><br/>
<input type="submit" value="提交" />
</form>
public class User implements Serializable{
private String uname;
private Integer age;
user已作为Account类的属性,所以要对应user的属性,则用”user.属性“的形式
●请求参数数据封装入类的集合中
效果为将两组用户姓名年龄各封装在list和map集合中
把数据封装Account类中,类中存在list和map的集合
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
金额:<input type="text" name="money" /><br/>
用户姓名:<input type="text" name="list[0].uname" /><br/>
用户年龄:<input type="text" name="list[0].age" /><br/>
用户姓名:<input type="text" name="map['one'].uname" /><br/>
用户年龄:<input type="text" name="map['one'].age" /><br/>
<input type="submit" value="提交" />
</form>
public class Account implements Serializable{
private String username;
private String password;
private Double money;
private List<User> list;
private Map<String,User> map;
将user类封装入集合list中,list[0].uname为将uname值封装在list集合的0位置,集合内存放user类
将user类封装入集合map中,map['one'].uname为将uname值封装在map集合的value中,value为user属性,map需要key,此处随便设定key为string类型的“one”。
最后打印效果如上。
3.获取servlet原生API的地址
/**
* 原生的API
* @return
*/
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
System.out.println("执行了...");
System.out.println(request);
HttpSession session = request.getSession();
System.out.println(session);
ServletContext servletContext = session.getServletContext();
System.out.println(servletContext);
System.out.println(response);
return "success";
}
只需在形参中写所需API,就能获取。
以上为控制台的输出打印。
4.@RequestParam
@RequestMapping(value ="/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username){
System.out.println("执行了...");
System.out.println(username);
return "success";
}
<a href="anno/testRequestParam?name=哈哈">RequestParam</a>
不用注解,则是找请求参数中的username属性或是封装类的username属性。
传入参数key是name,所以若要拿到值,形参中得用同名的name,否则获取不到。
(@RequestParam(name="name") String username)则将name参数封装到username中,相当于自定义。
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
如上name和value效果是一样的。required默认为true,指若使用了则必须传此命名的name参数,否则报错。
5.@RequestBody
/**
* 获取到请求体的内容
* @return
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了...");
System.out.println(body);
return "success";
}
<form action="anno/testRequestBody" method="post">
用户姓名:<input type="text" name="username" /><br/>
用户年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
RequestBody是将请求参数整体封装到形参body中去,之后关于json的时候再详细讲。
2020.12.23进行补充
<script>
// 页面加载,绑定单击事件
$(function(){
$("#btn").click(function(){
// alert("hello btn");
// 发送ajax请求
$.ajax({
// 编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hehe","password":"123","age":30}',
dataType:"json",
type:"post",
success:function(data){
// data服务器端响应的json的数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
});
});
</script>
前端发送ajax请求,发送数据为json字符串类型的data请求,然后后端要响应给前端json类型的数据data,之后才能解析。
/**
* 模拟异步请求响应
*/
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟查询数据库
user.setUsername("haha");
user.setAge(40);
// 做响应
return user;
}
通过@RequestBody注解将json数据封装在user中,根据同名自动封装在形参user的属性中(则提取了json字符串中的键值对),之后做响应,return了user类对象,但前端需要json类型的数据响应,@ResponseBody注解,可以吧返回的user对象转化为json类型。
6.restful编程风格与@PathVariable
即根据请求方法等的区别选择要使用的方法。
@RequestMapping(value="/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id){
System.out.println("执行了...");
System.out.println(id);
return "success";
}
{sid}是占位符,而PathVariable就是获取占位符的值,将其赋予字符串id
<a href="anno/testPathVariable/10">testPathVariable</a>
则最后输出结果为10
7.@RequestHeader
/**
* 获取请求头的值
* @param header
* @return
*/
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header) {
System.out.println("执行了...");
System.out.println(header);
return "success";
如上,获得请求头Accept的值
8.@CookieValue
游览器向服务器发送请求,服务器会开辟session空间,然后向游览器返回结果jsessionid。@CookieValue可以获取其值。
/**
* 获取Cookie的值
* @return
*/
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
System.out.println("执行了...");
System.out.println(cookieValue);
return "success";
}