ServletRequest应用
ServletRequest应用非常广泛,下面是一些例子:
-
获取请求参数:可以使用HttpServletRequest的getParameter()方法获取请求参数。
-
获取请求头信息:可以使用HttpServletRequest的getHeader()方法获取请求头信息。
-
获取Session对象:使用HttpServletRequest的getSession()方法可以获取HttpSession对象,从而存储和获取用户会话数据。
-
获取服务器路径等信息:可以使用HttpServletRequest的getServletContext()方法获取ServletContext对象,从而获取应用程序的相关信息。
-
文件上传:可以使用HttpServletRequest的getPart()方法获取上传的文件部分,从而实现文件上传。
这些只是ServletRequest的一些用例,实际上它可以用于许多其他方面的任务。
讲讲servlet怎么获取form表单的值,并输出到浏览器
要注意action的路径,我这里浏览器默认路径是http://localhost:8080/s1
,/para是servlet页面的访问路径,就是下面的ParameterReq类,因为后端要获取这个值,所以要把form表单action属性设置为/s1/para,因为我开始浏览器的请求路径就是/s1,那后端又是怎么获取表单的值的呢,对,就是获取name属性的值,当你在输入框输入的参数时,点击提交的那一刻,后端就拿到了输入框的值,并把内容响应到浏览器,或者也可以打印到控制台
form表单
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<form action="/s1/para" method="get">
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<input type="submit">
<input type="reset">
</form>
</body>
</html>
请求的servlet
package com.qcnel;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ParameterReq extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
// 输出到浏览器
resp.getWriter().write(username+":"+password);
// 打印在控制台
System.out.println(username);
System.out.println(password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
web.xml需要配置这些,然后就可以启动tomcat了
浏览器的输出
控制台的输出
ServletResponse应用
ServletResponse是Java Servlet规范中的一部分,它表示向客户端发送的HTTP响应。ServletResponse通过提供方法设置响应状态、响应头信息、响应正文和Cookie等,使得开发者可以更加灵活地控制和处理响应信息。下面是一些ServletResponse应用的例子:
-
设置响应状态和编码:使用ServletResponse的setStatus()方法可以设置响应状态码,使用setCharacterEncoding()方法可以设置响应编码。
-
设置响应头信息:使用ServletResponse的setHeader()方法可以设置响应头信息,例如Content-Type、Content-Length等。
-
设置响应正文:可以使用ServletResponse的getWriter()方法获取PrintWriter对象,从而将响应正文输出到客户端。
-
设置Cookie:使用ServletResponse的addCookie()方法可以设置响应的Cookie。
-
文件下载:可以使用ServletResponse的getOutputStream()方法将文件输出到客户端下载。
这些只是一些ServletResponse的常用用例,实际上还有很多其他应用场景。通过使用ServletResponse,开发者可以更加自由灵活地控制和处理HTTP响应。
Response下载文件
package com.qcnel;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class DownLoad extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取下载的文件路径(注意获取这里获取的是绝对路径,先获取ServletContext再使用ServletContext的getRealPath方法获取绝对路径)
String filePath = "D:\\ideaProject\\Maven-02\\src\\main\\resources\\1.jpg";
File file = new File(filePath);
if(file.exists()) {
// 设置 HTTP 响应中 "Content-Type" 响应头的值。它告诉客户端(浏览器)该响应中的数据是一个 "application/octet-stream" 的二进制流文件,因此客户端应该以二进制流的形式接收数据。
resp.setContentType("application/octet-stream");
//设置响应头控制浏览器以下载的形式打开文件
resp.setHeader("Content-Disposition", "attachment;filename=1.jpg");
//获取下载文件的输入流
FileInputStream fis = new FileInputStream(file);
// BufferedInputStream 是一个带有缓冲的输入流,它可以提高文件读取速度。
// 在使用 FileInputStream 读取文件时,每次都需要从磁盘中读取若干个字节,并进行数据传输,因此效率相对较低。
// 而使用 BufferedInputStream 可以对 FileInputStream 进行包装,每次读取时先将一定数量的数据读取到缓存区中,然后再逐个读取,减少了频繁的磁盘操作,提高了读取速度。
// 具体来说,BufferedInputStream 内部维护了一个缓冲区,读取数据时会先从缓冲区中读取,如果缓冲区为空,则再从底层输入流中读取一定数量的字节并填充到缓冲区中,以此类推。
BufferedInputStream bis = new BufferedInputStream(fis);
//通过response对象获取OutputStream流
OutputStream os = resp.getOutputStream();
// 创建缓冲区
int len;
byte[] buff = new byte[1024];
while((len = bis.read(buff)) != -1) {
//将缓冲区的数据输出到浏览器
os.write(buff, 0, len);
}
bis.close();
fis.close();
os.flush();
os.close();
} else {
resp.getWriter().println("File not found");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
Response验证码
package com.qcnel;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class Captcha extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//浏览器2秒自动刷新一次
resp.setHeader("refresh","1");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//得到图片后对图片进行操作
Graphics2D g = (Graphics2D) image.getGraphics();//笔
//设置图片的背景颜色
g.setColor(Color.white);
g.fillRect(0,0,80,20);//颜色的填充范围
//给图片写数据
g.setColor(Color.black);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(num(),0,20);
//告诉浏览器这个请求用图片的方式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存会节省掉很多空间
resp.setDateHeader("expires",-1);
resp.setHeader("Catch-Control", "no-cache");
resp.setHeader("Pragma","no-cache");
//图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
private String num(){
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");
}
num = sb.toString() + num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}