一、@Controller
1.作用:控制器类,处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model返回给对应的View进行展示
2.相关:需要在spring的配置中指定controller的扫描路径范围
<context:component-scan base-package="com.jaychou.*.*"/> //spring的自动扫描功能
图片中代码的意思大致是,component-scan,扫描将被自动注册为Spring beans的注释组件对应的类路径。
简单的讲,项目里xml文件使用了自动扫描配置,那么java类中如果有使用如下注解:【@Component,@Repository,@Service,@Controller,@RestController,@ControllerAdvice,和@Configuration】将会被spring扫描检测到,并把这些java类注册为bean
3.使用方法:标记在类上即可,一般会和@RequestMapping组合使用,即给这个类访问加入一个根路径。
@Controller
@RequestMapping(value = "/user") //根路径
public class UserAction {
}
常用的Controller层最终返回结果:
1.返回json数据。可以搭配@ResponseBody注解使用
2.返回字符串路径。走视图解析器
二、@RestController
1.作用:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
2.相关:
springMVC中视图解析器相关配置:
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置视图解析器的前缀和后缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
示例代码:【直接使用@RestController 导致返回jsp页面失败】
@RestController
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/getUserInfo",method = RequestMethod.GET)
public String getUserInfo(Map<String, Object> resultMap) {
User user = new User();
user.setName("JayChou");
user.setSex(1);
user.setAge(25);
resultMap.put("user",user);
return "userInfo";
}
}
上述代码,原本是想通过视图解析器返回到“userInfo.jsp”页面。但是在Controller层使用此注解,那么配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容,即返回“userInfo”。
所以可以根据各自注解的特性,灵活搭配,满足自己的业务需求。
示例代码:【使用@Controller + @RequestMapping注解成功返回jsp页面】
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/getUserInfo",method = RequestMethod.GET)
public String getUserInfo(Map<String, Object> resultMap) {
User user = new User();
user.setName("JayChou");
user.setSex(1);
user.setAge(25);
resultMap.put("user",user);
return "userInfo";
}
}