Spring MVC学习(二)常用注解

  1. Controller注解:用于标记一个类,使用该注解标记过的类就是一个控制器类,Spring使用扫描机制查找应用程序中所有基于注解的控制器类,分发器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。eg:@Controller
    public class newHelloController {}
  2. @RequestMapping注解:可以用来注释一个控制器类,这时候类中的所有方法都将映射为相对于类级别的请求。eg:@Controller
    @RequestMapping(value=”/user”)//注解类,该类下的所有方法都对应改路径
    public class userController {} 访问路径:http://localhost:8080/SpringMVCTest/user/register ;注释方法时,被注释的方法将成为一个请求处理方法。eg:@RequestMapping(value=”/hello”)
    public String hello(Model model){}
    • value属性:是@RequestMapping注释的默认属性,如果只有唯一的属性则可以省略属性名。
    • method属性:用来指示该方法仅仅处理哪些HTTP请求。
    • consumes属性:指定处理请求的提交内容类型。
    • produces属性:指定返回的内容类型。
    • params属性:指定request中必须包含某些参数值时才让该方法处理。
    • header属性:指定request中必须包含某些指定的header值,才让该方法处理请求。
  3. Model和ModelMap
    • Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器.如果处理方法的参数为Model或ModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数.在处理方法内部,开发者就可以通过调用这个参数对象访问模型数据中的所有数据,也可以向模型中添加新的属性数据.示例代码如下:

@ModelAttribute 注解注释的方法会优先调用,负责接收前台jsp页面传入的参数。

package com.xing.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 *@author xpengfei
 *@creat  3:25:30 PM   Sep 15, 2017
 */
@Controller
public class userTestModelAndModelMap {
    private static final Log logger=LogFactory.getLog(userTestModelAndModelMap.class);

    @ModelAttribute
    public void userModel(String username,String password,Model model){
        logger.info("***********userModel方法***********");
        //创建User对象存储jsp页面传入的参数
        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
        //将user对象添加到Model中
        model.addAttribute("user", user);
    }

    @RequestMapping(value="login1")
    public String login(Model model){
        logger.info("login1---------------------");
        //从Model中获取User对象
        User user=(User)model.asMap().get("user");
        user.setTestName("hhhhhh1111111111");
        System.out.println(user+"************************");
        return "result1";
    }
}

这里写图片描述

package com.xing.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 *@author xpengfei
 *@creat  3:38:43 PM   Sep 15, 2017
 */
@Controller
public class userTestModelAndModelMap2 {
    private static final Log logger=LogFactory.getLog(userTestModelAndModelMap2.class);

    @ModelAttribute  //@ModelAttribute注解修饰的方法会先于login调用,用于接收前台jsp页面传入的参数
    public void userModel2(String username,String password,ModelMap modelMap){
        logger.info("userModel2***********");

        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setTestName("hhhhh2222222222");
        modelMap.addAttribute("user", user);
    }

    @RequestMapping(value="/login2")
    public String login2(ModelMap modelMap){
        logger.info("login2***************");
        User user=(User)modelMap.get("user");
        System.out.println(user+"---------------------");
        return "result2";
    }
}

这里写图片描述

4.ModelAndView的使用示例:

package com.xing.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 *@author xpengfei
 *@creat  4:14:52 PM   Sep 15, 2017
 */
@Controller
public class userTestModelAndModelMap3 {
    private static final Log logger=LogFactory.getLog(userTestModelAndModelMap3.class);

    @ModelAttribute
    public void userModel3(String username,String password,ModelAndView modelAndView){
        logger.info("userModel3*************");
        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
        //将user对象添加到ModelAndView的Model中
        modelAndView.addObject("user", user);
    }

    @RequestMapping(value="login3")
    public ModelAndView login3(ModelAndView modelAndView){
        logger.info("login3-----------");
        User user =(User)modelAndView.getModel().get("user");
        System.out.println(user);

        user.setTestName("333333hhhhhhhhhhhhhh");
        //设置返回的视图名称
        modelAndView.setViewName("result3");
        return modelAndView;
    }
}

这里写图片描述
5.@RequestParam注解:
属性:
- name 类型String 用于指定请求头绑定的名称
- value 类型String name属性的别名
- required 类型 boolean 指示参数是否必须绑定
- defaultValue 类型String 如果没有传递参数而使用的默认值
使用示例代码:

package com.xing.controller;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;


/**
 *@author xpengfei
 *@creat  2:56:32 PM   Sep 15, 2017
 */
@Controller
@RequestMapping(value="/user")//注解类,该类下的所有方法都对应改路径
public class userController {
    //定义静态User类型的list用于代替数据库保存用户注册的信息
    private static List<User>userList;
    //构造类,初始化List
    public userController(){
        userList=new ArrayList<User>();
    }
    private static final Log logger=LogFactory.getLog(userController.class);


    @RequestMapping(value="/register",method=RequestMethod.GET)
    //响应请求http://localhost:8080/SpringMVCTest/user/register    支持get方法
    public String registerForm(){
        logger.info("register  get 方法被调用-------------------");
        //跳转到注册页面
        return "register";
    }


    @RequestMapping(value="/register",method=RequestMethod.POST)
    //响应请求http://localhost:8080/SpringMVCTest/user/register 支持post方法
    public String register(
            //将请求中的username参数的值赋给username变量,其他两个同样处理
            @RequestParam("username") String username,
            @RequestParam("password") String password,
            @RequestParam("testName") String testName
            ){
        logger.info("register post 方法被调用------");
        //创建User对象
        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setTestName(testName);

        //模拟数据库存储user
        userList.add(user);
        //跳转到登录界面
        return "login";
    }

    //响应请求http://localhost:8080/SpringMVCTest/user/login
    @RequestMapping(value="/login")
    public String login(
            //将请求中的username参数的值赋给username变量,其他两个做同样处理
            @RequestParam("username") String username,
            @RequestParam("password") String password,
            Model model
            ){
        logger.info("登录名:"+username+"\t密码:"+password);
        //在集合中查找用户是否存在,
        for(User user:userList){
            //若用户名和密码不匹配,则不会跳转到欢迎页面
            if(user.getUsername().equals(username)
                    && user.getPassword().equals(password)){
                model.addAttribute("user", user);
                return "welcome";
            }
        }
        return "login";
    }
}

程序运行结果如下图:
这里写图片描述
这里写图片描述
这里写图片描述
6.@PathVariable、@RequestHeader、@CookieValue注解
- @PathVariable注解:可以非常方便的获得请求URL中的动态参数,该注解只支持一个属性value,类型为String表示绑定的名称,如果省略则默认绑定同名参数。
- @RequestHeader注解:将请求的头部信息区数据映射到功能处理方法的参数上。name属性 用于指定头部绑定的名称 类型为String;value属性 是name属性的别名 类型为String;required属性 表示参数是否必须绑定 类型为Boolean;defaultValue属性:如果没有传递参数而是用的默认值 类型String;
- @CookieValue注解:用于将请求的Cookie数据映射到功能处理方法的参数上。属性和@RequestHeader的属性相同;
示例:

package com.xing.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 *@author xpengfei
 *@creat  6:01:57 PM   Sep 15, 2017
 *@PathVariable、@RequestHeader、@CookieValue注解的示例
 */
@Controller
@RequestMapping(value="/user")
public class PRCController {
    private static final Log logger=LogFactory.getLog(PRCController.class);
//  跳转到jsp页面
    @RequestMapping(value="/PRCController")
    public String PRCController(){
        return "PRCController";
    }

    /*
     * 测试@PathVariable注解
     * 该方法映射的请求为:
     */
    @RequestMapping(value="/pathVariableTest/{userId}")
    public void pathVariableTest(
            @PathVariable Integer userId
            ){
        logger.info("通过@PathVariable获取的数据:"+userId);
    }
    /*
     * 测试方法@RequestHeader注解
     * 该方法映射的请求为:
     */
    @RequestMapping(value="/requestHeaderTest")
    public void requestHeaderTest(
                @RequestHeader("User-Agent") String userAgent,
                @RequestHeader(value="Accept") String[]accepts
            ){
        logger.info("通过@RequestHeader注解获得的数据:"+userAgent);
        for(String accept: accepts){
            logger.info(accept+"-------------");
        }
    }
    /*
     * 测试@CookieValue注解
     */
    @RequestMapping(value="/CookieValueTest")
    public void cookieValueTest(
                @CookieValue(value="JSEEIONID",defaultValue="")String sessionId
            ){
        logger.info("通过@CookieValueTest获得的数据:"+sessionId);
    }
}

结果如下:
这里写图片描述
7.@SessionAttributes属性:允许我们选择性的指定Model中的哪些属性需要转存到HttPSession中.
- names属性: String[]类型,是Model中属性的名称,即存储在HttpSession当中的属性名称。
- value属性:String[]类型,name属性的别名。
- types属性:Class <”?”>类型,指示参数是否必须绑定。
PS:上边<>中的?单独打的是否排版有问题,就加了引号.
eg:
//将Model中属性名为user的属性放入HttpSession对象中
@SessionAttributes(“user”)
public class userController {}
这样user对象就被放到了session中了.

还可以写为:@SessionAttributes(types={User.class},value=”user”)

还可以放置多个对象到HttpSession中:
@SessionAttributes(types={User.class,Dept.class},value={“user”,”dept”})
types属性是用来指定放入HttpSession当中的对象类型.
8.@ModelAttribute注解:只支持一个属性value,类型为String,表示绑定的属性名称。
- 被@ModelAttribute注解注释的方法会在Controller每个方法执行前被执行,因此当一个Controller映射到多个URL时,需要谨慎使用。
- @ModelAttribute(value=“”)注释:返回具体类的方法。
- @ModelAttribute 注释void返回值的方法:model属性的名称和值由void方法内部model.addAttribute()方法实现,前提是要在方法的参数列表中出入一个Model类型的参数。
- @ModelAttribute注释返回具体类的方法
例如:
@ModelAttribute
public User userModel(
@RequestParam(“username”) String username,
@RequestParam(“password”)String password
){
return find(username,password);
}
在此例中userModel方法的返回值类型隐含表示,在这个例子中返回的是User类型,则model属性的名称就是user。
- @RequestMapping和@ModelAttribute同时注释一个方法时,方法返回的不再是视图名称:
例如:
@RequestMapping(value=“login”)
@ModelAttribute(value=“username”)
public String login(){
return “admin”;
}
这种使用方法不是返回名为admin的视图,而是相当于在request中封装了username(相当于key)=admin(相当于value);
- @ModelAttribute注释一个方法的参数
- 这时参数就是model的属性

未完待续……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值