JAVA学习日志2-8(servlet)
响应对象
响应对象,当客户端发送请求的时候 给客户端一个响应结果(文本 视频 图片),其实就是告诉客户端服务器已经收到请求。
在servlet中 这个对象是由tomcat容器创建的,类似于内置的对象,直接来使用,不用去实例化。
响应对象组成部分: 响应行 响应头 响应体
- 响应行
包含一些状态码与协议。
状态码:2xx 成功,3xx重定向,4xx客户机出现错误,5xx服务器出现错误。
http是一个请求与响应的协议,http协议是一次性连接协议,也就是每一次请求与响应(3次握手)都需要建立一次连接。http是不安全的,不能记录上一次的请求的状态与数据。
http 1.1 可以支持长连接的协议 keep alive(表示长连接的时间),在这个长连接的时候之内可以发送多次请求与响应。
即时通讯使用的是socket协议 - 响应头
设置响应头
在浏览器上打开服务器中的图片(获取到图片在服务器中的位置,转换成流对象输入给java,在以流对象输出给浏览器)
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应头,规定打开方式
resp.setHeader("Content-Type","image/jpg");
String path = req.getServletContext().getRealPath("WEB-INF/img/temp.jpg");
InputStream is = new FileInputStream(path);
//上面两条可以合为下面一条
// InputStream is = req.getServletContext().getResourceAsStream("WEB-INF/img/temp.jpg");
ServletOutputStream sos = resp.getOutputStream();
byte [] bytes = new byte[1024];
int leng = -1;
while((leng=is.read(bytes))!=-1){
sos.write(bytes,0,leng);
}
sos.close();
is.close();
}
}
下载,和在浏览器中打开图片原理相同,设置响应头 resp.setHeader(“Content-Disposition”,“attachment;filename=文件名称”)
public class DownLoadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Content-Disposition","attachment;filename=temp.jpg");
InputStream is = req.getServletContext().getResourceAsStream("WEB-INF/img/temp.jpg");
ServletOutputStream sos = resp.getOutputStream();
byte []bytes = new byte[1024];
int leng = -1;
while((leng=is.read(bytes))!=-1){
sos.write(bytes,0,leng);
}
sos.close();
is.close();
}
}
- 响应体
直接在页面中写内容,通过响应对象获取流对象来进行操作。
两种获取流对象的方式:
- ServletOutputStream sos = resp.getOutputStream(); 一般是用于来写字节
- PrintWriter pw = resp.getWriter(); 一般用于来写字符(字符串)
响应体的内容是直接写在页面中的,所以可以在写入一些前端的标签,在页面上显示标签的效果。如写入一个table表格。
public class TableServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter pw = resp.getWriter();
pw.write("<table border='1px'");
pw.write("<tr>");
pw.write("<td> 123 </td>");
pw.write("<td> 456 </td>");
pw.write("</tr>");
pw.write("</table>");
}
请求对象
ServletRequest, HttpServletRequest 。HttpServletRequest是 ServletRequest的子类
HttpServletRequest请求对象,用户发送请求的时候,由浏览器封装一些请求信息。
HttpServletRequest 也是由tomcat容器创建,只管使用
HttpServletRequest 请求行 请求头 请求体
- 请求行
1.请求行也就使用用户来获取当前协议 项目的路径 端口等等
2.获取请求行的信息
- 请求头
- 请求体
请求体: 用于发送请求传递的参数到服务器
获取键值的两个方法:
String value = req.getParameter(“键”);用于获取 form 表单中input的name值
String[] strs = req.getParameterValues(“键”); 一般用来获取复选按钮的多个值
a标签的href属性会携带参数,获取参数的值时传递的键是参数名而非name的名称。
文件上传案例
0.添加文件上传的jar包
1.得到目标文件夹的文件路径
2.判断服务器中是否存在存放文件的文件夹,不存在则创建
3.获取到ServletFileUpload对象,它存储了提交的form表单的信息。
4.把ServletFileUpload 装换为list集合,遍历每一项,如果是文件上传的表单内容,则写到服务器里。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--表单里有文件上传时,enctype的值必须为multipart/form-data-->
<form method="post" action="uploadservlet" enctype="multipart/form-data">
<!--name要赋值,否则文件无法上传-->
<input type="file" name="file">
<input type="submit">
</form>
</body>
</html>
servlet
@WebServlet("/uploadservlet")
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取服务器中WEB-INF/photo的路径
String path = req.getServletContext().getRealPath("WEB-INF/photo");
File file = new File(path);
//文件夹不存在则建立
if(!file.exists()){
file.mkdirs();
}
//判断是否是文件上传类型的表单
if(ServletFileUpload.isMultipartContent(req)){
FileItemFactory fis = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(fis);
List<FileItem> list = null;
try {
list = sfu.parseRequest(req);
} catch (FileUploadException e) {
e.printStackTrace();
}
for(FileItem temp : list){
if(!temp.isFormField()){
String filename = temp.getName();
try {
File newfile = new File(file,filename);
temp.write(newfile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}