1. 使用注解来代替配置文件
在servlet3.0中,可以没有配置文件。
<1>@WebServlet()
一般的Servlet需要配置的信息有以下几点:
<servlet>
<servlet-name>servlet的类名称</servlet-name>
<servlet-class>servlet所在的路径</servlet-class>
<init-param>
<param-name>初始化参数名称</param-name>
<param-value>初始化的值</param-value>
<load-on-startup>
元素标记容器是否在启动的时候就加载某个servlet(实例化并调用其init()方法)。
</load-on-startup>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet的类名称</servlet-name>
<url-pattern>虚拟路径</url-pattern>
</servlet-mapping>
@WebServlet具体实现代替web.xml中servlet配置的原理:
在@WebServlet中存在一些属性,这些属性实现了代替servlet的配置
注解中的属性 | 被替代的Servlet配置的具体信息 |
---|---|
String name | servlet-name |
WebInitParam[] initParams() | init-param |
int loadOnStartup() | load-on-startup |
String[] urlPatterns() | url-pattern |
String[] value() | url-pattern |
注意: 属性urlpatterns与values它们都是描述访问当前servlet的路径,但它们不能一起出现,只能使用一个。
在web.xml文件中的属性 metadata-complete,可以取值为true或false。如果为false,代表servlet3.0中的注解可以使用,如果为true(默认值),代表不可以使用注解。
如果需要获取servlet初始化参数,可以通过servletConfig对象获取。
<2>@WebFilter
取代过滤器配置:@WebFilter(value=”这里写需要过滤的资源”)
<3>@WebListener
取代过滤器配置:@WebListener配置过滤器
<4>@WebInitParam
为Servlet和Filter传递初始化参数。
2. 上传文件
第一步:在你要处理数据的Servlet上加注解@MultipartConfig
表示Servlet接收multipart/form-data 请求。
第二步:在servlet中要想得到上传信息,通过request对象获取一个Part对象。
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决获取文件名称中文乱码
request.setCharacterEncoding("UTF-8");
//得到上传 文件的信息。设置f为组件名称
Part part = request.getPart("f");
//获取上传文件名称
String cd = part.getHeader("Content-Disposition");
String filename = cd.substring(cd.lastIndexOf("\\")+1, cd.length()-1);
//完成文件上传,这边就不判断路径存不存在,不存在就创建。
part.write("D:/upload/"+filename);
}
}
3. 文件上传中注意事项
<1>1.关于上传文件中文名称乱码问题
因为上传是post请求,直接使用post乱码解决方案就可以 request.setCharacterEncoding(“utf-8”);
<2>关于获取上传文件名称
通过Part获取一个header
String cd = part.getHeader(“Content-Disposition”);
在这个header中包含了上传文件名称,直接截取出来就可以。
String filename = cd.substring(cd.lastIndexOf(“\”) + 1,cd.length() - 1);
<3>如果多文件上传怎样处理?
利用request.getParts();,这个方法返回的是一个Collection集合。里面存放的是Part。可以通过迭代器来处理。
4. 文件上传支持
在Servlet3.0之前 编写文件上传 :需要 jsp-smartupload 、commons-fileupload 第三方jar包。
在Servlet3.0之后,Servlet规程中内置文件上传、API支持。
<1>提供@MultipartConfig ,如果一个Servlet 使用该注解,在Servlet中解析request请求时,将根据multipart/form-data 格式进行解析。
默认按照urlencoded格式解析。
<2>、使用 request.getParameter 获得普通表单域内容。
从Servlet3.0开始可以 使用getParameter 获得上传表单中 普通字段值。
解决乱码 request.setCharacterEncoding
<3>获得文件上传域信息,使用Part。
注意getParameter使用 必须在 getPart 之前,文件乱码处理才会生效