Servleter二(Cookie和Session、过滤器、监听器、文件上传及下载)

1.Session和Cookie:cookie是写在客户端,session是写在服务器上。HttpServletReqest对象既可以得到session,也可以得到cookie。添加cookie要用HttpServletResponse对象。session的对象会自动添加。
Cookie中有name和value两个属性,name是由final修饰的,不可改变。Cookie的添加,将用户名写到Cookie中,退出后的下一次登录可以不用写用户名,直接从Cookie中获取。Cookie用来区分Session所对应的对象。

Cookie cookie=new Cookie("username",username);//分别为name属性和value属性
cookie.setMaxAge(60*5);//设置Cookie的周期,单位为秒,这是5分钟。
resp.addCookie(cookie);//响应后写到客户端

Cookie的使用:

 Cookie[] cookies=req.getCookies();//获得所有Cookie,可能有用户名的Cookie,也可能有头像的Cookie
 if(null!=cookies)
    {
        for(Cookie cookie:cookies)
        {
            if("username".equals(cookie.getName()))//得到用户名的Cookie
            {
                username=cookie.getValue();//得到用户名,退出后的下一次登录不用填写。
            }
        }
    }

Session是写在服务器的,Session中有个map,可以在Session中添加键值对。第一次请求时没有Cookie,服务器会创建有个HttpSession,响应时,会增加一个响应报头set-cookie,JSESSIONID的值等于Session的ID。下一次请求时根据Cookie的中的JSESSIONID的值就可以得到对应的Session对象。
2.过滤器:在执行目标servlet前后会执行一些其他的业务。写过滤器servlet要实现Filter接口。该接口中有三个方法。init、doFilter和destroy方法。init方法会传进一个FilterConfig对象。这个对象和ServletConfig对象类似,有getFilterNames、getServletContext、getInitParameter和getInitParameterNames方法。Filter的配置和servlet的类似,可以通过两种方式来配置,注释或web.xml的方式。
web.xml方式配置,当访问到wel时,就会调用filter的doFilter方法。

 <filter>
        <filter-name>filter</filter-name>
        <filter-class>Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/wel</url-pattern>
    </filter-mapping>

通过注释进行配置:

@WebFilter("/wel")

3.请求响应包装类:
ServletRequestWrapper
ServletResponseWrapper
HttpServletRequestWrapper
HttpServletResponseWrapper
要重写Request或Responce方法时,继承以上这几个类。可以重写其中的方法。
4.监听器:监听的对象是ServletContext,实例化该对象时,会自动调用contextInitialized方法,销毁时会自动调用contextDestroyed方法。监听器类的使用:

public class Listener implements ServletContextListener {
    @Override public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("before---------------------");
    }
    @Override public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("After----------------------");
    }
}

要将该监听器类注册给Tomcat容器后才会起作用,注册的方式有两种。通过配置或注释:
配置:

<listener>
<listener-class>Listener</listener-class>
</listener>

注释:

@WebListener

5.文件上传:用form表单,将form中的enctype属性设置成multipart/form-data,用post请求进行上传。form表单如下:

<form enctype="multipart/form-data" action="Upload" method="post">
	文件:<input type="file" name="pic" /><br/>
	描述:<input type="text" name="dis" />
	<input type="submit" value="提交"/>
</form>

接受文件的Servlet必须加注释@MultipartConfig。HttpServletRequest增加了对上传文件的处理,getPart可以得到Part对象。Part对象封装了上传文件的大小,名字等信息。其中write方法可以将上传的文件写入磁盘中。

@MultipartConfig//表示该servlet处理上传的文件
@WebServlet("/Upload")
public class UpServlet extends HttpServlet {
    @Override protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        Part part=req.getPart("pic");//根据指定名称得到文件
        part.write("e:/aaa/"+part.getSubmittedFileName());//将文件写入到磁盘中
    }
}

6.文件下载:浏览器不能识别MIME类型时会出现下载对话框。在servlet程序中,要对响应报头进行如下设置:

resp.setHeader("Content-Disposition","attachment;filename=show.jpg");//show.jpg即为下载到本地的文件名。

下载的底层是IO:

@WebServlet("/down")
public class DownServlet extends HttpServlet {
    @Override protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        resp.setHeader("Content-Disposition","attachment;filename=show.jpg");
        ServletContext servletContext=this.getServletContext();
        String dir=servletContext.getRealPath("res");//得到该文件夹的绝对路径
        InputStream inputStream=new FileInputStream(dir+"/untitled.png");//构建指向目标文件的输入流
        ServletOutputStream servletOutputStream=resp.getOutputStream();//输出流
        byte[] buffer=new byte[1024];
        int len=0;
        while((len=inputStream.read(buffer))!=-1)
        {
            servletOutputStream.write(buffer,0,len);
        }
        inputStream.close();
        servletOutputStream.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值