上一篇:JavaWeb学习笔记(四)servletContext
复习浏览器访问过程:
1. 监听8080端口,等待浏览器Http请求,解析url地址,在web.xml中匹配到对应的servlet
2. 根据请求信息构建request对象,构建响应对象response,构建该servlet实例对象,通过Service方法,调用doGet(request,response)
一、HttpServletResponse
1. 向浏览器输出信息
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer= resp.getWriter();
writer.print("<h1>404</h1>");
ServletOutputStream out = resp.getOutputStream();
out.print("abcdefg");
2. 下载文件
先放入一个资源文件
//给出文件真正的位置
String realPath = "D:/IdeaProjects/2021_6_16_kuangshen/2021_06_16/servlet01/servlet_1/src/resources/柿子.png";
//文件的名称是最后一个 / 后面的字符串
String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
//让浏览器支持下载,以及允许中文
resp.setHeader("content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
// //获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// //创建缓存区
int len =0;
byte[] buffer = new byte[1024];
// //获取outputStream对象(奇怪的是,这句一直出错,后来也没有修改又对了。。。)
ServletOutputStream out = resp.getOutputStream();
// //将输入流写入缓冲区,再用输出流输出到浏览器页面
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
// //关闭流
in.close();
out.close();
下载成功
3. 生成验证码
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让浏览器三秒刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
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.BLUE);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(makeRandom(),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());
}
private String makeRandom(){
Random r = new Random();
String num = r.nextInt(9999)+"";
StringBuffer sb = new StringBuffer();
for (int i=0;i<4-num.length();i++){//缺几位数字,补几个0
sb.append("0");
}
num = sb.toString() +num;
return num;
}
4. 重定向(最重要)
必须加tomat配置的路径/servlet_1
resp.sendRedirect("/servlet_1/hello");
一个注册页面的例子:
<%--解决浏览器显示的中文乱码--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>regist</h2>
<%--将前端数据提交给web.xml下/hello对应的类处理--%>
<form action="hello" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="pwd"><br>
<input type="submit">
</form>
</body>
</html>
String username = req.getParameter("username");
String password = req.getParameter("pwd");
System.out.println(username+":"+password);
resp.sendRedirect(req.getContextPath()+"/success.jsp");
二、HttpServletRequest
1. 获取前端传来的数据
(1) req.getParameter
String username = req.getParameter("username");
String password = req.getParameter("pwd");
System.out.println(username+":"+password);
输出:
(2) req.getParameterValues
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>regist</h2>
<%--将前端数据提交给web.xml下/hello对应的类处理--%>
<form action="hello" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="pwd"><br>
爱好:<input type="checkbox" name="hobbys" value="唱歌">唱歌
<input type="checkbox" name="hobbys" value="跳舞">跳舞
<input type="checkbox" name="hobbys" value="绘画">绘画
<input type="submit">
</form>
</body>
</html>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决从浏览器取到的数据是中文乱码
req.setCharacterEncoding("utf-8");
String[] a = req.getParameterValues("hobbys");
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
输出:
2. 请求转发
不用加tomat配置的路径/servlet_1
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
下一篇:JavaWeb学习笔记(六)Cookie 和 Session