版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
*/S一种是BS架构E/S架构B/S架构在我们的实际开发中使用的非常多,所以我们课程中的案例也都是基于三层架构设计的。也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web层,web需要接收http请求,完成http响应。表现层的设计一般都使用MVC(MVC是表现层的设计模型,和其他层也就是我们常说的service层。它负责业务逻辑处理,和我们开发项目的需求关。web层依赖业务层,但是业务层不依赖web层。(也就是我们说的,事务应该放到业务层来控制)也就是我们是常说的dao层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据层是业务层和持久层交互的接口,业务层需要通过数据层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对******MVC全名是ModelViewController,是模型(model)view(controller)WebMVC中每个部通常指的就是我们的jsp或者html。作用一般就是展示数据的。***SpringMVC是一种基于Java的实现MVC***SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级SpringFrameWorkSpringWebFlowSpring框架提供了构建Web应用程序的全功能MVCSpring可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。***SpringMVC已经成为目前最主流的MVC框架之一,并且随着Spring3.0的发布,全 Struts2,成为最优秀的MVC框架***JavaRESTful请求为什么学习也许你要问,为什么要学习SpringMVCstruts2吗?看SSH火其实很多初学者了一个概念,SSH实际上指的是Struts1.x+Spring+Hibernate。这个概念已经有Struts1.x霸主,但是在新的MVC时代,形式已来了S2SH(Struts2+Spring+Hibernate)整合开发。不要再被蒙蔽了,的统计吧SpringMVC的市场占有率是40%,而Struts2只有的6%。这已然说明了学习SpringMVC的必要性了,再说了,SpringMVC本身就是spring的一员,与整合spring时,SpringMVC根本无需中间整合包,而struts2接下来,让我们一起看看SpringMVC是如何处理HTTP请求的Modl这不过千万MVC设计模式和工程的三层结构三层结构指的是表现层业务层数据持久层。而MVC计。创建一个mavenwebPOM<project""<project""springioc组件需要的依赖包--><!--基于AspectJ的aop依赖-->springMVC依赖包--><!--jstl--<!--servlet--<!--配置Maven的JDK编译级别--> MVC中的C<web-app<web-app" <!--学习前置条件--><!--问题1:web.xml中servelet、filter、listener、context-param<!--问题2:load-on- 的作用,影响了servlet对象创建的时机--<!--问题3:url- 的配置方式有四种:/dispatcherServlet、/servlet/*、*、/<!--问题4:url-pattern <!--问题5:配置了springmvc spring配置文件之后,就产生了spring父子容器的问题
<!--设置spring配置文件路径--><!--如果不设置初始化参数,那么DispatcherServlet 默认路径下的配置文件--<!--默认配置文件路径:/WEB-INF/springmvc-servlet.xml<!--如果不指定初始化时机,DispatcherServlet就会在第一次被请求的时候,才会初化,而且只会被初始化一次--> URL-PATTERN的设置--><!--不要配置为/*,否则报错--><!--通俗解释:/*,会 springMVC提供了默认的Handler处理器--><!--但是对于JSP来讲,springmvc没有提供默认的处理器,我们也没有手动编写对于的处理器,此时按照springmvc的处理流程分析得知,它短路了--> <!--<servlet>--<!--<servlet-class>sss</servlet-class>--<!--</servlet>--<!--<servlet- >--<!--</servlet- >--创建<beans""""MVC中的M接口、注解方式注解方式必要的注解主要有以下两个pattern配置的是*的话,url中的“”可以加也可以不加。处理器的返回值是ModelAndView一个是将数据到Request域中publicclasspublicclassItemController@RequestMappublicModelAndViewqueryItem()throwsException{List<Item>itemList=newArrayList<>();Itemitem_1=newItem();item_1.setDetail("ThinkPadT430联想笔Itemitem_2=newItem();item_2.setDetail("6苹果 //创建modelandViewModelAndViewmodelAndView=new//添加modelmodelAndView.addObject("itemListitemList);return}}注意:商品数据使用Item提供的pojopublicclasspublicclassItem{privateIntegerid;privateStringname;privateFloatprice;privateStringpic;privateprivateDateprivateString}MVC中的M使用组件扫描器省去在spring置每个controller<!--扫描controller分隔--> <!--扫描controller分隔--> MVC中的V把参考资料中的item-list.jsp到工程的/WEB- 前端控制器前端控制器是如何执行对应的处理器的1、用户发送请求至前端控制器2、DispatcherServlet收到请求调用HandlerMap处理器映射器3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器器(如果有则生成)一并返4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理5、HandlerAdapter执行处理器(handler6、Controller执行完成返回7、HandlerAdapter将handler执行结果ModelAndView返回给9、ViewReslover解析后返回具体View对HandlerMap:处理器映射是说明:在说明:在springmvc处理器映射器、处理器适配器、视图解析器称为springmvc三spring-webmvc-xxx.jarspring-webmvc-xxx.jar包中有一个DispatcherSperties该配置中默认加载了一些springmvc默认的其他组件,其中就包括三大组件。##DefaultimplementationclassesforDispatcherServlet'sstrategy#UsedasfallbackwhennomatchingbeansarefoundintheDispatcherServletcontext.#Notmeanttobecustomizedbyapplicationdevelopers. 通过bean配 对类中标记的方法进行映射,根据定义的url匹配返回HandlerMethodHandlerMethod对象中封装urlMethod*对标记<!--注<!--注解映射器--><!--注解适配器--><bean 通过mvc配置(推荐<mvc:annotation-drivern<mvc:annotation-drivernHandlerMap<bean<bean<!--该视图解析器,默认的视图类就是JstlView,可以不写--><propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>jar包。此属性可以不设置,默认为JstlViewprefix和suffix:查找视图页面的前缀和后缀,最终视图的址为:前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回的ModelAndView指定,比如逻辑视图名为o,则最终返回的jsp视图地址“WEB-INF/jsp/o.jsp”SSM将工程的三层结构中的JavaBean分别使用Spring(XML)进行管理1、整合持久层mapper,包括数据源、会话工程及mapper对象的整合2、整合业务层Service,包括事务及service的bean3、整合表现层Controller,直接使用springmvc4、Web.xml加载spring(包含多个XMLSpring配置文件依赖包整合第连接工程整合(配置文件整合<?xmlversion="1.0"encoding="UTF-<beans<?xmlversion="1.0"encoding="UTF-<beans"""xmlns:tx="""<!--加载perties<context:property-placeholderlocation="classpath:perties"<!--配置数据源--> destroy-<propertyname="driverClassName"value="${jdbc.driver}"<propertyname="username"value="${jdbc.username}"<propertyname="password"value="${jdbc.password}"<!--配置SqlSessionFacotory<!--加载mybatis的配置文件(如果配置文件中没有配置项,可以忽略该文件)<propertyname="configLocation"value="classpath:mybatis/SqlMapConfig.xml"<!--配置数据源--><propertyname="dataSource"ref="dataSource"<!--配--><bean<!--指定扫描的包--><propertyname="basePackage"value="com.kkb.ssm.mapper"<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC-////DTDConfig>classpath#devenv[debug]#devenv[debug]productenvlog4j.rootLogger=DEBUG,stdout#Consoleoutput...log4j.appender.stdout.layout.ConversionPattern=%5p[%t]-%m%n<?xmlversion="1.0"encoding="UTF-<beans<?xmlversion="1.0"encoding="UTF-<beans""""""<!--扫描Service<ponent-scanbase-package="com.kkb.ssm.service"<!--配置事务--><!--事务管理器,对mybatis操作数据库进行事务控制,此处使用jdbc的事务控制<beanid="transactionManager"<!--指定要进行事务管理的数据源--><propertyname="dataSource"<!--通知--><tx:adviceid="txAdvice"transaction-<!- 行为--><tx:methodname="save*"propagation="REQUIRED"<tx:methodname="add*"propagation="REQUIRED"<tx:methodname="insert*"propagation="REQUIRED"<tx:methodname="delete*"propagation="REQUIRED"<tx:methodname="del*"propagation="REQUIRED"<tx:methodname="remove*"propagation="REQUIRED"<tx:methodname="update*"propagation="REQUIRED"<tx:methodname="modify*"propagation="REQUIRED"<tx:methodname="query*"read-only="true"<!--aop--<aop:advisoradvice-pointcut="execution(*com.kkb.ssm.service.impl.*.*(..))"整合Spring和springmvcspringmvc配<?xmlversion="1.0"encoding="UTF-<?xmlversion="1.0"encoding="UTF-" xml/ns/javaee/web- xml/ns/javaee/web-id="WebApp_ID"<display-name>ssm</display-<!--配置springmvc的前端控制器--><servlet-name>springmvc</servlet-<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-<init-<param-name>contextConfigLocation</param-<param-value>classpath:spring/springmvc.xml</param-</init-<load-on-startup>1</load-on-<servlet- <servlet-name>springmvc</servlet-<url-pattern>/</url-</servlet- </web-<?xmlversion="1.0"encoding="UTF-<?xmlversion="1.0"encoding="UTF-<beans"""""<!--配置处理器映射器和处理器适配器--><mvc:annotation-driven<!--配置视图解析器--><!--使用注解的handler以使用组件扫描器,加载handler ponent-scanbase-package="com.kkb.ssm.controller"web.xml加载spring<!--加载spring容器--><context-<param-name>contextConfigLocation</param-<param-classpath:spring/applicationContext-</param-</context-<!--加载spring容器--><context-<param-name>contextConfigLocation</param-<param-classpath:spring/applicationContext-</param-</context-<listener-class>org.springframework.web.context.ContextLoaderListener</listener-整合测试(编写代码实现商品查询列表,从mysql息请求请求返回值:ModelAndView指定Model和View(item-list.jsp)Request(Model:keyitemList业务处理逻辑(需求分析类、和根据需求开发service口以及实现类,注意:使用注解@Service开发servicepublicclassItemServiceImplimplementsItemServiceprivateItemMapperpublicList<Item>queryItemList()ItemExampleexample=newreturn}}Controller在Controller类上添加@Controller注publicclassItemController{privateItemService publicpublicclassItemController{privateItemService publicModelAndViewqueryItem()List<Item>itemList=//创建ModelAndView准备填充数据、设置视ModelAndViewmodelAndView=new//相当于request.setAttribute(key,value)modelAndView.addObject("itemListitemList);//设置视图(配置逻辑视图returnreturn}}开发入门程序中的返回controllerModelAndViewmodelview返回controllerrequestresponserequestresponse,3responsejsonresponse.getWriter().write("json串");返回字符串(推荐returnreturn"item/item-redirectreturnreturnforwardreturnreturn注解和 HttpMessageConverter,匹配不同的Controller返回值类型,然进行不同的消息转换处理***将转换之后的数据放到HttpServletResponse对象的响应体返回到页面***不同的HttpMessageConverter处理的数据,指定的ContentType@RequestBody注解的作用和@ResponseBody处理请求参数的Http消息转换的MapJacksonHttpMessageConverter处理POJO类型返回 ******JacksonJSONJavaStringHttpMessageConverter处理String类型返回***调用response.getWriter()方法将String通过RequestMap注解可以定义不同的处理器映射规则URL 在class上添加@RequestMap(url)指定通用请求前缀,限制此类下的所有方法的请求url必须以请求前缀开头,通过此方法对url进行模块化分类管理。GET (method=如果通过Post则报错HTTPStatus405-Requestmethod'POST'not@RequestMapPOST@RequestMap(method=HTTPStatus405-Requestmethod'GET'notGETPOST@RequestMap都是字符串类型Controller,比如简单类型、POJO内置的24后的值赋值给Controller类中方法的形参,这个过程就是参数绑定。默认支持的参数类型(ServletAPI通过request通过response信通过session对象得到session对ModelMap继承自LinkedHashMapModel是一个接口,它们的底层实现都是同一个的作用,Itemitem=service.queryItemById(id);model.addAttribute("item",item);包括基本类型和String类型POJO类型参数:包括List结构和Map结构的集合(包括数组SpringMVC如果是基本类型或者如果是基本类型或者String类型:如果是POJO类型,或者它的关联对象:要求表单中参数名称和POJO类的属性名称保持一致。控制器方法的参数类型是POJO类型。集合类型必须包含在POJO请求参数名称要和POJO中集合属性名称相同。给List给Map请求参数名称要和POJO中数组属性名称相同。在springmvc对于java数绑httpkeycontroller形参名称请求请求参数的keyControllerController的形参为Integerid,它和请求参数的key成 (value=publicStringfindItem(Integerid){System.out.println("接收到的请求参数是id);return"success";}请求参数的key和controller方法的形参名称不一致时,需要使用请求请求参数的keyControllerController的形参为Integerid,它和请求的参数不一致,要使用@RequestParam注解才能绑定成 (value=//通过@RequestParam注解绑定简单类publicStringfindItem(@RequestParam("itemidIntegeridSystem.out.println("接收到的请求参数是:"+id);return}TTPStatus400-RequiredIntegerparameter'XXXX'isnot (value=/findItem//通过@RequestParam//学习@RequestParam注解中的value、required、defaultValuepublicStringfindItem@RequestParam(value="itemid",required=true,defaultValue="2")Integerid)System.out.println(id);returnsuccess;}绑定POJO控制器方法的参数类型是控制器方法的参数类型是POJO类型。要求表单中参数名称和POJO类的属性名称保持一致。请求ControllerController publicStringupdateItem(Integerid,Itemitem)System.out.println("接收到的请求参数是:"+id);System.out.printlnitem);return"success";}绑定包装publicpublicclassItemQueryVOprivateItem}页面定义(item-<td>商品名称:<inputtype="text"name=""<td><inputtype="submit"value="查询"Controller测试方法:断点,查看vo中的item对象是否有值通过HTTP请求批量传递简单类型数据的情况,Controller方法中可以用String[]或者pojo的String[]属性接收(两种方式任选其一),但是不能使用集合接收。请求Controller publicStringdeleteitem(Integer[]return}使用POJO使用List<POJO>这种集合接收数据,必须将该集合在另一个POJO接收商品列表的publicpublicclassItemQueryVO//商品信息//商品信息privateItem//其他信息 privateList<Item> }请求? itemList[1].name=x&itemList[1].price=2000publicStringbatchUpdateItem(ItemQueryVOvo)return}请求Controller publicStringsaveItem(Stringdate){System.out.println("接收到的请求参数是date);return"success";}但是如果将date参数的类型由StringDate自定义publicpublicclassDateConverterimplementsConverter<String,Date>publicDateconvert(Stringsource)tryreturn}catch(ParseExceptione){}return}}配置在springmvc.xml置<!--加载注解<!--加载注解驱动--><!--转换器配置--><property<bean<beanspringmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处常,必须使用trycatch代码块或者throws关键字来处理异常。系统的dao、service、controller出现都通过throwsException 常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。publicpublicclassBusinessExceptionextendsExceptionprivateStringpublicBusinessException(Stringmessage)this.message=message;}publicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}publicpublicclassBusinessExceptionResolverimplementsHandlerExceptionResolverpublicModelAndViewresolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){BusinessExceptionbusinessException=if(exinstanceofBusinessException){businessException=(BusinessException)ex;businessExceptionnewBusinessException}ModelAndViewModelAndViewmodelAndView=newreturnmodelAndView;}}<%@<%@pagelanguage="java"contentType="text/html;charset=UTFEncoding="UTF-<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=UTF-${message在springmvc.xml<!--自定义异常处理器(全局)<!--自定义异常处理器(全局)--><bean (value=publicStringshowItemEdit(Integerid,Modelmodel)throws//查询要显示的商品内Itemitem=if(itemnullthrownewBusinessException("查询不到商品无法修改");model.addAttribute("item",item);//由于配置了ViewResolver}上传加入jar配置Multipartformenctype="multipart/form-data"的数据时,需要springmvcmultipart<beanid="multipartResolver"multipart<beanid="multipartResolver"><!--上传文件的最大尺寸5M<propertyname="maxUploadSize"上传代Controllerifif(pictureFile!= StringoriginalFilename= if(originalFilename!=null&&{//存 StringpicPath="E:\\03-teach\\07-StringnewFileName= (value=publicStringupdateItem(Modelmodel,ItemMultipartFilepictureFile)throwsExceptionFilenewFile=newthrownewBusinessException("名称不存在,上传不成功}}return}Jsp<td>商 <c:iftest="${item.pic<inputtype="file"配置文件的虚注意:在虚拟 中,一定将分级创建(提高i/o性能一般我们采用按日eclipse配置tomcat直接修改tomcat在tomcat安 json为什么使用json分析Springmvc使用json请求是KV,响应是JSON;请求是KV这种方式更常用更简单。Json输入key/valuejson(推荐Controller//输入是//输入是key/value,输出是//@ResponseBody将返回值转成json串响应给前台 publicItemresponseKV(Itemitem)return}JSPfunctionfunction}}输入json、输出ControllerpublicclassJsonController//输入是json,输出是@RequestBody将请求的json串转成java//@ResponseBody将返回值转成json串响应给前台 publicItemrequestJson(@RequestBodyItemitem)return}}JSPfunction//输入是json是,需要指定contentType为application/jsonfunction//输入是json是,需要指定contentType为application/json}}}什么是什么是,简称系统,比如web应用程序。它首次出现在2000年RoyFielding的博士中,他是HTTP规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(SimpleObjectAccessprotocol,简单对象协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计值得注意的是REST并没有一个明确的标准而更像是一种设计的风格。它本身并没有什么实用性,其价值在于如何设计出符合REST风格的网络接口。restful的优点restful的特性:Resouces个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,它的URI就可以,因此URI即为每一个资源的独一无二的识别符。表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层(ion比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,ransfer(Stateransfer转化是建立在表现层之上的,所以就是“表现层状态转化”。具体说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。restful的示例:/account/1HTTPGET: 得到id1的/account/1HTTPDELETE:删除id1的/account/1HTTPPUT:更新id1的 app动词。比如:RESTfulHTTPmethodput、delete、post、get操作资源。分别对应添加、删除、修改、查询。不过一般使用时还是postget。PutDelete几乎不使用。RESTfulURL(也就是返回数据类型,比如XML、JSON等数据格式。URL支持注意:restfulURL只会在GET添加DispatcherServlet的rest URL模板模式映射@RequestMap publicItemviewItem(@PathVariable("id")Integerid)throws//调用serviceItemitem=return}如果RequestMap中表示为"/viewItem/{id}",id和形参名称一致,@PathVariable静态资源如果在DispatcherServlet中设置url-pattern为/则必须对静态资源进行处理<!--当DispatcherServlet配置为/ <!--当DispatcherServlet配置为/ 映射--> <mvc:resourceslocation="/css/" 13Springmvc的器主要是处理器的定义publicclasspublicclassHandlerIntercepter1implementspublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{return}publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{}publicvoid pletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{}}}配置Springmvc器针对HandlerMap进行处理,即;如果某个HandlerMap中配置,则该HandlerMap映射成功的Handler会使用该拦针对单个HandlerMap配<property<refbean="interceptor"<beanid="interceptor"class="erceptor.Interceptor"全局器配置(推荐<!--配置全局<!--如果有多个的器--><!--/**表示所有 URL路径--path="/**"<beanclass="erceptor.Interceptor"多器规器应用(实现登录认证器对的请求URL进行校1、如果请求的URL是公开地址(无需登录就可以的URL,具体指的就是保护login字段的请求URL,采取放行。2session3session登录jsp<%@<%@pagelanguage="java"contentType="text/html;charset=UTFEncoding="UTF-<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=UTF-<tablealign="center"border="1"cellspacing="0" <td><inputtype="submit"value=ControllerpublicclassLoginControllerpublicStringreturn}//登录//登录publicStringlogin(HttpSessionsession,Stringusername,Stringpassword)//Service进行用 //把用户信息保存到sessionreturn}//退出publicStringlogout(HttpSessionsession)//清空return}}类publicpublicclassLoginInterceptorimplementsHandlerInterceptorpublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{StringrequestURI=if(requestURI.indexOf("login")>-1)returntrue;2、如果用户session存在,则放行。Stringusername=(String)if(username!=null&&!username.equals(""))return}3session中不存在,则跳转到登录页面。returnfalse;publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{//TODOAuto-generatedmethod}publicvoid pletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{//TODOAuto-generatedmethod}}<!--配置全局map的器--<!--如果有多 器,则按照顺序进行配置-- <!--/**表示所有 URL路径-- path="/**"/> <beanclass="erceptor.LoginInterceptor" <!--如果有多个器,则按照顺序进行配置--<!--/**表示所有URLURL路径--<beanclass="erceptor.Interceptor"1415Mock16SpringMVC17源码分析专题Servletservice:Servlet对象被HTTP请求时调DispatcherServletSpring有两种Bean的初始化(不是实例化)方式***一种是实现InitializingBean接***一种是通过反射调用bean ***不同点:接口比配置效率高,但是配置消除了对spring依InitializingBean接口为bean***afterPropertiesSet***凡是实现该接口的类,在初始化bean实现InitializingBeaninit-method***系统afterPropertiesSet这种BeanSpring***执行时机:在创建Bean (AutowireCapableBeanFactoryinvokeInitMethods初始化DispatcherServlet初始化:GenericServlet(实现了Servlet接口)的接下来准备调用GenericServlet的init而是被子类HttpServletBean给覆盖了,我们直接看看的init(接下来调用initServletBean(),不过该方法需要去HttpServletBean的子类FrameworkServlet中去看看方法调用到这里,我们终于知道DispatcherServletSpringFrameworkServlet类的initWebApplicationContext方法557springmvc.xmlspringonRefresh()方法是初始化一些默认组件,比如HandlerMap组件中,看到了这个地方,大家已经明白入门程序为什么没有配置三大组件,们随便找个initHandlerMap来了解一下它们是怎么实现的吧看看是如何加载默认策略的,进入getDefaultStrategies那么defaultStrategies至此,DispatcherServletDispatcherServlet:HttpServlet类的service方法(该方法的参数不是Http开头的继续到另一个service方(请求和响应都是HTTP开头该方法根据请求的method分别调用相应的处理。那接下来我们应该去看看doGet和doPost方法是如何处理请求的?但是问题是我们应该看哪个类中的doGet和doPost方法呢?通过上面的继承体系分析得知,我们应该去FrameworkServlet类看看到现在为止,我们还没有进入到我们的DispatcherServlet续去processRequest方法看一下通过这个doService方法才正式进入到DispatcherServlet至此,我们终于找到了DispatcherServlet中最核心的一个方法:源码阅读到这里,最起码从主流程中我们可以得知DispatcherServletDispatcherServlet是如何与三大组件进行联系的。所以我们要分别找到三大组件与DispatcherServlet交互的地方。处理器映射器与DispatcherServlet:getHandler处理器适配器与DispatcherServlet交互的代码:getHandlerAdapter方视图解析器与DispatcherServlet入processDispatchResult方法再进入render这个resolveViewName方法就是视图解析器和DispatcherServlet到此,DispatcherServlet的主流程以及三大组件和它的联系,我们都已经源码分析处理器映射器处理器流的afterPropertiesSetafterPropertiesSet看,其中又调用了intitHandlerMethods方法(定义了映射器处理的程我们继续去看看detectHandlerMethods方法 处理方法上面的方法处理逻辑主要分为两大步骤映射Method和RequestMap 映射关系:RequestMap Info和URL及HandlerMethod。我们先看第一大步骤,也就是调用MethodIntrospector.selectMethods方我们去看一下MetadataLookup的 内部类实现中调用的getMapForMethod方法是如何实现的?需要去RequestMapHandlerMap类中去查看该方法至此第一大步骤我们阅读完了,接下来去看看第二大步骤,我们看看类的registerHandlerMethod接下来,我们去看看register方法分析:DispatcherServlet类中的getHandler方接下来我们需要进入到具体 HandlerMap去执getHandlergetHandlerInternalHandlerMethodMap类去实现的接下来我们重点去看看lookupHandlerMethod方法(方法我们继续去看看addMatchingMaps方 RequestMapInfoHandlerMap getMatchingMap方最后去RequestMapInfo类去看看getMatchingCondition方本章节主要是分析本章节主要是分析JSP源码分析mvc:annotation-drivern注解和源码分析处理器器流18////第二种Handler处理器的编写方式:实现HttpRequestHandler接publicclassItemController2implementsHttpRequestHandlerthrowsServletException,IOException{List<Item>itemList=newArrayList<Item>();Itemitem_1=newItem();item_1.setName想笔记本);item_1.setDetail(ThinkPadT430联想笔记本电脑!);ItemItemitem_2=newite
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年渤海船舶职业学院高职单招语文历年参考题库含答案解析
- 宝贝学常见词
- 授权函完整版本
- 二零二五年能源管理服务简易借款合同3篇
- 二零二五年新型电子产品动产交易合同2篇
- 2024年河南物流职业学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- 2024年阜阳市第二人民医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 2024年阜康准东石油医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 2024年长沙现代女子医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 2025版高端食品买卖合同及食品安全追溯协议
- 2023浙江省杭州市中考语文真题试卷和答案
- 银行防诈骗知识宣传
- 【实战篇】华为IPD流程的应用案例
- spa浴按摩是怎么样的
- 统编版六年级语文上册专项 专题04标点符号及作用-原卷版+解析
- Book-1-Unit-3-going-positive教学设计文档
- 绩效管理外文翻译外文文献中英翻译-绩效管理外文文献
- 建立信息共享和预警机制
- 2023年湖北省鄂州市鄂城区数学七年级第一学期期末综合测试试题含解析
- 并行计算任务分配
- JGT129-2017 建筑门窗五金件 滑轮
评论
0/150
提交评论