SpringMVC学习笔记

第一章SpringMVC概述

springvc:是基于spring的一个框架,实际上就是spring的一个模块,专门是做web开发的。理解是servlet的一个升级

web开发底层是servlet ,框架是在servlet基础上面加入一些功能,让你做web开发方便。

SpringMVC就是一个Spring。Spring是容器,ioc能够管理对象,使用<bean>,@Component,@Repository,@Service,@Controller,SpringMVC能够创建对象,放入到容器中(SpringMVC容器),SpringMVC容器中放的是控制器对象。

       我们要做的是使用@Controller创建控制器对象,把对象放入到SpringMVC容器中,把创建的对象作为控制器使用,这个容器对象能接受用户的请求,显示处理结果,就当做是一个servlet使用(类似但并不是)。

       使用@Controller注解创建的是一个普通类的对象,不是Servlet。SpringMVC赋予了控制器对象一些额外的功能。

 

Web开发底层是servlet,SpringMVC中有个对象是Servlet:DispatherServlet(中央调度器)

DispatherServlet:负责接收用户所有的请求,用户把请求给了DispatherServlet,之后DispathServlet把请求转发给我们的Controller对象,最后是Controller对象处理请求。

 

Index.jsp---DispatherServlet(Servlet)---转发,分配给---Controller对象(@Controller注解创建的对象)

 

第二章Springmvc请求的处理流程

1).发起请求some.do---

2).tomcat(web.xml—url-pattern知道 *.do的请求是给中央调度DispatcherServlet)---

3)DispatcherServlet(根据springmvc.xml配置知道some.do---dosome())-------4)DispatcherServlet把some.do转发给MyController.doSome()方法

5)框架执行dosome()把得到ModelAndView进行处理,转发到show.jsp

 

上面的过程简化的方式

       Some.do---DispatcherServlet---MyController

 

Springmvc执行过程源代码分析

  1. tomcat启动,创建容器的过程

通过load-on-start标签指定的1,创建DispatcherServlet对象,DispatcherServlet它的父类是集成HttpServlet的,它是一个serlvet,在被创建时,会执行init()方法。在init方法中
//创建容器,读取配置文件
webApplicationContext ctx=new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);

上面创建容器作用:创建@Controller注解所在的类的对象。创建MyController对象中,这个对象放入到springmvc的容器中,容器是map,类似map.put(“myController”, MyController对象)

  1. 请求的处理过程

1)执行serv的service()

Protected void service(HttpServletRequest request,HttpServletResponse response)

Protected void doService(HttpServletRequest request,HttpServletResponse response)

DispatcherServlet.doDispatch(request,response){

调用MyController的dosom()方法;

}

       复习springmvc框架以及如何接收用户的参数

 

 

没有加入Java到JSON转换的时候其中内存中的对象

 

text/plain;charset=ISO-8859-1

 

 

发起的请求是由哪些服务器程序处理的。

 

Tomcat本身能处理静态资源的访问,像html,图片,js文件都是静态资源。

 

 表示静态资源和未映射的请求都给default处理

Default这个servlet作用:

 

  1. 处理静态资源
  2. 处理未映射到其他servlet的请求

 

复习前两天的内容:

解决请求中post方式有中文乱码,使用过滤器解决问题。CharacterEncodingFilter

逐个接收中,请求中参数名和形参名不一样,使用注解@RequestParam解决问题

使用Java对象接收请求参数时,要求请求中参数名和属性名一样。

Springmvc处理器方法的形参还可以用Map、List等集合类型,数组都可以。

 

处理器方法的返回值:

       表示请求的处理结果

  1. ModelAndView,表示数据和视图,对视图执行forward
  2. String:表示视图的,可以逻辑名称,完整视图路径,对视图执行forward
  3. Void:返回值本身不能表示数据和视图,可以相应ajax请求
  4. 对象Object:表示数据的,可以响应ajax请求。
  5. Springmvc处理器返回对象,转为json响应ajax步骤:①加入处理java转为json转换的工具库:使用jackson。②在springmvc配置文件加入注解驱动<mvc:annotation-dirver>。③在处理器方法上面加入@Requestbody。

 

url-pattren设置中央调度器的url-pattern是“/”:表示静态资源访问失败都是404,动态资源可以正常访问(例如网页的请求)。

              第一种解决静态资源访问的方案:在spring的配置文件中1)<mvc:default-servelt-handler> 2)<mvc:annotation-driven>。(原理:给程序内存中增加一个处理器对象,DefaultHttpRequestHandler,让这个对象来处理静态资源的访问)

             

在jsp,html中使用的地址,都是在前端页面中的地址,都是相对地址

地址分类:

  1. 绝对地址,带有协议名称的是绝对地址,http://www.baidu.com,ftp://202.122.23.1
  2. 相对地址,没有协议开头的,例如:user/some.do,/user/some.do。相对地址不能独立的使用,必须有一个参考地址,通过参考地址+相对地址本身才能够指定资源。
  3. 参考地址

在你的页面中的,访问地址不加“/”

访问的是:http://localhost:8080/ch06_path/index.jsp

路径:http://localhost:8080/ch06_path/

资源:index.jsp

在index.jsp发起user/some.do请求,访问地址变为:http://localhost:8080/ch06_path/user/some.do

当你的地址    没有斜杠开头,例如 user/some.do,当你点击链接时,访问地址是当前页面的地址再加上你链接的地址。

index.jsp 访问user/some.do,返回后现在的地址:http://localhost:8080/ch06_path/user/some.do

路径http://localhost:8080/ch06_path/user/

资源:some.do

在index.jsp在user/some.do,就变为http://localhost:8080/ch06_path/user/user/some.do

       解决方案:

  1. 加入EL表达式也就是下面介绍的那个。
  2. 加入一个base标签,是html语言中的标签。表示当前页面中访问地址的基地址。表示你的页面中所有没有“/”开头的地址,都是以base标签中的地址作为参考地址,使用base中的地址+user/some.do组成访问地址

 

2)在你的页面加上斜杠“/”

       访问的是:http://localhost:8080/ch06_path/index.jsp

       路径:http://localhost:8080/ch06_path/

点击       /user/some.do 访问地址变为http://localhost:8080/user/some.do   参考地址是       你的服务器地址,也就是http://localhost:8080

如果你的资源不能加入${pageContext.request.contextPath}(这个叫做EL表达式)

<p><a href="/ch06_path/user/some.do">发起user/first.do的get请求</a></p>

 

如果你的资源不能访问,有一个/是绝对的所以我们需要加入${pageContext.request.contextPath}这个EL表达式.

 

Index,jsp---addStudent.jsp—student/addStudent.do(Service的方法dao的方法)—result.jsp

 

 

第四章 SpringMVC核心技术

SpringMVC框架采用的是统一,全局的异常处理。

把Controller中的所有异常处理都集中到一个地方。采用的是aop的思想。把业务逻辑和异常处理代码分开,解耦合。

使用两个注解

1.@ExceptionHandler

2.@ControllerAdvice

 

拦截器:

1)拦截器是SpringMVC中的一种,需要实现HandlerInterceptor接口

2)拦截器和过滤器类似,功能方向侧重点不同。过滤器是用来过滤器请求参数,设置编码字符集等工作。

3)拦截器是拦截用户请求,做请求做判断处理。

4)拦截器是全局的,可以对多个Controller做拦截。一个项目中可以有0个或多个拦截器,他们在一起拦截用户请求。拦截器常用在:用户登录处理,权限检查,记录日志。

 

拦截器的使用步骤:

  1. 定义类实现HandlerInterceptor接口
  2. 在SpringMVC配置文件中声明拦截器,让框架知道拦截器的存在。

拦截器的执行时间:

       1)在请求处理之前,也就是Controller类中的方法执行之前先被拦截。

       2)在控制器方法执行之后也会执行拦截器。

       3)在请求处理完成后也会执行拦截器。

 

拦截器原理图

拦截器:看做是多个Controller中公用的功能,集中到拦截器统一处理,使用的是AOP的思想。掌握第一个preHandle()方法

============================================================

多个拦截器:

第一个拦截器preHandle=true,第二个拦截器preHandle=true

11111111拦截器的MyInterceptor的preHandle()

22222222拦截器的MyInterceptor的preHandle()

===================执行MyController中的doSome方法==============

22222222拦截器的MyInterceptor的postHandle()

11111111拦截器的MyInterceptor的postHandle()

22222222拦截器的MyInterceptor的afterCompletion()

111111111111拦截器的MyInterceptor的afterCompletion()

 

 

第一个拦截器preHandle=true,第二个拦截器preHandle=false

11111111拦截器的MyInterceptor的preHandle()

22222222拦截器的MyInterceptor的preHandle()

111111111111拦截器的MyInterceptor的afterCompletion()

第一个拦截器preHandle= false,第二个拦截器preHandle=true

11111111拦截器的MyInterceptor的preHandle()

拦截器和过滤器的区别

  1. 过滤去是Servlet中的对象,拦截器是框架中的对象。
  2. 过滤器是实现Filter接口对象,拦截器是实现HandlerInterceptor
  3. 过滤器是用来设置request,Response的参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能截断请求。
  4. 过滤器是在拦截器之前先执行的。
  5. 过滤器是Tomcat服务器创建的对象。拦截器是SPringMVC容器中创建的对象。
  6. 过滤器是一个执行时间点,而拦截器是有三个执行时间点。
  7. 过滤器可以处理jsp,js,html等等。拦截器是侧重拦截对Controller的对象,如果你的请求不能被中央调度器DispatcherServlet接收,这请求不会执行拦截器的内容。
  8. 过滤器拦截普通类方法执行,过滤器过滤Servlet请求响应。

 

 

用拦截器验证用户身份

Ch12

 

SpringMVC的执行流程(理解)

ApplicationContext ctx = new ClassPathXmlApplication ( "beans.xml") ;studentservice service = (studentService) ctx.getBean ( "service") ;

SpringMVC内部请求的处理流程:也就是SpringMVC接收请求,到处理完成的过程

  1. 用户发起请求some.do
  2. DispatcherServlet接收请求some.do,把请求转交给处理器映射器。

处理器映射器:SpringMVC框架中的一种对象,框架把视线了HandlerMapping接口的类都叫做映射器(多个)。

处理器映射器作用:根据请求,从SpringMVC容器对象中获取处理器对象(MyController controller=ctx.getBean(“some.do”))

                             框架把找到的处理器对象放到一个叫做处理器执行链(HandlerExecutionChain)的类保存

HandlerExecutionChain:类中保存着:1.处理器对象(MyController);2.项目中的拦截器List<HandlerIntercept>

3. DispatcherServlet把2中的HandlerExecutionchain中的处理器对象交给了处理器适配器对象(多个)处理器适配器:springmvc框架中的对象,需要实现HandlerAdapter接口。I

处理器适配器作用:执行处理器方法(调用MyController.doSome()得到返回值ModelAndView)

 

4.DispatcherServlet把3中获取的ModelAndView交给视图解析器对象。

视图解析器:SpringMVC的对象,需要实现ViewResoler接口(可以有多个)

视图解析器作用:组成视图完整路径,使用前缀,后缀。并创建View对象。

View是一个接口,表示视图,在框架中jsp,html不是string表示,而是使用View和他的实现类表示视图。

InternalResourceView:视图类,表示jsp文件,视图解析器会创建InternalResourceView类对象。这个对象的里面,有一个属性url=/WEB-INF/view/show.jsp

5.DispatcherServlet把4步骤中创建的view对象获取到,调用view类自己的方法,把Model数据放入到request作用域。执行对象视图的forward。请求结束。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值