Servlet3.0的出现是servlet史上最大的变革,其中的许多新特性大大的简化了web应用的开发,为广大劳苦的程序员减轻了压力,提高了web开发的效率。主要新特性有以下几个:
引入注解配置支持web模块化开发程序异步处理改进文件上传API非阻塞式IO读取流Websocket实时通信一、注解配置
Servlet3.0新规范顺应了时代的潮流,使用注解配置,取代混乱的web.xml全局配置。在这之前我们在创建servlet,filter,listener时,都是在web.xml中配置。
//创建一个servlet需要在web.xml中配置如下内容<servlet> <servlet-name>myFirstServlet</servlet-name> <servlet-class>Test.myServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myFirstServlet</servlet-name> <url-pattern>/aaa</url-pattern> </servlet-mapping>//我们只使用一行代码完成servlet的配置@WebServlet(name = "myFirstServlet",urlPatterns = {"/aaaa"})public class myServlet extends HttpServlet { @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher rd = req.getRequestDispatcher("/default.jsp"); rd.forward(req,resp); }}
关于filter和listener的注解配置方法和上述形式一样,在3.0新规范中主要提供了以下一些注解用于配置:
Websocket :用于配置socketWebInitParam :用于配置初始化参数,往往和servlet和filter结合使用WebListener :用于配置ListenerWebFilter :用于配置FilterMultipartConfig :用于文件上传(后面会详细介绍)还有一些,暂时没有涉及,就不列举了
二、Servlet3.0 Web模块化开发
在这之前我们对于web应用中的各个Servlet,Filter,Listener都是需要在web.xml中进行配置,如果只是本项目中的各个点的配置,那倒还好,但是如果我们引入框架,是不是每个框架中的各种配置也是需要在我们的web.xml中配置?这无疑会导致我们唯一的web.xml中内容混乱。Servlet3.0新规范提出了模块化开发,也就是每个Servlet,Filter,Listener都可以有属于自己的配置文件,功能和web.xml一样,它只负责配置当前的servlet。然后我们只需要将配置文件和自己写的Servlet等内容打包成jar,引入到具体项目中即可。(就像我们想要使用了某个功能,引入了从网上下载的jar包到项目中)下面我们看如何使用,由于Servlet,Filter,Listener的配置类似,此处以Servlet为例作为演示:
首先我们写一个servlet类:
public class MyServlet extends HttpServlet { @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ RequestDispatcher rd = req.getRequestDispatcher("/default.jsp"); rd.forward(req,resp); }}
然后我们创建一个web-fragment.xml文件,这就是属于此Servlet自己的配置文件,功能类似于Web.xml,只是这个是私有的。键入以下内容:
<?xml version="1.0" encoding="UTF-8"?><web-fragment xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://mon-fileupload等。自从servlet3.0新规范以来,改进了文件上传API。
<body> <h1>这是index页面</h1> <form method="post" action="/submit" enctype="multipart/form-data"> 姓名:<input type="text" name="name" /><br /><br /> 头像:<input type="file" name="mFile" /><br /><br /> <input type="submit" value="提交" /> </form> </body>
我们知道,在html中上传文件的表单用type="file"来指定,这是一点,还有一点就是from标签的enctype属性,他指定了表单参数的编码方式,主要有以下三种:
application/form-data :这是enctype的默认值,指定了这个值就表名表单只会提交所有input标签中的value值,对于我们的文件,提交的就是文件名。multipart/form-data:这种方式是将参数以二进制存储,上传文件的内容也会被封装成二进制流提交。text/plain:这种方式主要用于发送邮件对于需要上传文件功能的我们自然选择第二个参数值,正如上述代码展示的一样。下面我们写一个servlet用于处理上传的信息。
@WebServlet(name = "myServlet",urlPatterns = {"/submit"})@MultipartConfig //处理文件上传的servlet需要配置此注解public class FileUpload extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ resp.setContentType("text/html;charset=UTF-8"); PrintWriter writer = resp.getWriter(); Part part = req.getPart("mFile"); writer.println("文件类型:"+part.getContentType()+"<br />"); writer.println("文件名:"+part.getName()+"<br />"); part.write("C:\\Users\\Administrator\\Desktop\\photo.jpg"); }}
在servlet3.0中采用Part接口来处理文件上传,可以通过HtppServletRequest的以下两个方法来获取此接口对象:
Part getPart(String name);Collection<Part> getParts();
一个part对应于我们一个文件上传域,也就是一个input类型为file的元素。part中有以下一些方法:
String getContentType(); //返回文件类型,如image/png String getName(); //返回文件名 String getSubmittedFileName(); long getSize(); //返回文件的大小 void write(String var1) throws IOException; //将文件写入到服务器磁盘 void delete() throws IOException; //删除此文件 String getHeader(String var1); //获取指定文件名的值 Collection<String> getHeaders(String var1); //获取指定文件名的所有的值 Collection<String> getHeaderNames(); //获取所有Header 的name集合
在上面的程序中,我们使用了其中一些方法。打印了文件类型,文件名,最后将文件保存到本地桌面上。下面是运行的结果截图:
综上就是关于文件上传API的基本使用情况,希望对大家的学习有所帮助,也希望大家多多支持。