SpringMVC数据处理
类型转换器!注解驱动,配置访问静态资源mvc:annotationdrivenconversionserviceconversionService!配置自定义类型转换器beanidconversionServiceclassorg。springframework。context。support。ConversionServiceFactoryBeanpropertynameconverterssetbeanclasscom。demo。converters。MyStringToDateConvertersetpropertybeanpackagecom。demo。converters;importorg。springframework。core。convert。converter。Converter;importorg。springframework。util。StringUtils;importjava。text。ParseException;importjava。text。SimpleDateFormat;importjava。util。Date;定义类型转换器需要明确源类型和目标类型在convert方法自定义类型转换的实现在spring配置文件中配置自定义类型转换器publicclassMyStringToDateConverterimplementsConverterString,Date{OverridepublicDateconvert(Stringsource){try{if(!StringUtils。isEmpty(source)){if(source。split()。length3){SimpleDateFormatsdfnewSimpleDateFormat(yyyyMMdd);returnsdf。parse(source);}elseif(source。split()。length3){SimpleDateFormatsdfnewSimpleDateFormat(yyyyMMdd);returnsdf。parse(source);}else{thrownewRuntimeException(日期转换错误:source);}}}catch(ParseExceptione){e。printStackTrace();}returnnull;}}数据格式化NumberFormat用在javabean的属性或方法参数上DateTimeFormat用在javabean的属性或方法参数上lt;spring标签库lt;taglibprefixspringurihttp:www。springframework。orgtags。。。lt;spring:eval用来显示格式化后的数据salary:spring:evalexpressionuser。salaryspring:evalpackagecom。demo。controllers。entity;importlombok。Data;importorg。springframework。format。annotation。DateTimeFormat;importorg。springframework。format。annotation。NumberFormat;importjava。util。Date;DatapublicclassUser{privateIntegerid;privateStringusername;DateTimeFormat(patternyyyyMMdd)privateDatebirthday;20230303NumberFormat(styleNumberFormat。Style。CURRENCY)privateDoublebalance;1000privateString〔〕hobbies;NumberFormat(pattern,。)privateDoublesalary;1,000。01NumberFormat(styleNumberFormat。Style。PERCENT)privateDoubletaskCount;96}数据校验
HibernateValidator实现了JSR349验证注解规范的技术,在javaBean属性上标注
基于原生htmlform表单实现方式packagecom。demo。controllers。entity;importjakarta。validation。constraints。Min;importjakarta。validation。constraints。NotNull;importlombok。Data;DatapublicclassUser{NotNullMin(1)privateIntegerid;}packagecom。demo。controllers;importcom。demo。controllers。entity。User;importjakarta。validation。Valid;importorg。springframework。stereotype。Controller;importorg。springframework。ui。Model;importorg。springframework。validation。BindingResult;importorg。springframework。validation。FieldError;importorg。springframework。web。bind。annotation。PostMapping;importjava。util。HashMap;importjava。util。List;importjava。util。Map;在需要验证的javaBean的属性上面加入对应的验证注解在需要验证的处理方法的对应javaBean参数上加上Valid在需要验证的处理方法参数中加入BindingResult,代表自己处理错误,这样就不会显示错误页面了将错误信息循环通过map存入到request域中在jsp通过{errors。id}获取对应的错误信息ControllerpublicclassUserController{PostMapping(user)publicStringadd(ValidUseruser,BindingResultresult,Modelmodel){将错误信息取出来,输出到jsp页面判断当前是否出现了错误if(result。hasErrors()){存放错误信息,有利于在jsp中分别取出错误信息MapString,StringerrorsnewHashMap();key:错误信息的属性名,value:错误信息获取所有的错误信息包含错误的属性,错误信息ListFieldErrorfieldErrorsresult。getFieldErrors();for(FieldErrorfieldError:fieldErrors){errors。put(fieldError。getField(),fieldError。getDefaultMessage());}model。addAttribute(errors,errors);如果验证失败将请求转发到添加页面returnuseradd;}System。out。println(user);returnshow;}}基于Springform标签库的实现方式(静态数据)lt;pagecontentTypetexthtml;charsetUTF8languagejavalt;taglibprefixformurihttp:www。springframework。orgtagsformhtmlheadtitle添加用户titleheadbodyh1添加用户h1lt;Spring的form标签库method是支持put和delete多文件文件上传PostMapping(upload)publicStringupload(Stringdesc,MultipartFile〔〕multipartFiles)throwsIOException{for(MultipartFilemyfile:multipartFiles){StringpathD:myfile。getOriginalFilename();FilefilenewFile(path);myfile。transferTo(file);}returnsuccess;}多线程文件上传PostMapping(upload)publicStringupload(Stringdesc,MultipartFile〔〕multipartFiles)throwsInterruptedException{for(MultipartFilemyfile:multipartFiles){ThreadthreadnewThread((){StringpathD:myfile。getOriginalFilename();FilefilenewFile(path);try{myfile。transferTo(file);}catch(IOExceptione){e。printStackTrace();}});thread。start();thread。join();让子线程执行完在执行主线程}returnsuccess;}SpringMVC虚拟目录上传
lt;pagecontentTypetexthtml;charsetUTF8languagejavahtmlheadtitleTitletitleheadbodylt;磁盘路径imgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcc1h8cdb6a33b68e4349。jpgbodyhtml文件上传到三个路径1。项目路径(适合项目小,上传使用率低2。磁盘路径,这种方式通过虚拟目录的映射3。静态资源服务器(CDN)PostMapping(upload)publicStringupload(Stringdesc,MultipartFilemyfile,Modelmodel)throwsIOException{StringpathD:myfile。getOriginalFilename();FilefilenewFile(path);myfile。transferTo(file);model。addAttribute(filename,myfile。getOriginalFilename());returnsuccess;}SpringMVC拦截器拦截器:采用AOP的设计思想,类似Servlet过滤器,用来拦截处理方法
如:权限验证、日志、异常记录、记录方法执行时间mvc:interceptorsbeanclasscom。demo。interceptors。MyInterceptormvc:interceptorspackagecom。demo。interceptors;importorg。springframework。web。method。HandlerMethod;importorg。springframework。web。servlet。HandlerInterceptor;importorg。springframework。web。servlet。ModelAndView;importjavax。servlet。http。HttpServletRequest;importjavax。servlet。http。HttpServletResponse;importjava。util。Arrays;publicclassMyInterceptorimplementsHandlerInterceptor{在处理方法之前执行paramrequest在方法请求进来之前更改request中的的属性值paramresponseparamhandler封装了当前处理方法的信息returntrue:后续调用链是否执行false:中断后续执行throwsExceptionOverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{if(handlerinstanceofHandlerMethod){HandlerMethodhandler1(HandlerMethod)handler;}System。out。println(类:〔handler1。getBean()。getClass()〕方法:〔handler1。getMethod()。getName()〕参数:〔Arrays。toString(handler1。getMethod()。getParameters())〕前执行preHandle);returntrue;}在请求执行后执行,在视图渲染之前执行当处理方法出现了异常则不会执行方法paramrequestparamresponse在方法执行后更改response中的信息paramhandler封装了当前处理方法的信息parammodelAndView封装了model和view,请求结束后可以修改model中的数据或新增model数据,也可修改view的跳转throwsExceptionOverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System。out。println(方法后执行,在视图渲染之前postHandle);}在视图渲染之后执行,出现异常也会执行该方法paramrequestparamresponseparamhandlerparamex可以记录异常日志的功能,或者清除资源throwsExceptionOverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System。out。println(在视图渲染之后afterHandle);}}拦截器过滤器的区别
!必须保证对应的请求没有映射处理mvc:viewcontrollerpathadminviewnameadminmvc:viewcontrollermvc:interceptors!直接配置bean会拦截SpringMVC所有请求beanclasscom。demo。interceptors。MyInterceptor!不是所有的请求都要拦截mvc:interceptor!需要拦截请求mvc:mappingpath!不需要拦截的请求mvc:excludemappingpathlogin!拦截器beanclasscom。demo。interceptors。CheckLoginInterceptormvc:interceptormvc:interceptorspackagecom。demo。interceptors;importorg。springframework。util。StringUtils;importorg。springframework。web。servlet。HandlerInterceptor;importjavax。servlet。http。HttpServletRequest;importjavax。servlet。http。HttpServletResponse;importjavax。servlet。http。HttpSession;验证用户是否登录的拦截器publicclassCheckLoginInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{HttpSessionsessionrequest。getSession();如果没有登录if(StringUtils。isEmpty(session。getAttribute(username))){response。sendRedirect(request。getContextPath()login);returnfalse;}else{returntrue;}}}SpringMVC国际化通过浏览器语言设置国际化!设置国际化支持配置国际化属性资源文件beanidmessageSourceclassorg。springframework。context。support。ResourceBundleMessageSourcepropertynamebasenamevaluei18nloginvaluevaluei18nindexvaluearraypropertybeanpackagecom。demo。controllers;importorg。springframework。stereotype。Controller;importorg。springframework。web。bind。annotation。RequestMapping;基于浏览器设置的语言切换国际化1。新建jsp对应的国际化属性资源文loginenUS。propertiesloginzhCN。properties2。配置spingmvc。xml将国际化支持和资源文件都注入到springmvc中3。在jsp页面调用对应的属性资源内容:spring:messagecode绑定属性资源文件中对应的keyControllerpublicclassI8NController{RequestMapping(i18n)publicStringi18n(){returnlogin;}}通过超链接来切换国际化
》》》方式一!使用SessionLocaleResolver保持Locale的状态,会在session中获取Locale对象beanidlocaleResolverclassorg。springframework。web。servlet。i18n。SessionLocaleResolverbeanpackagecom。demo。controllers;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。stereotype。Controller;importorg。springframework。web。bind。annotation。PathVariable;importorg。springframework。web。bind。annotation。RequestMapping;importorg。springframework。web。servlet。i18n。SessionLocaleResolver;importjavax。servlet。http。HttpServletRequest;importjavax。servlet。http。HttpServletResponse;importjava。util。Locale;基于浏览器设置的语言切换国际化1。新建jsp对应的国际化属性资源文loginenUS。propertiesloginzhCN。properties2。配置spingmvc。xml将国际化支持和资源文件都注入到springmvc中3。在jsp页面调用对应的属性资源内容:spring:messagecode绑定属性资源文件中对应的keyControllerpublicclassI8NController{RequestMapping(i18n)publicStringi18n(){returnlogin;}RequestMapping(i18n{language}{country})publicStringchangeLocale(PathVariable(language)Stringlanguage,PathVariable(country)Stringcountry,HttpServletRequestrequest,HttpServletResponseresponse,AutowiredSessionLocaleResolverlocaleResolver){LocalelocalnewLocale(language,country);localeResolver。setLocale(request,response,local);returnlogin;}}
》》》方式二!使用SessionLocaleResolver保持Locale的状态,会在session中获取Locale对象beanidlocaleResolverclassorg。springframework。web。servlet。i18n。SessionLocaleResolverbean!使用springmvc提供的拦截器,接收local参数,设置到session中去mvc:interceptors!所有的请求都会被拦截beanclassorg。springframework。web。servlet。i18n。LocaleChangeInterceptormvc:interceptorsSpringMVC基于注解的国际化SpringMVC异常处理ExceptionHandler
通过ExceptionHandler可以在方法中记录日志ControllerAdvice是对Controller的增强全局异常处理
全局数据绑定
全局数据预处理
》》》优先级:处理器异常全局异常中具体异常全局异常
人民日报金句摘抄(56)1。努力以店小二的思维保姆式的服务,为企业快速落地创造条件,集聚高端高新企业和人才,让企业和办事人员感到便利舒心。2。未来之城,加快奔向未来。3。惊涛骇浪中把舵导向,大战大考前运筹
调查中秋假期车市走访金九已来豪华品牌消费升级趋势明显文懂车帝原创李德喆懂车帝原创行业尽管眼下全国部分地区仍然受到疫情影响,但在今年的中秋假期,各地积极打造新消费场景,拓展消费新业态。消费市场呈现多层次,个性化的特点。今年的中秋假期恰
国产手机赶超在即?从iPhone14系列升级点看国产机型发展速度还有几天,iPhone14系列终于要正式登场了。之前有博主统计,在最近90天内苹果热搜多达920个,平均每天10多个热搜,看得人原本很期待的心情逐渐转为想吐槽的心情。而且苹果很多上
情侣酒店为何流行圆床?酒店员工说出答案,跟想的或许不同相信不少情侣都会有在外过夜的需要,有时候或许是外出旅游,有时候或许只是想要换一种氛围,无论如何情侣在外过夜都是一件十分正常的事情,很多情侣其实都会选择去普通的酒店或者是宾馆,这些地
豪华紧凑型SUV,沃尔沃XC40产品力如何?有人说豪华汽车品牌和普通汽车品牌的最大差别就是价格!如果你对汽车没有过多的了解,那么价格确实是直观的差别。但如果你驾驶过很多车辆,你就会发现车辆的价格只是其次,驾驶感受才是最大的不
掘金四万亿市场,2022北京餐饮品牌大会成功举办9月3日,备受瞩目的餐饮界奥斯卡2022北京餐饮品牌大会在国家会议中心揭开面纱,政府部门餐饮上下游企业驻华使节等齐聚一堂,共同探讨餐饮行业的未来发展。北京餐饮品牌大会由北京市商务局
服贸会首日,顺义区签约项目金额达92。58亿元北京日报客户端记者王可心9月1日上午,2022年服贸会北京主题日举办,在两区建设两周年主题活动中,顺义区五个重大项目签约,签约金额为92。58亿元,主要涉及航空航天高新技术金融保险
为逃避害怕的事,你都找过哪些奇葩借口?1hr为逃避害怕的事,你都找过哪些奇葩借口?别害怕啦给自己安全感这本书中,为我们列举了很多,为逃避让自己害怕的事,而找的借口。这些借口能进行自我维持,从而构建出一个生态系统,不让我
穿越大凉山的慢火车把农贸集市搬进车厢,票价最低3元高铁时代,慢悠悠的绿皮火车正逐渐淡出公众视野。成昆线56335634次列车是我国仍保留着的81对公益性慢火车之一。大凉山今年1月迎来了高铁,但这列平均时速不到40公里的慢火车仍在运
辽宁十大暑期亲子游胜地出炉来源辽宁日报随着新学期即将到来,暑假游也画上句号。日前携程发布的2022年暑期亲子游报告(以下简称报告)显示,携程平台上来自辽宁的旅游订单中,亲子订单占比近三成,张氏帅府博物馆老虎
我心中的大山大河头条创作挑战赛好久不出远门,三年还是四年?但是我心中的大山大河可以丈量的地域更宽阔了。重庆,陕西,青岛,威海,北戴河,桂林,杭州,厦门,成都等,都在我的计划内,终有一天,疫情的阴霾