Servlet初体验之-笔记一

来源:互联网 发布:江南大学网络学生登录 编辑:程序博客网 时间:2024/05/29 14:21


1、资源分类

                 静态资源 ----- HTML ----- 源码不改,每次访问的数据都是一样的
                 动态资源 ----- 由程序(Servlet)生成 -- 每次访问得到的数据可能都不一样
                
            2、使用 Servlet 进行动态资源实现 --- 版本1
                 A、创建一个类实现 Servlet 接口
                 B、重写 service 方法
                 C、配置 Servlet 与 URL 的映射
                 D、浏览器输入 URL 后,就可以执行 Servlet 的 service 方法了(重点:执行流程 --- 看图解)

            3、使用 Servlet 进行动态资源实现 --- 版本2
                 A、继承 GenericServlet(通用的Servlet)
                 B、重写 service 方法
                 C、配置Servlet 与 URL 映射
                
                  和版本1比较,进行代码简化了
              
            4、使用 Servlet 进行动态资源实现 --- 版本3 ---- 终极版
                 A、eclipse 直接创建 Servlet 类 --- 继承 HttpServlet,配置信息自动生成
                 B、重写的不再是 service 方法,而是更加细化的 doGet 或 doPost 方法
                 C、怎么执行?
                   根据URL 找到对象类,反射生成对象,反射调用 (父类)service 方法,根据请求方式
                   再调用 子类的 doGet 或 doPost
               
            5、请求与响应简单使用
                            获取浏览器发送来的数据
                              并且向浏览器法发送响应数据
                             参数1:request ----- 封装了请求数据
                              参数2:response ---- 可以用于发送响应数据
        
            
        A、request 是请求对象
                  1. request.getParamter("键") ---- 可以根据键获取客户录入的一个值
                   
                  2. String []aihao=request.getParameterValues("aihao");      可以根据键获取客户录入的一组值 复选框  比如爱好
                   
                  3. Map<String, String[]> map = request.getParameterMap(); 获得所有值 封装到map集合中 key:是name值  value:是用户输入的值
                  
                  4.Enumeration<String> names = request.getParameterNames();  获得所有name值  返回
                        while(names.hasMoreElements()){
                            String nextElement = names.nextElement();
                            System.out.println(nextElement+"...."+Arrays.toString(request.getParameterValues(nextElement)));
                        }
                        
                        
                        hasMoreElements()测试此枚举是否包含更多的元素。
                        nextElement()  如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
                                       
         B、response 是响应对象
                   response.getWriter() --------- 获取一个字符打印流,可以像浏览器响应数据
                   
                   
                   
                   
            
             被屏蔽的实现:
                  request 和 response 这两个对象 和 Servlet 对象一样是 Tomcat 创建的,
                  Tomcat 在调用 service 方时,会把这两个对象作为参数传给 service,  service方法判断是get 还是post 最终传给
                  doGet 或 doPost 并调用 doGet 或 doPost

            6、servlet 高级 --- 生命周期 一个对象从创建到销毁的过程
                何时创建:用户第一次访问创建实例 并调用init()
                  init ----- 出生时调用的方法 ---- 第一次访问时出生
                  service -- 每次运行时调用的方法 - 每次访问
                  destory -- 消亡时调用的方法 ---- 服务器关闭时消亡
              
              注意:
                servlet 自始至终只有一个(使用了单例设计模式)
               
             控制Servlet初始化的时机:
                  A、web.xml中<servlet>标签中使用 <load-on-startup>设置初始化时机
                    取值:0 以及正整数,服务器加载时就启动
                    如果是负数或不设置,就是第一次访问时加载
                  B、 <load-on-startup> 还可以设置启动优先级
                    数字越小( >= 0 ),优先级越高
              
            7、Servlet 映射的 URL 如何配置?
                   一般实现完全匹配,URL 和 类名一致
                    浏览器地址栏中录入的路径完全匹配才能执行servlet  -->
                     <url-pattern>/abc/def/xxx</url-pattern> -->
                    
                     录入的路径只要目录严格匹配即可,而目录后任意 -->
                    <url-pattern>/xxx/yyy/*</url-pattern> -->
                    
                     录入的路径只要后缀名匹配即可,前面任意--> .do .action
                    <url-pattern>*.xx<url-pattern> -->
                    
                    路径爱咋咋地 ,都行--> ---- 不建议使用
                    <url-pattern>/</url-pattern> -->
                    
                优先级(越具体优先级越高):
                        1 > 2 > 3 > 4
            
            
            3、路径问题
                 方式1:
                  表单的 action = "http://loaclhost:8080/项目名/路径" ---- 繁琐
                   
                 方式2:
                  表单的 action = "/项目名/路径" ---- 和方式1一样,是对 方式1的简化
                
                  方式1 和 方式2 称之为绝对路径
                
                 方式3:
                  表单的 action = "路径" || "../../路径" ---- 相对路径(不建议使用)
                  文件位置一旦变动,路径名也要进行相应修改,不易于后期维护
                
                  相对路径怎么推导
                   不是根据存储位置推导而是根据地址栏输入的 URL 推导
                   
                       相对路径推导
                    action="Login"
                http://localhost:8080/day34B/login.htm
                http://localhost:8080/day34B/Login
                
                
                
                
                
                ServletConfig对象 //获取 Servlet 内部的一些信息
                 getServletName()         获得Servlet名字
                 getInitParameter("name值")        获得Servlet初始化参数
                 getInitParameterNames()获得Servlet所有初始化参数名字
                
                 Enumeration<String> names = fig.getInitParameterNames();
                        while(names.hasMoreElements()){
                            String name = names.nextElement();
                            System.out.println(name+"..."+fig.getInitParameter(name));
                        }
                        
                        
                        

          编码集概念:
           1、作用,让数字与字符(小图片)产生映射关系
           2、不同的编码集能映射的字符也不同
           3、不同的编码集中相同的字符可以对应的数字也不一样
          
        
        
        //怎么获取某个字符在某种编码集对应的数字?
        String str = "中";
        byte[] b1 = str.getBytes("UTF-8");
        byte[] b2 = str.getBytes("GBK");
        System.out.println("中在UTF-8中对应的字节:" + Arrays.toString(b1));//[-28, -72, -83]
        System.out.println("中在GBK中对应的字节:" + Arrays.toString(b2));//[-42, -48]
        
        //字节也可以转换成字符
        byte[] b3 = new byte[]{-28, -72, -83};
        String str2 = new String(b3,"UTF-8");
        System.out.println("str2 = " + str2);
        
        String str3 = new String(b3,"GBK");
        System.out.println("str2 = " + str3);
        //什么情况下乱码?
        //场景1:编码集不一样时,比如 IO 操作
        
        InputStream in = new FileInputStream("test.txt");
        byte[] buffer = new byte[1024];
        int length = in.read(buffer);
        //System.out.println(Arrays.toString(buffer));
        String str4 = new String(buffer,0,length,"UTF-8");
        System.out.println("str4 = " + str4);
        in.close();
        
        //场景2:编码集不一样,但是没有乱码
        //比如 GBK 的eclipse 向 UTF-8 的MySQL插入数据,这是怎么回事?
        //MySQL 自己做了特殊处理的?
        //中 ---- [-42, -48] ---- Eclipse GBK编码集中
        //到了 MySQL
        //1、将字节按照GBK转换成字符 new String( [-42, -48],"GBK") ---- 中
        //2、将图片按照UTF-8解析成字节 "中".getByte("UTF-8"); ---- [-28, -72, -83]
        //3、存储解析后的字节
        

        //总结:IO流操作时,数据传递以字节为标准,MySQL 中以图片为标准


仅供个人笔记使用,若内容有误,请包涵


0 0
原创粉丝点击