Servlet3.0 javaConfig配置
传统的servlet都是在web.xml中配置,从Servlet 3.0开始提供了ServletContainerInitializer接口,允许使用代码去配置servlets、filters、listeners。
 Spring为我们提供了一个该接口的实现类SpringServletContainerInitializer,查看源代码可以知道该类通过@HandlesTypes()注解指定了onStartup()方法的第一个参数接收WebApplicationInitializer实现类的集合。所以如果我们要使用这种方式配置servlet,只需要实现WebApplicationInitializer 接口即可。
  1. publicclassWebInitializerimplementsWebApplicationInitializer {
 
  1. privatestaticfinal Logger logger = LoggerFactory.getLogger(WebInitializer.class);
 
  1. @Override
  1. publicvoidonStartup(javax.servlet.ServletContext servletContext) throws ServletException {
  1. logger.info("begin init web application.");
 
  1. //配置Spring
  1. AnnotationConfigWebApplicationContext springContext = new AnnotationConfigWebApplicationContext();
  1. springContext.register(SpringConfig.class);
  1. //添加linstener
  1. servletContext.addListener(new ContextLoaderListener(springContext));
 
  1. //添加servlet
  1. ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
  1. "dispatcher", new DispatcherServlet(springContext));
  1. dispatcher.setLoadOnStartup(1);
  1. dispatcher.addMapping("/");
 
  1. //添加filter
  1. LoggerFilter loggerFilter = new LoggerFilter();
  1. FilterRegistration.Dynamic logFilterRegistration=container.addFilter("requestResponseLogFilter", loggerFilter);
  1. logFilterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC), false, "/*");
 
  1. logger.info("init web application success.");
  1. }
  1. }
Spring 配置
Spring的配置主要就是配置各种Bean,主要是要了解几种注解的使用方法。
 
@Configuration 注解 
相当于传统配置文件中的Beans,该类中的方法可以通过 @Bean标注为 bean
 
  1. @ConfigurationpublicclassSpringConfig {
  1. @Bean(name = "exampleBean")
  1. public ExampleBean getExampleBean() {
  1. returnnew ExampleBean();
  1. }
  1. }
@ComponentScan 注解
标明要扫描注解的包,相当于配置文件中的 context:component-scan。Spring会自动扫描注册指定包中使用注解指定的Bean。
  1. @ComponentScan(basePackages = {"com.example.service","com.example.dao"})
@PropertySource  注解
可以引入 properties配置文件,通过注入Environment对象可以很方便的拿到配置文件中的内容。
  1. @Configuration@PropertySource("classpath:config.properties")@ComponentScan(basePackages = {"com.example.service","com.example.dao"})publicclassSpringConfig {
 
  1. @Autowired
  1. private Environment env;
 
  1. @Bean(name = "mysqlDataSource")
  1. public DataSource mysqlDataSource() {
  1. ProxoolDataSource dataSource = new ProxoolDataSource();
  1. dataSource.setDriver(env.getProperty("ds.driver.classname"));
  1. dataSource.setDriverUrl(env.getProperty("ds.url"));
  1. dataSource.setUser(env.getProperty("ds.username"));
  1. dataSource.setPassword(env.getProperty("ds.password"));
  1. dataSource.setPrototypeCount(env.getProperty("proxool.prototype", Integer.class));
  1. dataSource.setMinimumConnectionCount(env.getProperty("proxool.minimum", Integer.class));
  1. dataSource.setMaximumConnectionCount(env.getProperty("proxool.maximum", Integer.class));
  1. dataSource.setSimultaneousBuildThrottle(env.getProperty("proxool.simultaneous", Integer.class));
  1. dataSource.setTestBeforeUse(true);
  1. dataSource.setHouseKeepingTestSql(env.getProperty("proxool.testSql"));
  1. return dataSource;
  1. }
 
  1. }
 
文件上传功能简介
基本概念
要使用基于Servlet 3.0的多路传输转换功能:
1、在web.xml中为DispatcherServlet添加一个multipart-config元素
2、通过Servlet编程的方法使用MultipartConfigElement进行注册
3、自己定制了自己的Servlet类,那你必须使用 @MultipartConfig对其进行注解。
注意:诸如最大文件大小或存储位置等配置选项都必须在这个Servlet级别进行注册,因为Servlet 3.0不允许在解析器MultipartResolver的层级配置这些信息。
 
 
使用方法
在以前,处理文件上传是一个很痛苦的事情,大都借助于开源的上传组件,诸如commons fileupload等。现在好了,很方便,便捷到比那些组件都方便至极。
 
让Servlet支持上传,需要做两件事情
  1. 需要添加MultipartConfig注解
  1. 从request对象中获取Part文件对象
MultipartConfig注解
属性名 类型 是否可选 描述  
fileSizeThreshold int 当数据量大于该值时,内容将被写入文件。  
location String 存放生成的文件地址。  
maxFileSize long 允许上传的文件最大值。默认值为 -1,表示没有限制。  
maxRequestSize long 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。  
         
一些实践建议:
  1. 若是上传一个文件,仅仅需要设置maxFileSize属性即可。
  1. 上传多个文件,可能需要设置maxRequestSize属性,设定一次上传数据的最大量。
  1. 上传过程中无论是单个文件超过maxFileSize值,或者上传总的数据量大于maxRequestSize值都会抛出IllegalStateException异常;
  1. location属性,既是保存路径(在写入的时候,可以忽略路径设定),又是上传过程中临时文件的保存路径,一旦执行Part.write方法之后,临时文件将被自动清除。
  1. 但Servlet 3.0规范同时也说明,不提供获取上传文件名的方法,尽管我们可以通过part.getHeader("content-disposition")方法间接获取得到。
  1. 如何读取MultipartConfig注解属性值,API没有提供直接读取的方法,只能手动获取。
 
参考文档:

Servlet3.0 multipart 文件上传技术的更多相关文章

  1. Servlet3.0学习总结——基于Servlet3.0的文件上传

    Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileu ...

  2. Servlet3.0学习总结(三)——基于Servlet3.0的文件上传

    在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不 ...

  3. Servlet3.0之八:基于Servlet3.0的文件上传@MultipartConfig

    在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不 ...

  4. java-基于Servlet3.0的文件上传

    Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet3.0中使用request.getParts()获取上传文件

  5. servlet3.0的文件上传代码配置怎么写

    之前学习过xml配置servlet3.0的文件上传,但是变成code方式一直不知道怎么弄,相比较起来apache的文件上传配置和xml倒是没什么太大区别. 直接上代码:无需依赖,只要一个方法就好了cu ...

  6. Spring MVC3.2 通过Servlet3.0实现文件上传

    Servlet3.0规范增加了对文件上传的原生支持,这里记录一下Spring MVC3通过Servlet3上传文件的实现. 配置文件: applicationContext.xml <!-- s ...

  7. Servlet3.0的文件上传功能

    在Servlet3.0之前,文件上传需要借助于第三方插件,在Servlet3.0之后,Servlet本身开始支持文件上传功能. 获取上传的文件可以通过HTTPServletRequest的getPar ...

  8. phpcms v9.6.0任意文件上传漏洞(CVE-2018-14399)

    phpcms v9.6.0任意文件上传漏洞(CVE-2018-14399) 一.漏洞描述 PHPCMS 9.6.0版本中的libs/classes/attachment.class.php文件存在漏洞 ...

  9. 【代码审计】JTBC(CMS)_PHP_v3.0 任意文件上传漏洞分析

      0x00 环境准备 JTBC(CMS)官网:http://www.jtbc.cn 网站源码版本:JTBC_CMS_PHP(3.0) 企业版 程序源码下载:http://download.jtbc. ...

随机推荐

  1. 手机 https 抓包---Charles篇

    原文出处: Lu尼玛的想疗院 作为一名现代前端,除了要掌握html,css,js 以及一系列乱七八糟框架之外,还得懂得如何抓包改包.当然,常规的网站或者自主开发的我们往往使用 chrome或者 fir ...

  2. .NET Core Entity使用Entity Framework Core链接数据库

    首先安装Nuget包 Install-package Microsoft.EntityFrameworkCore Install-package Microsoft.EntityFrameworkCo ...

  3. 使用JavaCV播放视频、摄像头、人脸识别

    一.导入Maven依赖包 <dependencies> <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-pla ...

  4. storm杂谈之Why use netty as transport instead of zeromq

    Storm后来用Netty来代替了zmq,这个能够參考一下两篇blog 这两篇blog具体的阐述原因以及一些性能測试, 大家參考一下 Reference 1.Netty 4 Reduces GC Ov ...

  5. ubuntu 登陆信息打印 -- motd

    新需求需要改变 Ubuntu 启动时的登录信息打印,根据搜索到的资料,找到了这里: luo[~]ssh luo@192.168.100.233 Press ^@ (C-Space) to enter ...

  6. testng.xml 配置大全

    1.TestNG的运行方式如下: 1 With a testng.xml file 直接run as test suite 2 With ant 使用ant 3 From the command li ...

  7. 前后分离模型之封装 Api 调用

    Ajax 和异步处理 调用 API 访问数据采用的 Ajax 方式,这是一个异步过程,异步过程最基本的处理方式是事件或回调,其实这两种处理方式实现原理差不多,都需要在调用异步过程的时候传入一个在异步过 ...

  8. (转)超过 130 个你需要了解的 vim 命令

    从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编辑器之一.5 年前,我写了一个问自己名为 “每个程序员都应该知道的 100 个 vim 命令” 这次算是之前那篇文章的改进版,希望你 ...

  9. logstash数据处理示例

    #test {"time":1504752032399,"date":"2017-09-08 12:00:00","str&quo ...

  10. [AaronYang]那天有个小孩跟我说Js正则

    按照自己的思路学习Node.Js 随心出发.突破正则冷门知识点,巧妙复习正则常用知识点 标签:AaronYang  茗洋  Node.Js 正则 Javascript 本篇博客地址:http://ww ...