javaweb02_HttpServletResponse和HttpServletRequest

javaweb02_HttpServletResponse和HttpServletRequest


HttpServletResponse


文件下载示例:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	//文件全路径
	String realPath = "D:\\eclipseworkspace\\javawebdemo\\src\\main\\resources\\头像.jpg";
	//通过字符串截取获得文件名
	String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
	//Content-Disposition: attachment 表示消息体应该被下载到本地,filename的值指定下载后的文件名(中文需要经URLEncoder类进行编码)
	resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
	//获取下载文件的输入流
	FileInputStream in =  new FileInputStream(realPath);
	//创建缓冲区
	int len = 0;
	byte[] buffer = new byte[1024];
	//获取输出流对象
	ServletOutputStream out = resp.getOutputStream();
	//使用输出流将缓冲区数据输出到客户端
	while ((len=in.read(buffer))>0){
		out.write(buffer,0,len);
	}
	out.close();
	in.close();
}

生成验证码示例:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	//让浏览器3秒刷新一次
	resp.setHeader("refresh", "3");
	//在内存中创建一个图片
	BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
	//得到画笔
	Graphics2D graphics = (Graphics2D) image.getGraphics();
	//设置图片背景色
	graphics.setColor(Color.white);
	graphics.fillRect(0, 0, 80, 20);
	//给图片写数据
	graphics.setColor(Color.BLUE);
	graphics.setFont(new Font(null, Font.BOLD, 20));	
	graphics.drawString(makeNum(), 0, 20);
	//告诉浏览器这个请求用图片打开
	resp.setContentType("image/jpeg");
	//不让浏览器缓存
	resp.setDateHeader("expires",-1);
	resp.setHeader("Cache-Control", "no-cache");
	resp.setHeader("Pragma", "no-cache");
	//将图片写给浏览器
	ImageIO.write(image,"jpg",resp.getOutputStream());
}

/**
 * 生成7位随机数并转换为字符串
 */
private String makeNum() {
	Random random = new Random();
	String num = random.nextInt(9999999)+"";
	StringBuffer sb = new StringBuffer();
	for(int i=0;i<7-num.length();i++) {
		sb.append("0");
	}
	return num = sb.toString()+num;
}

HttpServletResponse实现请求重定向(重点):

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	System.out.println("进入AServlet");
	resp.sendRedirect("/javawebdemo/b");
}

在这里插入图片描述
请求url:http://localhost:8080/javawebdemo/a
结果页面重定向至:http://localhost:8080/javawebdemo/b
地址栏url发生了改变!

重定向还可以写成以下形式:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	System.out.println("进入AServlet");
	resp.setHeader("Location", "/javawebdemo/b");
	resp.setStatus(302);
}

重定向与请求转发的区别:

请求转发的url不会改变
重定向的url会发生改变


重定向的应用:登录逻辑

添加依赖:

<dependency>
	<groupId>javax.servlet.jsp</groupId>
	<artifactId>javax.servlet.jsp-api</artifactId>
	<version>2.3.3</version>
</dependency>

登录页面:

<html>
<body>
<h2>Login</h2>
<%-- ${pageContext.request.contextPath} 代表当前的项目路径 --%>
<form action="${pageContext.request.contextPath}/login" method="post">
	用户名:<input type="text" name="username"/>
	密码:<input type="password" name="password"/>
	<input type="submit"/>
</form>
</body>
</html>

LoginServlet:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	System.out.println("Post进入LoginServlet");
	//解决请求中文乱码
	req.setCharacterEncoding("utf-8");
	String username = req.getParameter("username");
	String password = req.getParameter("password");
	
	System.out.println(username);
	System.out.println(password);
	
	resp.sendRedirect(req.getContextPath()+"/success.jsp");
}

success.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<h1>Success</h1>
</body>
</html>

HttpServletRequest

获取前端传递的参数:

String username = req.getParameter("username");
String password = req.getParameter("password");
//这个一般用于获取多选框的值
String[] hobbys = req.getParameterValues("hobbys");

请求转发的两种方式:

this.getServletContext().getRequestDispatcher("/success.jsp").forward(req, resp);
req.getRequestDispatcher("/success.jsp").forward(req, resp);

注意:
请求转发的映射地址为项目根路径:http://localhost:8080/javawebdemo
重定向的映射地址为:http://localhost:8080

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值