SpringMVC技术笔记

记录SpringMVC学习过程中的想要多留意的一些要点


  1. 使用SpringMVC后只需要编写处理器Handler(Controller)和视图View,其他组件(DispatcherServlet、ViewResolver)只需要配置好就行。

  2. 使用“/”作为DispatcherServlet的拦截方式,所有访问的地址都由DispatcherServlet进行解析,此方法可以实现REST风格的url。但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。
    解决方法有:激活Tomcat的defaultServlet来处理静态文件,然后在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
    或者采用<mvc:resources />
    <mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>以上配置将Web根路径"/"及类路径下 /META-INF/publicResources/ 的目录映射为/resources路径。
    参考:Spring MVC静态资源处理

  3. <mvc:annotation-driven/>这个类主要是用来向工厂中注册了:

  • RequestMappingHandlerMapping
  • BeanNameUrlHandlerMapping
  • RequestMappingHandlerAdapter
  • HttpRequestHandlerAdapter
  • SimpleControllerHandlerAdapter
  • ExceptionHandlerExceptionResolver
  • ResponseStatusExceptionResolver
  • DefaultHandlerExceptionResolver
    上面几个Bean实例。
    前两个是HandlerMapping接口的实现类,用来处理请求映射的。其中第一个是处理@RequestMapping注解的。第二个会将controller类的名字映射为请求url。中间三个是用来处理请求:@Controller注解的处理器,支持自定义方法参数和返回值、处理继承HttpRequestHandler的处理器、处理继承自Controller接口的处理器。后面三个是用来处理异常的解析器。
    参考:[Spring MVC 解读——<mvc:annotation-driven/>]
    相当于一个标签解决了大量手动配置工作。
    (https://my.oschina.net/HeliosFly/blog/205343)
  1. <context:component-scan base-package=“xxx”/>很实用,这个标签让Spring 来扫描指定包下的类,注册被@Component,@Controller,@Service,@Repository等注解标记的组件.

  2. 不管前端js有没有做校验,后端都需要对数据进行校验。controller校验页面请求的参数的合法性,service层主要校验关键业务参数。hibernate validation是个很好用的包,使用注解的形式在POJO上完成校验,还能实现分组校验。
    在Controller的方法中,需要在要检验的pojo前加@Validated,然后参数上必须加上BindingResult,而且得在@Validated后面。
    自定义注解校验器方法:创建注解、创建验证类(要实现接口ConstraintValidator,包括initializeisValid两个方法)、定义默认错误信息
    参考:【SpringMVC学习06】SpringMVC中的数据校验

  3. 异常处理:dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器进行统一异常处理。配置SimpleMappingExceptionResolver可以将异常信息(包括自定义异常信息)显示在页面上。

  4. SpringMVC中可以使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换。使用<mvc:annotation-driven/>后,只需要在Controller的方法上使用@ResponseBody注解就能返回对应的XML或者JSON数据。返回XML数据需要注意实体类上加@XmlRootElement。返回JSON数据需要Jackson2或者GSON(Spring会自动把GsonHttpMessageConverter加进来),不需要实体类上加注解。如果Accept属性中包含了/,表示接受任意格式返回数据。
    @RequestBody注解在Controller类的参数上可以将XML或者JSON数据转换成JAVA类。
    参考:
    SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(上)
    SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)
    这两篇把原理讲的很清楚,非常钦佩作者的技术实力和撰文能力。

  5. 数据回显:提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面。pringmvc默认对pojo数据进行回显。pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)。使用@ModelAttribute指定pojo回显到页面在request中的key。
    直接使用model.addAttribute("xxx", xxx )也能回显数据。

  6. Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。在springmvc中,定义拦截器要实现HandlerInterceptor接口的三个方法:preHandle(身份认证、身份授权)、postHandle(公用的模型数据)、afterCompletion(统一异常处理,统一日志处理)。
    全局拦截器配置:

<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 多个拦截器,按顺序执行 -->        
    <mvc:interceptor>
        <mvc:mapping path="/**"/> <!-- 表示拦截所有的url包括子url路径 -->
        <bean class="xxx"/>
    </mvc:interceptor>
    ...
</mvc:interceptors>

拦截器可以用来实现登陆认证(要点:在session中保存用户身份信息)。
参考:springmvc学习笔记(20)-拦截器

  1. 上传
    需要的maven包:commons-fileupload
    页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。
    在springmvc.xml中配置multipart类型解析器:
<!-- 文件上传 -->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为5MB -->
    <property name="maxUploadSize" value="5242880"/>
    <property name="defaultEncoding" value="utf-8"/>   
</bean>

在上传文件之前,首先要创建一个虚拟目录来保存文件,这个虚拟目录会对应磁盘上的一个实际的目录。
后端代码(比如上传图片):

@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model, HttpServletRequest request,
        Integer id,
        @Validated(value = { MyValidator.class }) ItemsCustom itemsCustom,
        BindingResult bindingResult, 
        MultipartFile items_pic)
        throws Exception {

    // 处理上传的单个图片    
    String originalFileName = items_pic.getOriginalFilename();// 原始名称
    // 上传图片
    if (items_pic != null && originalFileName != null && originalFileName.length() > 0) {
        // 存储图片的物理路径
        String pic_path = "D:\\temp";
        // 新的图片名称
        String newFileName = UUID.randomUUID()
                + originalFileName.substring(originalFileName
                        .lastIndexOf("."));     
        File newFile = new File(pic_path + newFileName);//新图片   
        items_pic.transferTo(newFile);// 将内存中的数据写入磁盘
        itemsCustom.setPic(newFileName);// 将新图片名称写到itemsCustom中
    } else {
        //如果用户没有选择图片就上传了,还用原来的图片
        ItemsCustom temp = itemsService.findItemsById(itemsCustom.getId());
        itemsCustom.setPic(temp.getPic());
    }

    // 调用service更新商品信息,页面需要将商品信息传到此方法
    itemsService.updateItems(id, itemsCustom);
    return "success";
}
//itemsCustom是实体类
//items_pic名字与前端保持一致

参考:【SpringMVC学习08】SpringMVC中实现文件上传

  1. RestTemplate的使用
  • GET请求:getForEntity方法的返回值是一个ResponseEntity<T>ResponseEntity<T>是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。responseEntity.getBody()可以以xml或JSON型式返回类数据。
  • POST请求:postForEntitygetForEntity相似,可以传一个类给服务器。
  • PUT请求:putpostForEntity差不多,没有返回值。
  • DELETE请求: delete
    参考:Spring RestTemplate中几种常见的请求方式
  1. Controller里处理Session
    session.getAttributesession.setAttribute
    @SessionAttributesvalue值代表我们需要把什么样的对象放入session,当我们把对象放入ModelMap这个对象的时候,如果给出的key也会自动放入session。只能注解于类或者接口。
    还可以利用@ModelAttribute@SessionAttributes相互配合,隐性的获取到放在session中的值。
    参考:Spring MVC系列(四)之session处理---@SessionAttributes
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容