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值。

 

 

 
posted @ 2023-03-18 11:54  qintee  阅读(24)  评论(0)    收藏  举报