• 2016-2-1 Servlet细节


    Servlet的一些细节(韩顺平老师视频讲解)
    (1)
    由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序想要被外界访问,
    必须把servlet程序映射到一个URL地址上。这个工作在web.xml文件中使用
    <servlet> & <servlet-mapping>

        <servlet>
            用于注册Servlet,它包含两个主要的子元素<servlet-name> & <servlet-class>
            分别用于设置Servlet的注册名和Servlet的完整的类名
        <servlet-mapping>
            用于映射一个已经注册的Servlet的一个对外访问路径,它包含两个子元素<servlet-name> & <url-pattern>
            分别用于指定Servlet的注册名和Servlet的对外访问路径
    (2)
    同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名
    (3)
    在Servlet映射到URL中也可以使用 *通配符,但是只能有两种固定格式
        一种是“*.扩展名” 另一种是:以正斜杠开头,并以“/*” 结尾。
    在匹配中,要参考的标准
        谁的匹配度高,谁就被选择
        *.do 的优先级最低
    (4)
     Servlet是一个供其他java程序(servlet引擎)调用的java类,它不能独立运行,它的运行完全由Servlet引擎来控制
     
     Servlet的单例问题
         当Servlet被第一次访问后,就被加载到内存,以后该实例就对各个请求服务。即在使用中,是单例的。
         因为Servlet是单例的,一次会出现线程安全问题。如果不加线程安全机制,就会出现问题。
     synchronized(this)
            如果一个变量需要多个用户共享,则应当在访问该变量时,加同步机制
            synchronized(this){
                // 同步代码
            }
            如果一个变量不需要共享,则直接在doGet()  或者在 doPost() 中定义
    (5)
    在我们的网站启动的时候,就需要初始化一些数据,要求有定时完成的任务(定时写日志、定时备份数据库)。
    <loat-on-startup>配合线程就可以搞定
    ServletConfig对象用来读取servlet的配置信息。
    如果希望所有的Servlet读取某个参数
    <context-param>
        <param-name></param-name>
        <param-value></param-vlaue>
    </context-param>
    读取所有参数
    Enumeration<String> names = this.getServletConfig.getInitParameterNames();
    while(names.hasMortElements()){
        String name = names.nextElement();
    }

    Referer的实际案例
    //获取用户浏览器Referer
        String referer = request.getHeader("Referer");

        if(referer == null || !referer.startWith("")){
                response.sendRedirect("/Error");
        }    
    //下载文件演示
    response.setHeader("Content-Disposition", "attachment; filename=winter.jpg");
    //打开文件,说明web站点下载文件原理
    //1.获取要下载文件的全路径
    String path = this.getServletContext().getRealPath("/images/winter.jpg");
    //2.先读到tomcat中,创建文件输入流
    FileInputStream fis = new FileInputStream(path);
    //做一个缓冲字节数组
    byte[] buffer = new byte[1024];
    int len = 0;//表示每一次读取了多少个字节
    OutputStream output = response.getOutputStream();
    while(len = fis.read(buff) > 0){
            output.write(buff, 0, len);
    }
    //关闭流

  • 相关阅读:
    oracle列合并
    Java移位操作符
    angularjs 事件向上向下传播
    angularjs 路由 ngRoute tab切换
    angularjs 自定义服务
    angularjs 服务供应商
    angularjs 缓存 $q
    angularjs $location 服务
    angularjs $http 服务
    angularjs 自定义指令 directive
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/5182170.html
Copyright © 2020-2023  润新知