在学习之初,总是对过滤器、拦截器、监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力!
如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户端(浏览器)与服务器之间的沟通桥梁,可以简单的理解为我们手机想要和电脑之间进行传输数据的USB。
<servlet>
<servlet-name>Web</servlet-name>
<servlet-class>com.Web</servlet-class>
<multipart-config>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>Web</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这是servlet重要的配置文件,当然里边涉及到通配符。
<filter>
<filter-name>Test</filter-name>
<filter-class>com.Test</filter-class>
</filter>
<filter-mapping>
<filter-name>Test</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这是过滤器的配置文件,当把Web项目发布到服务器以后,项目进行加载,会调用过滤器com.Test类中(该类实现HttpServlet)的init方法,当访问的Url符合过滤器的url,会调用doFile()方法。过滤器的作用是进行权限分配以及设置编码格式,需要注意在doFile方法中必须进行chain.doFile(request,response),进行该操作是为了进行下一个过滤器,这就要说一下过滤器链,所谓过滤器链就是多个过滤器组成的,它们的执行顺序是按照web.xml文件中配置的先后顺序进行执行。
<filter>
<filter-name>Test</filter-name>
<filter-class>com.Test</filter-class>
<init-param>
<param-name>number</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Test</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上边配置的过滤器中添加了初始参数,在执行的过程中可以通过request.getParameter("name")获取初始参数,用该方法可以统计浏览网页人数。
try { //获取上传的文件
Part part=request.getPart("file");
//获取请求的信息
String name=part.getHeader("content-disposition");
//System.out.println(name);//测试使用
//System.out.println(desc);// //获取上传文件的目录
String root=request.getServletContext().getRealPath("/upload");
System.out.println("测试上传文件的路径:"+root); //获取文件的后缀
String str=name.substring(name.lastIndexOf("."), name.length()-1);
System.out.println("测试获取文件的后缀:"+str); //生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的
String filename=root+"\\"+ UUID.randomUUID().toString()+str;
System.out.println("测试产生新的文件名:"+filename); //上传文件到指定目录,不想上传文件就不调用这个
part.write(filename); request.setAttribute("info", "上传文件成功");
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("info", "上传文件失败");
}
request.getRequestDispatcher("/success.jsp").forward(request, response);
这是文件上传的操作。
String fileName = "我的.txt";
OutputStream out = null;
FileInputStream fis = null;
// 1.获取资源文件的路径,当文件名是中文的时候出现不正常的情况,所以需要进行url编码
String path = "C:\\Users\\admin\\Desktop\\我的.txt";
try {
// 2.根据获取到的路径,构建文件流对象
fis = new FileInputStream(path);
out = response.getOutputStream();
// 5.设置http响应头,告诉浏览器以下载的方式处理我们的响应信息
response.setCharacterEncoding("utf-8");
response.setHeader("content-disposition", "attachment;filename=" + fileName);
// 6.开始写文件
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) != -1) {
out.write(buf, 0, len);
}
} finally {
if (fis != null) {
fis.close();
} }
这是下载的操作,需要注意的是该操作需要对中文进行编码,要不然不能进行下载,还有就是必须进行该操作:response.setHeader("content-disposition", "attachment;filename=" + fileName);,这个主要是告诉浏览器进行下载操作,要不然页面会显示你文件的内容。