详解SpringMVC

目录

 什么是SpringMVC?

控制器

Spirng MVC的工作流程

SpringMVC环境的搭建

        1.导入SpringMVC依赖

        2.提供SpringMVC配置类

        3.类型转换器

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

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

总结


 什么是SpringMVC?

        spring MVC是一个基于MVC模式的表现层框架。

特点:

  • 基于的是Servlet模式

  • 控制器不在需要继承其他的类,只需要用@Controller注解

  • 应用控制器方法参数封装灵活,如果方法参数和表单数据键相同,由前端控制器完成封装

  • 返回页面直接在方法中指定,可以String,void等

  • 性能优秀

MVC模式:Model-View-Controller(模型-视图-控制器)模式,它是一种架构模式,其目标是软件的用户界面和业务逻辑分开,使得代码更高的可拓展性、可复用性、可维护性等。

控制器

        SpringMVC 围绕DispatcherServlet设计的,DispatcherServlet用来处理所有HTTP请求和响应。

        解决了原本使用Serlvet处理请求,可能出现类爆炸的情况,一个Servlet只能处理一个请求,如果请求过多,100甚至1000个,我们需要提供100个甚至1000个Serlvet类。

        前端控制器(DispatcherServlet):负责接收客户端的请求,根据请求路径访问应用控制器,负责把页面参数填充给JavaBean,负责转发页面等。

        应用控制器(用户自定义含有@Controller注解的类),负责产生业务组件,调用业务组件方法完成业务,根据结果返回转发的页面对象。

Spirng MVC的工作流程

        

 

        1.客户端向服务器发出请求时,服务器先使用前端控制器(DIspatcherServlet)接收请求

        2.前端控制器会根据请求的URL路径,定位到具体的应用控制器(Controller)中具体的方法,并封装好的实体对象传入应用控制器方法

        3.在方法中生成业务组件调用组件的业务方法,把处理结果(模型),返回给转发的页面路径。由前端控制器(DIspatcherServlet)完成页面转发。

SpringMVC环境的搭建

        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());
        }
    }


}

        3.类型转换器

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;
    }
}

        4.根据配置类在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 "添加成功";
    }

}

总结

        SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目中应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术中的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值