配色: 字号:
CGB-SRPING-MVC-V1.0
2017-12-31 | 阅:  转:  |  分享 
  
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-webmvc
4.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
1
let-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>doListToJson()
{List>list=newArrayList<>();Mapt>map=newHashMap<>();map.put("id",10);map.put("content","cont
ent-A");list.add(map);map=newHashMap<>();map.put("id",20);map.p
ut("content","content-B");list.add(map);returnlist;}SpringMVC
拦截器SpringMVC拦截器概述拦截器是SpringMVC中的一个核心应用组件,主要用于处理多个Controller的共性问题
.当我们的请求由DispatcherServlet派发到具体Controller之前首先要执行拦截器中一些相关方法,在这些方法中可
以对请求进行相应预处理(例如权限检测,参数验证),这些方法可以决定对这个请求进行拦截还是放行.通过springmvc架构图分析
,拦截器在SpringMVC中处理流程中的一个位置分析:拦截器与过滤器有什么异同点?相同点:都可以对请求进行预处理不同点:都请求
进行预处理的时间不同.思考:假如对请求数据进行编码,是应在过滤器还是拦截器?拦截器如何编写?我们自己编写SpringMVC拦截器
需要实现HandlerInterceptor接口或者继承此接口的实现类.拦截器如何配置?我们自己的拦截器编写完成以后需要在spri
ng配置文件中进行配置,例如:拦截器在springmvc框架中的执行流程如下图所示:拦截器方法执行流程具体细节,参考如下所示
:当我们系统中有多个拦截器时,这些拦截器可以构成一个拦截器链.如下图所示:Spring拦截器应用编写自定义的Intercepto
r实现HandlerInterceptor接口或继承HandlerInterceptorAdapter,重写相关方法处理具体业务。
SpringMVC异常处理SpringMVC异常概述实际项目中我们经常会采用分层架构设计程序,每一层都可能会有异常,假如异
常信息没有处理,可能会选择抛出,当这些被抛出的异常假如与具体业务相关,那到控制层以后我们一般都进行相应的处理(处理方式应该相对友好)在Springmvc项目中,边界出现异常以后我们通常会在Controller中进行处理,常用封层架构分析:SpringMVC异常处理在spring中处理异常时,通常会在Controller中定义具体的异常处理方法,这个方法上使用@HandlerException注解进行描述.例如在指定Controller中定义异常处理方法:@ExceptionHandler(value=Exception.class)@ResponseBodypublicStringhandleException(Exceptione){System.out.println("局部异常处理");returne.getMessage();}当Spring的controller中没有定义具体的异常方法,我们外部定义一个全局的异常处理类,这个类使用@ControllerAdvice注解进行修饰.然后在这个类中定义具体的异常处理方法,这些方法再使用@HandlerExcpeiton进行修饰,例如@ControllerAdvicepublicclassAdviceExceptionHandler{@ExceptionHandler(Throwable.class)@ResponseBodypublicStringhandlerException(Throwablee){System.out.println("全局的异常处理");returne.getMessage();}}当控制层有局部的异常处理方法,还有全局的异常处理方法,此时在进行异常处理时遵循局部优先原则.提示:在控制层或@ControllerAdvice修饰类中可以使用@InitBinder,@ModelAttribute等注解对一些方法进行修饰,使用这些注解修饰的方法会优先执行.对这些注解了解.异常抛出及处理流程参考如下图(可作为扩展学习)总结重点和难点分析常见FAQ培优齐雷(Spring-day01)
献花(0)
+1
(本文系金银宝100首藏)