SpringMVC 的确十分方便,它让使用者方便地利用 Controller ,把从后端获取到的模型(数据)和视图搭配起来返回一个 Model And View 给发送请求的用户。
创建一个最基本的网站工程目录结构之后,要配置 Spring 和 SpringMVC 的配置文件。 SpringMVC 的配置文件主要配置容器对 Controller 的托管。需要引入的命名空间有 context 和 mvc 。
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
配置文件里有那么些 bean , 一个是包扫描的 bean。
这里配置了需要扫描的包,以及 context:component-scan 里面一个过滤器参数, include-filter ,设置扫描所有 @Controller 注解。
一个是 mvc:resources
这里配置网站的资源文件路径,如果不设置的话将访问不到网站的一些静态资源例如 css , js ,图片等。
还有一个是 Internal Resource View Resolver,它用于返回 jsp 视图。
这个类的参数 prefix 是指定 jsp 文件的前缀, 换个说法就是访问 jsp 文件的路径,这里填写存放 jsp 文件的路径。 suffix 是填写后缀,用 jsp 的话就填写 jsp 就好了。
我一个 Helloworld 里的整个配置文件就这样子了。
里面还有一个叫 ContentNegotiatingViewResolver 的东西,这个东西用于管理返回的视图的类型,例如 json、xml、html 等等,有了 SpringMVC 便可以很方便地返回不同类型的视图。
在这里我配置了一个 MappingJackson2JsonView 的 bean,用于支持返回 json 视图,这个支持需要添加类库支持
com.fasterxml.jackson.core
jackson-databind
${jackson.verison}
接下来就只是需要在 Controller 里编程,映射不同的路径到不同的 Controller 里处理就好了。
@Controller
@RequestMapping("/course")
public class CourseController {
private static Logger log = LoggerFactory.getLogger(CourseController.class);
private CourseServices courseServices;
@Autowired
public void setCourseServices(CourseServices courseServices) {
this.courseServices = courseServices;
}@RequestMapping(value = "https://www.it610.com/view", method = RequestMethod.GET)
public String viewCourse(@RequestParam("courseId") Integer courseId, Model model) {
log.info("couse content = {}", courseId);
Course course = courseServices.getCoursebyId(courseId);
model.addAttribute(course);
return "home";
}@RequestMapping(value = "https://www.it610.com/view/{courseId}", method = RequestMethod.GET)
public String viewCourse(@PathVariable("courseId") Integer courseId, Map model) {
Course course = courseServices.getCoursebyId(courseId);
model.put("course", course);
return "course_json";
}@RequestMapping(value = "https://www.it610.com/view/json/{courseId}", method = RequestMethod.GET)
public ResponseEntity viewCourseInJson(@PathVariable("courseId") Integer courseId) {
Course course = courseServices.getCoursebyId(courseId);
return new ResponseEntity(course, HttpStatus.OK);
}@RequestMapping(value = "https://www.it610.com/view/json2/{courseId}", method = RequestMethod.GET)
public @ResponseBody Course viewCourseInJson2(@PathVariable("courseId") Integer courseId) {
Course course = courseServices.getCoursebyId(courseId);
return course;
}
}
RequestMapping 的注解用于映射路径到 Controller ,然后 Controller 收到对应的 URL 的请求便会做出相应的逻辑,返回对应的东西。 注解的 method 参数用于指定这个方法响应什么类型的请求,最常用的是 POST 和 GET。
在 Controller 的方法上面 有 @ResponseBody 注解打在返回参数上,这是表示用合适的视图返回这个对象的 View ,在我的这个例子里将会返回一个用 json 表示这个类的视图。因为我在 SpringMVC 的 配置文件里面配置好了 Jackson 的视图处理器。如果使用泛型对象 ResponseEntity<> 包装返回类型的话也能达到相同的效果,甚至可以控制 HTTP 状态码,不过返回的对象就需要 new 一个 ResponseEntity 了,而且一般也不建议直接控制 HTTP 状态码。
使用 SpringMVC 需要配置这些基本的依赖
4.0.0
imooc-arthur
spring-mvc-study
1.0.0-SNAPSHOT <--
配置用到的依赖的版本号,用于代替填写version
-->【SpringMVC|SpringMVC 初体验】2.6
1.7.6
4.1.3.RELEASE
2.5.4
<--
统一配置 spring 系列的版本号,这样接下来 spring 相关的依赖就不需要填写版本号了
-->
org.springframework
spring-framework-bom
${spring.version}
pom
import
< -- SpringMVC 依赖 ->
org.springframework
spring-webmvc
commons-lang
commons-lang
${commons-lang.version}
<-- SpringMVC 需要用到 slf4j 做 logger,所以要加入这个依赖-->
org.slf4j
slf4j-log4j12
${slf4j.version}
<---->
slf4j-api
org.slf4j
org.slf4j
slf4j-api
${slf4j.version}
javax.servlet
servlet-api
2.5
commons-fileupload
commons-fileupload
1.3.1
<-- Java对象转Json类库,SpringMVC 的 Json 视图依赖这个 -->
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
<-- Jetty 容器,方便测试 -->org.eclipse.jetty
jetty-maven-plugin
9.2.2.v20140723