ServletContext对象 :上下文对象
getServletContext()
可以搜索当前工程目录下面的资源文件
getServletContext().getRealPath(path),根据相对路径获取服务器上资源的绝对路径
getServletContext().getResourceAsStream(path),根据相对路径获取服务器上资源的输入字节流
响应对象:客户端发送请求时,给客户端一个响应结果(视频 视频 图片) 高速客户端服务器已经接收到请求
ServletResponse(子类) HttpServletResponse(父类)
由tomcat创建 不需要要实例化 直接使用
响应对象组成:响应行 响应头 响应体
(1)响应行:包含一些状态码 和协议
http协议:请求与响应的协议
一次性连接协议 (请求和响应都完成后 断开连接 保证数据安全)
无状态的协议:不能记录上一次请求的状态和响应
不安全
https协议:http+ssl证书(加密数据的证书) 安全性:数据传输过程加密
http发展过程:0.9只支持文字传输
1.0一次性协议
1.1支持长连接 keep alive(连接的时间)
socket协议:地城tcp+udap 前者 安全慢 后者快不安全
tcp三次握手:
状态码: 1xx:服务器接收到请求 继续执行后面的操作(断点续传)
2xx:响应成功
3xx:重定向
4xx:路径找不到(页面不存在 tomcat没有运行 网页放在web-inf下)
5xx:服务器报错 (Java代码)
自定义设置状态码以及状态信息:
(2)响应头:
(3)设置响应头
resp.set():键值对性时赋值 键设置过 会进行覆盖
resp.add():键值对性时赋值 键重复 不会覆盖 只追加 执行最后一个
resp.setHeader("refresh","2秒,2.html")//跳转
//从服务器中读取图片输出到浏览器中
public class servlet01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应头的输出格式
resp.setHeader("content-type","imagin");
//得到服务器中的图片(out文件夹下的web-inf )输入流 InputStream is = req.getServletContext().getResourceAsStream("WEB-INF/img/download.jpg"); //获得输出流
OutputStream out = resp.getOutputStream(); int length = -1; byte[] bytes =new byte[1024]; while((length=is.read(bytes))!=-1 ){ out.write(bytes,0,length); } out.close(); is.close(); } }
(4)响应体: 直接在页面中 写内容:通过响应对象获取流对象
1.resp.getOutputStream() 用于写字节
2.resp.getWrite() 用于写字符
两个流不能同时使用 不报错 只出现一个
请求对象:用户发送请求时封装的请求信息 开发不用去操作 浏览器封装 Tomcat容器创建
HttpServletRequest extends ServletRequest
(1)请求行:获取用户当前协议,项目路径,端口等信息
获取请求行信息:
public class servlet04 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String scheme = req.getScheme();//获取协议 String path = req.getServletPath();//请求路径 String cpath = req.getContextPath();//项目名 String method = req.getMethod();//请求的方式 String query = req.getQueryString();//地址栏传入的参数 String url =req.getRequestURI();//形目明+访问路径 String sname = req.getServerName(); //ip地址 } }
(2)请求头:客户端发送请求的封装的一些头部信息 不需要关注 只需要获取就行
1.通过键获取:req.getHeader(" "); //返回单个 键值形式
类似迭代器Enumeration<String> e = req.getHeaderNames(); //获取所有
while(e.hasElements()){
String str = e.nextElement()
sout(key+req.getHeader(str))
}
(3)请求体:发送请求 传入服务器的参数(键值对)
地址?键1=值1&键2=值2&键3=值3 获取都是value值
方法:String str = getParameter("键") ====>表单中的name值
a标签跳转传递的参数 不能通过name值获取
<a href="?filename=">
String [] str = getParmenterValues("键")===》获取复选按钮
文件上传jar包:
ServletFileuload.isMultipartContent(req):用于判断是否以文件格式进行上传
//获取核心工厂对象
FileItemFactory factory = new DiskFileItemFactory();
//获取文件上传对象
ServletFileUpload sfu = new ServletFileUpload(factory);
//获取form表单中所有input标签的所有条目
List<FileItem> list =sfu.parseRequest(req);
Iterator<FileItem> iter = list.iterator();
while (iter.hasNext()) {
FileItem fileItem = iter.next();
//判断是文件是普通文本
if (fileItem.isFormField()) {
//获得条目的name值