SpringMVC 注解相关

@Controller注解

使用@Controller注解的类可以不需要集成特定的父类或者接口。 该注解标注的类就是一个SpringMVC Controller对象。为了让Spring能够自动找到控制器类,需要使用<context:component-scan../>元素,该元素指定一个包,这样Spring会自动扫描该包下的所有带有Spring注解的累,将其作为SpringBean。当然也要加上下面的元素:

    <!-- 配置annotation类型的处理映射器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <!-- 配置annotation类型的处理映射器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

@RequestMapping注解

@Controller注解可以指定了Controller,但是并不能指定哪个方法处理请求。@RequestMapping注解指示Spring用哪个类的哪一个方法处理请求动作。该注解可以用于类、方法。

@Controller
@RequestMapping(value = "/user")
public class UserController {
    private static final Log logger = LogFactory.getLog(UserController.class);

    //该方法的请求为 http://localhost:8080/user/register GET请求
    @RequestMapping(value = "/register", method = RequestMethod.GET)
    public String registerForm() {
        logger.info("   register GET 方法被调用");
        return "registerForm";
    }
}
  • 用于类的@RequestMapping(value = "/user")注解表示该要访问该类下的路由都需要加上/user;
  • 用于方法registerForm的注解@RequestMapping(value = "/register", method = RequestMethod.GET)指定该方法处理http://localhost/user/register请求,同时该方法只能处理GET请求。
  • @RequestMapping默认属性是value

@RequestMapping注解的部分属性

属性类型是否必须说明
valueString[]指定请求的地址映射到方法
nameString给映射地址一个别名
methodRequestMethod[]指定请求的方法类型
consumesString[]指定处理请求的提交内容类型(Content-Type)
producesString[]指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中包含的类型
paramsString[]指定request中必须包含某些参数时,才让该方法处理请求
headersString[]指定request中必须包含某些指定header值,才能让该方法处理请求

@RequestParam注解

属性类型是否必须说明
nameString指定请求头绑定的名称
valueStringname属性的别名
requiredboolean指定参数是否需要绑定
defaultValueString指定默认值
    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public String register(
            @RequestParam("loginname") String loginname,
            @RequestParam("password") String password,
            @RequestParam("username") String username) {
        //...
    }
  • @RequestParam("loginname") String loginname将请求中的loginname对应的值赋给loginname参数。

@PathVariable注解

@PathVariable注解只有一个value属性,表示请求中绑定到参数的值的名称。

    @RequestMapping(value = "/pathVariableTest/{userId}")
    public void pathVariableTest(@PathVariable(value = "userId") Integer userId) {
        //...
    }
  • @RequestMapping(value = "/pathVariableTest/{userId}")这是一个动态的请求,{userId}对于不同的请求有不同的值,@PathVariable(value = "userId") Integer userId这里指定请求中的userId会赋值到参数userId中。

@RequestHeader注解

该注解用于将请求的头信息数据映射到参数上。

    @RequestMapping(value = "/requestHeaderTest")
    public void requestHeaderTest(
            @RequestHeader("User-Agent") String userAgent,
            @RequestHeader(value = "Accept") String[] accepts) {
        //...
    }
  • @RequestHeader("User-Agent") String userAgent将请求头的User-Agent信息注入到userAgent参数中。

@CookieValue注解

该注解将请求的Cookie数据映射到参数中。

    public void cookieValueTest(
            @CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId) {
        logger.info("通过@CookieValue获得数据: " + sessionId);
    }
  • @CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId)Cookie中的JSESSIONID值设置到sessionId参数中。

@SessionAttribute注解

该注解可以选择Model中哪些属性存入到HttpSession中。

@Controller
@RequestMapping(value = "session")
//将Model中的属性名为user的属性放入HttpSession对象当中
@SessionAttributes("user")
public class SessionAttributesController {
    @RequestMapping(value = "/login")
    public String login(
            @RequestParam("loginname") String loginname,
            @RequestParam("password") String password,
            Model model
    ) {
        User user = new User();
        user.setLoginname(loginname);
        user.setPassword(password);
        user.setUsername("admin");
        model.addAttribute("user", user);
        return "welcome";
    }
}
  • @SessionAttributes("user")指定将Model中属性为user的内容存到HttpSession中。

@ModelAttribute注解

被该注解注释的方法会在Controller每个方法执行前被执行。

1.第一种情况 ModelAttribute(value=”“)修饰返回具体类型的方法

ModelAttribute(value=”xx”),修饰的方法返回的值会被添加到Model中,键为ModelAttribute(value="")xx,值为方法返回的值。
控制器:

@Controller
@RequestMapping(value = "/model")
public class ModelAttributeController {
    @ModelAttribute(value = "loginname")
    public String userModel1(
            @RequestParam("loginname") String name) {
        return name;
    }

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

表单

    <form action="/model/login1" method="post">
        <table>
            <tr>
                <td><label>登录名: </label></td>
                <td><input type="text" name="loginname"></td>
            </tr>
            <tr>
                <td><input type="submit" value="登录"></td>
            </tr>
        </table>
    </form>

表单点击登录后,调用ModelAttributeController控制器的login1方法,在调用该方法前会先调用userModel1方法,该方法的返回值会被添加到Model中,对应的键为loginname在视图中可以通过EL表达式获取。

第二种情况 ModelAttribute注释void方法

控制器:

@Controller
@RequestMapping(value = "/model2")
public class ModelAttribute2Controller {
    @ModelAttribute
    public void userModel2(
            @RequestParam("loginname") String loginname,
            @RequestParam("password") String password,
            Model model) {
        model.addAttribute("loginname", loginname);
        model.addAttribute("password", password);
    }

    @RequestMapping(value = "/login2")
    public String login2() {
        return "result2";
    }
}
  • ModelAttribute修饰没有返回值的方法,这时候如果要将数据添加到Model中,就需要在参数中添加Model参数。同样当访问.../login2路由时,userModel2方法会先于login2方法调用,将URL参数添加到Model中。最后在视图中通过EL表达式获取数据。

对应的视图是一个登录表单,不在给出。

第三种情况 ModelAttribute注释返回具体类的方法

控制器:

@Controller
@RequestMapping("/model3")
public class ModelAttribute3Controller {
    //...
    @ModelAttribute
    public User userModel3(
            @RequestParam("loginname") String loginname,
            @RequestParam("password") String password
    ) {
        return find(loginname, password);
    }
    //...
}
  • @ModelAttribute修饰在返回类的方法上,这里返回的是User类,那么Model中添加键为user,值为返回对象。

第四种情况 @ModelAttritube和@RequestMapping同时修饰一个方法

控制器:

@Controller
@RequestMapping(value = "/model4")
public class ModelAttribute4Controller {
    @RequestMapping(value = "/login4")
    @ModelAttribute(value = "username")
    public String login4() {
        return "admin";
    }
}
  • 此时请求的视图是/login4。并且Model键为username,值为返回的admin

第五种情况 @ModelAttribute注释一个方法的参数

控制器:

@Controller
@RequestMapping(value = "/model5")
public class ModelAttribute5Controller {
    @ModelAttribute(value = "user")
    public User userModel5(
            @RequestParam(value = "loginname") String loginname,
            @RequestParam(value = "password") String password
    ) {
        User user = new User();
        user.setLoginname(loginname);
        user.setPassword(password);
        return user;
    }

    @RequestMapping(value = "/login5")
    public String login5(@ModelAttribute("user") User user) {
        user.setUsername("管理员");
        return "result5";
    }
}
  • @ModelAttribute(value = "user")先修饰了一个方法,指定该方法返回的值插入到Model中,键为user
  • @ModelAttribute("user") User user修饰了参数,表示login5方法的参数user使用Model中键为user的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值