SpringMVC简介Web开发请求响应模型在web的世界里都是客户端发起请求,服务端处理请求,并返回响应给客户端。以上图形描述的就是 典型的B/S架构,是一种特殊的C/S机构,就是客户端服务端/架构.回顾:客户端技术:html/css/javascript,jq uery服务端技术:java/servlet/jsp数据传输协议:HTTP协议(超文本传输协议)MVC架构模式概述MVC架构 模式定义MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(controlle r)的缩写,一种软件设计典范。其中:M-Model模型:职责是负责业务逻辑。V-View视图:职责是负责显示界面和用户交互( 收集用户信息)。C-Controller控制器:是模型层M和视图层V之间的桥梁,用于控制流程。MVC应用场景:应用相对复杂的场 景.(电商系统,企业ERP系统,…)MVC应用优势:可以更好实现应用解耦,提到代码可扩展性.提高代码的可重用性,可读性以及可维护 性.生活中的MVC分析正规大饭店中菜单(view),服务员(controller),厨师(model)的角色菜单:呈现数据(有哪些 美味食品)服务员:服务于客户,将菜单信息传递给厨师.厨师:数据加工(洗菜,切菜,做菜)记住:程序中所有的逻辑都是来自于生活程序中的 MVCJava中最典型的MVC架构设计就是JSP+?servlet?+?javabean的模式。其中:JSP通常会充当视图层角 色(借助html呈现数据)Servlet通常会充当控制层角色(主要负责流程控制)JavaBean通常会用于处理业务逻辑,数据逻 辑(充当业务层对象)目前市场上基于这样的一种架构有一些对应的框架(FrameWork):Struts1.0Struts2.0(W ebWork)SpringMVC……SpringMVC概述SpringMVC是MVC架构模式的一种完美实现,是为了简化Ja va中MVC的编程过程而推出的一个Spring中的WEB应用模块。SpringMVC概要架构图及工作流程如下(先了解):Spr ingMVC核心架构图及工作流程(先了解,写完项目案例再重点强化)从SpringMVC核心架构分析,SpringMVC围 绕DispatcherServlet而计,使用HandlerMapping决定由哪个处理器处理请求。说明:具体流程可根据断点调试法 逐步跟踪尝试(暂且可先记住简要流程)SpringMVC中的核心组件:DispatcherServlet(控制器,请求入口) HandlerMapping(控制器,请求派发)Controller(控制器,请求处理流程)ModelAndView(模 型,封装业务处理结果和视图)ViewResolver(视图解析器,解析对应的视图关系)SpringMVC设计的优势:简化传统 MVC编程过程.更好提高代码的编码效率以及程序的可扩展性.SpringMVC基本实现案例分析案例功能分析浏览器中输入某个地址 ,直接访问资源访问地址,页面显示helloworld基本步骤分析创建springmavenweb项目添加SpringMVC 依赖库(建议通过maven添加)添加Spring配置文件spring-mvc.xml。Web.xml中配置SpringMVC 前端核心处理器(DispatcherServlet)创建SpringMVC后端处理器(Controller)spring-mv c.xml文件中配置Spring后端处理器及视图解析器(ViewResolver)部署运行springweb项目(tomcat) 基本配置创建MavenWeb项目具体mavenweb项目的创建过程可参考doc.tedu.cn.项目创建完成以后右键生成部署描 述符(web.xml)右键项目,选择属性,修改projectfacets,将java版本改成1.8.右键项目,修改targete druntimes,选择对应的tomcat服务器.pom.xml基本依赖实现添加spring-webmvc依赖,参考官网说明.< dependency>org.springframeworksp ring-webmvc4.3.9.RELEASEency>假如添加好了依赖,都没有找到对应的jar依赖,先检测网络是否是通的.假如网络是通的,还没有下载到具体的依赖,此时要右键项 目,选择maven/upatemavenproject/foreupdate…进行maven强制更新操作.spring核心配 置文件项目的资源目录中直接创建spring-mvc.xml核心配置文件UTF-8"?>ramework.org/schema/beans"xmlns:p="http://www.springframework.o rg/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="ht tp://www.springframework.org/schema/aop"xmlns:mvc="http://www.s pringframework.org/schema/mvc"xmlns:util="http://www.springframe work.org/schema/util"xmlns:jpa="http://www.springframework.org/s chema/data/jpa"xsi:schemaLocation="http://www.springframework .org/schema/beanshttp://www.springframework.org/schema/beans/sp ring-beans-4.3.xsdhttp://www.springframework.org/schema/mvcht tp://www.springframework.org/schema/mvc/spring-mvc-4.3.xsdhttp:/ /www.springframework.org/schema/txhttp://www.springframework.org /schema/tx/spring-tx-4.3.xsdhttp://www.springframework.org/schem a/aophttp://www.springframework.org/schema/aop/spring-aop-4.3.x sdhttp://www.springframework.org/schema/utilhttp://www.springf ramework.org/schema/util/spring-util-4.3.xsdhttp://www.springfra mework.org/schema/data/jpahttp://www.springframework.org/schema /data/jpa/spring-jpa-1.3.xsdhttp://www.springframework.org/schem a/contexthttp://www.springframework.org/schema/context/spring-co ntext-4.3.xsd">web.xml基本配置在web.xml文件中配置springmvc前端控制 器。dispatcherServlett-class>org.springframework.web.servlet.DispatcherServlett-class>contextConfigLocationame>classpath:applicationContext.xml 1let-mapping>dispatcherServletpattern>.do基于xml方式实现创建后端控制器通过控制器处 理用于请求,例如获取请求数据,对请求数据进行类型转换等。publicclassHelloControllerimplemen tsController{publicModelAndViewhandleRequest(HttpServletReques trequest,HttpServletResponseresponse)throwsException{ModelAn dViewmv=newModelAndView("hello");mv.addObject("message","hellow orld");returnmv;}}创建后端hello.jsp页面在hello.jsp文件中添加如下内容。…>${message}…其中${message}用于显示控制层封装返回的数据配置controller及视 图解析打开spring-mvc配置文件配置控制器,处理映射以及视图解析操作。具体代码如下ring.controller.XmlHelloController">.web.servlet.handler.SimpleUrlHandlerMapping">ppings">helloControllerrops>"class="org.springframework.web.servlet.view.InternalResourceVie wResolver">opertyname="suffix"value=".jsp"/>启动tomcat进行测试部署项目到tomcat ,启动tomcat并确定启动OK,然后在地址栏输入对应url,查看运行结果。分析具体处理流程:相关组件分析:DispatcherS ervlet核心前端处理(负责流程调度)SimpleUrlHandlerMapping(记录url到handler的映射)Hel loController(又称之为handler,处理客户端请求)ModelAndView(封装数据以及对应的视图)Intern alResourceViewResolver(负责视图解析,基于view找到具体的view对象,例如hello.jsp)基于注解方 式实现创建后端控制器Sping2.5之前我们都是通过实现Controller接口方式定义我们的处理类,Spring2.5之后可通过 @Controller和@RequestMapping注解定义我们的处理类。@Controller@RequestMapping( "/hello/")publicclassAnnotationHelloController{@RequestMapping ("doSayHello")publicStringdoSayHello(Modelmodel){model.addAtt ribute("message","helloworld");return"hello";}}说明:通过@Controller 配置这是一个控制器。通过@RequestMapping实现Url与控制器及方法的映射配置组件扫描及MVC注解应用在基于xml实现方 式上,applictionContext.xml配置文件中添加如下代码ent-scanbase-package="com.company"/>ation-driven/>InternalResourceViewResolver">B-INF/pages/"/>Sp ringMVC请求映射请求路径映射实际项目中我们要借助@RequestMapping注解定义映射路径。其注解应用位置类定义处: 提供初步的请求映射信息。方法定义处:提供进一步的细分映射信息普通url映射@RequestMapping(value={"/d oSayHello","/user/doSayWelcome"}):多个URL路径可以映射到同一个处理器的功能处理方法。REST 风格URL映射REST即表述性状态传递(英文:RepresentationalStateTransfer,简称REST),是一 种软件架构编码风格,是基于网络应用进行设计和开发的编码方式。可以降低开发的复杂度,提高程序的可伸缩性。例如:@RequestMap ping("/msg/{xxx}")请求的URL可以是“/msg/hello”或“/msg/welcome”@RequestMa pping("/msg/{id}/create"):请求的URL可以是“/users/1/create”。@RequestMapp ing("/msg/{mId}/topics/{tId}")这样也是可以的,请求的URL可以是“/users/10/topics/ 12”。说明:通过@PathVariable可以提取URI模板模式中的{×××}中的×××变量。http://localhost: 8080/http://localhost:8080/项目名/doUpdate.do?id=1http://localhost:8 080/http://localhost:8080/项目名/doUpdate/1.do请求方式映射请求方式限定项目中Control ler层对象的每个方法默认可以处理任意方式的请求,假如要指定控制层方法只能处理GET或只能处理POST请求,那该如何实现呢。借助@ RequestMapping注解中的method属性指定具体的请求处理方式,例如@RequestMapping(value=”do SaveObj”,method=RequestMethod.POST)publicStringdoSaveObject(Obj ectobj){….}请求方式组合项目中还可在控制层方法上借助@RequestMapping注解中的method属性指定使用哪几 种方式处理请求。@RequestMapping(value=”doSaveObj”,method={RequestMethod.P OST,RequestMethod.GET})publicStringdoSaveObject(Objectobj){….} 提示:一般浏览器只支持GET或POST方式。请求参数映射标准ServletAPI对象请求映射方法中可以直接使用ServletA PI中的对象获取参数数据,例如HttpServletRequest,HttpSession对象等,例如:@RequestMapp ing(value="request",method=RequestMethod.GET)@ResponseBodypublic StringwithRequest(HttpServletRequestrequest){System.out.println (request.getRequestURI());return"Obtainer''foo''queryparameter value''"+request.getParameter("gid")+"''";}提示:@ResponseBody注解作用:该注 解作用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Resp onse对象的body数据区,使用情况:返回的数据不是Html标签的页面,而是其他数据格式的数据时,(如Json、xml等)使用; 基本类型参数SpringMVC请求一个控制层资源时,可以在对应方法中直接使用参数变量接收参数数据,但参数变量的类型要为对象类型。 @RequestMapping(value="param",method=RequestMethod.GET)@ResponseB odypublicStringwithParam(@RequestParamStringfoo){return"Obt ained''foo''queryparametervalue''"+foo+"''";}提示:@RequestPara m注解用于接收请求参数中名字为foo的参数值,假如请求参数名与方法中的参数名一致,@RequestParam注解可以省略。假如不一 致则可以使用@RequestParam注解定义新的参数名直接接收页面数据,然后传递给方法名,例如@RequestMapping(v alue="param",method=RequestMethod.GET)@ResponseBodypublicString withParam(@RequestParam(value="param1",required=false)Stringfo o){return"Obtained''foo''queryparametervalue''"+foo+"''";} 提示:required=false表示,参数可以不存在,假如为true,参数不存在时会抛出异常。请求多个参数当请求中多个参数时可以 通过在方法中定义多个参数接收参数数据,也可以利用一个javabean对象接收多个参数数据以简化多个参数变量的定义。@Request Mapping(value="group",method=RequestMethod.GET)@ResponseBodypubli cStringwithParamGroup(Messagebean){return"Obtainedparameter group"+bean;}提示:当使用javabean接收请求参数数据时,bean中需要有与参数名对应的set方法。请求U rl参数SpringMVC请求资源路径的URL可以通过{XXX}形式指定动态的URL,动态URL中的这个可变参数的值可以直接注入到 方法对应的参数中。@RequestMapping(value="path/{var}",method=RequestMethod. GET)@ResponseBodypublicStringwithPathVariable(@PathVariableStr ingvar){return"Obtained''var''pathvariablevalue''"+var+" ''";}通过@PathVariable注解指定参数变量var获取请求url中{var}数据请求头参数当服务端要获取客户端请求头中数 据信息时,可通过@RequestHeader即可将请求头中的属性值绑定到处理方法的入参中,例如获取请求中Accept属性的值,然后 传入到对应方法的参数中。@RequestMapping(value="header",method=RequestMethod. GET)@ResponseBodypublicStringwithHeader(@RequestHeaderStringA ccept){return"Obtained''Accept''header''"+Accept+"''";}提示:方法 中的参数名需要与请求头参数中某个某个参数名相同,具体请求头相关信息可以在浏览器控制台查看。当应用中要获取请求中所有数据时可以在请求 方法中定义一个HttpEntity参数,通过此参数获取请求头及请求体中数据,例如@RequestMapping(v alue="entity",method=RequestMethod.POST)public@ResponseBodyStr ingwithEntity(HttpEntityentity){return"Postedrequest body''"+entity.getBody()+"'';headers="+entity.getHeaders ();}SpringMVC响应处理响应数据封装ModelAndView对象在对服务端响应数据进行封装时,可以直接在方法参数中 定义一个ModelAndView类型的参数,借助ModelAndView对象封装响应数据.@RequestMapping("doM odelAndView")publicModelAndViewdoModelAndView(ModelAndViewmv) {//ModelAndViewmv=newModelAndView();mv.addObject("data","mod elandview");mv.setViewName("back");returnmv;}提示:ModelAndView对 象由Spring创建,并可以将数据存储到ModelAndView对象的ModalMap类型的属性中(可参考源代码).Model对 象@RequestMapping("doModel")publicStringdoModel(Modelmodel){Sy stem.out.println("model="+model);model.addAttribute("data","moda l");return"back";}Map对象@RequestMapping("doMap")publicStringdo Map(Mapmap){map.put("data","map..");return"bac k";}说明:通过map接收页面参数时,需要使用@RequestParam注解声明@RequestMapping("doMap") publicStringdoMap(@RequestParamMapmap){map.pu t("data","map..");return"back";}响应数据转换转换为json格式JSON(JavaScript ObjectNotation):一种轻量级数据交换格式,通常用于实现客户端与服务端之间的数据传输.例如JSON格式的JavaSc ript对象:varo1={id:10,name:’a’,age:20}varo2=[{id:10,name:’a’,age: 20},{id:20,name:’B’,age:30}]访问json格式的javascript对象中的数据varid1=o1.i d;varid2=o2[0].id在实际的项目中,通常会将服务端返回的数据直接转换JSON格式字符串,在客户端将这个字符串再转换 为javascript对象,然后从这个对象直接取数据.例如:@RequestMapping("doJSON")@ResponseB odypublicMapdoJSON(){Mapmap=new HashMap();map.put("id",10);map.put("msg","hello world");returnmap;}转换为json格式时项目中需要添加json相关API依赖,例如使用jackson第三方库< dependency>com.fasterxml.jackson.corectId>jackson-databind2.8.5ndency>其他案例@RequestMapping("doBeanToJson")@ResponseBodypublicMes sagedoBeanToJson(){Messagemsg=newMessage();msg.setId(100);msg. setContent("msg-content-1");returnmsg;}@RequestMapping("doListTo Json")@ResponseBodypublicList |
|