SpringMvc

文章github地址:https://github.com/ShareCookies/ssm-springBoot/tree/master/spring/springMVC

# Spring MVC框架的使用:
##  1.配置DispatcherServlet:
​        1.使用Java将DispatcherServlet配置在Servlet容器中:p177
​            ...
​        附:
​            添加其他的Servlet和Filter:p248
​                例:
​                    ./附属功能/拦截器
##  2.启用Spring MVC:p180
​        基于Java进行配置:
​            配置类上加上@EnableWebMvc注解,即可启用springMVC。

##  3.编写控制器:
        1. 编写基本的控制器:
            1. 控制器类注册为spring容器的bean。
                ./控制层注解.txt goto: @Controller
                例:
                    @Controller
                    public class TestController {}
            2. 定义一个方法来处理指定的请求:
                ./控制层注解.txt goto: @RequestMapping
            3. 数据返回
                返回的数据可分为2种 :1.html页面 2.其他某种格式的数据(如json,xml等)。
                1. 编写模型视图类型(mvc)控制器:(返回html页面)
                    配置视图解析器:p181 p210(配置一次就好)
                        控制器方法返回的字符串将会被Spring MVC解读为要渲染的视图名称。
                        DispatcherServlet会要求视图解析器将这个逻辑名称解析为实际的视图。
                        例:
                            @Bean
                            public ViewResolver viewResolver() {
                                InternalResourceViewResolver resolver = new Internal ResourceViewResolver() ;
                                resolver.setPrefix("/WEB-INF/views/");
                                resolver.setSuffix(".jsp") ;
                                //resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);//让InternalResourceViewResolver将视图解析 为JstlView(jsp更进一步),而不是InternalResourceView
                                return resolver ;
                            }
                    1. 控制器返回模型与视图名:
                        @RequestMapping(value="/register",method=GET)
                        public StringshowRegistrationForm(Modelmodel){//1.返回模型
                            model.addAttribute(newSpitter());//新增了一 个Spitter实例到模型中。//模型中的key是spitter,是根据对象类型推断得到的
                            return"registerForm";//2.返回视图名
                        }
                        附:
                            控制器的处理方法完成时,通常会返回一个逻辑视图名。
                            如果方法不直接返回逻辑视图名(例如方法返回void),那么逻辑视图名会根据请求的URL判断得出。
                    2. 视图读取模型数据
                        registerForm.jsp:
                        <sf:form method="POST" commandName="spitter">
                            FirstName:<sf:input path="firstName"/>...
                        </sf:form>
                    附:
                        ./图片/传递模型数据到视图中.png
                        ./图片/视图中访问模型数据.png
                2. 编写REST类型控制器:(返回json或xml类型数据)
                    什么是rest:
                        ./REST/README.txt
                    编写REST类型控制器:
                        为控制器方法使用@ResponseBody注解,即可返回json或xml类型数据(看Accept请求头)。
                        例:
                            ./控制层注解.txt goto: @ResponseBody
                            @ResponseBody
                            public String loginSuccess(HttpServletRequest request){  
                                return "loginSuccess";  
                            }
                        详情:
                            ./REST/spring实现RESTful架构.txt
        2. 接收请求的输入:p193
            ./控制层注解.txt goto: 数据的获取
        3. 提供资源之外的其他内容
            请求头设置或错误信息等 p516
            处理异常:
                ./附属功能/异常处理.txt
        附:
            控制器编写注意事项:
                设计良好的控制器本身只处理很少甚至不处理工作,而是将业务逻辑委托给一个或多个服务对象进行处理。
                附:控制器只是用来对外开放请求的,顶多对请求参数做一点处理,所有的业务等逻辑要放到服务层中进行。
    附:
        sprnigBoot中应用springMvc:
            SpringBoot为我们自动配置好了SpringMVC框架,所以通过SpringBoot使用Spring MVC框架,我们可以只需引入mvc的start启动依赖,@EnableWebMvc启用springMVC框架,编写控制器即可。
     

# Spring MVC框架介绍
​    介绍:Spring MVC 是 Spring 提供的 Web 开发框架,用来构建Web应用程序。
##  springMvc执行流程(springMVC处理请求的过程):P175
        1、前端控制器DispatcherServlet:(一切的起源)
            用户发来一个请求,首先接受的肯定是servlet容器(DispatcherServlet)。            
        2、处理器映射器HandlerMapping(返回controller)
            前端控制器(DispatcherServlet)收到请求后会解析请求,并通过处理器映射器(HandlerMapping)根据url信息找到我们需要的处理器(Handler)(也可以叫Controller),返回给前端控制器。
​                例:
                /**
                ​* Return the HandlerExecutionChain for this request.
                ​* <p>Tries all handler mappings in order.
                ​* @param request current HTTP request
                ​* @return the HandlerExecutionChain, or {@code null} if no handler could be found
                ​*/
                @Nullable
                protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
                if (this.handlerMappings != null) {
                    for (HandlerMapping mapping : this.handlerMappings) {
                        HandlerExecutionChain handler = mapping.getHandler(request);
                            if (handler != null) {
​                                    return handler;
                            }
                        }
                    }
                    return null;
                }
        3、处理器执行链HandlerExecutionChain(里头包含了controller)
            处理器映射器返回的其实是处理器执行链(HandlerExecutionChain),只是处理器执行链里包含了处理器。
            而处理器就是我们写的controller层方法。
        4、处理器适配器HandlerAdapter(通过适配器执行controller)
            前端控制器(DispatcherServlet)查找合适的处理器适配器(HandlerAdapter),通过处理器适配器执行处理器。
            ​例:
                ​HandlerExecutionChain mappedHandler = null;
                ​...
                ​ModelAndView mv = null;
                ​// Determine handler adapter for the current request.
                ​HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
                ​// Actually invoke the handler.
                ​mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            附:
                控制器方法执行完后会有两种类型返回:1.视图名和模型 2. restful形式,返回的mv为null,即不走第5步。
                1.返回视图名和模型:
​                    控制器方法没有直接产生浏览器中渲染所需的HTML。
                    控制器方法处理完后,会将请求连同模型和视图名塞入ModelAndView,发送回DispatcherServlet
                    注:
            ​            模型:!
            ​                控制器在完成逻辑处理后,通常会产生一些要返回前端的数据信息,这些信息会被放入模型中(model)。
            ​            视图:
                            控制器通常会返回一个String类型的值,这个就是控制器名。
            ​                非Ajax的话仅仅给前端数据信息是不够的,还得把这些信息与HTML一起整合。
                2. restful形式:
                    restful形式是处理器适配器执行完处理器后,直接把处理器返回的数据通过消息转换器转换为json,然后塞入response传给客户端,而不返回mv了就跳过了第5步。

        5、视图解析器ViewResolver
​            前端控制器接到ModelAndView之后,交由我们的视图解析器去查找合适的视图,最然进行视图渲染,渲染完成塞入response最终返回给用户。
            ​例:
                ​for (ViewResolver viewResolver : this.viewResolvers) {
                ​    View view = viewResolver.resolveViewName(viewName, locale);
                    ​if (view != null) {
                        ​return view;
                    ​}
                ​}
                ​视图渲染。
                ​view.render(mv.getModelInternal(), request, response);
                //把模型数据交付给视图后,前端控制器的任务就完成了,视图将使用模型数据进行渲染然后输出,这个输出会通过响应对象直接传递给客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值