zoukankan      html  css  js  c++  java
  • Servlet

    Servlet简介

    Servlet就是sun公司开发动态web的一门技术
    Sun在这些API中提供一个接口叫做: Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

      编写一个类,实现Servlet接口
      把开发好的JAVA类部署到Web服务器中.
    把实现了Servlet接口的Java程序叫做,Servlet
    Servlet接口Sunday公司有两个默认的实现类:HttpServlet,GenericServlet

     

     编写一个Servlet程序

    1.编写一个普通类

    2.实现Servlet接口,这里我们直接继承HttpServlet

    public class HelloServiet extends HttpServlet {
        //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter writer = resp.getWriter();//回应流
            writer.print("hello,servlet");
    
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }

     

     编写Servlet的映射
      为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;

    web容器指tomcat服务器

    注意:URL路径的/

     Mapping问题

    1.一个Servlet可以指定一个映射路径

       <servlet-mapping>
           <servlet-name>hello</servlet-name>
           <url-pattern>/hello</url-pattern>
       </servlet-mapping>

    2.一个Servlet可以指定多个映射路径

        <!--servlet请求路径-->
       <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello1</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello2</url-pattern>
        </servlet-mapping>

    都可以访问到

    3.一个Servlet可以指定通用映射路径

      <servlet-mapping>
           <servlet-name>hello</servlet-name>
           <url-pattern>/hello/*</url-pattern>
       </servlet-mapping>

    4.默认请求路径

    <!--默认请求路径--> 
    <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>

    随便输入任何内容都可以进入

    5.指定一些后缀或者前缀等等...

    <!--可以自定义后缀实现请求映射  注意点: *前面不能加任何内容,如/-->
     <servlet-mapping>
           <servlet-name>hello</servlet-name>
           <url-pattern>*.do/url-pattern>
       </servlet-mapping>

    6.优先级问题

    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;|

     servletContext

      web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;

        `共享数据

        `在这个Servlet中保存的数据,可以在另外一个servlet中拿到;

    放置数据的类

       @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("hello");
            ServletContext servletContext = this.getServletContext();
            String username="头秃";
            servletContext.setAttribute("username",username);//将一个数据保存在:了ServletContext中,名字为: username  值 username
    
        }

    读取数据的类

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext = this.getServletContext();
            String username = (String) servletContext.getAttribute("username");
    
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
            resp.getWriter().print("名字="+username);
        }

    一次写两个参数的方法resp.setContentType("text/html;charset=utf-8");

    获取初始化参数

    在xml中配置

        <!--配置一些web应用初始化参数-->
        <context-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://127.0.0.1:3306/mybatis</param-value>
        </context-param>

    使用

      @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            final ServletContext servletContext = this.getServletContext();
            String url = servletContext.getInitParameter("url");//获取初始化的参数,可以变为一个字符串
            resp.getWriter().print(url);
        }

    测试运行

     读取资源文件

    Properties

      `在java目录下新建properties

      `在resources目录下新建properties
      `发现:都被打包到了同一个路径下: classes,我们俗称这个路径为classpath;

     InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
      第一个'/'代表当前web应用
    思路:需要一个文件流
    
    

     读取db.properties配置文件

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
            Properties prop = new Properties();
            prop.load(is);//
            String user = prop.getProperty("username");//获取属性
            String pwd = prop.getProperty("password");//获取属性
            resp.getWriter().print(user+":"+pwd);
        }

    去webapp下做一个映射

    运行结果

    HttpServletResponse 响应

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

      `如果要获取客户端请求过来的参数:找HttpServletRequest

      `如果要给客户端响应一些信息:找HttpServletResponse

    简单分类

    负责向浏览器发送数据的方法

        ServletOutputStream getOutputStream() throws IOException;//写平常的流用
    
        PrintWriter getWriter() throws IOException;//写中文用

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

        void setCharacterEncoding(String var1);//设置响应的编码
    
        void setContentLength(int var1);//设置响应的字符串长度
    
        void setContentLengthLong(long var1);//设置长度
    
        void setContentType(String var1);//设置类型
    void setDateHeader(String var1, long var2);

    void addDateHeader(String var1, long var2);

    void setHeader(String var1, String var2);

    void addHeader(String var1, String var2);

    void setIntHeader(String var1, int var2);

    void addIntHeader(String var1, int var2);

     2.下载文件

      1.向浏览器输出消息

      2.下载文件

        1.要获取下载文件的路径

        2.下载的文件名是啥?

        3.设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西

        4.获取下载文件的输入流

        5.创建缓冲区

        6.获取OutputStream对象

        7.将FileOutputStream流写入到buffer缓冲区

        8.使用OutputStream将缓冲区中的数据输出到客户端!

    //        1.要获取下载文件的路径
            String realPath = "D:\\IDEA项目\\Maven项目\\servlet-01\\response\\src\\main\\resources\\niao.jpg";
            System.out.println("下载的路径:"+realPath);
    //    2.下载的文件名是啥?
            String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
    //    3.设置想办法让浏览器能够支持下载我们需要的东西
            resp.setHeader("Content-disposition","attachment;filename="+filename);
    //    4.获取下载文件的输入流
            FileInputStream in = new FileInputStream(realPath);
    //    5.创建缓冲区
            int len = 0;
            byte[] buffer = new byte[1024];
    //    6.获取OutputStream对象
            ServletOutputStream out = resp.getOutputStream();
    //    7.将FileOutputStream流写入到buffer缓冲区
            while ((len=in.read(buffer))>0){
                out.write(buffer,0,len);
            }
            out.close();
            in.close();
    
    //    8.使用OutputStream将缓冲区中的数据输出到客户端!
    
    
        }

     如果文件名是中文

    //    3.设置想办法让浏览器能够支持下载我们需要的东西,中文文件名URLEncoder.encode编码,否则可能会乱码
            resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));

    不过不建议使用中文名

    HttpServletRequest 请求

     
  • 相关阅读:
    软件工程第一次结对作业
    软件工程第二次作业
    vue之vuex
    ceshi
    第3次 结构与部分
    第二次作业
    获得领跑衫感言
    期末总结
    第十四,十五周作业
    第七周作业
  • 原文地址:https://www.cnblogs.com/nuliyao123/p/14386635.html
Copyright © 2011-2022 走看看