Web基础之Request对象和Response对象项目实战
一、知识回顾:
Request请求对象:主要的作用是获取客户端提交过来的参数,以及转发请求等;
Response响应对象:主要作用是处理客户端的请求;可以设置响应状态,响应正文等一系列响应信息;
对两个对象的API有一定的了解;
二、项目实战:
项目实战1:简单的登录验证
项目实战2:图片下载
项目实战3:文件列表下载
整体项目结构:
三、项目源代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
<div style="text-align: center">欢迎注册华信会员</div>
<form action="mylogin" method="POST">
<div style="text-align: center">
<span>用户名:</span>:<input type="text" name="userName"><br />
<span>密 码:</span><input type="text" name="pwd"><br />
<input type="submit" value="确定"><input type="reset"
value="重置">
</div>
</form>
</body>
</html>
package com.hx.login;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置请求编码,防止乱码(POST请求方式)
req.setCharacterEncoding("UTF-8");
// 获取客户端提交过来的用户名和密码
String name=req.getParameter("userName");
String pwd=req.getParameter("pwd");
// 登录校验
if("刘让洲".equals(name)&&"123456".equals(pwd)){
writeResponse(resp, "恭喜您登陆成功!");
}else{
writeResponse(resp, "登陆失败!");
}
}
protected void writeResponse(HttpServletResponse resp,String content) throws IOException {
// 设置响应类型以及浏览器的解析编码
resp.setContentType("text/html;charset=utf-8;");
// 响应正文输出
resp.getWriter().write(content);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
package com.hx.login;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownLoadImageServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//1.拿到图片的路径
String path =req.getServletContext().getRealPath("/img/pic1.jpg");
//2.获取图片的输入流
InputStream in = new FileInputStream(path);
//3.设置相应头
String contentType=req.getServletContext().getMimeType(".jpg");
//3.1设置响应正文的MIME类型
resp.setContentType(contentType);
//3.2设置响应正文的长度
resp.setContentLength(in.available());
//3.3.设置下载文件的描述信息
resp.setHeader("Content-Disposition","attachment;fileName=dowmload.jpg");
//4.输出响应正文
OutputStream out =resp.getOutputStream();
byte [] bytes = new byte[1024];
int len =in.read(bytes);
while(len!=-1){
out.write(bytes, 0, len);
len =in.read(bytes);
}
//关闭流
in.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>可下载文件列表</title>
</head>
<body style="text-align: center">
<div
style="width: 250px; height: 180px; text-align: center; margin: 0 auto">
<table border="2">
<caption>可下载文件列表</caption>
<tr>
<th>序号</th>
<th>文件名</th>
<th>操作</th>
</tr>
<tr>
<td>1</td>
<td>JDBC.docx</td>
<td><a
href="http://localhost:8080/Servlet03/comdown?fileName=JDBC.docx">下载</a></td>
</tr>
<tr>
<td>2</td>
<td>pic1.jpg</td>
<td><a
href="http://localhost:8080/Servlet03/comdown?fileName=pic1.jpg">下载</a></td>
</tr>
<tr>
<td>3</td>
<td>WEB BASE.xlsx</td>
<td><a
href="http://localhost:8080/Servlet03/comdown?fileName=WEB BASE.xlsx">下载</a></td>
</tr>
</table>
</div>
</body>
</html>
package com.hx.login;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CommonDownLoadServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//判断是否盗链,不懂可以略过
String referer =req.getHeader("Referer");
if(referer!=null && !"".equals(referer.trim())){
int index0 =referer.lastIndexOf("/");
String temp =referer.substring(0,index0);
index0=temp.lastIndexOf("/");
String srcAddress=temp.substring(index0);
String contextPath=req.getContextPath();
if(!srcAddress.equals(contextPath)){
resp.sendError(404, "你个盗链狗!");
return;
}
}
//获取要下载的文件名
String fileName=req.getParameter("fileName");
//判断文件是否为空
if(fileName==null || "".equals(fileName.trim())){
//设置响应正文,防止乱码
resp.setContentType("text/html;charset=utf-8");
// resp.sendError(404,"请指定下载文件名称!");
resp.getWriter().write("请指定下载文件名称!");
return;
}
//获取要下载文件的MIME类型
int index=fileName.lastIndexOf(".");
String mimeType=null;
//如果文件没有后缀,则将文件mime类型设置问二进制文件
if(index<0){
mimeType=req.getServletContext().getInitParameter(".bin");
}else{
//拿到文件的后缀
String subfix=fileName.substring(index);
mimeType=req.getServletContext().getMimeType(subfix);
if(mimeType==null || "".equals(subfix.trim())){
mimeType=req.getServletContext().getInitParameter(".bin");
}
}
//获取文件输入流
InputStream in = req.getServletContext().getResourceAsStream("/File/"+fileName);
//设置响应头
String contentType=req.getServletContext().getMimeType(mimeType);
resp.setHeader("Content-Type", contentType+";charset=UTF-8;");
resp.setContentLength(in.available());
resp.addHeader("Content-Disposition", "attachment;fileName="+fileName);
OutputStream out =resp.getOutputStream();
byte [] bytes=new byte[1024];
int len =in.read(bytes);
while(len!=-1){
out.write(bytes, 0, len);
len =in.read(bytes);
}
//关闭流
in.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Servlet03</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.hx.login.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/mylogin</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>com.hx.login.DownLoadImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/down</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>comdownload</servlet-name>
<servlet-class>com.hx.login.CommonDownLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>comdownload</servlet-name>
<url-pattern>/comdown</url-pattern>
</servlet-mapping>
</web-app>
三、项目运行效果:
简单登录验证:
单张图片下载:
文件列表下载:点击下载即可下载相应的文件到本地;
四、总结
1、对Request对象和Response对象有了更加深刻的了解;
2、知道Request对象和Response对象的API该怎么应用;
3、通过做出文件下载知道了原来网络上下载文件的原理;
共勉!