SpringMVC 简单响应
学习中,如有错误请多包涵
启动服务器初始化过程
服务器启动,执行ServletContainersInitConfig类,初始化web容器
执行createServletApplicationContext方法,创建了WebApplicationContext对象
加载SpringMvcConfig
执行@ComponentScan加载对应的bean
加载UserController,每个@RequestMapping的名称对应一个具体的方法
执行getServletMappings方法,定义所有的请求都通过SpringMVC
单次请求过程
发送请求localhost/save
web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
解析请求路径/save
由/save匹配执行对应的方法save()
执行save()
检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
ServletContainersInitConfig
//web容器配置类 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
/*
createServletApplicationContext()方法,
创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,
而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围
*/
//加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { //初始化WebApplicationContext对象 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); //加载指定配置类 ctx.register(SpringMvcConfig.class); return ctx; }
/*
getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
*/
//设置由springmvc控制器处理的请求映射路径 protected String[] getServletMappings() { return new String[]{"/"}; }
/*
createRootApplicationContext()方法,如
果创建Servlet容器时需要加载非SpringMVC对应的bean,
使用当前方法进行,使用方式同createServletApplicationContext()
*/
//加载spring配置类 protected WebApplicationContext createRootApplicationContext() { return null; } }
上面可简化为
ServletConfig
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } }
一个例子
项目结构

SpringMvcConfig
@Configuration @ComponentScan("com.itheima.controller") //开启json数据类型自动转换 @EnableWebMvc public class SpringMvcConfig { }
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class<?>[] getRootConfigClasses() { return new Class[0]; } protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } //乱码处理 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; } }
@Controller public class UserController { //响应页面/跳转页面 //返回值为String类型,设置返回值为页面名称,即可实现页面跳转 //意思是当你访问http://localhost/toJumpPage,你的页面会跳转到当前项目中的page.jsp @RequestMapping("/toJumpPage") public String toJumpPage(){ System.out.println("跳转页面"); return "page.jsp"; } //响应文本数据 //返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解 @RequestMapping("/toText") //@ResponseBody设置当前返回值为响应体,在这里方法返回类型String是响应体,所以可实现返回字符串信息 //没有@ResponseBody,会认为return "response text"的意思是将页面跳转到response text,这样就造成错误 @ResponseBody public String toText(){ System.out.println("返回纯文本数据"); return "response text"; } //响应POJO对象 //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解 //在pom.xml中添加坐标才能将对象转Json,具体实现参考public interface HttpMessageConverter<T> /* <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> */ @RequestMapping("/toJsonPOJO") @ResponseBody public User toJsonPOJO(){ System.out.println("返回json对象数据"); User user = new User(); user.setName("itcast"); user.setAge(15); return user; } //响应POJO集合对象 //返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解 @RequestMapping("/toJsonList") @ResponseBody public List<User> toJsonList(){ System.out.println("返回json集合数据"); User user1 = new User(); user1.setName("test1 "); user1.setAge(15); User user2 = new User(); user2.setName("test2 "); user2.setAge(12); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); return userList;
} }

代码来源:itheima
@Controller //⇽--- 控制器 public class HomeController { @GetMapping("/") //⇽--- 处理对根路径“/”的请求 public String home() { return "home"; //⇽--- 返回视图名 } }
可以看到,这个类带有@Controller。就其本⾝⽽⾔,@Controller并没有做 太多的事情。它的主要⽬的是让组件扫描将这个类识别为⼀个组件。因为 HomeController带有@Controller,所以Spring的组件扫描功能会⾃动发现它, 并创建⼀个HomeController实例作为Spring应⽤上下⽂中的bean。
home()是⼀个简单的控制器⽅法。它带有@GetMapping注解,表明如果针 对“/”发送HTTP GET请求,那么这个⽅法将会处理请求。该⽅法所做的只是返回 String类型的home值。

浙公网安备 33010602011771号