springmvc注解有哪些?使用方法详解

TheDisguiser 2020-07-24 17:26:49 java常见问答 8444

springmvc中,注解几乎可以解决一切事情,所以熟练掌握注解是非常有必要的,下面让我们来看看它有哪些注解及该如何使用吧。

一、@Controller

@Controller 标记于一个类上,它标记过的类就是一个SpringMVC Controller 对象

package com.cqvie.handler;
import org.springframework.stereotype.Controller;
@Controller
public class HelloWorld
{
    @RequestMapping("/helloworld")
    public String sayHello()
    {
        System.out.println("Hello World!");
        return "success";
    }
}

二、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,适用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

/**
 * Rest 风格的 URL(以 CRUD 为例):
 *         新增:/order POST
 *         修改:/order/1 PUT
 *         获取:/order/1 GET
 *         删除:/order/1 DELETE
 * @param id
 * @return
 */
@RequestMapping(value = "/testRestPut/{id}", method = RequestMethod.PUT)
public String testRestPut(@PathVariable int id)
{
    System.out.println("testRestPut:" + id);
    return SUCCESS;
}
@RequestMapping(value = "/testRestDelete/{id}", method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable int id)
{
    System.out.println("testRestDelete:" + id);
    return SUCCESS;
}
@RequestMapping(value = "/testRestPost/{id}", method = RequestMethod.POST)
public String testRestPost(@PathVariable int id)
{
    System.out.println("testRestPost:" + id);
    return SUCCESS;
}
@RequestMapping("/testRestGet")
public String testRestGet()
{
    System.out.println("testRestGet");
    return SUCCESS;
}

三、@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数

@Controller
public class TestController
{
    @RequestMapping(value = "/user/{userId}/roles/{roleId}", method = RequestMethod.GET)
    public String getLogin(@PathVariable("userId") String userId
        , @PathVariable("roleId") String roleId)
    {
        System.out.println("User Id : " + userId);
        System.out.println("Role Id : " + roleId);
        return "hello";
    }
    @RequestMapping(value = "/product/{productId}", method = RequestMethod.GET)
    public String getProduct(@PathVariable("productId") String productId)
    {
        System.out.println("Product Id : " + productId);
        return "hello";
    }
    @RequestMapping(value = "/javabeat/{regexp1:[a-z-]+}"
        , method = RequestMethod.GET)
    public String getRegExp(@PathVariable("regexp1") String regexp1)
    {
        System.out.println("URI Part 1 : " + regexp1);
        return "hello";
    }
}

四、@RequestParam

@RequestParam适用于将请求参数区数据映射到功能处理方法的参数上

/**
 * @RequestParam("id") 带参映射
 * @param id
 * @return
 */
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("id") int id)
{
    System.out.println("testRequestParam  " + id);
    return "success";
}

五、@CookieValue

常用于获取Cookie中的值

/**
 * 获取 Session
 * JSESSIONID=411A032E02A2594698F6E3F4458B9CE4
 */
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId)
{
    System.out.println("JSESSIONID = " + sessionId);
    return "success";
}

六、@SessionAttributes

@SessionAttributes即将值放到session作用域中,写于class上

package com.cqvie.yjq;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import com.cqvie.model.User;
@SessionAttributes(value = {
    "user"
}, types = {
    String.class
})
@RequestMapping("/springmvc")
@Controller
public class SessionAttributesTest
{
    /**
     * @SessionAttributes
     *         除了可以通过属性名指定需要放到会话中的属性外(value 属性值),
     *         还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值)。
     * 注意: 该注解只能放在类的上面,不能放在方法上面
     * 
     * @return
     */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Map < String, Object > map)
    {
        User user = new User(1, "刘邦", "qwe", "123", "辽宁");
        map.put("user", user);
        map.put("school", "重庆");
        return "success";
    }
}

七、@ModelAttribute

代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

package com.cqvie.yjq;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.cqvie.model.User;
@Controller
@RequestMapping("/springmvc")
public class ModelAttributeTest
{
    private static final String SUCCESS = "success";
    /**
     * 1.有 @ModelAttribute 标记的方法,会在每个目标方法执行之前被 SpringMVC 调用
     * 2.@ModelAttribute注解也可以修饰目标方法POJO类形的入参,其value的属性值有如下作用:
     *     1)SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在则直接传入到目标方法的入参中
     *     2)SpringMVC会以value为key,POJO类型的对象为value,存入的request中
     * 
     * @param id
     * @param map
     */
    @ModelAttribute
    public void getUser(@RequestParam(value = "id", required = false) int id
        , Map < String, Object > map)
    {
        //模拟数据库中获取对象
        User user = new User(1, "刘邦", "123", "023", "重庆");
        System.out.println("从数据库中获取一个对象:" + user);
        map.put("abc", user);
    }
    /**
     * 运行流程:
     *         1.执行@ModelAttribute注解修饰的方法,从数据库中取出对象,把对象放入Map中,键为:user;
     *         2.SpringMVC从Map中取出User对象,并把表单的请求参数赋值给该User对象的对应属性;
     *         3.SpringMVC把上述对象传入目标方法的参数。
     * 
     * 注意:在@ModelAttribute修饰的方法中,放入到Map时的键需要和目标方法入参类型的第一个字母小写的字符串一致
     * 
     * @param user
     * @return
     */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") User user)
    {
        System.out.println("修改:" + user);
        return SUCCESS;
    }
}

以上就是本篇文章的所有内容,如果想要了解更多java架构师知识,就请持续关注奇Q工具网。

推荐阅读:

SpringMvc @RequestMapping原理详解

springmvc的工作流程是怎样的?流程详解

springmvc和struts2的区别是什么?有什么不同?