




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SpringMVC1.Spring-mvc介绍SpringWebMVC是什么SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求响应模型,框架的目的就是帮助我们简化开发,SpringWebMVC也是要简化我们日常Web开发的。另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。SpringWebMVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(HandlerMapping)进行处理器管理和视图解析器(ViewResolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndViewhandleRequest(request,response)方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。SpringWebMVC能帮我们做什么让我们能非常简单的设计出干净的Web层和薄薄的Web层;进行更简洁的Web层的开发;天生与Spring框架集成(如IoC容器、AOP等);提供强大的约定大于配置的契约式编程支持;能简单的进行Web层的单元测试;支持灵活的URL到页面控制器的映射;非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;提供一套强大的JSP标签库,简化JSP开发;支持灵活的本地化、主题等解析;更加简单的异常处理;对静态资源的支持;支持Restful风格。1.3SpringWebMVC架构SpringWebMVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理。首先让我们整体看一下SpringWebMVC处理请求的流程:1.3.1、SpringWebMVC处理请求的流程、产生响应用户L发送请利“端控制器%返回控制Model2、委托请*处理器5、返回McidelAndVlewZZ[lodelAiiclXlew.页面控制器/处理器弘渲染视图4、返盲]模型数据用务款
调业对、产生响应用户L发送请利“端控制器%返回控制Model2、委托请*处理器5、返回McidelAndVlewZZ[lodelAiiclXlew.页面控制器/处理器弘渲染视图4、返盲]模型数据用务款
调业对模型Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:ValueObject(数据)和服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。1.3.2、SpringWebMVC核心架构图
HandlerMappincj1、发送请求HandlerinUm归rCotihollHrL调用处蹶相幽HandlerMappincj1、发送请求HandlerinUm归rCotihollHrL调用处蹶相幽J制媛方法7.朝晌应用户―Dispatcher
ServletHandlerAdapter1)DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMapping),根据配置的映射规则,找到对应的处理器(Handler)。2)调用相应处理器中的处理方法,处理该请求,处理器处理结束后会将一个ModelAndView类型的数据传给DispatcherServlet,这其中包含了处理结果的视图和视图中要使用的数据。3)DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将视图要显示的数据传给对应的视图,最后给浏览器构造一个HTTP响应。DispatcherServlet是整个SpringMVC的核心。它负责接收HTTP请求组织协调SpringMVC的各个组成部分。其主要工作有以下三项:1)截获符合特定格式的URL请求。2)初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。3)初始化SpringMVC的各个组成组件,并装配到DispatcherServlet中。核心组件:DispatcherServlet:中央控制器,把请求给转发到具体的控制类handlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略Controller:具体处理请求的控制器ModelAndView:服务层返回的数据和视图层的封装类ViewResolver&View:视图解析器,解析具体的视图Interceptors:拦截器,负责拦截我们定义的请求然后做处理工作1.4SpringWebMVC优势
1、清晰的角色划分:前端控制器①ispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器(Validator)、命令对象(Command请求参数绑定到的对象就叫命令对象)、表单对象FormObject提供给表单展示和提交到的对象就叫表单对象)。2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;3、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;4、和Spring其他框架无缝集成,是其它Web框架所不具备的;5、可适配,通过HandlerAdapter可以支持任意的类作为处理器;6、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制;7、功能强大的数据验证、格式化、绑定机制;8、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试;9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。10、强大的JSP标签库,使JSP编写更容易。还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。2.SpringMVC的第一个例子创建一个web工程导入依赖包JSiReferencedLibraries商,.aopaIlianee-l.O.O.mons.fileupload-'e.oommon&.io-1.4.0jar■.apache.oommon&.io-1.4.0jarorg.5pringframework.aop-3.0.2.RELEA&E.jar>施■oioorg.springframework.beans-3.0.2.RELEASEjar■oio■oioorg.springframework.beans-3.0.2.RELEASEjar■oioorg.springframework.cont&xt-3.0.2.RELEASE.jar[>o[>3.创建springmvc的配置文件<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans”xmlns:xsi="/2001/XMLSchema-instance”xmlns:p="/schema/p”xmlns:context="/schema/context”xmlns:mvc="/schema/mvc”xsi:schemaLocation="/schema/mvc/schema/mvc/spring-mvc-3.0.xsd/schema/beanshttp://www.springframework.Org/schema/beans/spring-beans-3.0.xsd/schema/contexthttp://www.springframework.Org/schema/context/spring-context-3.0.xsd"default-autowire="byName"></beans>文件的命名规则:中央控制器(servlet的名称)的名称+"-servlet.xml”默认位置:WEB-INF下配置中央控制器(在web.xml中添加如下配置:)<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>配置:controller和视图解析器<!--处理器--><beanname="/hello"class="cn.javass.chapter2.web.controller.HelloWorldController"/><!--ViewResolver--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/><propertyname="prefix"value="/WEB-INF/jsp/"/><propertyname="suffix"value=".jsp”/></bean>创建controller©ControllerpublicclassErrorsFileUpload(privateLoggerlogger=Logger.getLogger(ErrorsFileUpload.class);/**成功*/privatestaticfinalStringSUCCESS="0";/**失败*/privatestaticfinalStringFAIL="1";/**终端文件域name*/privatestaticfinalStringFILE_INPUT_NAME=PropertiesUtils.getValue("perties","FILE_INPUT_NAME");@AutowiredprivateExceptionInfoService<ExceptionInfo>exceptionInfoService;@ResponseBody@RequestMapping(value="/errorsFileUpload",method=RequestMethod.POST)@Auth(verifyLogin=false,verifyURL=false)publicStringfileUpload(HttpServletRequestrequest,HttpServletResponseresponse)(Stringresult="";Stringphone=request.getParameter("phone");Stringversion=request.getParameter("version");StringfilePath="";if(StringUtils.isBlank(phone)){return"{'result':'"+FAIL+"','desc':手机号不能为空!'}”;}if(StringUtils.isBlank(version)){return"{'result':'"+FAIL+"','desc':版本号不能为空!'}”;}try{//转型为MultipartHttpRequestMultipartHttpServletRequestmultipartRequest=(MultipartHttpServletRequest)request;//获得上传的文件(根据前台的name名称得到上传的文件)MultipartFilemultipartFile=multipartRequest.getFile(FILE_INPUT_NAME);if(!multipartFile.isEmpty()){filePath=FileUpload.uploadErrorInfoFiles(multipartFile,request);}ExceptionInfoinfo=newExceptionInfo();info.setPhone(phone);info.setVersion(version);info.setFilePath(filePath);exceptionInfoService.insertExceptionInfo(info);result="{result:"+SUCCESS+",desc:上传成功!}";}catch(Exceptionex){logger.error("客户端上传文件出错!"+ex.getMessage());result="{'result':'"+FAIL+"','desc':发生异常,上传失败!'}”;}returnresult;}}创建/WEB-INF/jsp/hello.jsp视图页面启动服务器运行测试3.四种HandlerMappingBeanNameUrlHandlerMapping(默认)当选用了BeanNameUrlHandlerMapping映射响应器时各个处理控制器应保证<bean>的name属性即为请求的url模板。<!--不用id属性,而设置name属性。这里是因为URL中含有XMLid属性非法字符——特别是斜杠(/);--><beanname="/hello.do"class="com.wepull.test.HelloController"/><!--根据控制器的名字将控制器映射到URL,这是DispatcherServlet的默认的HandlerMapping--><beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>SimpleUrlHandlerMapping当选用了SimpleUrlHandlerMapping映射响应器时各个处理控制器应保证<bean>的id属性与SimpleUrlHandlerMapping中的mappings对应。<!--使用简单些!来映射,用上下文配置文件中定义的属性集合将控制器映射到URL--><beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><propertyname="mappings"><props><propkey="/hello1.do">myController</prop></props></property></bean>ControllerClassNameHandlerMapping不推荐]<!--通过将控制器的类名作为URL的基础将控制器映射到URL,访问时类名首字母需要小写[默认全小写]--><beanclass="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>ControllerClassNameHandlerMapping支持用户定义如下属性:(1)caseSensitive:大小写是否敏感,默认是false,该属性主要是用来生成映射路径的时候匹配大小写是否敏感,如果为true,则只把Controller类名称的首字母小写,其他的保持原样进行请求路径映射,如果为false,则全部小写。basePackage也使用同样的规则,只是basePackage在caseSensitive为true的时候不需要首字母小写。(2)basePackage:表示要用于生成路径映射的基包,默认是null,这个时候就采用Controller不包含包名称的类名称来映射,映射规则跟之前介绍的映射规则相同。如果定义了basePackage,假设为com.host.app,这个时候如果Controller类的全名称是com.host.app.abc.edf.MyController,那么映射的路径就是/abc/edf/my/*。(3)pathPrefix:表示映射路径的前缀,默认是空串。假设pathPrefix为prefix,basePackage为com.host.app,那么com.host.app.abc.MyController的映射路径就是/prefix/abc/my/*。(4)excludedPackages:是数组形式,表示需要把哪些包排除在ControllerClassNameHandlerMapping的映射范围之内。(5)excludedClasses:是数组形式,表示需要把哪些类排除在ControllerClassNameHandlerMapping的映射范围之内。使用ControllerClassNameHandlerMapping需要注意的地方:(1)需要使用ControllerClassNameHandlerMapping来映射的Controller类上如果加了@RequestMapping注解ControllerClassNameHandlerMapping也是可以进行URL路径映射的。(2)使用ControllerClassNameHandlerMapping映射的是类似于/controllerName/*这样的形式,这也就是说只有在处理器方法映射不存在斜杠的时候才可以使用这种形式访问到。看下面一个例子,在下面代码中MyController类能够映射的请求路径是/my/*,这也意味着只有满足/my/*的请求路径才能映射到MyController,才能访问到它里面的处理器方法,所以当请求/my/test1.do的时候毫无疑问可以访问到处理器方法test1,但是当想访问MyController的test2方法,请求/my/test/test2.do的时候由于它不能映射到MyController,所以不能如愿的访问到MyController的test2方法。这也是ControllerClassNameHandlerMapping一个缺陷。@ControllerpublicclassMyController{@RequestMapping("test1")publicStringtest1(){return"test";}@RequestMapping("test/test2")publicStringtest2(){return"test";}}(3)由于在SpringMVC应用中可以同时定义多个HandlerMapping,这就涉及到一个映射的优先级问题。HandlerMapping都实现了Ordered接口,所以我们可以通过HandlerMapping的order属性来指定匹配映射的先后顺序。我们知道在ViewResolver链中,如果一个逻辑视图被一个ViewResolver解析了之后,该次视图解析就结束了,其他的视图解析器就不能再解析这个视图了,它的order属性是用来定义ViewResolver进行视图解析的先后顺序的。但是HandlerMapping不一样,它是在SpringMVC的配置文件中定义的所有的HandlerMapping都可以进行URL映射,它的order属性是用于指定映射匹配的先后顺序的。看一个例子:<beanclass="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"><propertyname="order"value="1"/></bean><beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"><propertyname="order"value="10"/></bean>我们在SpringMVC的配置文件里面定义了两个HandlerMapping,代码如上所示,由它们的。rder属性我们知道ControllerClassNameHandlerMapping会先于DefaultAnnotationHandlerMapping进行映射匹配。定义了一个MyTestController,代码如下所示:@ControllerpublicclassMyTestController{@RequestMapping("mytest/test")publicvoidtest(){System.out.println("hellotest");}@RequestMapping("test")publicvoidtest2(){System.out.println("hellotest2");}}我们知道ControllerClassNameHandlerMapping会把MyTestController映射为“/mytest/*”,按照这种方式我们只能利用/mytest/test.do请求到MyTestController的test2方法,而没法利用/mytest/mytest/test.do请求到test方法。而DefaultAnnotationHandlerMapping会把MyTestController的test2方法映射为“/test.do”,把test方法映射为“/mytest/test.do”。而根据Spring定义了多个HandlerMapping就会有多个映射机制存在的这么一个机制我们知道上述几种映射关系都是会存在的。那么这个时候如果我请求/mytest/test.do会请求哪个方法呢?我们知道,如果是按照ControllerClassNameHandlerMapping的映射机制会访问MyTestController的test2方法,而按照DefaultAnnotationHandlerMapping的映射机制就会访问MyTestController的test方法。这个时候HandlerMapping的order属性就起作用了,order属性越小的就会先匹配,由上面的配置我们知道ControllerClassNameHandlerMapping的order属性相对较小,所以将使用它的映射URL来匹配这次请求,所以处理的是MyTestController的test2方法。CommonsPathMapHandlerMapping[不推荐]使用控制器代码中的元数据将控制器映射到URL。应用了jdk1.5后的新特性,通过Controller中的注释进行映射在类的注释中加入@@monsattributes.PathMap("/path.do")这个写在javadoc注释中)/***@@monsattributes.PathMap("/hello.do")*/publicclassHelloControllerextendsAbstractCommandController{...}<beanid="urlMapping"class="org.springframework.web.servlet.handler.metadata.CommonsPathMapHandlerMapping"/>4springmvc基于注解的开发4.1注解第一个例子创建web项目在springmvc的配置文件中指定注解驱动,配置扫描器<!--注解驱动--><mvc:annotation-driven/><!--扫描器--><context:component-scanbase-package="com.coolparking.action"/><!--视图解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/><propertyname="prefix"value="/view/"/><propertyname="suffix"value=".jsp”/></bean>@controller:标识当前类是控制层的一个具体的实现@requestMapping:放在方法上面用来指定某个方法的路径,当它放在类上的时候相当于命名空间需要组合方法上的requestmapping来访问。4.2注解方式参数接收参数:HttpServletRequest定义在参数的列表,可以直接使用在参数列表上直接定义要接收的参数名称,只要参数名称能匹配的上就能接收所传过来的数据,可以自动转换成参数列表里面的类型,注意的是值与类型之间是可以转换的数据写到页面,方法的返回值采用ModelAndView,newModelAndView(〃index〃,map);,相当于把结果数据放至到request里面在参数列表中直接定义Model,model.addAttribute(〃p〃,person);把参数值放到request类里面去,建议使用Ajax调用springMVC的方法:直接在参数的列表上定义PrintWriter,out.write(result);把结果写到页面,建议使用的请求方式的指定:@RequestMapping(method=RequestMethod.POST)可以指定请求方式,前台页面就必须要以它制定好的方式来访问,否则出现405错误重定向:controller内部重定向,redirect:加上同一个controller中的requestMapping的值,controller之间的重定向:必须要指定好controller的命名空间再指定requestMapping的值,redirect:后必须要加/,是从根目录开始4.3springmvc常用注解©Controller:将class定义为一个controller类。©RequestMapping:在类前面定义,则将url和类绑定。在方法前面定义,则将url和类的方法绑定。RequestMapping注解有六个属性,下面分成三类进行说明。a、value,method;value:指定请求的实际地址,指定的地址可以是URITemplate模式(后面将会说明);value的uri值为以下三类:可以指定为普通的具体值;可以指定为含有某变量的一类值(URITemplatePatternswithPathVariables);@RequestMapping(value="/owners/{ownerId}”,method=RequestMethod.GET)publicStringfindOwner(@PathVariableStringownerId,Modelmodel){Ownerowner=ownerService.findOwner(ownerId);model.addAttribute("owner”,owner);return"displayOwner";}可以指定为含正则表达式的一类值(URITemplatePatternswithRegularExpressions);@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")publicvoidhandle(@PathVariableStringversion,@PathVariableStringextension){//...}method:指定请求的method类型,GET、POST、PUT、DELETE等;b、consumes,produces;consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;Produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;c、params,headers;params:指定request中必须包含某些参数值是,才让该方法处理。headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。@RequestParam:一般用于将指定的请求参数付给方法中形参,如果请求参数名称和形参名称保持一致,则不需要这种写法。@RequestMapping(params="method=reg5”)publicStringreg5(@RequestParam("name")Stringuname,ModelMapmap){System.out.println("HelloController.handleRequest()");System.out.println(uname);return"index";}@SessionAttributes:将ModelMap中指定的属性放到session中。@Controller@RequestMapping("/user.do")@SessionAttributes({"u","a"})//将ModelMap中属性名字为u、a的再放入session中。这样,request和session中都有了。publicclassUserController{@RequestMapping(params="method=reg4")publicStringreg4(ModelMapmap){System.out.println("HelloController.handleRequest()");map.addAttribute("u","uuuu");//将u放入request作用域中,这样转发页面也可以取到这个数据。return"index";}}@ModelAttribute:这个注解可以跟@SessionAttributes配合在一起用。可以将ModelMap中属性的值通过该注解自动赋给指定变量。@RequestMapping(params="method=reg5")publicStringreg5(@ModelAttribute("u")Stringuname,ModelMapmap){System.out.println("HelloController.handleRequest()");System.out.println(uname);return"index";}@RequestBody作用:该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;再把HttpMessageConverter返回的对象数据绑定到Controller中方法的参数上。使用时机:GET、POST方式提时,根据requestheaderContent-Type的值来判断:application/x-www-form-urlencoded,可选(即非必须,因为这种情况的数据@RequestParam,@ModelAttribute也可以处理,当然@RequestBody也能处理);multipart/form-data,不能处理(即使用@RequestBody不能处理这种格式的数据);其他格式,必须(其他格式包括application/json,application/xml等。这些格式的数据,必须使用@RequestBody来处理);POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。@RequestMapping(value="/person/profile/{id}/{name}/{status}",method=RequestMethod.GET)public@ResponseBodyPersonporfile(@PathVariableintid,@PathVariableStringname,@PathVariablebooleanstatus){returnnewPerson(id,name,status);}PUT方式提交时,根据requestheaderContent-Type的值来判断:application/x-www-form-urlencoded,必须;multipart/form-data,不能处理;其他格式,必须;说明:request的body部分的数据编码格式由header部分的Content-Type指定;@ResponseBody作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。@ResponseBody可以标注任何对象,由Srping完成对象协议的转换。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;<!--解决@ResponseBody乱码问题,必须放在<mvc:annotation-driven/>之前--><beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><propertyname="messageConverters"><list><beanclass="org.springframework.http.converter.StringHttpMessageConverter"><propertyname="supportedMediaTypes"><list><value>text/plain;charset=UTF-8</value></list></property></bean></list></property></bean>7.其他:@Service用于标注业务层组件@Controller用于标注控制层组件(如struts中的action)©Repository用于标注数据访问组件,即DAO组件@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。@InitBinder在SpringMVC中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定。自定义SpringMVC的属性编辑器主要有两种方式,一种是使用@InitBinder标签在运行期注册一个属性编辑器,这种编辑器只在当前Controller里面有效;还有一种是实现自己的WebBindingInitializer,然后定义一个AnnotationMethodHandlerAdapter的bean,在此bean里面进行注册,这种属性编辑器是全局的。第一种方式:可以单独的写在你的每一个controller中。剩下的控制器都继承该类。spring自己提供了大量的实现类,诸如CustomDateEditor,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。@ControllerpublicclassBaseController{@InitBinder//必须有一个参数WebDataBinderpublicvoidinitBinder(WebDataBinderbinder){binder.registerCustomEditor(Date.class,newCustomDateEditor(newSimpleDateFormat("yyyy-MM-dd"),false));binder.registerCustomEditor(int.class,newPropertyEditorSupport(){@OverridepublicStringgetAsText(){//TODOAuto-generatedmethodstubreturngetValue().toString();}@OverridepublicvoidsetAsText(Stringtext)throwsIllegalArgumentException{//TODOAuto-generatedmethodstubsetValue(Integer.parseInt(text));}});}}第二种:1.定义自己的WebBindingInitializerpublicclassMyWebBindingInitializerimplementsWebBindingInitializer{@OverridepublicvoidinitBinder(WebDataBinderbinder,WebRequestrequest){binder.registerCustomEditor(Date.class,newCustomDateEditor(newSimpleDateFormat("yyyy-MM-dd"),false));}}在springMVC的配置文件里面定义一个AnnotationMethodHandlerAdapter,并设置其WebBindingInitializer属性为我们自己定义的WebBindingInitializer对象<beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><propertyname="cacheSeconds"value="0"/><propertyname="webBindingInitializer"><beanclass="com.xxx.blog.util.MyWebBindingInitializer"/></property></bean>第二种方式经过上面两步就可以定义一个全局的属性编辑器了。注意:当使用了<mvc:annotation-driven/>的时候,它会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean。这时候第二种方式指定的全局属性编辑器就不会起作用了,解决办法就是手动的添加上述bean,并把它们加在<mvc:annotation-driven/>的前面。如果不生效,则将手动注册AnnotationMethodHandlerAdapter改为手动注册RequestMappingHandlerAdapter。5文件上传引入jar包.apache.conimons.io-1.4.0.jar配置文件上传表单视图解析器<beanid="multipartResolver"class="mons.CommonsMultipartResolver"><propertyname="maxUploadSize"value="204800”/></bean>写上传逻辑@RequestMapping(value="/personForUpload.do”,method=RequestMethod.POST)publicStringpersonForUpload(HttpServletRequestrequest,Personperson,Map<String,Object>map)throwsException(//第一步转化requestMultipartHttpServletRequestmr=(MultipartHttpServletRequest)request;〃获得上传的文件mr.getFile(StringfileName),fileName是<inputtype="file"name="pic">中picCommonsMultipartFilecf=(CommonsMultipartFile)mr.getFile("pic");byte[]fb=cf.getBytes();StringfileName="";〃设置时间戳格式SimpleDateFormataf=newSimpleDateFormat("yyyyMMddhhmmssSSS");〃获得时间戳的字符串fileName=af.format(newDate());//加三位随机数
Randomrandom=newRandom();for(inti=0;i<3;i++)(fileName=fileName+random.nextInt(10);}Stringpath=request.getSession().getServletContext().getRealPath("/");OutputStreamout=newFileOutputStream(path+"/img/"+fileName+".jpg");out.w
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中考语文常考作文押题(10大主题+10篇范文)
- 预防人伤黄牛培训
- 识字3《小青蛙》(教学设计) 一年级语文下册同步高效课堂系列(统编版.2024)
- 2024年沪教版小学六年级上学期期末英语试卷及答案指导
- 房产广播稿文案
- 15 青春之光(教案)-2024-2025学年统编版语文七年级下册标签标题
- 2023三年级数学下册 数学好玩第1课时 小小设计师教学实录 北师大版
- 2024秋七年级英语上册 Unit 5 Family and Home Lesson 25 Jenny's Family教学实录 (新版)冀教版
- 端午节的发言稿
- 《探究声音的产生秘密》(教学设计) 小学科学校本课程
- 三年级下册语文七彩课堂
- 《工程勘察设计收费标准》(2002年修订本)
- 食品化学 碳水化合物课件
- 在建项目汛前安全生产检查表
- 中国风传统文化家风家训主题PPT模板
- 华为终端合作手机硬件测试标准-V10.4发布版本
- 外科手术基本器械及其使用
- 植被砼护坡绿化施工组织设计
- GPON组网与华为MA5800-X15OLT配置
- 小学四年级综合实践活动课件.ppt
- 通用请假条Excel表格模板
评论
0/150
提交评论