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();
}
}