web服务器接收到客户端的http请求后,针对这个请求,分别创建一个代表请求的HttpServletRequest对象和一个代表响应的HttpServletResponse对象。
- 获取客户端请求过来的参数:HttpServletRequest
- 给客户端响应一些数据:HttpServletResponse
HttpServletRequest代表客户端的请求,用户通过HTTP协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest对象中,通过HttpServletRequest的方法,可以获得客户端的所有信息。
servlet:
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求与响应的编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 获取前端传递来的参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] skills = request.getParameterValues("skills");
// 验证输入的username和password
if (username.equals("admin") && password.equals("123456")){
System.out.println("登陆成功!");
request.getRequestDispatcher("/success.jsp").forward(request,response);
}else {
System.out.println("登录失败!");
request.getRequestDispatcher("/failure.jsp").forward(request,response);
}
System.out.println(username);
System.out.println(password);
for (String str : skills) {
System.out.print(str + "\t");
}
System.out.println("admin" == username);
System.out.println("123456" == password);
}
}
登录页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
首页
根据输入的账户密码是否正确跳转到success.jsp与failure.jsp
HttpServletResponse获取两个输出流:getPOutputStream()和getWiter()。获取的两个输出流不能同时使用,会报错。
HttpServletResponse应用:
/**
* 使用HttpServletResponse实现下载文件
*
* @Author:xiezr
* @Creat:2021-07-29 15:12
*/
public class HttpServletResponseTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, UnsupportedEncodingException {
// 1.
String filePath = "G:\\SummerWeb\\servletStudy\\src\\main\\webapp\\images\\beautifulGirl.jpg";
// 2.使用substring截取文件名
String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
// 3.设置浏览器支持下载文件,设置文件名编码格式为UTF-8,防止下载的时候文件名显示错误乱码
resp.setHeader("Content-disposition","attachment;filename"+ URLEncoder.encode(fileName, "UTF-8"));
// 4.使用缓冲流,提高效率
BufferedInputStream fis = null;
BufferedOutputStream bos = null;
try {
fis = new BufferedInputStream(new FileInputStream(filePath));
// 5.创建响应输出流,ServletOutputStream继承与OutputStream,属于节点流
ServletOutputStream sos = resp.getOutputStream();
bos = new BufferedOutputStream(sos);
// 读取文件,写出文件到浏览器,即下载
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1){
bos.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 6.关闭资源就不显示了
}
}
}
运行结果:
public class CheckCodeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.
response.setHeader("refresh","3");
// 2.
BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);
// 3.获取“画笔”工具
Graphics2D graphics = (Graphics2D) image.getGraphics();
// 修改背景颜色,填充颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,100,30);
// 4.给图片写数据
graphics.setColor(Color.MAGENTA);
// 设置字体类型与字体大小
graphics.setFont(new Font(null,Font.BOLD,30));
// 将随机数写入图片
graphics.drawString(productCode(),0,30);
// 5.
response.setContentType("image/jpg");
// 设置浏览器不要缓存
response.setDateHeader("expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
// 6.图片IO流写出到浏览器上
ImageIO.write(image,"jpg",response.getOutputStream());
}
// 生成随机数
public String productCode(){
Random random = new Random();
// 把生成的随机数转换为String类型
String str = String.valueOf(random.nextInt(666666));
// 如果随机数生成的位数少于6为,使用0补齐
StringBuffer sbuffer = new StringBuffer();
for (int i = 0; i < 6 - str.length(); i++) {
sbuffer.append("0");
}
return sbuffer + str;
}
}
运行结果:
一个web资源收到客户端的请求后,他会通知客户端去访问另一个web资源,这个过程叫做重定向(地址栏的url地址会改变)。
public class RedirectTest extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("/servletStudy/hello");
}
}
看一下浏览器:
浏览器地址栏 | 请求次数 | 是否共享Request域的数据 | 能否访问WEB-INF目录下的资源 | 能否访问工程外的资源 | |
---|---|---|---|---|---|
请求转发 | 没有改变 | 一次 | 是 | 是 | 否 |
请求重定向 | 发生改变 | 两次 | 否 | 否 | 是 |