zoukankan      html  css  js  c++  java
  • SpringMVC框架

    1.SpringMVC是基于spring的框架,实际上就是spring的一个模块,专门是做web开发的,web开发底层是servlet,框架是在servlet基础上加入一些功能,让web开发方便
    2.SpringMVC就是一个spring,spring是容器,IOC能够管理对象,使用<bean> @Component @Repository @Service @Controller spring能够创建对象,放入到容器中,springMVC容器中存放的是控制器对象,我们要做的是使用@Controller创建控制器对象,把对象放入到springMVC容器中,把创建的对象作为控制器使用,这个控制器对象能接受用户的请求,显示处理结果,就当做是一个servlet使用;
    3.注意:使用@Controller注解创建的是一个普通类的对象,不是servlet,SpringMVC富裕了控制器对象一些额外的功能;
    4.web开发底层是servlet,SpringMVC有一个对象是servlet:DispatcherServlet(中央调度器),它负责接收用户的所有请求,之后请求转发给Controller对象,最后是Controller对象处理请求
    5.注意:在web.xml中,需要在Tomcat启动时,创建DispatcherServlet对象的实例,需要<load-on-startup>标签,它表示Tomcat启动后创建对象的顺序,值越小,越先执行
     为啥要创建实例?
     在它创建的时候,会同时创建SpringMVC容器对象,读取SpringMVC的配置文件,把这个配置文件的对象都创建好,当用户发起请求时就能使用这些对象
    6.servlet的初始化会执行init()方法。DispatcherServlet在init()中(了解原理):
     WebApplication ctx=new ClassPathXmlApplicationContext("springmvc.xml");
     getServletContext().setAttribute(key,ctx);
    7.@RequestMapping:请求映射,作用是把一个请求地址和一个方法绑定,一个请求指定一个方法处理。
     属性;value 是一个string类型的,表示请求的URI地址的,不能重复,推荐以“/”开头
     位置;在方法上面:被修饰的方法叫控制器方法或处理器方法,在方法上面:被修饰的方法可以处理请求,类似于servlet中的doget/dopost
    8.springMVC请求的处理流程:
     1.发起some.do,Tomcat接收请求
     2.Tomcat读取web.xml,知道*.do的请求给DispatcherServlet
     3.DispatcherServlet读取springmvc.xml,知道some.do-->dosome
     4.DispatcherServlet把some.do转发给MyController.dosome()方法
     5.框架执行doSome()把得到的ModelAndView进行处理,转发到show.jsp
    9.中央调度器:DispatcherServlet 作用:用户向服务器发送请求,请求会到DispatcherServlet,DispatcherServlet 对请求URL进行解析,得到请求资源标识符(URI),然后根据该URI,将请求分派给不同的控制器对象处理,返回类型为ModelandView;
    10.框架对视图执行的forWord操作:request.getRequestDispatcher("/show.jsp")
    当配置了视图解析器,可以使用逻辑蒙城(文件名),指定视图,框架会使用视图解析器的前缀+逻辑名称+后缀组成路径,这里就是字符串连接操作
    11.SpringMVC注解式开发之@RequestMapping的使用
     属性 method:表示请求的方式,它的值是RequestMethod类的枚举值,例如表示get方式的请求:RequestMethod.GET
    12.接收请求的参数:第一类是使用SpringMVC提供的在控制器方法形参中使用的:HttpServletRequest、HttpServletResponse、HttpSession
    第二类是用户提交的参数:逐个接收、对象接收
    逐个接收请求参数的  要求:控制器方法的形参名必须和请求参数名相同,同名的请求参数赋值给同名的形参
                 原理:使用request接收请求参数
     Stirng strName=request.getParameter("name"),Stirng strAge=request.getParameter("age");
     SpringMVC框架调用DispatcherServlet,通过他调用控制器类中的方法,按名称对应,参数分别对应给同名的方法
    在逐个接收请求时,如果请求参数名和形参名不一致,可以使用@RequestParam注解,它使用的位置是控制器方法形参名前,属性value的值是请求参数名,属性required的值为true时表示请求参数名必须携带数据,为false表示不必携带参数
    13.注意(接上):get方式的请求方式没有乱码,但post方式请求有乱码,需要使用过滤器,过滤器可以自定义,也可以使用框架中的;->CharacterEncodingFilter
    14.DispatcherServlet:中央调度器,匿名叫前端控制器(front controller),我们写的类加上@Controller注解是后端控制器(back controller),会处理请求;返回的类型是ModelandView,model是模型,是数据,view是界面,显示数据;
    15.控制器方法的返回值:ModelAndView、void(了解)、String、对象Object;
    ModelAndView:当处理器方法需要返回Model和View时,使用ModelAndView作为返回值
    String:控制器方法返回视图的逻辑名称(需要配置视图解析器,用来补全路径)或者完整视图路径(不能配置视图解析器,否则路径会错),框架对视图是做forword转发操作
    void:不能表示数据和视图,在处理ajax请求时,可以使用void返回值,响应对象会输出结果
    Object:例如String,Integer、Map、List、Student都是对象,对象有属性,属性是数据,所以返回Object表示数据,和视图无关,可以使用对象表示的数据显示ajax请求
    16.现在做ajax,步骤为;1.加入处理json格式的工具库的依赖,SpringMVC默认使用Jackson  2.在SpringMVC配置文件中加入<mvc:annotation-driven>注解驱动  3.在处理器方法的上面加@ResponseBody注解
    17.返回对象框架的处理流程;1.框架返回Student类型,调用框架中ArrayList<HttpMessageConverter>中每个类的方法CanWrite()判断哪个HttpMessageConverter的接口实现类能够转换Student类型  2.框架会调用实现类的Writer()MappingJackson2HttpMessageConverter中的Writer()方法将Student类型的数据转为json数据  3.框架会调用@ResponseBody把2中的结果数据输出到浏览器,ajax请求完成;
    18.在配置文件中有一个类中的的两种重要方法:HttpMessageConverter类中的CanWriter  作用是检查处理器返回的值能否转为writer形参表示的数据格式,如果能,返回true
    Writer:把处理器方法的返回值对象,调用Jackson中的ObjectMapper转为json格式的字符串
    19.补充上面的逐个接受  当请求参数名和形参名不一致时,使用@RequestParam注解,他的属性有value和required,value的值是请求参数名,required的值默认是true,意思是请求中必须有这个参数名,不存在就报错,改为false,则相反,使用位置在控制器方法的形参名前面;
    20.按对象接受请求参数,适用于请求参数比较多的情况下,在控制器方法中的形参位置填写,例如:Student stu
    21.补充16中的@ResponseBody注解:作用:把处理器方法的返回对象转为json格式,通过HttpServletResponse将json格式的数据发送到浏览器
    位置:方法上面,和其他注解无先后顺序
    22.处理器方法返回的是String,String可以表示数据或者视图,区分是数据还是视图,看有没有@ResponseBody注解,有,返回String就是数据,反之亦然;
    23.补充上面:@RequestMapping注解:属性有value,method,produces,value的值表示请求的地址,可以表示多个,method的值表示接受的请求方式,例如:@RequestMapping(value="/ajax.do",method = RequestMethod.POST),url前面的斜杠表示根目录下
    使用的位置:1.在类的上面,表示模块名,例如:@RequestMapping("/test") ,意思是所有项目是这个模块下的  2.在方法的上面,表示请求映射地址,  produces用于处理字符编码
    24.tomcat本身能处理静态资源的访问,像html,js文件,图片都是静态资源文件,它的web.xml文件中有一个servlet,名称是default,在服务器启动时自动创建,它能处理静态资源,处理未映射到其他servlet的请求;
    25.当在web.xml中声明了中央调度器Dispatcher Servlet,当设置<url-pattern>/</url-pattern>时,将tomcat中默认的可以访问静态资源文件的servlet覆盖,由此,静态资源文件将由中央调度器来处理,但是中央调度器默认不能处理静态资源,因为没有对应的处理器来处理;
    26.第一种处理静态资源文件的方式:需要在springmvc的配置文件中加入<mvc:default-servlet-handler>,加入这个标签的原理是:框架会创建控制器对象DefaultServletHttpRequestHandler(类似于我们的Mycontroller类),这个对象可以将接受到的请求转发给tomcat默认的servlet;
    27.第二种处理静态资源文件的方法:需要在springmvc的配置文件中加入<mvc:resources location="/static/" mapping="/static/**"/>,resources表示框架会创建静态资源处理对象,不依赖tomcat,mapping:访问静态资源的uri地址,使用通配符**,location:静态资源在你项目中的目录位置
    28.上面第二种讲述了传参,返回结果和静态资源文件的处理,而且只有当中央调度器的<url-pattern>配置了斜杠,才需要配置静态资源;
    29.地址分类;
     1.绝对路径:带有协议名称的是绝对路径,例如:http://www.baidu.com
     2.相对路径:没有协议开头的,相对地址不能独立使用,必须有参考地址,通过参考地址,相对路径才能指定资源。例如:user/some.do     /user/some.do
    30.参考地址:
     1.访问地址不加“/”
    访问的是:http://localhost:8080/myWeb/index.jsp  路径:http://localhost:8080/myWeb/   资源:index.jsp
    在index.jsp中发起 user/some.do请求,访问地址变为 http://localhost:8080/myWeb/test/some.do
    所以参考地址为: http://localhost:8080/myWeb/
     2.访问地址加“/”
    访问的是:http://localhost:8080/myWeb/index.jsp
    在index.jsp中发起 /user/some.do请求,访问地址变为http://localhost:8080/test/some.do
    所以参考地址为:http://localhost:8080/
    31.在访问地址中不加入斜杠,可能会导致一些问题,尽量还是加上,在访问地址前加上el表达式:${pageContext.request.contextPath},例如;<a href="${pageContext.request.contextPath}/user/some.do"></a>
    解决方案:1.base标签  2.el表达式
    总结:前端不加后端加(这里指斜杠) 在前端,访问地址不加斜杠,然后在jsp文件的上面加上 <%String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%>,在<head>里面加上<base href="<%=basePath%>"

                                                                       第三章  ssm整合开发
    32.ssm整合也叫做ssi,整合中有容器。
    1.第一个容器springmvc容器,管理Controller控制器对象
    2.第二个容器Spring容器,管理Service,dao,工具类对象的
    我们要做的是把对象交给容器创建和管理。把Controller还有web开发的相关对象交给springmvc容器,这些web用的对象写在springmvc配置文件中
    service,dao对象定义在spring的配置文件中,让spring来管理;
    springmvc容器和spring容器是有关系的,springmvc容器是spring容器的子容器,子可以访问父的内容
    33.springmvc中的请求与转发:forward/redirect
     forward:处理器方法返回ModelAndView,实现转发forword    语法格式:setViewName("forward:视图的完整路径")
    forward的特点:不和视图解析器一起使用,就当做项目中没有视图解析器
    这种方式是显示转发,这看似和直接写逻辑名称的mv.setViewName("result");一样,其实不然,直接写逻辑名称的转发操作依赖视图解析器,必须在指定路径下才能使用;
    mv.setViewName("forward:/WEB-INF/view/result.jsp") 完整路径,不依赖视图解析器
    redirect:处理器方法返回ModelAndView,实现重定向redirect    语法格式:setViewName("redirect:视图的完整路径")
    forword的特点:不和视图解析器一起使用,就当做项目中没有视图解析器
    框架对重定向的操作:框架会把model中的简单类型的数据,转为string使用,作为hello.jsp的get请求参数使用
    目的是在hello.jsp和DoRedirect.do两次请求之间传递参数
    重定向不能访问/WEB-INF下的资源
    34.异常处理:
    springmvc框架采用的是统一,全局的异常处理。把controller中的所有异常处理都集中到一个地方。采用aop的思想,把业务逻辑和异常处理代码分离,解耦合。
    用到的两个注解:@ExceptionHandler   @ControllerAdvice
    步骤:1.写一个父类异常类,继承Exception,定义其他的异常类来继承父类。 2.在处理器方法中抛出异常  3.自定义一个异常处理类,相当于aop中的切面类,在方法的上面定义@ControllerAdvice,在方法上面定义@ExceptionHandle(value=......),value的值为抛出的异常类名;
    35.拦截器:
    1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口
    2)拦截器和过滤器类似,功能方向侧重点不同,过滤器是用来过滤请求参数,设置字符集等工作。拦截器是拦截用户的情求,做情求做判断的;
    3)特点:拦截器是全局的,可以对多个Controller拦截,一个项目中可以有多个拦截器,可以一起拦截用户请求,在框架中按照ArrayList存储,先声明的先执行;
    4)主要用于用户登录处理,权限检查,记录日志
    使用步骤:
    1)定义类实现HandlerInterceptor接口
    2)在springmvc配置文件中,声明拦截器,让框架知道拦截器存在
    拦截器的执行时间
    1)在请求处理之前,也就是controller类中的方法执行之前先被拦截
    2)在控制器方法执行之后
    3)在请求处理完成后
    在拦截器类中定义一个类实现HandlerInterceptor接口,重写他的三个方法:preHandle、 postHandle、afterCompletion。
    preHandle方法是于控制器方法执行之前执行,他返回真或者假,返回真是代表放行,返回假是拦截;postHandle是于控制器方法执行完后执行,afterCompletion是最后执行的,用于资源的关闭;他是三个方法中最重要的一个,是整个项目的入口
    拦截器可以看做是多个controller中公用的功能,集中到拦截器统一处理,是aop的思想,比如:判断用户的登录权限
    36,拦截器和过滤器的区别:
    1.过滤器是servlet中的对象,拦截器是框架中的对象
    2.过滤器是实现Filter接口的对象,拦截器是实现HandleInterceptor
    3.过滤器是用来设置request,response的参数,属性的,侧重对数据的过滤,过滤器是用来验证请求的,能截断请求
    4.过滤器是在拦截器之前先执行
    5.过滤器是Tomcat服务器创建的对象,拦截器是springMVC容器中创建的对象
    6.过滤器是一个执行时间点;拦截器有三个执行时间点;
    7.过滤器可以处理jsp.js.html等,拦截器是侧重拦截对controller的对象,如果你的情求不能被dispatcherservlet接受,这个情求不会执行拦截器内容;
    37.springmvc内部请求的处理流程:也就是springmvc接受请求,到处理完成的过程;
    1.用户发起some.do的情求
    2.dispatcherservlet接受请求,把请求转交给处理器映射器;(它是springmvc框架中一种对象,它的作用是根据请求,从springmvc容器中获取处理器对象),框架把找到的处理器对象放到一个叫做处理器执行链的类中保存(HandlerExecuteChain)
    3.dispatcherservlet把2中的HandlerExecuteChain中的处理器对象交给了处理器适配器对象(执行处理器方法,返回ModelAndView),然后又将ModelAndView返回给中央调度器
    4.dispatcherservlet把3中的ModelAndView交给了视图解析器,(springmvc中的对象,可以有多个,作用是组成视图完整路径,创建view对象)
    5.中央调度器把4中创建的view对象获取到,调用view类自己的方法,把model数据放入到request作用于,执行对象视图的forward,请求结束
     
     
     
     
  • 相关阅读:
    【DL】如何使用MMSegmentation训练数据集
    【python基础】Python错误:AttributeError: module 'json' has no attribute 'loads'解决办法
    【python基础】如何理解Python装饰器?
    【DL】如何生成用于训练的数据集
    【pytorch基础】基于训练的pytorch模型转换为onnx模型并测试
    【python基础】JupyterNotebook配置远程登录
    【工具使用】标注工具Labelme的安装以及使用
    【leetcode_easy_math】892. Surface Area of 3D Shapes
    【leetcode_easy】1636. Sort Array by Increasing Frequency
    【leetcode_easy】1640. Check Array Formation Through Concatenation
  • 原文地址:https://www.cnblogs.com/1877chl/p/13666854.html
Copyright © 2011-2022 走看看