创建一个dynamic web project 在创建一个包com.h 创建工程Hellohtml
package com.h; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class World extends HttpServlet{ @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 首先将访问修饰符覆写为public // 设置内容类型 resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html><head><title>Hello World Sample</title></head>"); out.println("<body><h1>Hello World Title<h1><h2>" +new Date().toLocaleString() + "</h2></body></html>"); out.flush(); } }
web.xmljava
<web-app servlet> <servlet-name>He</servlet-name> <servlet-class>com.h.World</servlet-class> </servlet> <servlet-mapping> <servlet-name>He</servlet-name><!-- servlet-name 要和上面的保持一致--> <url-pattern>/HelloWorld</url-pattern><!-- 注意前面要有斜线--> </servlet-mapping> </web-app>
工程右键 runweb
localhost:8080/Hello/HelloWorld 上面/HelloWorld对应He对应上面的He对应com.h.World 在Hello目录下在tomat的默认目录下浏览器
生命周期缓存
Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。服务器
init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。能够配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。不管有多少客户机访问Servlet,都不会重复执行init()。app
service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,并且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象做为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。jsp
destroy(): 仅执行一次,在服务器端中止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其余的线程,所以须要确认在调用destroy()方法时,这些线程已经终止或完成。ide
一、精确匹配: /directory/file1.jsp 二、目录匹配: /directory/* 三、扩展匹配: *.jsp <filter> <filter-name>authority</filter-name> <filter-class>com.util.AuthorityFilter</filter-class> </filter> <filter-mapping> <filter-name>authority</filter-name> <url-pattern>/pages/genbill/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>authority</filter-name> <url-pattern>/pages/cmm/*</url-pattern> </filter-mapping>
<servlet> <servlet-name>Servlet_03</servlet-name> <servlet-class>com.enterise.always.servlet.Servlet_03</servlet-class> <init-param> <param-name>name_01</param-name> <param-value>value_01</param-value> </init-param> <init-param> <param-name>name_02</param-name> <param-value>value_02</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Servlet_03</servlet-name> <url-pattern>/servlet/Servlet_03</url-pattern> </servlet-mapping> <context-param> <param-name>context_param</param-name> <param-value>value3</param-value> </context-param>
<init-param>就是初始化的数据 经过getInitParameter获取数据post
String s1 = this.getInitParameter("name_02");
<context-param>就是初始化的数据 通getServletContext().getInitParameter("congtext_param")获取数据
ServletContext servletContext=this.getServletContext(); //对SevletContext中参数进行操做
servletContext.getAttribute("count"); //获取
servletContext.setAttribute("count",count); //修改
//跳转至下一个servlet RequestDispatcher dispatcher = context.getRequestDispatcher("/ResulstServlet"); dispatcher.forward(request, response);
使用forward跳转则后面的response输出则不会执行,而用include来跳转,则include的servlet执行完后,再返回到原来的servlet执行response的输出
setStatus 设置响应行 当中 状态码
setHeader 设置响应头信息
getOutputStream 得到字节流 ---- 输出响应体内容
getWriter 得到字符流 ---- 输出响应体内容
文件拷贝 ---- 字节流
分析文件内容 --- 字符流 (中文操做 字符流)
200 请求处理成功
302 客户端重定向
304 客户端访问资源没有被修改,客户端访问本地缓存
404 访问资源不存在
500 服务器内部出错
refresh:3;url=http://www.itcast.cn -------- 3秒后自动跳转http://www.itcast.cn 网站
<meta content="3;url=/day06/response/demo3/result.html" http-equiv="refresh"> ---- 完成3秒自动跳转
response.setCharacterEncoding("utf-8"); 这个post,对get不起做用
response.setContentType("text/html;charset=utf-8"); 通常使用这个
注意:
一、getOutputStream和getWriter 不能同时使用
二、必须在getOutputStream和getWriter 以前 设置响应 编码
三、getOutputStream和getWriter 输出内容 是 HTTP响应体
四、getOutputStream和getWriter 存在缓冲区的 ,在service方法结束时,自动关闭流,flush缓冲区内容
案例六 文件下载
第一种:经过超连接 完成文件下载
* 若是浏览器能够识别该文件格式,直接打开,只有连接文件浏览器不识别文件格式,才会实现下载
<a href = "/data/aa.zip">zip 下载</a> 文件zip下载相对目录 <a href = "/data/b.jpg>jpg图片</a> 图片相对目录但不下载直接打开和超连接同样
第二种:经过Servlet程序实现下载
原理:经过Servlet读取目标程序,将资源返回客户端
经过程序下载文件 设置两个头信息 Content-Type Content-Disposition
<a href = "/工程目录?filename=aa.zip">zip 下载</a> 文件zip下载相对目录 <a href = "/工程目录?filename=b.jpg>jpg图片</a> 图片相对目录但不下载直接打开和超连接同样
response.setContentType(getServletContext().getMimeType(filename)); ---- 设置文件类型
response.setHeader("Content-Disposition", "attachment;filename="+ filename); ---- 设置文件以附件形式下载(对于浏览器识别格式文件)
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到文件名 String filename = request.getParameter("filename"); System.out.println(filename); response.setContentType(getServletContext().getMimeType(filename)); response.setHeader("Content-Disposition", "attachment;filename="+ filename); // 下载 读取目标文件,经过response 将目标文件内容写到客户端 // 绝对磁盘路径 读取文件 String fullFilename = getServletContext().getRealPath( "/工程目录/" + filename); InputStream in = new FileInputStream(fullFilename); OutputStream out = response.getOutputStream(); int b; while ((b = in.read()) != - 1) { out.write(b); } in.close(); out.close(); }