Spring mvc 学习拾遗.docx
《Spring mvc 学习拾遗.docx》由会员分享,可在线阅读,更多相关《Spring mvc 学习拾遗.docx(20页珍藏版)》请在冰豆网上搜索。
![Spring mvc 学习拾遗.docx](https://file1.bdocx.com/fileroot1/2023-5/16/b40109fc-8aae-4b86-8acb-c6de3928aca5/b40109fc-8aae-4b86-8acb-c6de3928aca51.gif)
Springmvc学习拾遗
Springmvc学习拾遗
1:
配置文件位置:
mvcServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:
/spring/web/servlet-context.xml
1
默认为/WEB-INF/dispatcher-servlet.xml
2:
Springmvc目前支持5个tag,分别是
mvc:
annotation-driven,mvc:
interceptors,mvc:
view-controller,mvc:
resources和mvc:
default-servlet-handler
2.1:
mvc:
annotation-driven
注册DefaultAnnotationHandlerMapping(解析controller类上的注释)和AnnotationMethodHandlerAdapter(解析controller类方法上的注释)两个bean,及一系列缺省的messageconverter
其实际意义为:
Xml代码
12class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
3
4
5
6
7
8
9
10
11
12
1314class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
1516class="org.springframework.http.converter.StringHttpMessageConverter"/>
17
18class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
19//处理json返回
20
21
22
2324class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
2526class="org.springframework.format.support.FormattingConversionServiceFactoryBean"/>
3:
非代码形式配置视图
mvc:
view-controller
将指定路径的请求直接转到对应的view上,而不需要特定的controller来处理请求。
例如
Xml代码
view-controller path="/hello/*" view-name="helloWorld"/>
4:
静态内容映射
mvc:
resources
将指定URL的匹配模式来访问静态文件,如
resources mapping="/js/**" location="/WEB-INF/js/" cache-period="3600"/>
resourcesmapping="/js/**"location="/WEB-INF/js/"cache-period="3600"/>
表示将/WEB-INF/js/目录映射到/js/目录,cache超时时间为3600秒。
则jsp中引用js/helloWorld.js实际上指向的是/WEB-INF/js/helloWorld.js.
5:
@SessionAttributes
相当于以前的requiresSession属性,当配置此属性时,handlermethod中的参数值将从session中获取,如果不存在则抛出SessionRequiredException,与之前提到的SessionStatus.setComplete()一起使用,可起到避免提及成功后按刷新键重复提交的情况。
6:
@ExceptionHandler
1.:
@RequestMapping("/exception")
2. public void ExceptionTest() throws Exception{
3. throw new Exception("i don't know");
4. }
5. @ExceptionHandler
6. public String handleException(Exception e,HttpServletRequest request){
7. System.out.println(e.getMessage());
8. return "helloworld";
9. }
@RequestMapping("/exception")
publicvoidExceptionTest()throwsException{
thrownewException("idon'tknow");
}
@ExceptionHandler
publicStringhandleException(Exceptione,HttpServletRequestrequest){
System.out.println(e.getMessage());
return"helloworld";
}
其中/exception抛出一个异常,而handleException则抓到这个异常并进行处理
7:
SpringMVC文件上传
Springmvc使用jakarta的commonsfileupload来支持文件上传。
先修改pom.xml,增加对commonsfileuploadlib包的引用。
Xml代码
1.
2. commons-io
3. commons-io
4. 2.0.1
5.
6.
7.
8. commons-fileupload
9. commons-fileupload
10. 1.2.2
11.
commons-io
commons-io
2.0.1
commons-fileupload
commons-fileupload
1.2.2
再修改spring的context配置文件,增加对MultipartResolver的引用。
Xml代码
1.2. class="mons.CommonsMultipartResolver">
3.
-- one of the properties available; the maximum file size in bytes -->
4.
5.
class="mons.CommonsMultipartResolver">
--oneofthepropertiesavailable;themaximumfilesizeinbytes-->
增加uploader的controller类
Java代码
1.@RequestMapping("/uploader")
2.public String uploader(@RequestParam("name") String name,
3. @RequestParam("file") MultipartFile file,
4. HttpSession session){
5. if (!
file.isEmpty()) {
6. System.out.println(file.getSize());
7. }
8. return "helloWorld";
9.}
@RequestMapping("/uploader")
publicStringuploader(@RequestParam("name")Stringname,
@RequestParam("file")MultipartFilefile,
HttpSessionsession){
if(!
file.isEmpty()){
System.out.println(file.getSize());
}
return"helloWorld";
}
增加文件上传的jsp页面
Html代码
1.
2.
3.
file upload test 4.
5.
6.
7.
12.
13.
8:
pom.xml中
UTF-8默认还是可以识别被自动采用
fileuploadtest
view-controllerpath="/hello/*"view-name="helloWorld"/>
11:
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
value="org.springframework.web.servlet.view.JstlView"/>
对比:
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:
prefix="/WEB-INF/jsp/"
p:
suffix=".jsp"/>
分析:
publicclassInternalResourceViewResolverextendsUrlBasedViewResolver{
publicclassUrlBasedViewResolverextendsAbstractCachingViewResolver
publicclassResourceBundleViewResolverextendsAbstractCachingViewResolver
表13.4.视图解析器
ViewResolver
描述
AbstractCachingViewResolver
抽象视图解析器实现了对视图的缓存。
XmlViewResolver
支持XML格式的配置文件。
该配置文件必须采用与SpringXMLBeanFactory相同的DTD。
默认的配置文件是/WEB-INF/views.xml。
ResourceBundleViewResolver
ResourceBundle中寻找所需bean的定义。
这个bundle通常定义在一个位于classpath中的属性文件中。
默认的属性文件是views.properties。
UrlBasedViewResolver
将视图名直接解析成对应的URL。
如果你的视图名和视图资源的名字是一致的,就可使用该解析器。
InternalResourceViewResolver
(UrlBasedViewResolver的子类)
它支持InternalResourceView(对Servlet和JSP的包装),以及其子类JstlView和TilesView。
可以用默认"viewClass"为:
value="org.springframework.web.servlet.view.JstlView"
VelocityViewResolver/FreeMarkerViewResolver
(UrlBasedViewResolver的子类)
支持VelocityView(对Velocity模版的包装)和FreeMarkerView以及它们的子类。
Spring支持多个视图解析器一起使用,形成解析链。
如果某个解析器没有找到合适的视图,Spring会在上下文中寻找是否配置了其它的解析器。
如果有,它会继续进行解析,否则,Srping会抛出一个Exception。
12:
Spring加载resource时classpath*:
与classpath:
的区别
ApplicationContextctx=newClassPathXmlApplicationContext(
"classpath*:
com/test/rs/jarAppcontext.xml");
ApplicationContextctx=newClassPathXmlApplicationContext(
"classpath:
com/test/rs/jarAppcontext.xml");
.classpath*:
为了从多个jar文件中加载相同的文件.jarAppcontext.xml。
只要在com/test/rs/目录结构下就能别加载到。
classpath:
只能加载找到的第一个文件.jarAppcontext.xml。
13:
1:
HandlerMapping接口--处理请求的映射
实现类:
SimpleUrlHandlerMapping通过配置文件,把一个URL映射到资源DefaultAnnotationHandlerMapping通过注解,把一个URL映射到Controller类上
2:
HandlerAdapter接口--处理请求的映射
实现类:
AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上
13:
配置DispatcherServlet
springMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:
/springMVC.xml
不写,使用默认值:
/WEB-INF/-servlet.xml,即springMVC-servlet.xml
1
springMVC
/
1、拦截*.do,例如:
/user/add.do,弊端:
所有的url都要以.do结尾。
不会影响访问静态文件。
2、拦截/,例如:
/user/add,弊端:
对jpg,js,css静态文件的访问也被拦截不能正常显示。
后面有解决办法。
3、拦截/*,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。
14:
多个HandlerMapping的执行顺序问题:
--对静态资源文件的访问方案一(二选一)-->
default-servlet-handler/>
--对静态资源文件的访问方案二(二选一)-->
resourcesmapping="/js/**"location="/js/"cache-period="31556926"/>
resourcesmapping="/css/**"location="/css/"cache-period="31556926"/>
DefaultAnnotationHandlerMapping的order属性值是:
0
resources/>自动注册的SimpleUrlHandlerMapping的order属性值是:
2147483646
default-servlet-handler/>自动注册的SimpleUrlHandlerMapping的order属性值是:
2147483647
当访问一个a.jpg图片文件时,spring会先执行order值比较小的,
先通过DefaultAnnotationHandlerMapping来找处理器,一定是找不到的,我们没有叫a.jpg的controller动作。
继续找由于最后一个SimpleUrlHandlerMapping是匹配"/**"的,所以一定会匹配上,再响应图片。
SimpleUrlHandlerMapping,把对静态资源的访问由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler使用各个Servlet容器自己的默认Servlet.,处理并返回.。
附:
Tomcat默认Servlet.为default(见tom