Servlet学习笔记-阿里云开发者社区

开发者社区> 王小雷> 正文

Servlet学习笔记

简介: Servlet学习笔记 1.0 Servlet 概述 1.1 Servlet是运行在服务器端的Java小程序,通过HTTP协议用于接受客户端请求,并发出响应。 1.2 Servlet中的方法 public void servlet(ServletRequest req,ServletRequest res) throws ServletE
+关注继续查看
Servlet学习笔记
1.0 Servlet 概述
    1.1 Servlet是运行在服务器端的Java小程序,通过HTTP协议用于接受客户端请求,并发出响应。
    1.2 Servlet中的方法
    public void servlet(ServletRequest req,ServletRequest res)
        throws ServletExcepation,java.io.IOException
    ServletRequest req:代表着请求对象,该对象有HTTP协议的请求部分的所有内容。它的实现类由服务器提供,封装数据也是服务器来做。
    ServletRequest res:代表着响应对象,该对象中由我们写数据(HTTP协议的响应部分)进去。它的实现类也是由服务器提供的。
    service:            由服务器调用,每次请求都会调用一次。服务器采用的是多线程机制。
2.0 Servlet 的编码步骤
    2.1 编写一个类实现javax.servlet接口,或者继承javax.servlet.GenericServlet.
    2.2 编译
    set classpath=%classpath%;E:\IDE\tomcat-8.0.26\lib\servlet-api.jar
    javac -d . HelloServlet.java
    2.3 修改web.xml
    2.4 部署,把应用部署到Tomcat上,访问地址:http://localhost:8080/DemoServlet/hello

3.0 Servlet 的执行过程
4.0 Servlet 的编写方式
    1、javax.servlet.GenericServlet:通用的Servlet实现,抽象类
    2、javax.servlet.http.HttpServlet:与HTTP协议有关的,抽象类。
    3、Servlet的核心类
5.0 Servlet 的生命周期
6.0 Servlet 的线程安全
    尽量使用局部变量,避免使用实例变量。

7.0 Servlet 的一些细节
    7.1 一个Servlet可以映射到多个地址上。
    7.2 可以使用地址通配符*
        7.2.1(优先级高) *.do 必须以*号开头        如:*.do
        7.2.2(优先级高) 以/开头,必须以*结尾     如:/action/*
        7.2.3 默认的Servlet,映射路径是<url-pattern>/</url-pattern>。不需要配,因为默认的Servlet负责处理用户请求找不到的处理工作。一切都是Servlet。
        7.2.4 应用在启动时就完成Servlet的实例化和初始化。2为启动的顺序。
            web.xml
            <load-on-startup>2</load-on-startup>
8.0 ServletConfig:Servlet的参数配置
    8.1 ServletConfig:代表看针对当前Servlet的参数配置。
        在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
    8.2 如何得到ServletConfig对象的应用:在初始化Servlet,由容器产生,并传递给你

9.0 ServletContext 
    9.1 ServletContext代表着当前应用。每个应用只有一个ServletContext对象的实例,由容器提供。
    9.2 如何获取ServletContext的实例:ServletConfig.getServletContext();
    9.3 ServletContext的生命周期:诞生,应用被加载时就由容器被创建好。活着,应用不挂就一直活着。死亡,应用挂了就挂了。
    9.4 域(存活范围)对象:ServletContext称为应用范围域对象。
            ServletContext{
                private Map<String,Object>map = new HashMap<String,Object>();
                public void setAttribute(String key,Object value){
                    map.put(key,value);
                }
                public void removeAttribute(String key){
                    map.remove(key);
                }
                public void getAttribute(String key){
                    return get(key);
                }
            }
        注:当前应用的所有Servlet共享同一个ServletContext。
    9.5 配置应用级的参数web.xml
        用ServletContext取。
10.0 servlet转发、实现中文文件的下载、读取
    10.1 servlet转发
    Demo1.java
        public void doGet(HttpServletRequest request,HttpServletResponse response)
                throws ServletExcepation, IOException{
                ServletContext sc = getServletContext();
                RequestDispatcher rd = sc.getRequestDispatcher("/servlet/Demo2");
                rd.forward(request,response); //转发

                }
        }
    Demo2.java
        public void doGet(HttpServletRequest request,HttpServletResponse response)
                throws ServletExcepation, IOException{
                        response.getWriter().writer("i am secent servlet")
                }
    10.2 Servlet实现中文文件的下载
    DemoIo.java
        public void doGet(HttpServletRequest request,HttpServletResponse response)
                throws ServletExcepation, IOException{
                        //文件在哪?以不变以万变
                        ServletContext sc = getServletContext();
                        String realPath = sc.getRealPath("/WEB-INF/classes/27.jpg");//文件存放的真是路径
                        //System.out.println(reaPath);
                        //构建文件的输入流
                        InputStream in = new FileInputStream(realPath);

                        //要获取 的文件名

                        String filename = realPath.substring(realPath.lastIndexOf(file.separator)+1);

                        //告知客户端以下载的方式打开:Content-Disposition=attachment;filename=27.jpg


                        response.setHeader("Content-Type","application/octet-stream");
                        response.setHeader("Content-Disposition","attachment;filename"+URLEncoder.encode(filename,"UTF-8"));//中文属于不安全字符,需要使用url编码

                        //用response的字节流进行输出
                        OutputStream out = response.getOutputStream();
                        int len = -1;
                        byte b[] = new byte[1024];
                        while((len = in.read(b))!=-1){
                            out.write(b,0,len);
                        }
                        in.close();
                        out.close();
                }
            }
    10.3 读取配置文件的各种方式
        10.3.1 利用ServletContext读取: a b c ,可以读取任何位置上的资源,使用限制只能是在web应用中用。
            private void test10(HttpServletRequest request,HttpServletResponse response)
                throws ServletExcepation,IOException{
                String path = getServletContext().getRealPath("/a.properties");
                //String path = getServletContext().getRealPath("/WEB-INF/classes/b.properties");
                //String path = getServletContext().getRealPath("/WEB-INF/classes/com/demo/resource/c.properties");


                InputStream in = new FileInputStream(path);
                Properties props = new Properties();
                props.load(in);
                System.out.println(props.getProperty("hello"));
                }
        10.3.2 利用ResourceBundle读取: b c,不能读取properties的文件。只要是java程序便可。
            private void test20(HttpServletRequest request,HttpServletResponse response)
                throws ServletExcepation,IOException{
                ResourceBundle rb = ResourceBundle.getBundle("b");
                ResourceBundle rb = ResourceBundle.getBundle("com.demo.resource.c");
                System.out.pringtln(rb.getString("hello"));
                }
        10.3.3 类加载器读取:只能读取classes或者类路径中的任意资源(更专业),但是不适合读取特别大的资源。建议读b c  ,a也可以但是文件过大不推荐。不要让tomcat等服务器在有空格的目录中。

                private void test20(HttpServletRequest request,HttpServletResponse response)
                    throws ServletExcepation,IOException{
                        ClassLoader c1 = ServletContextDemo7.class.getClassLoader();//得到类加载器
                        InputStream in = cl.getResourceAsStream("b.properties");
                        Properties props = new Properties();
                        props.load(in);
                        System.out.println(props.getProperty("hello"));
                }




            private void test30(HttpServletRequest request,HttpServletResponse response)
                throws ServletExcepation,IOException{
                    ClassLoader c1 = ServletContextDemo7.class.getClassLoader();//得到类加载器
                    URL url = cl.getResource("com/demo/resource/c.properties")
                    String path = url.getPath();
                    InputStream in = new FileInputStream(path);
                    Properties props = new Properties();
                    props.load(in);
                System.out.println(props.getProperty("hello"));
                }





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《Servlet和JSP学习指南》一导读
自从Servlet面世以来,也开发出了许多基于Java的Web框架,以帮助程序员更迅速地编写Web应用程序。
1137 0
WebService |学习笔记
快速学习 WebService
22 0
vue observer 源码学习
一、版本:2.5.9 二、建议       vue最重要的应该就是响应式更新了,刚开始接触vue或多或少都能从官方文档或者其他地方知道vue响应式更新依赖于Object.defineProperty()方法,这个方法在MDN上有详细讲解,不过,如果是初学者的话,直接去看响应式更新源码还有点难度的,最好是先用项目练一遍,对vue有个相对熟悉的了解,然后可以去各大热门讲解的博客上看看人家的讲解,这样汇总一番有点底子了再去看源码实现相对轻松点。
1508 0
从零开始学习 webservice第一集,java webservice简单实例入门教程
现在从零开始学习webservice 概念自己百度搜,总之,webservice就相当于一个接口,就像你走进了一家售货店,你不需要知道这家店怎么卖给你东西,你拿着钱去,说我要一包玉溪,人家就会给你返回一包玉溪烟,这就是webservice。
1478 0
+关注
王小雷
专注大数据,人工智能的多面手,对新兴的技术与知识充满了好奇与渴望!
128
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载