获取请求数据
使用原生Servlet API获取
这里的原生Servlet API即为使用HttpServletRequest对象来获取参数
@RequestMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response){
String username=request.getParameter("username");
String password=request.getParameter("password");
if(username.equals("admin") && password.equals("123456")){
return "success";
}else {
return "error";
}
注意这里的HttpServletRequest等对象是由web容器创建的
使用@RequestParam
注解获取参数
@RequestMapping("/login")
public String login(
@RequestParam(required = true)
String username,
@RequestParam
String password
){
if(username.equals("admin") && password.equals("admin")){
return "success";
}else {
return "error";
}
}
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
// name同value用于指定前端数据的name
// 若形参名与参数name相同则不需要指定
@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";
}
使用控制器方法上的形参名接收
若请求参数名和控制器方法上的形参名相同,那么可以省略@RequestParam注解
当使用的是Spring6+版本,则需要在pom.xml文件中指定编译参数-parameter
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- maven版本 -->
<version>3.9.8</version>
<configuration>
<!-- 生成java字节码版本 -->
<source>21</source>
<target>21</target>
<compilerArgs>
<!-- 指明在生成字节码时保留方法参数名称 -->
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
使用javabean接受请求参数
若前端使用json提交那么需要在形参处添加@RequestBody注解
@Data
public class User {
private String username;
private String password;
}
// 使用javabean接收参数
@RequestMapping("/login")
public String login(User user){
if(user.getUsername().equals("admin") && user.getPassword().equals("admin")){
return "success";
}else{
return "error";
}
}
底层先通过扫描文件,通过isAnnotationPresent()
方法判断该类是否被@Controller
注解;若被注解,则通过该类的getMethod()
方法来获取每一个方法,同时用方法对象的getAnnotation()
方法判断该方法是否是一个requestMapping;若此方法是一个requestMapping,则使用该方法对象的getParameters()
方法,来获取参数类型。获取到参数类型后利用invoke()
来为该参数赋值,所赋予的值是通过对参数类的class对象使用newInstance()
方法所创建,并利用参数类的class对象的getMethod()
方法获取到该类的所有方法后,再利用这些方法中所有的setter方法名去掉set且首字母小写作为前端请求参数名通过httprequest对象来获取这些参数的值,并使用这些setter对象invoke()
方法来进行赋值
若对上述分析理解还不够深刻,则去看之前spring6中手写ioc的部分
使用@RequestHeader
注解获取请求头
使用方法与@RequestParam
相同,其value为请求头中属性的名称
使用@CookieValue
注解获取提交的cookie
使用方法与@RequestParam
相同,其value为cookie中属性的名称
发送一个cookie
<script type="text/javascript">
function sendCookie(){
document.cookie = "id=1; expires=Thu,18 Dec 2025 12:00:00 UTC; path=/";
document.location = "/springmvc/login";
}
</script>
<button onclick="sendCookie()">发送cookie</button>