Servlet重要类及其方法的应用

打印 上一主题 下一主题

主题 1935|帖子 1935|积分 5805

Servlet重要类及其方法的应用

Servlet重要类及其方法的应用

1.1 HttpServlet的一些方法介绍
  1. //        this.getInitParameter();得到初始化参数
  2. //        this.getServletConfig();得到servlet配置就是web.xml中我们写的配置
  3. //        this.getServletContext();得到servlet上下文
复制代码
1.2 ServletContext

web容器(tomcat)在启动的时候,它会为每个web程序创建一个对应的ServletContext对象,它代表当前的web应用。
作用:

  • 共享数据:不同servlet之间(类似vue的store)
    1. //第一个servlet中
    2. ServletContext servletContext = this.getServletContext();
    3. String username = "lihua";
    4. //将数据保存在其中,通过第一个参数取出数据,第二个参数是值
    5. servletContext.setAttribute("username",username);
    6. //另外一个servlet
    7.         ServletContext servletContext2 = this.getServletContext();
    8.         String username = (String)
    9. //取出
    10.             servletContext2.getAttribute("username");
    11. //设置格式
    12. resp.setContentType("text/html;charset=utf-8")
    13. //打印到响应中
    14.         resp.getWriter().print(username);
    复制代码

    • 获取初始化参数
    1.     <context-param>
    2.         <param-name>url</param-name>
    3.         <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    4.     </context-param>
    复制代码
    1. //获取初始化参数
    2. ServletContext servletContext = this.getServletContext();
    3. String url = servletContext.getInitParameter("url");
    4.     //jdbc:mysql://localhost:3306/mybatis
    复制代码
  • 请求转发
    1. ServletContext servletContext = this.getServletContext();
    2.         //需要转发的请求路径
    3.         RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/hello");
    4.         requestDispatcher.forward(req,resp);//实现请求转发
    5.         //合并前两句
    6. //        servletContext.getRequestDispatcher("/hello").forward(req,resp);
    7.         
    复制代码
    现在本servlet路径显示的是/hello路径的页面
  • 读取资源文件
    Properties:

    • 在java目录下新建properties(如db.properties)
    • 在resources目录下新建properties
    发现都被打包到同一个路径下:classes,俗称类路径
    1. ServletContext servletContext = this.getServletContext();
    2. //把资源变成流
    3. InputStream resourceAsStream = servletContext.getResourceAsStream("/WEB-INFO/classes/db.properties");
    4. Properties properties = new Properties();
    5. properties.load(resourceAsStream);
    6. String username = properties.getProperty("username");
    7. //得到:helloworld
    8. //db.properties中:
    9. username=helloworld
    复制代码
1.3 HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpsServletRequest代表,代表响应的一个HttpServletResponse

  • 如果要获取客户端请求过来的参数,找HttpServletRequest
  • 如果要给客户端响应一些信息,找HttpServletResponse
简单分类方法:

  • 负责向浏览器发送信息的方法

      1. getOutputStream()//字节流
      2. getWriter()//字符,用来写中文等
      3. //这些方法都是继承自ServletResponse
      复制代码

  • 负责向浏览器发送响应头的方法

      1. setCharacterEncoding(String charset)
      2. setContentLength(int len)
      3. setContentLengthLong(long len)
      4. setContentType(String type)
      5. //上述方法继承自ServletResponse
      6. addDateHeader(String name, long date)
      7. setHeader(String name, String value)
      8. addHeader(String name, String value)
      9. setIntHeader(String name, int value)
      10. addIntHeader(String name, int value)
      11. //这些是自己类的方法,而且不止这些
      复制代码

  • 响应码和设置响应码的方法
一些应用:

  • 向浏览器输出消息:不多说,上面一直在演示
  • 下载文件
    1. //        1.获取下载路径
    2.         String realPath ="C:\\Users\\adminster\\Desktop\\雨夜.png";
    3. //        2.获取下载文件名
    4. //            截取字符串获取文件名字
    5.         String fileName = realPath.substring(realPath.lastIndexOf("\") + 1);
    6. //        3.想办法让浏览器支持下载(设置响应头)
    7. //            如果文件路径有中文的话需要UrlEncoder
    8.         resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
    9. //        4.获取下载文件的输入流
    10.         FileInputStream fileInputStream = new FileInputStream(realPath);
    11. //        5.创建缓冲区
    12.         int len = 0;
    13.         byte[] bytes = new byte[1024];
    14. //        6.获取OutputStream对象
    15.         ServletOutputStream outputStream = resp.getOutputStream();
    16. //        7.将OutputStream流写入缓冲区
    17.         while ((len=fileInputStream.read(bytes))>0){
    18.             outputStream.write(bytes,0,len);
    19.         }
    20.         fileInputStream.close();
    21.         outputStream.close();
    22. //最后成功下载文件
    复制代码
  • 验证码功能
    验证码是怎么来的:

    • 前端实现
    • 后端实现,需要用到java的图片类生成一个图片
    1.     @Override
    2.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //       让浏览器三秒刷新一次
    4.         resp.setHeader("refresh","3");
    5. //        在内存创建一个图片,参数宽高颜色
    6.         BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
    7. //        图片的画笔
    8.         Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
    9. //        设置图片背景颜色
    10.         graphics2D.setColor(Color.RED);
    11. //        填充图形
    12.         graphics2D.fillRect(0,0,80,20);
    13. //        给图片写数据
    14.         graphics2D.setColor(Color.blue);
    15.         graphics2D.setFont(new Font(null,Font.BOLD,20));
    16.         graphics2D.drawString(makeNum(),0,20);
    17. //        告诉浏览器这个请求以图片jpeg的形式打开
    18.         resp.setContentType("image/jpeg");
    19. //        网站存在缓存,我们阻止其缓存,下面三行可以不掌握
    20.         resp.setDateHeader("expires",-1);
    21. //        缓存控制,设置为不缓存
    22.         resp.setHeader("Cache-Control","no-cache");
    23. //        Pragma
    24.         resp.setHeader("Pragma","no-cache");
    25. //        把图片写给浏览器,以imageIO的形式
    26.         ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
    27.     }
    28.     private  String makeNum(){
    29.         Random random = new Random();
    30. //        生成随机数[0,10000000) int ;
    31.         String s = random.nextInt(10000000) + "";
    32.         //以下步骤都是为了当为啥不够七位时补零
    33.         StringBuffer sb = new StringBuffer();
    34.         for (int i = 0; i < 7 - s.length(); i++) {
    35.             sb.append("0");
    36.         }
    37.         s = sb.toString() + s;
    38.         return s;
    39.     }
    复制代码
    效果:同时每三秒刷新一次为不同数字



  • Response重定向(最重要)
    至于什么是重定向?感觉说过很多次了,就是web资源收到客户端请求之后,让它去访问另外一个资源的过程
    1. //重定向操作:
    2. resp.sendRedirect("/SonMaven_war/img");
    3. //重定向路径不能只写个/img,还需要加上部署的项目名
    复制代码
    状态码3开头都是重定向请求
    转发和重定向的区别:(131条消息) 请求转发和重定向_豆虫儿的博客-CSDN博客
    请求转发:request.getRequestDispatcher(URL地址).forward(request, response)
    重定向:response.sendRedirect(URL地址)
    重定向之后url地址变化,转发不变
1.4 HttpServletRequest

代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装得到HttpServletRequest
方法介绍一些重要的:

  • 获取前端传递的参数
    1. //一个表单,index.jsp中
    2. //修改编码
    3. <%@ page language="java" contentType="text/html; charset=UTF-8"
    4.         pageEncoding="UTF-8"%>
    5. <form action="${pageContext.request.contextPath}/hello" method="get">
    6.     用户名:<input type="text" name="username">
    7.     密码:<input type="password" name="password">
    8.     <input type="submit">
    9.         
    10. servlet中      
    11. //        解决后台中文乱码
    12.         req.setCharacterEncoding("utf-8");
    13. //        得到表单参数
    14.         String username = req.getParameter("username");
    15.         String password = req.getParameter("password");
    16.         
    17.         resp.setCharacterEncoding("utf-8");
    18. //       一组同名的可以用
    19. // String[] password =req.getParameterValues("password")
    复制代码
  • 请求转发
    1. //        请求转发,不像重定向不需要写部署项目路径
    2. req.getRequestDispatcher("/error").forward(req,resp);
    3. //只改变页面,路径不变
    复制代码
问题一如何解决封装到端口被占用?

打开cmd,输入netstat -aon | find "1099",数字是被占用的端口号,然后打开任务管理器,输入该进程的pid号结束进程
问题二不允许有匹配 [xX][m M][lL] 的处理指令目标

原因web.xml中
[code][/code]必须放在第一行

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表