《精通SpringJava Web开发技术详解.ppt》由会员分享,可在线阅读,更多相关《精通SpringJava Web开发技术详解.ppt(266页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精通Spring:JavaWeb开发技术详解作者:孙卫琴作者:孙卫琴参考书籍:参考书籍:精通Spring:Java Web开发技术详解出版出版社:清华大学出版社社:清华大学出版社技术支持网址:技术支持网址: springmvc-servlet.xml:这是SpringMVC框架的专有配置文件。web.xmlspringmvcorg.springframework.web.servlet.DispatcherServlet1springmvc/springmvc-servlet.xmlspringmvc-servlet.xml(续)messagesspringmvc-servlet.xml(续)
2、2.7发布和运行helloapp应用初次访问hello.jsp的流程n(1)DispatcherServlet调用PersonController控制器类的init()方法。n(2)PersonController控制器类的init()方法把一个新建的Person对象保存到Model类型的model参数中n(3)PersonController控制器类的init()方法把请求转发给hello.jsp。n(4)hello.jsp中的标签从消息资源文件中读取文本,把它输出到网页上。n(5)hello.jsp中的标签在Model中查找属性名为“personbean”的Person对象。把Person
3、对象中的userName属性赋值给HTML表单的userName文本框。由于此时Person对象的userName属性的取值为null,所以在hello.jsp网页上,userName文本框没有内容。n(6)把hello.jsp生成的网页视图呈现给浏览器客户。2.8依赖注入和控制反转依赖注入和控制反转n站在JavaWeb应用程序的角度,Controller控制器类等组件注入到JavaWeb应用程序中,JavaWeb应用程序依赖它们来处理客户请求,却无需管理它们的生命周期,这一过程称作依赖注入。n站在SpringMVC框架的角度来看待这一过程,也称作控制反转,也就是说,本来应该由JavaWeb应
4、用程序控制对象生命周期的权力转到了SpringMVC框架手中。2.8依赖注入和控制反转依赖注入和控制反转nSpring框架规定,Bean组件包括五种存在范围:nsingleton:单例范围。在整个应用程序中,Spring框架只创建一个Bean实例。这是默认的范围。nprototype:原型范围。每次程序访问Bean组件时,Spring框架都会创建一个Bean实例。nrequest:请求范围。对于每一个HTTP请求,Spring框架会创建一个Bean实例。nsession:会话范围。对于每一个HTTP会话,Spring框架会创建一个Bean实例。napplication:Web应用范围。对于整个
5、Web应用,Spring框架会创建一个Bean实例。2.9向Spring框架注册Bean组件的三种方式n(1)用Controller、Service和Respository等注解标识一个Java类。n(2)在Spring框架或分支框架的配置文件中用元素来注册Bean组件,例如:2.9向Spring框架注册Bean组件的三种方式n注解来注册Bean组件,例如:ConfigurationpublicclassMyConfigureBean(customerService)Scope(application)publicCustomerServicecreate()returnnewCustomer
6、ServiceImpl();第3章控制器层的常用类和注解n3.1用Controller注解标识控制器类n3.2控制器对象的存在范围n3.3设置控制器类的请求处理方法的URL入口n3.4绑定HTTP请求数据和控制器类的方法参数n3.5请求参数的类型转换n3.6请求参数的格式转换n3.7控制器类的方法的参数类型n3.8控制器类的方法的返回类型n3.9控制器与视图的数据共享n3.10ControllerAdvice注解的用法3.1用Controller注解标识控制器类n把一个类用Controller注解标识,这个类就变成了SpringMVC框架中的控制器类。n在SpringMVC的配置文件中,以下代
7、码用于告诉SpringMVC框架,在哪些Java包中扫描Java类的Spring注解:3.2控制器对象的存在范围控制器对象的存在范围n默认情况下,Controller对象的存在范围为singleton(单例),即在整个应用程序的生命周期内,一个Controller类只有一个实例。nSpringMVC框架还允许把一个Controller对象的存在范围设置为request或session:nrequest范围:对于每一个HTTP请求,SpringMVC框架创建一个Controller对象。当完成了对这个HTTP请求的响应,Controller对象就结束生命周期。nsession范围:对于每一个HT
8、TP会话,SpringMVC框架创建一个Controller对象。当这个HTTP会话结束,Controller对象就结束生命周期。3.2控制器对象的存在范围控制器对象的存在范围ControllerRequestScope/ControllerA的存在范围为requestpublicclassControllerAControllerSessionScope/ControllerB的存在范围为sessionpublicclassControllerB3.3设置控制器类的请求处理方法的URL入口ControllerpublicclassControllerA/设定请求方式以及多个URL入口Requ
9、estMapping(value=/input,/,method=RequestMethod.GET)publicStringmethod1()RequestMapping(value=/hello)/设定一个URL入口publicStringmethod2()RequestMapping(go)/直接设定URL入口publicStringmethod3()3.3设置控制器类的请求处理方法的URL入口params属性RequestMapping(value=test,params=username=weiqin,address,!phone)publicStringtestParam()3.3
10、设置控制器类的请求处理方法的URL入口method属性RequestMapping(value=test,method=RequestMethod.GET,RequestMethod.DELETE)publicStringtestMethod()3.3设置控制器类的请求处理方法的URL入口headers属性RequestMapping(value=test,headers=Host=localhost,Accept,!Referer)publicStringtestHeaders()3.3设置控制器类的请求处理方法的URL入口n,SpringMVC框架还提供了几种简化形式的映射注解:nGetM
11、apping:指定请求方式为GET。nPostMapping:指定请求方式为POST。nPutMapping:指定请求方式为PUT。nDeleteMapping:指定请求方式为DELETE。GetMapping注解/方式一RequestMapping(value=test,method=RequestMethod.GET)publicStringtest()/方式二GetMapping(value=test)publicStringtest()/方式三GetMapping(test)publicStringtest()3.4绑定绑定HTTP请求数据和控请求数据和控制器类的方法参数制器类的方法参
12、数n直接定义和请求参数同名的方法参数。n用RequestParam注解绑定请求参数。n用RequestHeader注解绑定请求头。n用CookieValue注解绑定Cookie。n用PathVariable注解绑定RESTFul风格的URL变量。3.4.1直接定义和请求参数同名的方法参数RequestMapping(test)publicStringtestParam(Stringname,intage,Stringaddress)System.out.println(name=+name);System.out.println(age=+age);System.out.println(adr
13、ess=+address);returnresult;3.4.2用用RequestParam注注解绑定请求参数解绑定请求参数RequestMapping(test)publicStringtestParam(RequestParam(required=false,defaultValue=Guest)Stringname,RequestParam(name=age)intage,RequestParam(address)StringhomeAddress)System.out.println(name=+name);System.out.println(age=+age);System.out
14、.println(homeAdress=+homeAddress);returnresult;3.4.3用RequestHeader注解绑定HTTP请求头RequestMapping(test)publicStringtestRequestHeader(RequestHeader(Host)StringhostAddr,RequestHeaderStringHost,RequestHeaderStringhost)System.out.println(hostAddr+-+Host+-+host);returnresult;3.4.4用CookieValue注解绑定CookieRequestM
15、apping(test)publicStringtestCookie(CookieValueStringusername,CookieValue(address)StringhomeAddress)System.out.println(username=+username);System.out.println(homeAddress=+homeAddress);returnresult;3.4.5用PathVariable注解绑定RESTFul风格的URL变量ControllerRequestMapping(/main/variable1)publicclassTestPathControl
16、lerRequestMapping(/test/variable2)publicStringtestPath(PathVariableStringvariable1,PathVariable(variable2)intvariable2)System.out.println(variable1=+variable1);System.out.println(variable2=+variable2);returnresult;3.4.6把一组请求参数和一个JavaBean类型的方法参数绑定ControllerpublicclassProductControllerRequestMapping(/
17、product)publicStringgetDetail(Productproduct)System.out.println(name:+product.getName();System.out.println(price:+product.getPrice();returnresult;3.5请求参数的类型转换n创建和使用自定义类型转换器的步骤:n(1)创建hello.jsp,它接收用户输入的Person信息,最后会把Person信息显示到网页上。n(2)创建包含Person信息的Person类。n(3)创建类型转换器PersonConverter类,它把String类型的Person信息
18、转换成Person对象。n(4)在SpringMVC配置文件中注册PersonConverter类型转换器。n(5)创建控制器类PersonController,它读取经过数据类型转换的person参数,把它保存在Model中,再由hello.jsp显示Person信息。PersonConverter类publicclassPersonConverterimplementsConverterpublicPersonconvert(Stringsource)/创建一个Person对象Personperson=newPerson();/以“,”分隔StringstringValues=source
19、.split(,);if(stringValues!=null&stringValues.length=4)/为Person实例赋值person.setUserName(stringValues0);person.setAge(Integer.parseInt(stringValues1);person.setIsMarried(Boolean.parseBoolean(stringValues2);person.setWeight(Double.parseDouble(stringValues3);returnperson;else.3.6请求参数的格式转换请求参数的格式转换RequestM
20、apping(value=/useFormat)publicStringuseFormat(DateTimeFormat(pattern=yyyy-MM-dd)Datedate,NumberFormat(pattern=#,#)intsalary,Modelmodel)model.addAttribute(date,date);model.addAttribute(salary,salary);System.out.println(date=+date);System.out.println(salary=+salary);returnshowFormatData;3.7控制器类的方法的参数类
21、型njavax.servlet.ServletRequest或javax.servlet.http.HttpServletRequestnjavax.servlet.ServletResponse或javax.servlet.http.HttpServletResponsenjavax.servlet.http.HttpSessionnorg.springframework.web.context.request.WebRequestnorg.springframework.web.context.request.NativeWebRequestnjava.util.Localen用于读取请求
22、数据的java.io.InputStream或java.io.Readern用于生成响应结果的java.io.OutputStream或java.io.Writernjava.security.Principalnorg.springframework.http.HttpEntity3.7控制器类的方法的参数类型njava.util.Map或org.springframework.ui.Modelnorg.springframework.ui.ModelMapnorg.springframework.web.servlet.ModelAndViewnorg.springframework.we
23、b.servlet.mvc.support.RedirectAttributesnorg.springframework.validation.Errorsnorg.springframework.validation.BindingResultnorg.springframework.web.bind.support.SessionStatusnorg.springframework.web.util.UriComponentsBuildern用ModelAttribute、PathVariable、CookieValue、RequestParam、RequestHeader、Request
24、Body和RequestPart注解标识的参数n和请求参数对应的数据类型3.8控制器类的方法的返回类型控制器类的方法的返回类型n(1)ModelAndView类型:包含了Model数据以及视图组件。本章3.9.4节介绍了把ModelAndView作为返回类型的范例。n(2)String类型:Web组件的逻辑名字。n(3)void:没有返回值。在这种情况下,在请求处理方法中可以直接通过Writer等来输出响应结果。n(4)如果请求处理方法用ModelAttribute注解来标识,那么方法的返回值无论是什么类型,都会添加到Model中。3.9控制器与视图的数据共享nModelAttribute注解
25、:表示Model的特定数据。norg.springframework.ui.Model接口:表示Model数据。控制器和视图都能访问Model。norg.springframework.ui.ModelMap类:表示Model数据的映射。控制器和视图都能访问ModelMap。norg.springframework.web.servlet.ModelAndView类:表示Model数据以及视图。控制器和视图都能访问ModelAndVIew。3.9控制器与视图的数据共享n把方法参数保存到Model中RequestMapping(value=/sayHello,method=RequestMeth
26、od.POST)publicStringgreet(ValidModelAttribute(personbean)Personperson,BindingResultbindingResult,Modelmodel)3.9控制器与视图的数据共享n把Model的特定属性赋值给方法参数RequestMapping(value=/output)publicStringoutput(ModelAttribute(userName)Stringname)System.out.println(name);returnresult;3.9控制器与视图的数据共享nModel接口表示Model数据,存放在Mod
27、el中的数据采用“属性名/属性值”的形式。Model中的数据能够被控制器和视图共享。n/向Model中存放共享数据nmodel.addAttribute(userName,userName);n/从Model中读取共享数据nStringuserName=(String)model.getAttribute(userName);3.9控制器与视图的数据共享nModelMap类表示Model的映射类型。Modelmodel=ModelMapmodelMap=StringuserName1=(String)model.getAttribute(userName);StringuserName2=(S
28、tring)(model.asMap().get(userName);StringuserName3=(String)modelMap.get(userName);3.9控制器与视图的数据共享ModelAndView类包含了Model和视图信息。RequestMapping(value=/testview)publicModelAndViewlogin(ModelAndViewmodelAndView)/从ModelAndView中读取userName属性StringuserName=(String)(modelAndView.getModel().get(userName);System.o
29、ut.println(userName);/showUser是showUser.jsp的逻辑名字modelAndView.setViewName(showUser);returnmodelAndView;/把请求转发给showUser.jsp3.10ControllerAdvice注注解的用法解的用法3.10ControllerAdvice注解注解的用法的用法ControllerAdvicepublicclassMyControllerAdviceModelAttribute(name=colors)publicMapsetColors()HashMapcolors=newHashMap();
30、colors.put(RED,红色);colors.put(BLUE,蓝色);colors.put(GREEN,绿色);returncolors;第4章视图层创建HTML表单n4.1Spring标签库中的表单标签n4.2处理复杂表单的Web应用范例n4.3设置HTTP请求和响应结果的字符编码4.1Spring标签库中的表单标签标签库中的表单标签n表单标签表单标签n表单标签的语法格式如下:4.1Spring标签库中的表单标签标签库中的表单标签n文本框标签的语法格式如下:n该标签有一个重要的path属性。例如:用户名:4.1Spring标签库中的表单标签标签库中的表单标签n复选框标签的语法格式如下
31、:n多个path属性取值相同的复选框标签组成了一个选项组,允许多选。例如:支付方式:信用卡微信支付宝现金4.1Spring标签库中的表单标签标签库中的表单标签n单选按钮标签的语法格式如下:n多个path属性取值相同的单选按钮标签组成了一个选项组,只允许单选。例如:性别:男性女性4.1Spring标签库中的表单标签标签库中的表单标签下拉列表标签的语法格式如下:或者:xxx或者:4.1Spring标签库中的表单标签标签库中的表单标签收入档次:请选择收入档次4.1Spring标签库中的表单标签标签库中的表单标签n标签输出数据验证产生的错误消息,其语法格式如下:或者:4.2处理复杂表单的Web应用范例
32、4.2处理复杂表单的Web应用范例4.3设置HTTP请求和响应结果的字符编码encodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrueencodingFilter/*第5章数据验证n5.1按照JSR-303规范进行数据验证n5.1.1数据验证注解n5.1.2自定义数据验证注解n5.1.3在SpringMVC的配置文件中配置HibernateValidator验证器n5.1.4在控制器类中进行数据验证n5.1.5在JSP文件中指定显示错误消息的CSS样式n5.
33、2Spring框架的数据验证机制n5.2.1实现Spring的Validator接口n5.2.2用数据验证类进行数据验证5.1按照JSR-303规范进行数据验证/第一种方式:指定错误消息的编号NotBlank(message=person.no.username.error)privateStringuserName;/第二种方式:指定错误消息文本NotBlank(message=UserNamecantbeempty.)privateStringuserName;5.1按照JSR-303规范进行数据验证数据验证注解数据验证注解描述描述Null待验证数据必须为null。NotNull待验证数据
34、必须不为null.AssertTrue待验证数据为布尔类型,并且必须为true。AssertFalse待验证数据为布尔类型,并且必须为false。Min(value)待验证数据必须大于等于value。Max(value)待验证数据必须小于等于value。DecimalMin(value)待验证数据必须大于等于value。DecimalMax(value)待验证数据必须小于等于value。Size(min,max)(1)待验证数据如果是String类型,那么其长度必须大于等于min,并且小于等于max。(2)待验证数据如果是集合、Map或数组,那么其包含的元素数目必须大于等于min,并且小于等于
35、max。Digits(integer,fraction)待验证数据必须是数字。integer指定数字的整数部分的最大位数,fraction指定数字的小数部分的最大位数。例如Digits(integer=6,fraction=2)表示数字的整数部分最多6位,小数部分最多2位。Past待验证数据为日期时间类型,并且必须小于当前日期时间。Future待验证数据为日期时间类型,并且必须大于当前日期时间。Pattern(regex)待验证数据必须符合特定的正则表达式。regex指定正则表达式。Valid对待验证数据以及所关联的数据进行递归验证,参见本章5.1.4节。JSR-303提供的数据验证注解5.1
36、按照JSR-303规范进行数据验证数据验证注解数据验证注解描述描述NotBlank待验证数据为String类型,去除两端空格后必须不为空。假定变量data为 待 验 证 数 据,判 断 条 件 为(data!=null)&(data.trim().length()0)NotEmpty(1)待验证数据如果是String类型,必须不为空。假定变量data为待验证数据,判断条件为(data!=null)&(data.length()0)(2)待验证数据如果是集合、Map或数组,那么其包含的元素的数目必须大于0。Length(min,max)待验证数据为String类型,其长度必须大于等于min,小于
37、等于max。Range(min,max)待验证数据为数字类型,或者可以转换为数字的String类型,其数值必须大于等于min,小于等于max。URL待验证数据必须是有效的URL。Email待验证数据必须是有效的Email。CreditCardNumber待验证数据必须是有效的信用卡号。HibernateValidator提供的数据验证注解5.1按照JSR-303规范进行数据验证nJSR-303还支持开发人员创建自定义的数据验证注解,包括两个步骤:n(1)创建自定义注解类型。在本范例中为Minimal类。n(2)创建数据验证实现类。在本范例中为MinimalValidator类。5.1按照JSR
38、-303规范进行数据验证Target(ElementType.FIELD,ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)Constraint(validatedBy=MinimalValidator.class)publicinterfaceMinimalintvalue()default0;Stringmessage();Classgroups()default;Classpayload()default;5.1按照JSR-303规范进行数据验证publicclassMinimalValidatorimplementsConstra
39、intValidatorprivateintminValue;publicvoidinitialize(Minimalmin)/把Minimal注解的value属性赋值给成员变量minValueminValue=min.value();publicbooleanisValid(Integervalue,ConstraintValidatorContextcontext)/value参数表示被检验的数据returnvalue=minValue;5.2Spring框架的数据验证机制nSpring框架本身也提供了一套数据验证机制。运用这套验证机制包括以下两个步骤:n(1)创建实现org.spring
40、framework.validation.Validator接口的数据验证类。在本范例中为PersonValidator类。n(2)在SpringMVC框架中创建数据验证类的对象并通过它进行数据验证。5.2Spring框架的数据验证机制publicclassPersonValidatorimplementsValidatorpublicbooleansupports(Classclazz)returnPerson.class.equals(clazz);publicvoidvalidate(Objectobj,Errorserrors)ValidationUtils.rejectIfEmpty
41、(errors,userName,person.no.username.error);ValidationUtils.rejectIfEmptyOrWhitespace(errors,password,person.no.password.error);Personperson=(Person)obj;if(person.getPassword()!=null&person.getPassword()!=&person.getPassword().length()!=6)errors.rejectValue(password,person.tooshort.password.error);5.
42、2Spring框架的数据验证机制nPersonController的请求处理方法可以通过JSR-303的Valid注解来声明对person参数进行数据验证:publicStringgreet(ValidModelAttribute(personbean)Personperson,BindingResultbindingResult,Modelmodel)第6章拦截器n6.1拦截器的基本用法n6.2串联的拦截器n6.3范例:用拦截器实现用户身份验证第6章拦截器n6.1拦截器的基本用法n6.2串联的拦截器n6.3范例:用拦截器实现用户身份验证6.1拦截器的基本用法方法方法返回类型返回类型方法的执行
43、时机方法的执行时机preHandle()方法方法boolean类型。如果返回true,会继续执行后续流程。如果返回false,会中断执行流程。调用控制器类的请求处理方法之前。postHandle()方法方法void类型调用控制器类的请求处理方法之后,把请求转发给视图组件之前。afterCompletion()方法方法void类型视图组件执行完毕,把响应结果返回给客户端之前。HandlerInterceptor拦截器接口的方法拦截器的执行流程创建自定义的拦截器publicclassMyInterceptor1implementsHandlerInterceptorOverridepublicbo
44、oleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsExceptionSystem.out.println(MyInterceptor1.preHandle();returntrue;OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsExceptionSystem.o
45、ut.println(MyInterceptor1.postHandle();创建自定义的拦截器(续MyInterceptor1)OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsExceptionSystem.out.println(MyInterceptor1.afterCompletion();配置拦截器6.2串联的拦截器publicclassMyInterceptor2implementsHandl
46、erInterceptorOverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsExceptionSystem.out.println(MyInterceptor2.preHandle();returntrue;OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAn
47、dView)throwsExceptionSystem.out.println(MyInterceptor2.postHandle();6.2串联的拦截器(续MyInterceptor2)OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsExceptionSystem.out.println(MyInterceptor2.afterCompletion();6.2串联的拦截器6.3范例:用拦截器实现用户身份
48、验证publicclassLoginInterceptorextendsHandlerInterceptorAdapterOverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException/获取请求的URLStringurl=request.getRequestURI();/如果访问/toLogin或/login,不拦截,放行if(url.indexOf(/toLogin)=0|url.indexOf(/login)=0)return
49、true;/继续执行后续流程6.3范例:用拦截器实现用户身份验证(续LoginInterceptor)HttpSessionsession=request.getSession();/获取sessionObjectobj=session.getAttribute(person);if(obj!=null)returntrue;/验证通过,继续执行后续流程/没有登录且不是登录页面,转发到登录页面,并给出提示信息request.setAttribute(msg,还没登录,请先登录!);request.getRequestDispatcher(/toLogin).forward(request,re
50、sponse);returnfalse;/中断执行后续流程LoginInterceptor执行流程第7章异常处理n7.1SpringMVC的异常处理机制n7.2使用SimpleMappingExceptionResolver类n7.3实现HandlerExceptionResolver接口n7.4使用ExceptionHandler注解7.1SpringMVC的异常处理机制处理视图层的异常java.lang.Exception/WEB-INF/jsp/generalError.jsp处理HTTP状态代码为404的错误404/WEB-INF/jsp/404.jsp处理HTTP状态代码为404的错