课程笔记11springmvc收尾it教程spring5mvc_第1页
课程笔记11springmvc收尾it教程spring5mvc_第2页
课程笔记11springmvc收尾it教程spring5mvc_第3页
课程笔记11springmvc收尾it教程spring5mvc_第4页
课程笔记11springmvc收尾it教程spring5mvc_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1概念介绍*/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计。2程创建一个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-drivern HandlerMap<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-ceholderlocation="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"<disy-name>ssm</disy-<!--配置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@RequestMap(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);简单类型8String在springmvc对于javahttpkeycontroller形参名称请求请求参数的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";}绑定包装POJOPOJOPOJO一个POJO的这种类,称之为包装POJO。publicpublicclassItemQueryVOprivateItem}页面定义(item-<td>商品名称:<inputtype="text"name=""<td><inputtype="submit"value="查询"Controller测试方法:断点,查看vo中的item对象是否有值通过HTTP请求批量传递简单类型数据的情况,Controller方法中可以用String[]或者pojo的String[]属性接收(两种方式任选其一),但是不能使用集合接收。请求Controller publicStringdeleteitem(Integer[]return}使用POJO必须放在另一个POJO接收商品列表的publicpublicclassItemQueryVO//商品信privateprivateItem//其他信息 privateList<Item> }请求? x&publicStringbatchUpdateItem(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请 异publicclasspublicclass ceptionextendsExceptionprivateStringpublic ception(Stringmessage)this.message=message;}publicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}publicpublicclass HttpServletResponseresponse,Objecthandler,Exceptionex) ception ception=if(exinstanceof }ception=ception)ception=newModelAndViewmodelAndView=new returnmodelAndView;}}<%@<%@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)throwsItemitem=if(item==null)thrownewBusines model.addAttribute("item",item);//由于配置了}上传SpringMVCcommons-fileuploadjar文件上传需要指定enctype=”multipart/form-配置Multipartmultipart<beanid="multipartResolver"multipart<beanid="multipartResolver"><!--上传文件的最大尺寸5M<propertyname="maxUploadSize"上传代Controllerifif(pictureFile!= StringoriginalFilename= if(originalFilename!=null&&{//存 StringpicPath="E:\\03-teach\\07-StringnewFileName (value=publicStringupdateItem(Modelmodel,ItemMultipartFilepictureFile)throwsException}}returnFilenewFile=newthrownew }}Jsp<td>商 <c:iftest="${item.pic<inputtype="file"配置文件的虚注意:在虚拟 中,一定将分级创建(提高i/o性能一般我们采用按日eclipse配置tomcat直接修改tomcat在tomcat安 为什么使用JSONJSONHTMLAjaxJSON请求是KV,响应是JSON(推荐使用JSON输入key/valueJSON(推荐JSPfunctionfunction}}Controller//输入是//输入是key/value,输出是//@ResponseBody将返回值转成json串响应给前台 publicItemresponseKV(Itemitem)return}输入JSON、输出JSPfunction//输入是json是,需要指定contentType为application/json}}function//输入是json是,需要指定contentType为application/json}}ControllerpublicclassJsonController//输入是json,输出是@RequestBody将请求的json串转成java@ResponseBody将返回值转成json publicItemrequestJson(@RequestBodyItemitem)returnreturn}}什么是mock对象对象mockServlet、Request、ResponseServletAPIServlet***这个虚拟的对象mock***mock就是真实对象在调试期间的代替品为什么使用mock基于RESTfulSpringMVCSpringMVC程,即从URL请求到控制器处理,再到视图渲染都可以测试。MockMvcBuilderMockMvc其主要有两个实现: 对于我们来说直接使用静态工厂MockMvcBuildersstandaloneSetup(Object...器并得到相应的MockMvc对于服务器端的SpringMVC测试支持主点由方法:perform(RequestBuilderrb)执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,该方法的返回值是一个ResultActions;其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上传使用,即用来Mock客户端请求需要的所有数据。用来匹配执行完请求后的包含了很多验证API比如此处使用MockMvcResultHandlers.print单元测试执行结果,可以针对执行结果进行自定义验证逻辑spring单元测试组件包--><!--单元测试JunitMock测试使用的json-path依赖-->importstaticorg.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;importstaticorg.springframework.test.web.servlet.result.MockMvcResultHandlers.print;importstaticorg.springframework.test.web.servlet.result.MockMvcResultMatchers.status;importstaticorg.springframework.test.web.servlet.result.MockMvcResultMatchers.content;importimportimportimportimportimportimportorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;importorg.springframework.test.context.web.WebAppConfiguration;importorg.springframework.test.web.servlet.MockMvc;importimportorg.springframework.test.web.servlet.request.MockMvcRequestBuilders;importorg.springframework.test.web.servlet.result.MockMvcResultHandlers;importorg.springframework.test.web.servlet.result.MockMvcResultMatchers;importorg.springframework.test.web.servlet.setup.MockMvcBuilders;import@ContextConfiguration(locations="classpath:spring/*.xml")publicclassTestMockMVCprivateWebApplicationContextprivateMockMvcmockMvc;publicvoidsetup()//初始化一个MockMVC对象的方式有两种:单独设置、web//建议使用Web应用上下文设mockMvc=}publicvoidtest()throwsException//通过perform去发送一个HTTP//andDoMvcResultresult=}publicvoidtest2()throwsException//通过perform去发送一个HTTP////MvcResultresult=mockMvc.perform(get("/item/findItem").param("id",.andExpect(jsonPath("$.name").value("台式机}}用于一个ApplicationContext集成测试加载WebApplicationContext理解什么是REST之前,先去理解一下什么是HTTP,参考【HTTP,简称(源表述性状态转化描述了一个架构样式的网络系统,比如web应用程序。***价值在于如何设计出符合REST风格的******REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。((Resources可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI它的URI就可以,因此URI(eresetation(RepresentationtxtHTML式、XML格式、JSON格式表现,甚至可以采用二进制格式。ransferransfer是“表现层状态转化”。具体说,就是HTTP协议里面,四个表示操作方用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除动词设计:也就是针对资源的具体操作类型,由动词设计:也就是针对资源的具体操作类型,由HTTPHTTPPOST、DELETE、PUT、RESTful的示例:/account/1HTTP/account/1HTTPGET:得到id=1的/account/1HTTPDELETE:删除id=1的/account/1HTTP 更新id1的RESTful的URL RESTful请求 queryItemById(@PathVariable RESTful的@RequestMap:通过设置method属性的CRUD,可以将同一URL映射到不同的HandlerMethod@GetMap、@PostMap、@PutMap、@DeleteMap注解同@RequestMap注解的method属性RESTfulRESTful服务中一个重要的特性就是一种资源可以有式式,在中可以使用扩展名,比如.jsonJSONxmlXML据请求头设置Accept,比如设置Accept为application/json协商管理器,直接使用@ResponseBody注解将数据按照JSON静态资源如果在DispatcherServlet中设置url-pattern为/则必须对静态资源进行处理<!--当DispatcherServlet配置为/ <!--当DispatcherServlet配置为/ 映射--> <mvc:resourceslocation="/css/" map映 ResourceHttpRequestHandler,这样静态资源在经过DispatcherServlet转发时就可以找到对应的Handler了。14SpringMVC的器主要是针对特定处理器进行的SpringMVC器介业务处理,类似与servletFilterSpringMVC中的请求是通过HandlerInterceptorSpringMVC中定义一个Interceptor4SpringHandlerInterceptor继承实现了HandlerInterceptorSpring已经提供的实现HandlerInterceptor接口的抽象类HandlerInterceptorAdapter;3)实现Spring的WebRequestInterceptor接口;4)继承实现了WebRequestInterceptor定义publicclasspublicclassMyHandlerIntercepter1implementspublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{return}publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{}publicvoid pletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{}}配置SpringMVCSpringMVC拦截器是绑定在中的,即;如果某个,则该 映射成功的针对单个HandlerMap配只有通过该处理器映射器查找到的处理器,才能使用该器<置,如果通过第二个映射器查找到的处理器,是无法使用器的。<<property<refbean="interceptor"<beanid="interceptor"class="erceptor.MyHandlerInterceptor"全局器配置(推荐SpringMVC的全局器配置,其实是把配置的器注入到每个已初始化<!--配置全局 <!--配置全局 器--<!--公 所有请求,而且可以有多个--<beanclass="erceptor.MyHandlerInterceptor1"<beanclass="erceptor.MyHandlerInterceptor2"<!--如果有多 器,则按照顺序进行配置--<!--/**表示所有 URL路径-- path="/test/**"<!--特定请求 器只能有一个--<beanclass="erceptor.MyHandlerInterceptor3"多器规器应用(实现登录认证器对的请求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-" <td><inputtype="submit"value=ControllerpublicclassLoginController publicStringreturn}//登 publicStringlogin(HttpSessionsession,Stringusername,Stringpassword)//Service进行用 //把用户信息保存到session//重定向到商品列表页return}//退 publicpublicStringlogout(HttpSessionsession)return}}类publicclassLoginInterceptorimplementsHandlerInterceptorpublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{//获取请求的StringrequestURI= 1、如果请求的URL是公开地址(无需登录就可 2、如果用户session存在,则放行Stringusername=(String)if(username!=null&&!username.equals(""))return 3、如果用户sessionreturn}publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{//TODOAuto-generatedmethod}}publicHttpServletResponseresponse,Objecthandler,ExceptionthrowsException//TODOAuto-generatedmethod}}<!--<!--配置全局 <!--如果有多个器-->器,则按照顺序进行配置--><!--/**表示所有 URL路径-- path="/**"<beanclass="erceptor.LoginInterceptor"<!--如果有多 器,则按照顺序进行配置--<!--/**表示所有 URL路径-- path="/**"<beanclass="erceptor.MyHandlerInterceptor"15SpringMVC问题1:在子容器一个Bean,然后父容器中使用@Autowired注解注入,问题2@Autowired注解的开启方式有哪些?如果父容器中不开启16******由于浏览器对于Javascript的同源策略的限制,导致不能通过(Ajax)B***跨域指的是/hh程序,他利用IFrame他的页面上,当你使用真实的用户名,登录时,他的页面就可以通过到你的表单中input***解决跨域的方式有多种,比如***解决跨域的方式有多种,比如基于JavaScript的解决方式、基于的JSONP、以及基于CORS***JSONP和CORSJSONP只能解决get、CORS支持GET方式,同时也支持POST提交方式。***我们重点就来讲解CORS什么是******CORSW3C标准,全称是"跨域资源共享"(Cross-originresourcesharing***它允许浏览器向跨源服务器,发出XMLHttpRequestAJAX***CORS浏览器和服务器同时支持浏览器不能低于IE10OriginheaderAccess-Control-Allow-Origin,则浏览器将CORS请求分成两类:简单请求(simplerequest)和非简单请request只要同时满足以下两大条件,就属于简单请求加一个Origin字段。该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*不,******非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUTDELETEDELETE,或者Content-Type字段的类型是application/json(prefligt***出正式的XMLHttpRequest样请求。下面是这个"预检"请求的HTTP头信息。"预检"请求用的请求方法是"预检"请求用的请求方法是字段是除了CORS是X-Custom-Header。CORS,OriginAccess-Control-Allow-Origin使用使用springmvc 器实publicpublicclassAllowOriginInterceptorimplementsHandlerInterceptorpublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,ObjectthrowsException//有跨域行为时参 if(request.getHeader("Origin")!=null){//允许哪一个//允许那种请求方response.setHeader("Access-Control-Allow-Methods",response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS, }return}}配置器的代码,请自行补充***Access-Control-Allow-Credentials为true的时候,Access-Control-Allow-Origin*”,否则报错***如果有多 器,一定要把处理跨域请求 器放到首位JSJqueryurl:'自己要请求的method:'请求方式',//GETPOSTPUT}}全局在模块配置中添加 }$http.get(url,{withCredentials:$http.post(url,data,{withCredentials:publicpublicclassAllowOriginInterceptorimplementsHandlerInterceptorpublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,ObjectthrowsException//有跨域行为时参考 if(request.getHeader("Origin")!=null){//允许哪一个 request.getHeader("Origin")根据请求来的url动态允//允许那种请求方response.setHeader("Access-Control-Allow-Methods",response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE,HEAD");response.setHeader("Access-Control-Max-Age","0");response.setHeader("Access-Control-Allow-"Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,X-E4M-With,userId,token");response.setHeader("XRequestAllowed","1");}return}}17源码分析专题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方源码分析处理器适配器流分析源 :RequestMap分析源 接着进 pter类的Handle方进入RequestMapHandlerAdapter类执行handleInternal方进入invokeHandlerMethodServletInvocableHandlerMethod返回值的处理我们就不看了,重点进入InvocableHandlerMethod类的进入getMethodArgumentValues posite本章节主要是分析本章节主要是分析JSP源码分析mvc:annotation-drivern注解和源码分析处理器器流分析源码:DispatcherServlet的doDispatcher方流程分析类流程分析类流程分析类18////第二种Handler处理器的编写方式:实现HttpRequestHandler接publicclassItemController2implementsHttpRequestHandlerthrowsServletException,IOException{List<Item>itemList=newArrayList<Item>();Itemitem_1=newItem();item_1.setName想笔记本);item_1.setDetail(ThinkPadT430联想笔记本电脑!);Itemitem_2=newItem();item_2.setName(苹果);item_2.setDetail(6苹果 !);//数据request.setAttribute(itemList,request.getRequestDispatcher(/WEB-INF/jsp/item/item-list.jsp).forward(request,}}实现Controller开发时需要实现Controller////式:实现Controller接publicclassItemControllerimplementsControllerpublicModelAndViewhandleRequest(HttpServletRequestreq,HttpServletResponseresp)throwsException{//TODOAuto-generatedmethodstubList<Item>itemList=newArrayList<Item>();Itemitem_1=newItem();item_1.setName想笔记本);item_1.setDetail(ThinkPadT430联想笔记本电脑!);Itemitem_2=newitem_2.setName(苹果 6苹 !//创建ModelAndView准备填充数据、设置视ModelAndViewmodelAndView=new//相当于request.setAttribute(key,value)modelAndView.addObject(itemListitemList);//指定视图的地modelAndView.setViewName(WEB-INF/jsp/item/itemList.jspreturn}}Handler<!--配置<!--配置处理器--><bean如果在DispatcherSperties器映射器之BeanNameUrlHandlerMap:*将的name*这样就可以通过getBean(url Handler和url根据映射器的映射规则,在根据映射器的映射规则,在springmvc.xml中配置URL和处理器bean的name<beanname="/queryItem"请求处理器适配器通过supports方法适配所有实现了HttpRequestHandler器通过handle该适配器只能适配执行实现了HttpRequestHandler接口的handlerpublicpublicclassItemController1implementsHttpRequestHandlerpublicvoidhandleRequest(HttpServletRequest//此处省}}显式配置:在springmvc.xml<!--配置<!--配置http请求处理器适配器--><beanpublicbooleansupports(Objecthandler)return(handlerinstanceof}throwsException((HttpRequestHandler)handler).handleRequest(request,return}}适配器之通过通过supportsController通过handle开发Handler实现Controller//springmvc的handler开发//springmvc的handler开发要实现Controller接口(除了实现Controller接口,还可以实现其他接口publicclassItemControllerimplementsController{publicModelAndViewhandleRequest(HttpServletRequestreq,HttpServletResponseresp)throwsException{//此处省}}<!--配置处理器适<!--配置处理器适配器,所有适配器都实现HandlerAdapter接口--><beanclass="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"publicpublicclassSimpleControllerHandlerAdapterimplementsHandlerAdapterpublicbooleansupports(Objecthandler)return(handlerinstanceof}throwsExceptionreturn((Controller)handler).handleRequest(request,}}非注解方式开发的Handler19请求乱码解决之getGETGET请求参数是通过请求行中的URI发送给Web(Tomcat)Tomcat服务器会对URI进行编码操作(此时使用的是Tomcat设置的字符集,默认是iso8859-1)TomcatISO8859-11之修改tomcat指定UTF-8protocol="HTTP/1.1"2StringStringusername=3请求乱码解决之post 使用@RequestMap注解中的produces属性,指定响应体的编码格20HTTPHTTP什么是HTTP什么是HTTPHTTPHTTP协议HTTPTCP/IPHTTP(应用层)HTTP协议是一个无状态协议(不会记录每次时的信息(TCP服务器端是。什么是WEB通过浏览器可以到的所有资源都是web资web静态资源和动态资源是通过程序展示页面数据的,比如Servlet请求静态资源的数据是不变的,比如HTML、JPG、AVIHTTP就是为了约束客户端和服务器之间传输webHTTPHTTPHTTP1.01.1HTTP1.1和HTTP1.0版本之间最大的区别就是可以接传输多个web

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论