如何搭建SpingMVC环境

本文介绍了如何在SpringMVC中导入依赖,配置WebApplicationConfig,实现类型转换器,创建DispatcherServlet,并展示应用控制器的使用。重点涵盖了MVC架构、配置类和控制器的交互过程。

1.导入SpringMVC依赖

<!-- Spring 核心-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>

        <!-- MVC-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
        <!--tomcat-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>9.0.36</version>
        </dependency>

2.提供SpringMVC配置类

@Configuration
@ComponentScan(basePackageClasses = WebApplicationConfig.class)
@EnableWebMvc // 开启类型的自动转换
public class WebApplicationConfig implements WebMvcConfigurer {

    // 请求映射处理适配器
    @Autowired
    private RequestMappingHandlerAdapter adapter;

    // 设置响应信息的编码集
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        StringHttpMessageConverter stringHttpMessageConverter
                = (StringHttpMessageConverter)converters.get(1);
        stringHttpMessageConverter.setDefaultCharset(Charset.forName("utf-8"));
    }

    // 提供静态资源的支持 请求的url以/html/开头,表示找类路径的/static/html/下的文件
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/html/**")
                .addResourceLocations("classpath:/static/html/");
    }

    // 注册类型转换器
    @PostConstruct
    public void addConversionConfig() {
        ConfigurableWebBindingInitializer initializer =
                (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer();
        if (initializer.getConversionService() != null) {
            GenericConversionService converService = (GenericConversionService) initializer.getConversionService();
            // 添加自定义转换器
            converService.addConverter(new LocalDateTypeChange());
        }
    }


}

类型转换器

import org.springframework.core.convert.converter.Converter;
			// 第一个位置:表单元素提供的数据类型,第二个位置:需要转换的目标类型
public class LocalDateTypeChange implements Converter<String, LocalDate> {
    @Override
    public LocalDate convert(String s) {
        if(s != null && s.matches("\\d{4}-\\d{2}-\\d{2}")){
            return LocalDate.parse(s);
        }
        return null;
    }
}

3.根据配置类在Tomcat容器中去创建并注册前端控制器(DispatcherServlet)

public class MainServer {
    public MainServer(){
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8080);
        tomcat.getConnector();

        Context context = tomcat.addContext("",null);

        // 创建前端控制器
        DispatcherServlet dispatcherServlet =
                new DispatcherServlet(
                        this.createApplicationContext(context.getServletContext())
                );

        // 注册前端控制器
        Wrapper servlet =
                Tomcat.addServlet(context,"dispatcherServlet",
                        dispatcherServlet);
        servlet.setLoadOnStartup(1);
        // 表示任何的路径请求都可以到达前端控制器
        servlet.addMapping("/*");

        try {
            tomcat.start();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }

    }

    /**
     * 创建SpringMVC的应用上下文对象
     * @param servletContext servlet 上下文对象
     * @return SpringMVC的应用上下文对象
     */
    public WebApplicationContext createApplicationContext(ServletContext servletContext){
        AnnotationConfigWebApplicationContext ctx =
                new AnnotationConfigWebApplicationContext();
        // 注入配置类
        ctx.register(WebApplicationConfig.class);
        ctx.setServletContext(servletContext);

        ctx.refresh();
        // 用于在非web应用中关闭IoC容器
        ctx.registerShutdownHook();
        return ctx;
    }

    public static void main(String[] args) {
        new MainServer();
    }

}

5.根据需求提供应用控制器(带有@Controller的类)

@Controller
public class TestController {

    // RequestMapping 书写请求映射路径
    // 当以该注解的映射路径访问前端控制器时会转发到对应映射路径的方法
    // 方式1:通过RequestMapping 来设置MIME类型 produces = "text/html;charset=utf-8"
    @RequestMapping("/test")
    public String test(){
        System.out.println("应用控制器的test方法");
        /* 请求转发工作流程:
        客户端向服务器发出请求,服务器在服务器内部进行资源的调配,将客户端想要的资源回发给客户端。
        客户端只向服务器发出一次请求,可以共享request中绑定的数据
         */
        return "/html/Test.html";
    }

    @RequestMapping("/test3")
    public String test3(){
        System.out.println("应用控制器的test方法");
        /* 重定向工作流程:
          客户端向服务器发起请求,服务器在重定向资源时,向客户端发送302状态码,同时发送location响应头。
          客户端接收到响应信息后,发现为302状态码,就会读取location响应头信息,根据该信息的路径,再次向
          服务器发出第二次请求
         */
        return "redirect:/html/Test.html";
    }


    @RequestMapping("/test2")
    @ResponseBody // 把JSON或XML或普通文本写入HttpServletOutStream
    public String test2(){
        System.out.println("应用控制器的test2方法");
        return "测试2";
    }

    @RequestMapping("/addUser")
    @ResponseBody
    public String addUser(UserBean userBean,int age,String tel,
                          @RequestParam("tel") String userTel){
        /*
         如果表单元素的name属性值和控制器方法的参数名不同,可以通过
         注解@RequestParam 对方法参数指定它对应的表单元素
         */

        System.out.println(userBean);
        System.out.println(age);
        System.out.println(tel);
        System.out.println(userTel);
        return "添加成功";
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值