springMVC总结
1.核心是dispatchServlet,请求会由dispatcherServlet分配给控制器(根据处理器映射来确定)。在控制器完成处理之后,接着请求会被发送给一个视图(根据视图解析器来确定)
呈现输出
2.dispatcherServlet会查询一个或多个处理器映射器来确定请求的下一站在哪里,处理器映射会根据请求所携带的url来确定。
3.控制器在完成逻辑处理后,会产生一些信息,这些信息需要返回给用户并在浏览器上显示(模型),这些信息会被发送给一个视图,一般是一个jsp
4.控制器做的最后一件事就是把请求连同模型和视图名称发送回dispatcherServlet
5.dispatcherServlet会利用视图解析器将逻辑视图名匹配为一个特定的视图实现,在这里它交付模型数据,请求的任务就完成了。
二.搭建springMVC+tiles
1.配置web.xml,当确定了servlet的名字之后,我们要在web-INF目录下创建一个servlet名字-servlet.xml来加载应用上下文(这里写为yue-servlet.xml)
然后我们要定义处理哪些url,当url是
(1)*.do,可以随意访问
(2)/,对静态资源访问会出问题,但是后面可以通过其他方法补救(使用<mvc:resources>,使用tomcat的defaultServlet进行拦截(速率最好的),使用<mvc:default-servlet-handler>)
2.dispatcherServlet的处理器映射器
(1)DfaultAnnotaionHandlerMapping
(2)SimpleUrlHandelreMapping还有两个不想写了。。。因为只用到DefaultAnnotationHandlerMapping
使用annotation,还必须在yue-servlet.xml中配置<mvc:annotation-driven>
(3)在控制器当中,首先需要配置<context:component-scan>在yue-servlet.xml中,另外,如果想将数据从控制器传到前端jsp中,必须使用一个model将其put进去(也可使用modelMap)
3.解析视图
视图解析器有多个:一般使用的是InternalResourceViewResolver和TilesViewResolver(使用tiles2框架时需要用到)
(1)InternalResourceViewResolver:可以加入前缀名和后缀,要在yue-servlet.xml中配置一个bean
(2)使用TilesViewResolver,也是要配置一个bean,然后再定义一个类为TilesConfigurer的bean用来加载tiles的定义,即tiles.xml
(3)spring发布了属于其的新标签s
4.完成spring应用上下文
使用一个contextLoaderListener加载其他的配置文件到一个spring应用上下文中,配置web.xml
5.处理控制器的输入
(1)当在类上面定义了一个类似于@requestMapping("/spitter")表示这个控制器会处理根路径为spitter的请求,当在这个类的某个方法上再定义了一个
@requestMapping(value="/spittles",method=GET)等价于这个方法会处理一个spitter/spittles的get请求
(2)记住若你想将数据传到前台,必须使用一个内置的model类对象将数据put进去
(3)当使用requestParan("spitter")在一个参数前面表明它的值应该根据请求中名为spitter的查询参数来获取
(4)你也可以使用一个@requestMapping(param="method=reg")这种形式来定义请求,不过一般这种情况下需要再类那里定义好要接受什么样的.do(感觉其他应该也可以),然后在
表单中也要多加入一个input添加method参数,注意在requsetMapping那里必须使用/这个在.do请求之前
输入参数的时候使用input:hidden,然后name为method,value表示你要使用的那个method的名字
(5)若使用tiles,则controller中处理方法的返回名字必须和tiles中的definition的name相同表示它要回到那个tile的页面当中
(6)若在requestMapping中使用了param,则请求路径上一定会有一个param参数(即?后面的值)
6.关于springMVC的form标签:http://haohaoxuexi.iteye.com/blog/1807330(但是感觉没有用的必要。。。。)
7.使用@valid注解进行校验,然后利用BindingResult类型参数去判断是否表单的输入出错
8.若希望在requestMapping中使用{username}即使用方法中的参数,那么在方法中的参数前面加入@PathVariable注解表示会以这个参数填掉{username}的值
9.定义校验规则:
在实体类中,在每一个属性上面可以使用@Size和@Pattern两个注解去配置,例如
@Size(min =3,message="username must logger than 3")
@Pattern(regexp="^[fdf]",message="")
private String username;
表示代表这个类对象的输入的表单username必须符合这个正则表达式的规则
10.sf:error使用:
<sf:error path="fullname" cssClass="error" />则表示将会输出fullname这个属性域上的错误
11.处理文件上传
(1).首先在form标签中配置enctype="multipart/form-data",使得每个输入域都作为post请求的不同部分提交
(2).使用input语句,<input name="image" type="file" />
(3).在controller中,要加入一个MultipartFIle image参数表明会接受文件的上传(这里最好使用一个requestParam来保证数据的传输)
(4).保存文件到文件系统中,使用一个FileUtils工具类,然后使用它的一个write方法实现,例子:
File file = new File(webRootPath(根目录) + "/resource/" + filename);
FileUtils.writeByteArrayToFile(file,image.getBytes())来将数据以字节的形式保存到文件系统中
(5).因为dispatcherServlet本身并不知道如何处理multipart的表单数据,所以需要配置一个bean叫CommonsMultipartResolver的bean,并且id必须为multipartResolver,因为
dispatcherServlet会自动查找id为这个的解析器bean
12.action通过(url-pattern为/的情况下)映射到controller的方法:在action属性中,在requestMapping中的指定路径之前,加上${pageContext.request.contextPath},这个
表示jsp的绝对路径,指的是部署的应用程序名(当前的项目名称),和前面一个"/",例如:/TestSpringMVC
而action的例子:${pageContext.request.contextPath}/test/show(test是类上的value,show是方法上的value)
记住一定要在配置文件的xml中定义prefix为/,否则会自动在你的return的string语句中加入类上的value
13.通过对象去定位:首先需要再一个控制器中modelmap的put或者model的addAttribute,然后再在转向的那个jsp中使用spring的form标签,然后再在这个form要发送到的
那个controller的方法的参数上加入一个user,就可以接受到已经更新完属性的user了。