SpringMVC 常用注解 --面试中会问的一些内容

1、@Controller
@Cnontroller 在controller层的类上会用到该注解。分发处理器会扫描使用该注解的类,并检测方法是否使用了@RequestMapping注解。
该注解如果被识别需要开启包扫描。注意***@Controller 的功能是定义一个控制器,真正处理请求的处理器是使用@RequestMapping注解的方法。

2.@RequestMapping
@ResquestMapping是一个用来处理请求地址映射的注解,可用在类上或者上。用于类上表示所有响应请求的方法都是以该地址作为父类。
返回值会通过视图解析器解析为实际的物理视图,InternalResourceViewResolver视图解析器会做出如下解析:通过 prefix+returnval+suffix 的方式得到实际物理视图、
例:

<!-- 配置视图解析器:如何把 handler 方法返回值解析为实际的物理视图 -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/views/"></property>
         <property name="suffix" value=".jsp"></property>
     </bean>

RequestMapping注解有六个属性;
1.value:指定请求实际的地址 @RequestMapping(value = "/testRestPut/{id})实际访问地址是:localhost://testRestPut/id
2.method:指定求求的method类型 GET POST PUT DELETE 等
例:

/**
     * 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;
    }

3.consumes:指定处理器提交内容类型(Content-Type)如application/json, text/html;
4.produces:指定返回内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
5.params:指定request中必须包含某些参数值,才能让该方法处理请求
6.header:指定request中某些方法必须包含的header值,才能让该方法处理请求

3、@Resource和@Autowired
都是bean的注入时使用的注解,@Resource并不是spring的注解,它的包是javax.annotation.Resource,需要导入,但是spring支持该注解注入。
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要在写setter方法了。
1.@Autowired
它是spring提供的,只安装类型注入。可以放在属性和或setter方法上
例;

public class HelloWorld{
    // 下面两种@Autowired只要使用一种即可
    @Autowired
    private UserDao userDao; // 用于字段上
    
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于属性的方法上
        this.userDao = userDao;
    }
}

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

public class HelloWorld{ 
  @Autowired 
  @Qualifier("userDao") 
  private UserDao userDao; 
}

2.@Resource
@Resource默认是名称注入(byName)需要导入jar包javax.annotation.Resource
@Resource 有两个重要的属性,name和type。因为Spring将@Resource注解的name属性解析为bean的名称,type属性解析为了bean的类型。所以,如果使用name,需要使用名称自动注入(byName)策略,使用type属性是使用自动类型注入(byType)策略。如果既不指定name也不指定type属性,这是将通过反射机制使用名称自动注入策略。
注意:最好是将@Resource放在setter方法上,这样更符合面向对象思想,通过get,set方法操作属性,不是直接操作类。

public class HelloWorld{
    // 下面两种@Resource只要使用一种即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
        this.userDao = userDao;
    }
}

4、@PathVariable
用于将url中的模板变量映射到功能处理方法的参数上,即取出url模板中变量作为参数。
例:

@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";  
     }  
} 

5、@CookieValue
作用:用来获取Cookie中的值;
  参数: value:参数名称 required:是否必须 defaultValue:默认
例:

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

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

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

7、@SessionAttributes
作用:@SessionAttributes即将值放到session作用域中,写在class上面。 
 @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value 属性值),
还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值)
例:
@SessionAttributes(value = {“user”}, types = {String.class})
@RequestMapping("/springmvc")
@Controller
public class SessionAttributesTest {

 * 注意: 该注解只能放在类的上面,不能放在方法上面
 * 
 * @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";
}

}
8、@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;
}

}
9、@ResponseBody 
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

展开阅读全文

没有更多推荐了,返回首页