xyz327

hakuna matata

springmvc 在容器初始化后使用监听ContextRefreshedEvent事件来初始化DispatcherServlet中的各种属性
MultipartResolver就是其中一个
初始化MultipartResolver是从IOC容器里面获取一个名为multipartResolverMultipartResolver的Bean

MultipartResolver是用于处理HTTP上传文件的请求处理器
springmvc在处理文件上传时,使用MultipartResolverHttpServletRequest解析包装成MultipartHttpServletRequest对象
MultipartHttpServletRequest提供了获取MultipartFile的方法

MultipartHttpServletRequest接口继承了HttpServletRequest
MultipartFile提供了获取上传的文件相关属性以及文件流的方法
在Controller中使用MultipartHttpServletRequest更方便的处理上传文件

MultipartResolver

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public interface MultipartResolver {
/**
* 判断给定的请求是否包含 multipart 内容
* 通常是检查request的Content-Type是否是 "multipart/form-data"
* 实际还是依赖解析器自己的实现
*/
boolean isMultipart(HttpServletRequest request);

/**
* 解析HTTP request 包含的文件和参数并把它们包装到
* {@link org.springframework.web.multipart.MultipartHttpServletRequest}对象中
* 这个接口实现了{@link javax.servlet.http.HttpServletRequest}
*/
MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;

/**
* 清理资源,例如存储的上传文件
*/
void cleanupMultipart(MultipartHttpServletRequest request);
}

springmvc为MultipartResolver提供了两种实现

阅读全文 »

SpringMvc初始化

Springmvc的入口是DispatcherServlet,先从这里看起
DispatcherServlet的继承关系图
dispatcherServlet继承图

阅读全文 »

java中ArrayListLinkedList的区别

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2. 对于随机访问getsetArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3. 对于新增和删除操作addremoveLinedList比较占优势,因为ArrayList要移动数据。

ArrayList使用动态数组存储数据,

使用无参构造函数时默认大小是10,初始化时动态数组是个空数组{}

当数组容量不够时会扩容,扩容方式是 newCapacity=oldCapacity+(oldCapacity>>1), 当前数组大小*1.5
所以当插入数据量比较大时可能会浪费一部分空间,在可以确定数据量大小时给定初始化容量大小可以提高效率
在空间分配完毕后可以使用trimToSize去除掉多余的空间

LinkedList使用链表存储数据,

阅读全文 »

异常

第57条:只针对异常的情况才使用异常

第58条:对可恢复的情况使用受检异常,对编程错误使用运行时的异常

java 三种可抛出结构(throwable): 受检异常,运行时异常,错误

第59条:避免不必要的使用受检的异常

第60条:优先使用标准的异常

阅读全文 »

通用程序设计

第45条:将局部变量的作用域最小化

1. 最有力的方法就是在第一次使用它的地方声明
2. 几乎每个局部变量的声明都应该包含一个初始化表达式
3. 在循环终止后不再需要循环变量的内容时, `for`循环优先于`while`循环

第46条:for-each循环优先于传统的for循环

不能使用`for-each`循环的情况
1. 过滤, 需要使用显示的迭代器,或者java8的stream
2. 转换,
3. 平行迭代,

第47条:了解和使用类库

阅读全文 »

方法

第38条: 检查参数的有效性

第39条: 必要时进行保护性拷贝

第40条: 谨慎设计方法签名

1. 谨慎地选择方法的名称。方法的名称应该始终遵循标准的命名习惯
2. 不要过于追求提供便利的方法。每个方法应该尽其所能。只有当一项操作被经常用到的时候,才考虑为它提供快捷方式。如果不能确定,还是不提供快捷为好
3. 避免过长的参数列表。 目标是4个或更少
    缩短过长参数的方法
    1. 把方法分解成多个方法,每个方法只需要这些参数的一个子集。
    2. 创建辅助类,用来保存参数的分组。这些辅助类一般为静态成员类。
    3. 从对象构建到方法调用都采用Builder模式,设置完参数再调用执行(execute)方法
4. 对于参数类型,要优先使用接口而不是类

第41条:慎用重载

阅读全文 »

枚举和注解

第30条: 用enum代替int常量

第31条:用实例域代替序数

不要依赖枚举的`ordinal`而是自己定义实例域

第32条:用EnumSet代替位域

第33条:用EnumMap代替序数索引

阅读全文 »

泛型

第23条:不要在新代码中使用原生态类型

第24条:消除非受检警告

1
@SuppressWarnings("unchecked")
`@SuppressWarnings`注解可以用在任何粒度的级别中,应该尽可能使用在小的范围中 
每当使用`@SuppressWarnings`注解时,都要添加一条注释,说明为什么这么做是安全的

第25条:列表优先于数组

阅读全文 »

第13条: 使类和成员的可访问性最小

第14条:在共有类中使用方法而不是公有域

第15条:使可变性最小

使类成为不可变,要遵循下面五条规则
1. 不要提供任何会修改对象状态的方法
2. 保证类不会被扩展
3. 所有的域都是final的
4. 所有的域都是私有的
5. 确保对任何可变组件的互斥访问

第16条:复合优先于继承

第17条:要么为继承而设计,并提供文档说明,要么就禁止继承

阅读全文 »