1.请求 1.1请求对象介绍
请求:获取资源。在 BS 架构中,就是客户端浏览器向服务器端发出询问。请求对象:就是在项目当中用于发送请求的对象。1.2请求对象常用方法-获取各种路径
String getContextPath() 获取虚拟目录名称String getServletPath() 获取Servlet映射路径String getRemoteAddr() 获取访问者ip地址String getQueryString() 获取请求的消息数据String getRequestURI() 获取统一资源标识符StringBuffer getRequestURL() 获取统一资源定位符1.3请求对象常用方法-获取请求头信息
String getHeader(String name) 根据请求头名称获取一个值Enumeration<String> getHeaders(String name) 根据请求头名称获取多个值Enumeration<String> getHeaderNames() 获取所有请求头名称1.4请求对象常用方法-获取请求参数信息
String getParameter(String name) 根据名称获取数据String[] getParameterValues(String name) 根据名称获取所有数据Enumeration<String> getParameterNames() 获取所有名称Map<String,String[]> getParameterMap() 获取所有参数的键值对1.5获取请求参数并封装对象 1.5.1. 手动封装方式 1.5.2. 反射封装方式 1.5.3. 工具类封装方式 1.6流对象获取请求信息
BufferedReader getReader() 获取字符输入流ServletInputStream getInputStream() 获取字节输入流1.7请求对象操作共享数据方法
void setAttribute(String name,Object value) 向请求域对象中存储数据Object getAttribute(String name) 通过名称获取请求域对象中的数据void removeAttribute(String name) 通过名称移除请求域对象中的数据1.8请求转发
请求转发:客户端的一次请求到达后,发现需要借助其他 Servlet 来实现功能。特点: 浏览器地址栏不变 域对象中的数据不丢失 负责转发的 Servlet 转发前后的响应正文会丢失 由转发的目的地来响应客户端
RequestDispatcher getRequestDispatcher(String name) 获取请求调度对象void forward(ServletRequest req,ServletResponse resp) 实现转发2.响应 2.1响应对象介绍
响应:回馈结果。在 BS 架构中,就是服务器给客户端浏览器反馈结果。响应对象:就是在项目中用于发送响应的对象。2.2字节流响应消息
ServletOutputStream getOutputStream() 获取响应字节输出流对象ServletOutputStream getOutputStream() 获取响应字节输出流对象void setContentType(“text/html;charset=UTF-8”)设置响应内容类型,解决中文乱码问题2.3字符流响应消息
PrintWriter getWriter() 获取响应字符输出流对象2.4响应图片
创建字节输入流对象,关联读取的图片路径。通过响应对象获取字节输出流对象。循环读取和写出图片。 代码 package com.itheima; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.Arrays; @WebServlet("/reviewDemo2") public class ReviewDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 创建字节输入流对象,关联读取的图片路径。 String realPath = getServletContext().getRealPath("/img/ad1.jpg"); System.out.println(realPath); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath)); // 2. 通过响应对象获取字节输出流对象。 ServletOutputStream os = resp.getOutputStream(); // 3. 循环读取和写出图片。 int len; byte[] bytes = new byte[1024]; while ((len = bis.read(bytes)) != -1) { os.write(bytes, 0, len); } bis.close(); os.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }2.5设置缓存
缓存:对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频繁请求服务器。以此来提高效率!void setDateHeader(String name,long time) 设置消息头添加缓存2.6定时刷新
定时刷新:过了指定时间后,页面自动进行跳转void setHeader(String name,String value) 设置消息头定时刷新2.7请求重定向
请求重定向:客户端的一次请求到达后,发现需要借助其他 Servlet 来实现功能。特点:浏览器地址栏会发生改变,两次请求、请求域对象中不能共享数据,可以重定向到其他服务器。重定向实现原理
设置响应状态码为 302 resp.setStatus(302);设置响应的资源路径(响应到哪里去,通过响应消息头 location 来指定)resp.setHeader(“location","/responseDemo07");响应对象重定向方法 void sendRedirect(String name) 设置重定向2.8文件下载
创建字节输入流,关联读取的文件。设置响应消息头支持的类型。设置响应消息头以下载方式打开资源。通过响应对象获取字节输出流对象。循环读写。释放资源。 代码 package com.itheima; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; @WebServlet("/reviewDemo3") public class ReviewDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 创建字节输入流,关联读取的文件。 String realPath = getServletContext().getRealPath("/img/ad1.jpg"); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath)); // 2. 设置响应消息头支持的类型。 resp.setHeader("Content-Type", "application/octet-stream"); // 3. 设置响应消息头以下载方式打开资源。 resp.setHeader("Content-Disposition", "attachment;filename=" + System.currentTimeMillis() + ".png"); // 4. 通过响应对象获取字节输出流对象。 ServletOutputStream os = resp.getOutputStream(); // 5. 循环读写。 int len; byte[] bytes = new byte[1024]; while ((len = bis.read(bytes)) != -1) { os.write(bytes, 0, len); } // 6. 释放资源。 bis.close(); os.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }3.案例 学生管理系统 3.1案例实现-资源准备
创建一个 web 项目。在 web 目录下创建一个 index.html,包含两个超链接标签(添加学生、查看学生)。在 web 目录下创建一个 addStudent.html,用于实现添加功能的表单页面。在 src 下创建一个 Student 类,用于封装学生信息。3.2案例实现-添加功能
创建 AddStudentServlet 类。继承 HttpServlet。重写 doGet 和 doPost 方法。获取表单中的数据。将获取到的数据封装成 Student 对象。将 Student 对象中的数据保存到 d:\stu.txt 文件中。通过定时刷新功能完成对浏览器的响应3.3案例实现-查看功能
创建 ListStudentServlet 类。继承 HttpServlet。重写 doGet 和 doPost 方法。通过字符输入流读取 d:\stu.txt 文件中的数据。将读到的数据封装到 Student 对象中。将多个 Student 对象保存到集合中。遍历集合,将数据响应到浏览器 代码 package com.itheima.servlet; import com.itheima.bean.Student; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; @WebServlet("/addStudent") public class AddStudent extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String age = req.getParameter("age"); String score = req.getParameter("score"); Student student = new Student(); student.setUsername(username); student.setAge(Integer.parseInt(age)); student.setScore(Integer.parseInt(score)); BufferedWriter bw = new BufferedWriter(new FileWriter("/stu.txt",true)); bw.write(student.getUsername()+","+student.getAge()+","+student.getScore()); bw.newLine(); bw.close(); resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("添加成功,2s后跳转首页..."); resp.setHeader("Refresh","2;URL=/review/index.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } package com.itheima.servlet; import com.itheima.bean.Student; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.ArrayList; @WebServlet("/listStudentServlet") public class ListStudentServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { BufferedReader br = new BufferedReader(new FileReader("/stu.txt")); ArrayList<Student>students = new ArrayList<>(); String line; while ((line = br.readLine()) != null) { String[] split = line.split(","); Student student = new Student(split[0],Integer.parseInt(split[1]),Integer.parseInt(split[2])); students.add(student); } resp.setContentType("text/html;charset=UTF-8"); //获取输出流对象 PrintWriter pw = resp.getWriter(); for(Student s : students) { pw.write(s.getUsername() + "," + s.getAge() + "," + s.getScore()); pw.write("<br>"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <a href="addStudent.html"> 添加学生</a> <a href="/review/listStudentServlet"> 查看学生</a> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加学生</title> </head> <body> <form action="/review/addStudent"> 姓名:<input type="text" name="username"><br/> 年龄:<input type="number" name="age"><br/> 学分:<input type="number" name="score"><br/> <button type="submit">保存</button> </form> </body> </html>