Controller注解

在Spring中 Controller注解用于指示Spring类的实例是一个控制器,相对于实现Controller接口变得更加简单。而且实现Controller接口只能处理一个单一的请求,而是用@Controller注解可以支持同时处理多个请求动作,更加灵活。
@Controller用于标记一个类,使用他标记的类就是一个SpringMVC Controller对象,即一个控制器类,Spring使用扫描机制查找应用程序中所有基于注解的控制器类。分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解的方法才是真正处理请求的处理器。
在使用Controller注解前,需要在Spring配置文件中打开注解扫描

 <context:component-scan base-package="com.lucas"/>

Controller 注解用法

在使用注解前,创建一个 SpringMVC工程:【SpringMVC】SpringMVC入门实例

@Controller
public class LoginControl {

    @RequestMapping(value = "/index/login")
    public String login(){
        return  "login";
    }
}

@Controller表示该类是一个控制器类,@RequestMapping注解用来映射一个请求,value="/index/login"表示请求由该注解下的login方法进行处理。
所以当请求’/index/login’的地址,可以转发到LoginControllogin()方法进行处理
在这里插入图片描述

前面的RequestMapping注解也可以加到Controller类上 ,如下所示,请求得到同样的结果

@Controller
@RequestMapping("/index")
public class LoginControl {

    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
}

Controller 接收请求参数

通过形参接收请求参数

首先在之前的工程(【SpringMVC】SpringMVC入门实例)上增加如下修改
在这里插入图片描述
login.jsp修改如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/index/add" method="post">
    <div>
        名字:<input name="name" >
    </div>
    <div>
        年龄:<input name="age" >
    </div>
    <div>
        <input type="submit" value="添加用户">
    </div>
</form>
</body>
</html>

增加success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>添加成功</h2>
</body>
</html>

LoginControl中添加 add()方法,该方法增加两个参数agename,该参数名称需要和表单inputname的名称一致。

@Controller
@RequestMapping("/index")
public class LoginControl {

    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
    @RequestMapping(value = "/add")
    public String add(int age,String name){
        System.out.println("age:"+age+"  name:"+name);
        return  "success";
    }
}

请求结果如下:
在这里插入图片描述
在这里插入图片描述

控制台打印了请求参数信息
在这里插入图片描述

通过实体Bean 接收请求参数

在前面工程基础上新建实体类User

public class User {
    private int age;
    private  String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

LoginControl中 的add()方法参数修改如下:

@Controller
@RequestMapping("/index")
public class LoginControl {

    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
    @RequestMapping(value = "/add")
    public String add(User user){
        System.out.println("user:"+user );
        return  "success";
    }
}

执行结果:
在这里插入图片描述

通过HttpServletRequst接收请求参数

LoginControl中 的add()方法参数修改如下:

@Controller
@RequestMapping("/index")
public class LoginControl {

    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
    @RequestMapping(value = "/add")
    public String add(HttpServletRequest  request){
        System.out.println("request age:"+ request.getParameter("age") );
        System.out.println("request name:"+ request.getParameter("name") );
        return  "success";
    }
}

打印如下:
在这里插入图片描述

通过RequestParam注解接收请求参数

RequestParam注解作用:把请求中的指定名称的参数传递给控制器中的形参赋值
注解属性
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供

LoginControl中 的add()方法参数修改如下:

@Controller
@RequestMapping("/index")
public class LoginControl {

    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
    @RequestMapping(value = "/add")
    public String add(@RequestParam(value="name",required=false)String username,@RequestParam(value="age",required=false)String age){
        System.out.println("RequestParam age:"+ age);
        System.out.println("RequestParam name:"+ username );
        return  "success";
    }
}

打印如下:
在这里插入图片描述

通过PathVariable注解接收请求参数

PathVariable注解作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
注解属性 value:指定url中的占位符名称

优点:Restful风格的URL 请求路径一样,可以根据不同的请求方式去执行后台的不同方法

login.jsp中添加一个a标签


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/index/add" method="post">
    <div>
        名字:<input name="name" >
    </div>
    <div>
        年龄:<input name="age" >
    </div>
    <div>
        <input type="submit" value="添加用户">
    </div>
</form>
<a href="${pageContext.request.contextPath}/index/hello/1">PathVariable注解请求</a>
</body>
</html>

LoginControl中 添加sayHello()方法:

@Controller
@RequestMapping("/index")
public class LoginControl {

    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
    @RequestMapping(value = "/add")
    public String add(@RequestParam(value="name",required=false)String username,@RequestParam(value="age",required=false)String age){
        System.out.println("RequestParam age:"+ age);
        System.out.println("RequestParam name:"+ username );
        return  "success";
    }

    @RequestMapping(path="/hello/{id}")
    public String sayHello(@PathVariable(value="id") String id) {
        System.out.println("id="+id);
        return "success";
    }
}

在这里插入图片描述

通过ModelAttribute注解接收请求参数

ModelAttribute注解作用

  • 出现在方法上:表示当前方法会在控制器方法执行前线执行。
  • 出现在参数上:获取指定的数据给参数赋值。

修饰的方法有返回值

给User中添加一个id属性,再到UserController中添加一个parameterUser()方法,给user添加id,
在add方法中user已经被上面的parameterUser先执行了修改,已经给id赋值

@Controller
@RequestMapping("/index")
public class LoginControl {
    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
    @ModelAttribute
    public User parameterUser(){
        User user = new User();
        user.setId(1);
        return user;
    }
    @RequestMapping(value = "/add")
    public String add(User user){
        System.out.println("user :"+ user);
        return  "success";
    }
}

在这里插入图片描述
在这里插入图片描述

修饰的方法没有返回值

在上面案例基础上,把parameterUser的返回值去掉,增加一个Map来存储数据,存储的key为user,在add方法中使用@ModelAttribute(“user”)User user获取在parameterUser()方法中赋值的数据。程序运行后,add方法的user参数能取到parameterUser方法赋值的数据。 执行结果同上

@Controller
@RequestMapping("/index")
public class LoginControl {
    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }
    @ModelAttribute
    public void parameterUser(Map<String,User> userMap){
        User user = new User();
        user.setId(2);
        userMap.put("user",user);
    }
    @RequestMapping(value = "/add")
    public String add(@ModelAttribute("user")User user){
        System.out.println("user :"+ user);
        return  "success";
    }
}

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐