• day12学习总结


    一、响应对象 - HttpServletResponse

    简介:

            响应对象: ServletResponse 与 HttpServletResponse

            HttpServletResponse继承于ServletResponse

            响应:服务器给客户端作出回应

            响应对象是由tomcat服务器创建的 内置对象 只管使用

            响应包括:响应行 响应头 响应体

    响应行:

            查看响应行:

                    运行项目,然后按f12 

            

            协议:

                    就是定义网络数据传输的一种规范,必须遵循这种规范才能进行有效的交流

            http简介:

                    超文本传输协议(Hyper Text Transfer Protocol,HTTP

                    是一个简单的请求-响应协议,它通常运行在TCP之上

            http特点:

                    A. http 超文本协议 主要用于来传输文本 也可以传输文件以及音频 视频

                    B. http 是一个一次性性 请求与响应完事之后 连接就断开了

                    C. http是一个无状态连接的协议 不能记录每一次连接的记录 相对于比较安全

                    D. http协议传输数据是不安全的 

            http发展史:

                    A.http 0.9 只能用于传输普通内容 局限性比较大

                    B.http 1.0 是一个一次性协议 是请求与响应的协议 请求与响应完事之后 连接就断开

                    C.http 1.1 常连接的协议 需要设置 keep_alive存活的时间 在这个时间段中可以进行多次请求与响应

            https协议:

                    A.https协议=http协议+ssl证书

                    B.ssl证书主要用于保证数据传输的安全性 

            常见状态码:

                    1xx :服务器接收到请求,继续执行操作 (断点续传)

                    2xx:响应成功

                    3xx:重定向

                    4xx:请求资源不存在

                            产生原因:

                                    请求的资源不存在或者请求的路径不正确,访问servlet已经页面的路径不对

                                    项目是否部署成功了 请求的资源是否在out文件夹下是否存在

                                    直接访问web-inf下资源 也会产生404错误

                    5xx:运行在服务器的java代码出现错误

                            查找错误方法:

                                    A.查看控制台

                                    B.查看页面的错误

                                    C.断点调试 局部测试 dao =servie =servlet

             设置状态码:

    1. try {
    2. System.out.println(1/0);
    3. } catch (Exception e) {
    4. resp.setStatus(500,"代码发生了异常");
    5. e.printStackTrace();
    6. }

    响应头:

            查看响应头:

             常见的响应头:

     

             案例:浏览器加载服务器图片

                    需求:使用浏览器直接打开服务器图片

                    分析:

                     代码:

    1. package com.qf.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.ServletOutputStream;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.BufferedInputStream;
    9. import java.io.BufferedOutputStream;
    10. import java.io.IOException;
    11. import java.io.InputStream;
    12. @WebServlet(name = "servlet01",urlPatterns = "/servlet01")
    13. public class Servlet01 extends HttpServlet {
    14. @Override
    15. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. //通过响应对象设置页面打开文件类型方式
    17. //resp.setHeader("Content-Tyep","image/png");
    18. resp.setContentType("image/png");
    19. //通过请求对象获取输入流
    20. InputStream is = req.getServletContext().getResourceAsStream("/WEB-INF/upload/bg.png");
    21. //通过响应对象获取输出流
    22. ServletOutputStream os = resp.getOutputStream();
    23. //实例化高效输入流
    24. BufferedInputStream bis = new BufferedInputStream(is);
    25. //实例化高效输出流
    26. BufferedOutputStream bos = new BufferedOutputStream(os);
    27. //读取
    28. int leng=-1;
    29. while ((leng=bis.read())!=-1){
    30. //写入
    31. bos.write(leng);
    32. }
    33. //关闭资源
    34. bos.close();
    35. bis.close();
    36. os.close();
    37. is.close();
    38. }
    39. }

             案例:将服务器图片下载到本地

                    需求:下载服务器上的图片

                    分析:

                     代码:

    1. package com.qf.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.ServletOutputStream;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. @WebServlet(name = "servlet02",urlPatterns = "/servlet02")
    11. public class Servlet02 extends HttpServlet {
    12. @Override
    13. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    14. //通过请求对象获取服务器上的文件
    15. String filename = req.getParameter("filename");
    16. //通过响应对象设置响应头告诉浏览器下载方式
    17. resp.setHeader("Content-Disposition","attachment;fileName"+filename);
    18. //通过请求对象获取输入流
    19. InputStream is = req.getServletContext().getResourceAsStream("/WEB-INF/upload/bg.png");
    20. //通过响应对象获取输出流
    21. ServletOutputStream os = resp.getOutputStream();
    22. byte [] b = new byte[1024];
    23. int leng =-1;
    24. while ((leng=is.read(b))!=-1){
    25. os.write(b,0,leng);
    26. }
    27. os.close();
    28. is.close();
    29. }
    30. }

               设置响应头:

                          注意点:

                            A.addHeader() 同时设置多个相同键的时候 都会设置成功

                            B.setHeader("","")同时设置多个相同键的时候 会覆盖

                    案例:自动跳转页面

                            需求: 两秒后自动跳转页面

                            

    1. package com.qf.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet(name = "demo01Servlet",urlPatterns = "/demo01Servlet")
    9. public class Demo01Servlet extends HttpServlet {
    10. @Override
    11. protected void service(HttpServletRequest req, HttpServletResponse resp)
    12. throws ServletException, IOException {
    13. //设置响应头
    14. // resp.setHeader("admin","123");
    15. // resp.setHeader("admin","12");
    16. // resp.addHeader("ad","12345");
    17. // resp.addHeader("ad","1234");
    18. resp.setHeader("refresh","2;login.jsp");
    19. }
    20. }

    响应体:

            

              注意点:

                    这两个方法只能存在一个  不能两个同时存在

    1. @Override
    2. protected void service(HttpServletRequest req, HttpServletResponse resp)
    3. throws ServletException, IOException {
    4. // ServletOutputStream os = resp.getOutputStream();
    5. // os.write(97);
    6. // os.write("阿超".getBytes());
    7. // //设置响应的编码格式
    8. // resp.setContentType("text/html;charset=utf-8");
    9. // PrintWriter pw = resp.getWriter();
    10. // pw.write("哈哈哈!今天星期五");
    11. // pw.flush();
    12. // pw.close();

    二、请求对象  HttpServletRequest

    简介:

            请求对象有 ServletRequest 和 HttpServletRequest 

             请求对象HttpServletRequest 是ServletRequest 的子类

            HttpServletRequest 是由tomcat容器创建 只管使用

            请求组成:请求行 请求头 请求体

    请求行:

            运行项目 进入浏览器 按f12

            获取请求行方法:

            测试:

    1. package com.qf.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet(name = "servlet03",urlPatterns = "/servlet03")
    9. public class Servlet03 extends HttpServlet {
    10. @Override
    11. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. //获取上下文
    13. System.out.println(req.getServletContext());
    14. //获取请求的路径 servlet的路径
    15. System.out.println(req.getServletPath());
    16. //获取请求的项目打包的名称
    17. System.out.println(req.getContextPath());
    18. //获取请求提交的方法
    19. System.out.println(req.getMethod());
    20. //获取请求的参数 就是在URL地址上拼接的参数
    21. System.out.println(req.getQueryString());
    22. //获取请求的路径 项目打包名称加上servlet的名称
    23. System.out.println(req.getRequestURI());
    24. //获取请求的端口号
    25. System.out.println(req.getLocalPort());
    26. //获取请求的主机名
    27. System.out.println(req.getLocalName());
    28. //获取协议以及版本号
    29. System.out.println(req.getProtocol());
    30. //获取协议
    31. System.out.println(req.getScheme());
    32. //获取服务器地址 主机id
    33. System.out.println(req.getServerName());
    34. //获取服务器端口号
    35. System.out.println(req.getServerPort());
    36. }
    37. }

     

    请求头:

    1. package com.qf.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.util.Enumeration;
    9. @WebServlet(name = "servlet04",urlPatterns = "/servlet04")
    10. public class Servlet04 extends HttpServlet {
    11. @Override
    12. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. //获取单个请求头
    14. System.out.println(req.getHeader("Host"));
    15. //获取全部请求头 返回的类型与迭代器相像
    16. Enumeration headerNames = req.getHeaderNames();
    17. while (headerNames.hasMoreElements()){
    18. //获取元素
    19. String s = headerNames.nextElement();
    20. System.out.println(s+"\t"+req.getHeader(s));
    21. }
    22. }
    23. }

     

    请求体:

    前端:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 86182
    4. Date: 2022/9/2
    5. Time: 10:42
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>$Title$title>
    12. head>
    13. <body>
    14. <a href="servlet02?filename=bg.png">下载a>
    15. <form action="servlet05" method="post">
    16. <p>
    17. 文本:<input type="text" name="tex">
    18. p>
    19. <p>
    20. <input type="password" name="pwd">
    21. p>
    22. <p>
    23. <input type="radio" name="sex" value="男">
    24. <input type="radio" name="sex" value="女">
    25. p>
    26. <p>
    27. <input type="checkbox" name="hobby" value="打篮球"> 打篮球
    28. <input type="checkbox" name="hobby" value="跳舞"> 跳舞
    29. <input type="checkbox" name="hobby" value="唱歌"> 唱歌
    30. <input type="checkbox" name="hobby" value="rap"> rap
    31. p>
    32. <p>
    33. <input type="submit" value="提交">
    34. p>
    35. form>
    36. body>
    37. html>

    后端:

    1. package com.qf.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.util.Enumeration;
    9. @WebServlet(name = "servlet05",urlPatterns ="/servlet05")
    10. public class Servlet05 extends HttpServlet {
    11. @Override
    12. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. //设置编码
    14. req.setCharacterEncoding("utf-8");
    15. resp.setCharacterEncoding("utf-8");
    16. //获取单个name 值
    17. String tex = req.getParameter("tex");
    18. System.out.println(tex);
    19. System.out.println("==========");
    20. //获取全部name 值
    21. Enumeration names = req.getParameterNames();
    22. //循环遍历
    23. while (names.hasMoreElements()){
    24. //获取name值
    25. String s = names.nextElement();
    26. //通过name值获取value值
    27. System.out.println(s+"\t"+req.getParameter(s));
    28. }
    29. System.out.println("==========");
    30. //根据单选框的name值 获取选中的value值
    31. String[] sexes = req.getParameterValues("sex");
    32. if (sexes!=null&&sexes.length>0){
    33. for (String s:sexes){
    34. System.out.println(s);
    35. }
    36. }
    37. System.out.println("==========");
    38. //根据复选框name值获取选中的value值
    39. String[] hobbies = req.getParameterValues("hobby");
    40. if (hobbies!=null&&hobbies.length>0){
    41. for (String s:hobbies){
    42. System.out.println(s);
    43. }
    44. }
    45. }
    46. }

    案例:本地文件上传服务器

            需求:文件上传

            分析:

            

            代码:

                    前端:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <form action="servlet06" method="post" enctype="multipart/form-data">
    9. <p>
    10. 用户:<input type="text" name="uname">
    11. p>
    12. <p>
    13. 密码:<input type="password" name="upwd">
    14. p>
    15. <p>
    16. 文件上传:<input type="file" name="fileup">
    17. p>
    18. <p>
    19. <input type="submit" value="提交">
    20. p>
    21. form>
    22. body>
    23. html>

                     后端:

                            先导入文件上传的jar包

                     

    1. package com.qf.servlet;
    2. import org.apache.commons.fileupload.FileItem;
    3. import org.apache.commons.fileupload.FileUploadException;
    4. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    5. import org.apache.commons.fileupload.servlet.ServletFileUpload;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.annotation.WebServlet;
    8. import javax.servlet.http.HttpServlet;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11. import java.io.File;
    12. import java.io.IOException;
    13. import java.util.Iterator;
    14. import java.util.List;
    15. import java.util.UUID;
    16. @WebServlet(name = "servlet06",urlPatterns = "/servlet06")
    17. public class Servlet06 extends HttpServlet {
    18. @Override
    19. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    20. //通过请求对象获取保存在服务器上的文件夹路径
    21. String path = req.getServletContext().getRealPath("/WEB-INF/upload/");
    22. //将文件夹路径实例化为文件对象
    23. File file = new File(path);
    24. //如果文件夹不存在 则创建文件夹
    25. if (!file.exists()){
    26. file.mkdirs();
    27. }
    28. //判断前端表单的提交方式是否是一文件的形式提交
    29. boolean flag = ServletFileUpload.isMultipartContent(req);
    30. //判断 如果是true 则是以文件形式提交
    31. if (flag){
    32. //实例化DiskFileItemFactory对象 也就是工厂对象
    33. DiskFileItemFactory factory = new DiskFileItemFactory();
    34. //通过工厂对象获取文件上传的核心对象
    35. ServletFileUpload fileUpload = new ServletFileUpload(factory);
    36. //获取所有的input标签
    37. List list = null;
    38. try {
    39. list = fileUpload.parseRequest(req);
    40. } catch (FileUploadException e) {
    41. e.printStackTrace();
    42. }
    43. //将集合转换为迭代器
    44. Iterator iterator = list.iterator();
    45. //遍历迭代器
    46. while (iterator.hasNext()){
    47. //获取input标签
    48. FileItem fileItem = iterator.next();
    49. //判断input标签的值是普通文本还是文件
    50. if(fileItem.isFormField()){
    51. //这是input标签的值是普通文本的操作
    52. //获取input标签的name值
    53. String fieldName = fileItem.getFieldName();
    54. //判断这个name值是哪个标签的值
    55. if (fieldName.equals("uname")){
    56. System.out.println(fileItem.getString("utf-8"));
    57. }else if (fieldName.equals("upwd")){
    58. System.out.println(fileItem.getString("utf-8"));
    59. }
    60. }else {
    61. //这是input标签的值是文件时的操作
    62. //也就是文件上传的操作
    63. //获取文件的名称
    64. String name = fileItem.getName();
    65. //判断文件是否是图片 因为这里上传的是图片
    66. if (!(name.endsWith("jpg")||name.endsWith("jpeg")||name.endsWith("png")||name.endsWith("gif"))){
    67. System.out.println("该文件不是图片");
    68. //结束方法
    69. return;
    70. }
    71. //文件是图片时
    72. //随机生成一个图片名称 防止有重名被覆盖并平均文件名称
    73. String fileItemName = (UUID.randomUUID()+"").replaceAll("_","")+name;
    74. //将图片构建为File对象
    75. File f = new File(path,fileItemName);
    76. //将图片文件对象写入到服务器
    77. try {
    78. fileItem.write(f);
    79. } catch (Exception e) {
    80. e.printStackTrace();
    81. }
    82. }
    83. }
    84. }else {
    85. System.out.println("提交的类型有误");
    86. }
    87. }
    88. }

    三、ServletConfig

    简介:

            ServletConfig是由tomcat容器创建的 用于来获取servlet配置信息

    获取ServletConfig:

            第一种方式:

                    

             第二种方式:

            

     

             

    获取servlet配置信息:

            

    测试:

    1. package com.qf.servlet;
    2. import javax.servlet.ServletConfig;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.annotation.WebInitParam;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.io.IOException;
    10. import java.util.Enumeration;
    11. @WebServlet(name = "servlet07",urlPatterns = "/servlet07",
    12. initParams = {@WebInitParam(name = "name",value = "banzhang")
    13. ,@WebInitParam(name = "encoding",value = "utf-8")})
    14. public class Servlet07 extends HttpServlet {
    15. @Override
    16. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. //获取ServletConfig对象
    18. ServletConfig servletConfig = this.getServletConfig();
    19. //获取单个键值
    20. String name = servletConfig.getInitParameter("name");
    21. System.out.println(name);
    22. //获取全部键值
    23. Enumeration initParameterNames = servletConfig.getInitParameterNames();
    24. //遍历
    25. while (initParameterNames.hasMoreElements()){
    26. String s = initParameterNames.nextElement();
    27. //根据键获取值
    28. System.out.println(s+"\t"+servletConfig.getInitParameter(s));
    29. }
    30. }
    31. }

     

     

  • 相关阅读:
    个人网站广告联盟平台比较(获取被动收入) Mediavine,Adsense,ezoic使用评测比较
    [华为杯研究生创新赛 2023] 初赛 REV WP
    Pytorch从零开始实战06
    【算法】搜索大法
    java计算机毕业设计任务进度监督的软件项目实训管理系统源码+数据库+系统+lw文档+mybatis+运行部署
    05 【函数(上)】
    聊聊Cola-StateMachine轻量级状态机的实现
    JavaWeb基础面试题
    数据中心网络设计思路图,数据中心网络设计方案
    [附源码]Python计算机毕业设计Django旅游网的设计与实现
  • 原文地址:https://blog.csdn.net/qq_53884348/article/details/126663108