JAVA学习日志2-8(servlet)

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();
    }
}
  • 响应体
    直接在页面中写内容,通过响应对象获取流对象来进行操作。
    两种获取流对象的方式:
  1. ServletOutputStream sos = resp.getOutputStream(); 一般是用于来写字节
  2. 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();
                    }
                }
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值