Spring MVC随笔记录

时间:2021-06-11 14:58:19

根据https://blog.csdn.net/abc997995674/article/details/80353410整理

@ModelAttribute 可以用在方法、方法参数上,也可以和@requstmapping  一起2019-03-31使用放在方法上。放在方法上分返回void 和有返回值,有@ModelAttribute("key")形式。@ModelAttribute可以用来更新数据库行(先把原先数据行存在model中,再更新---机制是先存值再更新)

maven 包含本地仓库、第三方仓库和*仓库。

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>添加这一个依赖就可以自动引入其他所有的spring运行环境相关jar和springmvc运行相关jar,不用一个一个的引入,很好的处理方式。

1、springmvc的基本配置

spring容器是springmvc容器的父容器,父容器可以看到子容器的Bean,子容器中不能看到父容器中的Bean。如果两个容器都配置了包扫描,会有同一个bean被创建两次的情况。最常用的解决方案就是在配置包扫描是进行过滤:
在springmvc配置文件中配置只扫描@Controller注解,spring容器配置排除扫描@Controller注解。

执行过:根据包扫描<context:component-scan  和@controler确定作为控制器的类,再根据@requstmapping形成对应映射路径处理每一个请求,最后根据页面解析器<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">的配置返回对应视图。

2、处理器向页面返回参数可以通过ModelAndView、Model、ModelMap、Map和HttpServletRequest实现,很多文章说到ModelAndView只能通过在 方法中new的方式实现,实际上它和其它几个一样,也可以通过放在方法参数中实现,在功能中在实现它的视图(view)就可以。

3、重定向(return “redirect:res”)/请求转发(return “forward:res”)

4、 springmvc+ajax+json 传参参考一下两篇文博文,https://www.cnblogs.com/qiankun-site/p/5774300.html  和 https://www.cnblogs.com/qiankun-site/p/5774300.html,个人理解设置contentType:'application/json;charest=utf8' 和 stringify(params) 和@RequestBody 用在传复杂对象(嵌套对象、json数组)的情景,一般(简单)对象不设置这三项也可以。

5、springmvc 默认实现了一些数据类型转换器,比如 string 转 Int 、date 、实体类等,我们可以利用converter、Formatter、PropertyEditor(https://blog.csdn.net/abc997995674/article/details/80384151)实现自定义转换器(自定义格式-->生成类型转换器-->绑定到DataBinder,注意加注解@InitBinder("params"))。

6、springMVC结合ajax时在方法上加@ResponseBody,该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区,所以也可以不用@ResponseBody直接利用response的write方法实现返回数据。前端有三种传值方式(键值对、对象、JSON.stringify({key1:value1,key2:value2...})),当前端使用get方式传值时,后台都可以获取到数据但要注意乱码问题(get方式传数据出现中文乱码是因为get使用的ASCLL编码)。使用post时前两种都要和contentType:”application/x-www-form-urlencoded”结合使用后台才能获取到值但要注意乱码问题,第三种要结合contentType:”application/json; charset=utf-8”和@RequestBody使用不会出现乱码问题。

7、上传下载,上传文件时要在springMVC中配置<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">必须配,DispatcherServlet经过一系列解析最后在controller中利用MultipartFile file接受文件参数。使用ResponseEntity<byte[]>完成文件下载,记得设置"Content-Disposition","attachment;filename=filename"请求头,浏览器才能认得这是一个下载。也可利用@ResponseBody+返回字节数组(原始方式)实现。

8、静态资源处理,使用<mvc:default-servlet-handler />将请求交给容器(tomcat)默认的servlet处理,再配置<mvc:annotation-driven />处理默认servlet无法处理的请求。也可以利用<mvc:resources />将静态资源的处理交给SpringMVC自己处理。

9、springMVC利用HiddenHttpMethodFilter将post请求(带_method参数)解析成put和delete请求 支持rest风格。

10、配置<mvc:view-controller path="/hello" view-name="hello"></mvc:view-controller>不经过controller直接转发到目标页面。

11、JSR 303 是Java为Bean数据合法性校验提供的标准框架,在bean上绑定校验规则(@NotNull、@Max等)。步骤:1、引入jar包;2、配置<mvc:annotation-driven/>会默认装配LocalValidatorFactoryBean

3、在bean上加对应验证规则;4、在controller验证对象上加@Valid注解和保存校验结果的对象(BindingResult或Errors),返回错误信息会保存到默认模型中。

12、拦截器,springMVC提供抽象类实现public abstract class HandlerInterceptorAdapter implements HandlerInterceptor,多个拦截器执行时三个方法的执行顺序以栈结构执行顺序

  (prehander->controller->posthander->viewResover->afterCompletion),需要配置<mvc:interceptors>才能使用。可以使用 <mvc:interceptor>、<mvc:mapping path="" />、<mvc:exclude-mapping path="" />来配置拦截器的作用路径。 能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring MVC环境下

  才能使用,因此Filter是最通用的、最先应该使用的。如登录这种拦截器最好使用Filter来实现。