精华内容
下载资源
问答
  • web 前端入坑第一篇:web前端到底是什么?有前途吗

    万次阅读 多人点赞 2016-08-01 14:49:20
    web前端到底是什么? 某货: “前几年前端开发人员鱼目混杂,技术参差不齐,相对学习起来不规范,导致> 前端开发人员聚集,所以现在前端工种和工资还是没得到普遍重视,但近2年来,> > HTML5、JS 的流行...

    web前端到底是什么?


    某货: “前几年前端开发人员鱼目混杂,技术参差不齐,相对学习起来不规范,导致> 前端开发人员聚集,所以现在前端工种和工资还是没得到普遍重视,但近2年来,> > HTML5、JS 的流行,让前端异常火爆,以后还会更有前途吗?请问您怎么看?”



    “我只能告诉你:前端不灭”
    “除非你不要脸!”
    “前些年因为国内都不要脸,然而现在都明白了用户体验至上,现在都要脸;”
    “不但要脸 还要胸大 活好!用着舒服”
    “后端提供床,前端提供颜值高的妹,你说重要吗?”


    某货:“嘿嘿!你意思是 地上、厨房都可以,但没妹子怎么行?。。【大大的 污 】”


    上面对话,是我前两天在群里 一段解答的对话。
    有人问我 为什么你举例这么生动,真实,让人看了觉得更激情了。我只能告诉你:我主业是段子手,副业才是code,你表 搞错好吗?
    好,下面我来简单粗暴的介绍下我自己:3个特征而已


    1. 我 最 帅!
    2. 我 最 帅!
    3. 我 最 帅!

    O(∩_∩)O 好了,我们已经相识了,我们进入相知的阶段(我擦,太快了吧?)

    在我讲段子之前呢,我有必要和责任解释下:
    {“ web前端开发 ”是什么? }
    {“ web前端开发 ”有前途吗?}
    {“ web前端开发 ”到底怎么学?}

    这3个对象,是你入【前端】这个坑的初恋,对!没错同时和 3个对象谈恋爱(我知道你大学肯定干过额 【邪恶脸】)。

    NO 1: web前端开发 ”是什么?


    前言:声明啊,我是个草根派,不是学院派;那些一篇噼里啪啦,噼里啪啦的各种定义 和术语解释,你在我这么帅的人的系列文章里,根本看不到 嘿嘿!


    【啦啦啦 啦啦啦, 我是卖报的小行家,不怕苦,不怕累。。】。。。画风突变


    跑题啦!不过话说回来,这个脍炙人口的儿歌,深刻反映了我们 web前端行业的一个工种状态。行家,自由,但要经历苦、累 才会有收获。其他行业,苦、累居多,而我们大前端那必须是自由,乐趣,随心所欲的一个工种。

    本帅的感触:做任何一件事,如果是兴趣使然,那必定会坚守到老,从菜鸟变大神也是顺理成章的事儿。因为你的经验会随着你的颜值经历时间的洗刷,最后你回头会发现一件最有意义的事:

    我擦,加薪了! (^o^)/YES!

    废话了这么多,我们来步入正题:其实web前端这个职位,并没有一个有效的历史记录可以查询,更没有一个明确的定义,她不像java 攻城狮、c++开发这种一开始就有明确定位的工种一样,是有核心技能可以描述的。比如java开发,顾名思义就是利用java程序来开发功能,php开发:利用php做个商城等等。

    前端小美女

    你会发现:我们前端这个姑娘,她甚至没有一个logo 和拟人化的图形用来描述(是不是挺扯淡的?)不过不要紧,下面让帅的人 来为她正名。O(∩_∩)O~

    一、web前端的演变


    Web前端开发工程师是一个很新的职业,在国内乃至国际上真正开始受到重视的时间不超过10年。Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征。在互联网的演化进程中,网页制作是Web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。

    2005年以后,互联网进入Web 2.0时代,各种类似桌面软件的Web应用大量涌现,网站的前端由此发生了翻天覆地的变化。网页不再只是承载单一的文字和图片,各种丰富媒体让网页的内容更加生动,网页上软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现的。

    随着WEB2.0概念的普及和W3C组织的推广,网站重构的影响力正以惊人的速度增长。


    前端飞速发展


    上边一段标注解释,是某科的一些附录,(这么枯燥的东西,就让别人来总结吧对么?)大概阐述了,以前的web是怎么一种状态和Web2.0的重要性。

    其实中国的“web前端开发攻城狮”这个职位好多人并不知道是怎么叫出来的,那么我偷偷 <( ̄︶ ̄)>告诉你:其实是淘宝团队,发明出来的本土化的名称,因为历史原因,淘宝在2005以后迅速崛起,并且爆发式的访问量,让淘宝网的用户体验受到巨大考验和急需前进。

    然后淘宝官方第一次有了【 web前端开发 】这个字眼和招聘职位,或许其他网站也想到了这样一种描述,但是毕竟知名度巨高的淘宝,受关注度自然高,口碑相传,就把【前端开发】这个叫法发扬光大了。

    在早期点Web前端不叫前端,而是被亲切的叫做“网页设计师”,没错你没看错,就是这个名字,我记得那时候 【网页三剑客】的说法满天飞,你掌握了这3贱客,真的很贱,就可以被人叫做网页设计师了。

    网页三剑客:DW\FW\Falsh

    网页三剑客

    网页三剑客(Flash、Dreamweaver、Firewoks) 并称为Macromedia的网页制作三剑客,由于是同一公司的产品,因而在功能上有着一个非常紧密的结合 。后来Firewoks被Adobe这个变态的巨头收购以后,ps就基本取代Firewoks来做设计网页的工作了,虽然我知道现在还有人用,估计是一种怀念和某些好用的切图功能吧。

    而那时候的网页设计师 如果要入此道,必须要掌握的就是Dreamweaver,并不是说只有他能写html 和 css ,而是它在当时的自动提示实在太好用、太强大了,简直不用费脑细胞,你就可以轻轻松松的完成你所想。在当时前端工具和编辑器贫乏的时代,这个绝对是神奇级别了(当然后来 写的多了都熟悉基本不用提示的)。当年还有很多基于Dreamweaver构建网站的教程,那时候真的是个基情满满的年代,这些工具类的历史产物,有兴趣的朋友可以去了解一下就好了,我们不在多舌。

    二、web前端开发入门,需要掌握哪些基础


    虽说这个问题很大,但是这个话题就很好回答了;因为现在前端如此眼花缭乱,技能多多,都是基于此三板斧:
    HTML、CSS、JavaScript


    W3C


    语言基础:HTML、CSS、JavaScript

    思想标准:W3C标准

    W3C万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,如广为业界采用的超文本标记语言标准通用标记语言下的一个应用)、可扩展标记语言等,有效促进了Web技术的互相兼容,对互联网技术的发展和应用起到了基础性和根本性的支撑作用。

    所以 我们现在运用的html 超文本标记语言,css 等所有基于web技术的范畴,基本都是w3c标准,并全世界统一执行的,所以符合w3c 也就是开启前段之门了。
    web前端,首先不是孤立存在的,前端相对于web后端编程而言,前端是浏览器自身支持的编程语言,包括html,css,javascript

    HTML: 是构成网页展示的基础,是一种很简单可视化的标识语言,说白了就是 一是一,你写二就出二。网上所有的网页网站,不管多么牛鼻最后都会转化成html,被浏览器渲染出来,用作展示。

    CSS: 又称作样式表,简单点说就是html的外衣,将html包装的明艳动人。

    JavaScript:是一种直译式脚本语言,非常灵活,可以在任何浏览器上开发与调试的一种动态类型、弱类型、基于原型的语言。
    (关于js这个让人又爱又恨的语言,我们到后面会着重介绍和学习,因为掌握此技能, 你就拥有了全世界,说全世界是扯淡的,说白了拥有了 money和妹子)

    NO 2: web前端开发 ”到底有前途吗?


    如果你在2012年以前 这么问,或许很多人会思考一下,给你说不知道,应该没后端编程有前途吧,或者直接说,web前端有啥啊?不就写个网页、js吗?工资又低。。。。


    但现在是2016年了亲,我只能说以后都会是前端年,很久以前不懂web前端的人观念大概是:

    xx是美工,让他弄个网页过来
    xx你好,你能给我切割按钮过来吗,我后面需要用
    xx你alert一下,看我数据传过去了没。
    xx xx xx 的

    xx你麻痹啊xx!不要叫我美工,谁叫我跟谁急;不要叫我页面仔,虽说每个扎实的前端都是页面仔过来的;更不要侮辱我的职业,以为前端只是写页面、切图。。

    然而现在的真实情况是这样的:

    hi,小北你这个是什么效果啊,这么牛,css3 html5做的?【css3 html5 笑而不语

    我擦,这,这 怎么自动就刷新了,吓我一跳啊,我还拉回切换着f5呢【gulp、 webpack等构建工具笑而不语

    哎呦,js真牛逼啊,连后台数据库都能操作了,服务器都能构建了【nodejs笑而不语

    哥,你需要什么形式的json串啊, 我这边好生成一下,哥,你过来看一下这个体验怎么样?【老子 不笑,也不会语。尼玛要累死我?


    随着html5的普罗天下,css3的风靡全球,随着nodejs 的崛起,JavaScript这个最容易被人误解的语言,终于散发了它本该有的光芒(不要以为是我抄的别人的话,本篇文章纯属原创,我就是这么有才!)


    Javascript这个牛鼻的历史产物,现在真的可以说是万能的,至少在web层面是这样,交互、效果、数据操作、娱乐游戏、操作文件io等等。

    由于现在是web应用时代,各种尺寸的电子设备,增长式的爆发,只要和屏幕有关的 就是颜值,颜值代表了一切,你说前端有前途吗?

    html5、网页游戏风靡全球,需要页面展现的东西 都是前端范畴,你说有前途吗?

    目前世界上最多的可视化物质是什么?蚂蚁?人?还有人说是TT(泥煤,亏你想的出来),那么我告诉你,是网页,网页 ,网页,据统计现在全世界 有亿级别的网页,请问什么概念,你说有前途吗?

    最直观的:前端的工资 从前几年的平均几K 到现在的10 20 k 。

    前端工资比例图


    你说有前途没?

    由于本篇文章是 我 前端系列文章的第一篇,只介绍下历史原因 和 为前端正名,并且有效提升初学者和怀疑者的兴趣,所以一些名词的介绍和意义,大家先自行谷歌、度娘一下,后面我们会一一道来。

    NO 3: web前端开发 ”怎么学习,怎么入门?


    想知道吗?嘿嘿,我好累,喝口水把个妹,想知道,持续关注我帅帅的颜值,下回分解!

    在最后,特别感谢,贺贺妹子(傻),辛苦整理提供一些资料和配图,让我的文章更加生动和有趣。我想她一定是被我的颜值折服了吧!

     

    ----------------------------------------------------------------------------------------------

     

    web前端入坑系列:点击标题进入

    第一篇: web 前端入坑第一篇:web前端到底是什么?有前途吗

    第二篇: web前端入坑第二篇:web前端到底怎么学?干货资料!

    第三篇:web前端 | 一条“不归路” -  学习路线!

     

     

    入坑方式:   欢迎加入~!气氛热情,欢乐多,妹子多!

     

     

     扫描屏二维码或直接搜索,可以关注 我的前端公众号 :前端你别闹

    听说妹子挺多的,及时更新一些前端解惑和段子

    70

     

    展开全文
  • web.xml文件什么?有什么用?--详解

    万次阅读 多人点赞 2018-10-08 10:41:31
    但是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件。 1、WEB工程加载web.xml过程  经过个人测试,WEB工程加载顺序与元素节点在文件中的配置顺序无关。即不会因为 filte...

     前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程。web.xml主要用来配置Filter、Listener、Servlet等。但是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件。

    1、WEB工程加载web.xml过程

      经过个人测试,WEB工程加载顺序与元素节点在文件中的配置顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。WEB容器的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet。并且这些元素可以配置在文件中的任意位置。

      加载过程顺序如下:

    1. 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。 
    2. 紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。 
    3. 容器将<context-param>转换为键值对,并交给servletContext。 
    4. 容器创建<listener>中的类实例,创建监听器。 

    2、web.xml文件元素详解

      1、schema

      web.xml的模式文件是由Sun公司定义的,每个web.xml文件的根元素<web-app>中,都必须标明这个 web.xml使用的是哪个模式文件。其它的元素都放在<web-app></web-app>之中。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
        xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    </web-app>

      2、<icon>Web应用图标

      指出IDE和GUI工具用来表示Web应用的大图标和小图标。

    <icon>
        <small-icon>/images/app_small.gif</small-icon>
        <large-icon>/images/app_large.gif</large-icon>
    </icon>

      3、<display-name>Web应用名称

      提供GUI工具可能会用来标记这个特定的Web应用的一个名称

    <display-name>Tomcat Example</display-name>

      4、<disciption>Web应用描述

      给出于此相关的说明性文本

    <disciption>Tomcat Example servlets and JSP pages.</disciption>

      5、<context-param>上下文参数

      声明应用范围内的初始化参数。它用于向 ServletContext提供键值对,即应用程序上下文信息。我们的listener, filter等在初始化时会用到这些上下文中的信息。在servlet里面可以通过getServletContext().getInitParameter("context/param")得到。

    <context-param>
        <param-name>ContextParameter</para-name>
        <param-value>test</param-value>
        <description>It is a test parameter.</description>
    </context-param>

      6、<filter>过滤器

      将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。

    <filter>
        <filter-name>setCharacterEncoding</filter-name>
        <filter-class>com.myTest.setCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>setCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

      7、<listener>监听器

    <listener> 
        <listerner-class>com.listener.SessionListener</listener-class> 
    </listener>

      8、<servlet>

      <servlet></servlet> 用来声明一个servlet的数据,主要有以下子元素:

    • <servlet-name></servlet-name> 指定servlet的名称
    • <servlet-class></servlet-class> 指定servlet的类名称
    • <jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径
    • <init-param></init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数
    • <load-on-startup></load-on-startup>指定当Web应用启动时,装载Servlet的次序。当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet。当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它。
    • <servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素
    • <servlet-name></servlet-name> 指定servlet的名称
    • <url-pattern></url-pattern> 指定servlet所对应的URL
    <!-- 基本配置 -->
    <servlet>
        <servlet-name>snoop</servlet-name>
        <servlet-class>SnoopServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>snoop</servlet-name>
        <url-pattern>/snoop</url-pattern>
    </servlet-mapping>
    <!-- 高级配置 -->
    <servlet>
        <servlet-name>snoop</servlet-name>
        <servlet-class>SnoopServlet</servlet-class>
        <init-param>
            <param-name>foo</param-name>
            <param-value>bar</param-value>
        </init-param>
        <run-as>
            <description>Security role for anonymous access</description>
            <role-name>tomcat</role-name>
        </run-as>
    </servlet>
    <servlet-mapping>
        <servlet-name>snoop</servlet-name>
        <url-pattern>/snoop</url-pattern>
    </servlet-mapping>

      9、<session-config>会话超时配置

      单位为分钟。

    <session-config>
        <session-timeout>120</session-timeout>
    </session-config>

      10、<mime-mapping>

    <mime-mapping>
        <extension>htm</extension>
        <mime-type>text/html</mime-type>
    </mime-mapping>

      11、<welcome-file-list>欢迎文件页

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
    </welcome-file-list>

      12、<error-page>错误页面

    <!-- 1、通过错误码来配置error-page。当系统发生×××错误时,跳转到错误处理页面。 -->
    <error-page>
        <error-code>404</error-code>
        <location>/NotFound.jsp</location>
    </error-page>
    <!-- 2、通过异常的类型配置error-page。当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面。 -->
    <error-page>
        <exception-type>java.lang.NullException</exception-type>
        <location>/error.jsp</location>
    </error-page>

      13、<jsp-config>设置jsp

      <jsp-config> 包括 <taglib> 和 <jsp-property-group> 两个子元素。其中<taglib> 元素在JSP 1.2 时就已经存在;而<jsp-property-group> 是JSP 2.0 新增的元素。

      <jsp-property-group> 元素主要有八个子元素,它们分别为:

    • <description>:设定的说明 
    • <display-name>:设定名称 
    • <url-pattern>:设定值所影响的范围,如: /CH2 或 /*.jsp
    • <el-ignored>:若为 true,表示不支持 EL 语法 
    • <scripting-invalid>:若为 true,表示不支持 <% scripting %>语法 
    • <page-encoding>:设定 JSP 网页的编码 
    • <include-prelude>:设置 JSP 网页的抬头,扩展名为 .jspf
    • <include-coda>:设置 JSP 网页的结尾,扩展名为 .jspf
    <jsp-config>
        <taglib>
            <taglib-uri>Taglib</taglib-uri>
            <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
        </taglib>
        <jsp-property-group>
            <description>Special property group for JSP Configuration JSP example.</description>
            <display-name>JSPConfiguration</display-name>
            <url-pattern>/jsp/* </url-pattern>
            <el-ignored>true</el-ignored>
            <page-encoding>GB2312</page-encoding>
            <scripting-invalid>true</scripting-invalid>
            <include-prelude>/include/prelude.jspf</include-prelude>
            <include-coda>/include/coda.jspf</include-coda>
        </jsp-property-group>
    </jsp-config>

      对于Web 应用程式来说,Scriptlet 是个不乐意被见到的东西,因为它会使得HTML 与Java 程式码交相混杂,对于程式的维护来说相当的麻烦,必要的时候,可以在web.xml 中加上<script-invalid> 标签,设定所有的JSP 网页都不可以使用Scriptlet。

    3、Mapping规则

      当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。

      其匹配规则和顺序如下:

    1. 精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
    2. 最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
    3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

      以”/’开头和以”/*”结尾的是用来做路径映射的。以前缀”*.”开头的是用来做扩展映射的。所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

    展开全文
  • 关于web项目的一些总结: WebRoot下的WEB-INF的内容是无法直接访问的,必须通过服务器的转发操作才可以访问。 request.getRequestDispatcher("/WEB-INF/...WebRoot到底是个什么东西?为什么我们放入资源就可以访问...

    关于web项目的一些总结:

    1. WebRoot下的WEB-INF的内容是无法直接访问的,必须通过服务器的转发操作才可以访问。

      request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(req, resp);
      

      通过测试发现WebRoot下的其他路径(包括子文件夹)是可以随意访问的。

    2. WebRoot到底是个什么东西?为什么我们放入资源就可以访问了呢?也没有配置servlet啊?

      这都是编译器的功劳,首先呢,右键web项目点击Properties,接着找到Deployment Assembly,如下图:

      在这里插入图片描述

      我们可以很清楚的看到,WebRoot的资源默认是放入根路径的,这个根路径在哪呢?就是Tomcat路径下的webapps/当前web应用,因为我们的web程序不就是发布到Tomcat上吗?所以这个也很好理解。同时再解释一下,为什么 静态资源就可以打开了?因为 Tomcat 匹配一个路径,是先扫描是否存在该文件,如果存在,则返回,如果不存在,则匹配Servlet路径,如果没有匹配到Servlet-url,那么则返回404页面

      还可以看到,我自己创的resources文件夹,默认会被部署到web应用下的/WEB-INF/classes,大家都知道WEB-INF下的资源是无法被直接访问的,所以我的Resources下的静态资源并不能被访问到,但是我们可以把他的部署目录修改 成部署到 项目的根目录即可。

      其实WebRoot并不特殊,我完全可以把他改成任意的名字,只要发布的路径是 web项目的根路径就行了。

      还有一些小伙伴使用maven的方式创建web工程,为什么本地不报错,但是部署到Tomcat运行就报错了呢?,提示找不到jar包,最大的可能就是,检查一下Web Deployment Assembly,看看是否里面包含了maven的库。我们需要把maven的库也一起部署到应用下面啊,不然当然会提示Class Not Found…

    3. java Build PathWeb Deployment Assembly的区别 是 什么?

    ​ 首先呢?我们从字面意思理解,java Build Path当然就是 java的编译路径,那么就很好理解了,这个选项是设置,java程序的编译生成的classes,jar包啊,资源们的输出目录,编译器给我们编译,总得需要个目录吧。所以这个选项的作用就是 设置编译后的文件的位置。

    ​ 而Web Deployment Assembly就是 当编译器替我们把 web 项目部署到Tomacat上面,放到web应用下的哪个目录呢?于是乎,就有了Web Deployment Assembly两个的本质区别就是一个是设置输出本地编译的位置,一个是设置存放在web应用下的位置

    展开全文
  • web文件上传

    千次阅读 2018-07-12 10:38:39
    今天在复习Web 的时候,做个一个文件上传的小Demo,发布一篇博客,记录一些笔记要点。和web做上传的一些注意事项。这个Demo 解决了Web上传问题中的以下问题: 1.实现web开发中的文件上传功能,需要完成2个步骤操作: ...

            今天在复习Web 的时候,做个一个文件上传的小Demo,发布一篇博客,记录一些笔记要点。和web做上传的一些注意事项。这个Demo 解决了Web上传问题中的以下问题:

    1.实现web开发中的文件上传功能,需要完成2个步骤操作:

    ①在web页面中添加上传输入项
    ②在servlet中读取上传文件的数据,并保存到本地盘中。

    如何在web页面中添加上传输入项?
    <input type="file">标签用于在web页面中添加文件上传输入项,设 置文件上传输入项时刻须注意。
    1.必须要设置inpu输入项的name属性,否则浏览器将不会发送上传文件的数据.
    2.必须把form的enctype属性设置为multipart/form-data,设置该值后,浏览器在上传文件时,将把文件数据附带在http
    请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

    DisKFileItemFactory是创建 FileItem 对象的工厂,这个工厂类常用方法:
    public void setSizeThreshold(int size Threshould)
    设置内存缓冲区的大小,默认为10k,当上传文件大于缓冲区大小时,fileupload组件将使用
    临时缓存上传文件。
    public void  (java.io.File.repository)
    指定临时文件目录,默认值为
    System.getProperty("java.lang.tmpdir");

    public DiskFileItemFactory(int size Threshould,java.ioo.File repository)
    构造函数

    上传文件乱码问题:
    DiskFileItemFactory factory = new DiskFileItemFactoy();
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setEncoding("UTF-8");

    inpuvalue = new String(inputValue.getBytes("iso-8859-1","UTF-8"));

    ServletFileUpload.setHeaderEnconding("UTF-8");
    1.上传文件乱码:
    1.1 ServletFileUpload.setHeaderEnconding("UTF-8");
    1.2 解决普通输入项的乱码(注意:表单类型为Multipart/form-data的时候,设置request的编码是无效的)
    FileItem.setString("UTF-8"); //解决乱码
    2.在处理表单之前,要记得调用:
    ServletFileUpload.isMultipartContent
    3.设置解析器缓冲器大小,以及临时文件的删除
    设置解析器缓冲区大小   DiskFileItemFactory.setSizeThreshould(1024*1024);方法
    临时文件的删除,在程序中处理完成上传文件后,一定要记得调用item.delete()方法,以删除临时文件

    4.再上传系统时候,注意上传文件的目录,这个文件的保存目录不能让外界直接访问到.不然后服务器有很大的漏洞。

    5.限制上传文件的类型
    List types = Arrays.asList(".jpg",".gif",".avi",".txt"); 
    6.限制上传文件的大小
    ServletFileUpload负责处理上传的数据,并将表单中每个输入项封装成一个FileItem对象中,常用方法有:
    boolean isMultipartContent(HttpServletRequest request)
    判断上传表单是为Multipart/form-data类型
    List<FileItem> list = upload.parseRequest(request);
    解析request对象,并把表单中的每个输入项包装成一个fileItem对象,并返回一个保存了所有FileItem的list集合.
    setFile SizeFileMax(long fileSizeMax)
    设置单个上传文件总量的最大值
    setSizeMax(long sizeMax)
    设置上传文件总量的最大值
    setHeaderEconding(java.lang.String encoding)
    设置编码格式
    setProgressListener(ProgressListener pListener)

    7.如何判断空上传输入项
    String filename = item.getName().substring(item.getName().lastIndexOf("\\")+1); //获取到文件名称
    String ext = filename.substring(filename.lastIndexOf(".")+1); //获得文件的扩展名
    if(filename==null || filename.trim().equals("")){
    continue;
    }

    8.为避免上传文件的覆盖,程序在保存上传文件时,要为文件生成唯一的文件名
    public String generateFileName(String filename){
    return UUID.randomUUID().toString() + "_" + filename;
    }

    String savepath = this.getServletContext().getRealPath("/WEB-INF/upload");
    String saveFileName = generateFileName(filename);
    //File.separator   常量分隔符   /
    FileOutputStream out = new FileOutputStream(savepath + File.separator + saveFileName); //指定目录下

    9.目录文件上限问题(哈希目录)  原理:文件名转换成哈希值  根据哈希第四位生成一级目录
    在web工程中难免会有目录保存的文件过多而见降低打开目录的效率.一般来说一个目录保存1000个文件属于正常。对于1000个,目录打开效率就会降低
    所以我们使用一种将目录的名字转换成哈希值打散存储
    public String generateSavePath(String pathe,String filename){
    int hashcode = filename.hashCode(); //121212
    int dir1 = hashcode&15;
    int dir2 = (hashcode>>4)&0xf;

    String savepath = path + File.separator + dir1 + File.separator + dir2;
    if(!file.exists()){
    file.mkdirs(); //因为需要创建多级目录  所以这里一定是mkdirs()  不是mkdir()函数
    }
    return savepath;
    }

    图示举例:
    哈希值在计算机中的保存以二进制保存   为数字

    0011 1010 0111 1111 1010 1110 0110 0111
    ---------------------------------------    二进制 1111 = 15 十进制
    0000 0000 0000 0000 0000 0000 0000 1111

    结果:000 0000 0000 0000 0000 0000 0000 0111 7
    按照哈希值的第四位 保存 二进制0111 = 十进制 7 保存到文件目录为7的目录下,第四位最大为15-最小为0,故总共16个一级目录
    一级目录不够,再利用哈希值的第5-8位,生成二级目录.类似可以生成三级目录、四级目录、无极目录... 代码如下:

    //解决目录上限(1000个最佳)问题
    public String generateSavePath(String path,String filename){
    int hashcode = filename.hashCode(); //哈希值
    int dir1 = hashcode&15; //一级目录
    int dir2 = (hashcode>>4)&0xf; //二级目录  哈希值的第5~8位
    String savepath = path + File.separator + dir1 + File.separator + dir2;
    File file = new File(savepath);
    if(!file.exists()){
    file.mkdirs();
    }
    return savepath;
    }

    10.后台进度条数据(设置监听器 ServletFileUpload.setProcessListener())
    (监听器一定要设在解析之前)使用解析器调用update方法
    void update(long pBytesRead,long pContentLength,int pItems);
    //每 1M 进度条涨一下
    ProgressListener progressListener = new ProgerssListener(){
    private long megaBytes = -1;
    public void update(long pBytesRead,long pContentLength,int pItems){
    long mBytes = pBytesRead / 1000000;
    if(megBytes == aBytes){
    return ;
    }
    megaBytes = mBytes;
    System.out.println("We are currently reading item "+pItems);
    if(pContenLength == -1){
    System.out.println("So far "+pBytesRead +"Bytes have been read ");
    }else{
    System.out.println("So far."+pBytesRead +"of "+ pContentLength +"bytes have been read.");
    }
    }
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Arrays;
    import java.util.List;
    import java.util.UUID;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadBase;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.ProgressListener;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;

    @WebServlet("/UploadServlet")
    public class UploadServlet extends HttpServlet{
    /**

    */
    private static final long serialVersionUID = 1L;
    //处理上传数据
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    DiskFileItemFactory factory = new DiskFileItemFactory(); //创建一个工厂  默认缓冲区大小为10k
    //设置缓冲区大小为 1 M  如果上传文件大于1M,则上传的文件将不再保存在缓冲区,将会保存在临时文件中,读取数据的时候也会从临时文件中读取
    factory.setSizeThreshold(1024*1024);  
    //设置临时文件保存目录   / 代表web工程    将/temp设置为临时保存文件目录
    factory.setRepository(new File(this.getServletContext().getRealPath("temp")));
    ServletFileUpload upload = new ServletFileUpload(factory); //创建解析器

    //在解析数据之前  做后台页面数据生成进度条
    upload.setProgressListener(new ProgressListener() {
    private long megaBytes = -1 ;
    @Override
    public void update(long pBytesRead, long pContentLength, int pItems) {
    long mBytes = pBytesRead / 1000000;
    if(mBytes == -1){
    return ;
    }
    megaBytes = mBytes;
    System.out.println("已经读取文件个数:"+pItems);
    if(pContentLength == -1){
    System.out.println("已经读取"+pBytesRead+"字节");
    }else{
    System.out.println("读取了"+ pBytesRead +"字节");
    }
    }
    });

    //解决中文乱码问题
    upload.setHeaderEncoding("UTF-8");
    //限制单个文件上传大小   100 M
    upload.setFileSizeMax(1024*1024*100);
    //限制上传数据的类型
    List types = Arrays.asList("txt","avi","gif","jpg");
    if(!upload.isMultipartContent(request)){ //若果不是上传表单数据
    String nameString = request.getParameter("username");
    System.out.println("name:"+nameString);
    return ;
    }
    try {
    System.out.println("//");
    System.out.println(this.getServletContext().getRealPath("/WEB-INF/upload"));
    System.out.println("----------------------------------");
    List<FileItem> list = upload.parseRequest(request); //调用解析器解析request,得到并保存所有上传数据的List
    for (FileItem item : list) {
    if(item.isFormField()){ //判断是否为输入项
    //为输入项
    String  inputName = item.getFieldName(); //获得文件的名称
    String  inputvalue = item.getString(); //获得文件的值
    String  inputValue = new String(inputvalue.getBytes("iso-8859-1"));
    System.out.println(inputName+"="+inputValue);
    }else{
    //代表输入项中封装的是文件
    String filename = item.getName().substring(item.getName().lastIndexOf("\\")+1); //获取到文件名称
    String ext = filename.substring(filename.lastIndexOf(".")+1); //获得文件的扩展名
    if(filename==null || filename.trim().equals("")){
    continue;
    }
    /*if(!types.contains(ext)){
    request.setAttribute("message","本系统不支持上传"+ext+"文件类型");
    request.getRequestDispatcher("/message.jsp").forward(request, response);
    return ;
    }*/
    System.out.println("filename:"+filename);
    InputStream in = item.getInputStream(); //获得inputStream流
    //设置缓冲区
    int len = 0;
    byte buffer[] = new byte[1024];
    String saveFileName = generateFileName(filename); //调用gerenate函数 生成唯一的文件名称
    String savepath = generateSavePath(this.getServletContext().getRealPath("/WEB-INF/upload"),saveFileName);
    //File.separator   常量分隔符   /
    FileOutputStream out = new FileOutputStream(savepath + File.separator + saveFileName); //指定目录下
    while((len = in.read(buffer)) > 0){
    out.write(buffer,0,len);
    }
    in.close();
    out.close();
    item.delete(); //删除上传完毕后的临时文件
    }
    }
    }catch (FileUploadBase.FileSizeLimitExceededException e) {
    request.setAttribute("message","文件大小不能超过 5 M");
    request.getRequestDispatcher("/message.jsp").forward(request, response);
    return ;
    }catch (FileUploadException e) {
    e.printStackTrace();
    }
    }

    //解决同名文件覆盖问题
    public String generateFileName(String filename){
    //UUID.randomUUID().toString() 74e59732-f339-4546-bf91-42c6c83696ea 全球唯一标识
    return UUID.randomUUID().toString() + "_" + filename;
    }

    //解决目录上限(1000个最佳)问题
    public String generateSavePath(String path,String filename){
    int hashcode = filename.hashCode(); //哈希值
    int dir1 = hashcode&15; //一级目录
    //0x 代表16进制  16进制 0 1 2 . . . A(10) B C D E F(15) 则0xf = 1111 最高为补24位 0000 0000 0000 0000 0000 0000 1111 
    //hashcode>>4 哈希值向前移动4位 若原来为0101 1000 0010 0001 1111 1100 1010 1111 移动后为0101 1000 0010 0001 1111 1100 1010
    int dir2 = (hashcode>>4)& 0xf; //二级目录   
    String savepath = path + File.separator + dir1 + File.separator + dir2;
    File file = new File(savepath);
    if(!file.exists()){
    file.mkdirs();
    }
    return savepath;
    }
    }

    };

     

    1.创建Web工程

     

    2.编写UploadServlet.java代码

    package com.nyist.cn.Servlet;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Arrays;
    import java.util.List;
    import java.util.UUID;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadBase;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.ProgressListener;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;

    @WebServlet("/UploadServlet")
    public class UploadServlet extends HttpServlet{
    /**

    */
    private static final long serialVersionUID = 1L;
    //处理上传数据
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    DiskFileItemFactory factory = new DiskFileItemFactory(); //创建一个工厂  默认缓冲区大小为10k
    //设置缓冲区大小为 1 M  如果上传文件大于1M,则上传的文件将不再保存在缓冲区,将会保存在临时文件中,读取数据的时候也会从临时文件中读取
    factory.setSizeThreshold(1024*1024);  
    //设置临时文件保存目录   / 代表web工程    将/temp设置为临时保存文件目录
    factory.setRepository(new File(this.getServletContext().getRealPath("temp")));
    ServletFileUpload upload = new ServletFileUpload(factory); //创建解析器

    //在解析数据之前  做后台页面数据生成进度条
    upload.setProgressListener(new ProgressListener() {
    private long megaBytes = -1 ;
    @Override
    public void update(long pBytesRead, long pContentLength, int pItems) {
    long mBytes = pBytesRead / 1000000;
    if(mBytes == -1){
    return ;
    }
    megaBytes = mBytes;
    System.out.println("已经读取文件个数:"+pItems);
    if(pContentLength == -1){
    System.out.println("已经读取"+pBytesRead+"字节");
    }else{
    System.out.println("读取了"+ pBytesRead +"字节");
    }
    }
    });

    //解决中文乱码问题
    upload.setHeaderEncoding("UTF-8");
    //限制单个文件上传大小   100 M
    upload.setFileSizeMax(1024*1024*100);
    //限制上传数据的类型
    List types = Arrays.asList("txt","avi","gif","jpg");
    if(!upload.isMultipartContent(request)){ //若果不是上传表单数据
    String nameString = request.getParameter("username");
    System.out.println("name:"+nameString);
    return ;
    }
    try {
    System.out.println("//");
    System.out.println(this.getServletContext().getRealPath("/WEB-INF/upload"));
    System.out.println("----------------------------------");
    List<FileItem> list = upload.parseRequest(request); //调用解析器解析request,得到并保存所有上传数据的List
    for (FileItem item : list) {
    if(item.isFormField()){ //判断是否为输入项
    //为输入项
    String  inputName = item.getFieldName(); //获得文件的名称
    String  inputvalue = item.getString(); //获得文件的值
    String  inputValue = new String(inputvalue.getBytes("iso-8859-1"));
    System.out.println(inputName+"="+inputValue);
    }else{
    //代表输入项中封装的是文件
    String filename = item.getName().substring(item.getName().lastIndexOf("\\")+1); //获取到文件名称
    String ext = filename.substring(filename.lastIndexOf(".")+1); //获得文件的扩展名
    if(filename==null || filename.trim().equals("")){
    continue;
    }
    /*if(!types.contains(ext)){
    request.setAttribute("message","本系统不支持上传"+ext+"文件类型");
    request.getRequestDispatcher("/message.jsp").forward(request, response);
    return ;
    }*/
    System.out.println("filename:"+filename);
    InputStream in = item.getInputStream(); //获得inputStream流
    //设置缓冲区
    int len = 0;
    byte buffer[] = new byte[1024];
    String saveFileName = generateFileName(filename); //调用gerenate函数 生成唯一的文件名称
    String savepath = generateSavePath(this.getServletContext().getRealPath("/WEB-INF/upload"),saveFileName);
    //File.separator   常量分隔符   /
    FileOutputStream out = new FileOutputStream(savepath + File.separator + saveFileName); //指定目录下
    while((len = in.read(buffer)) > 0){
    out.write(buffer,0,len);
    }
    in.close();
    out.close();
    item.delete(); //删除上传完毕后的临时文件
    }
    }
    }catch (FileUploadBase.FileSizeLimitExceededException e) {
    request.setAttribute("message","文件大小不能超过 5 M");
    request.getRequestDispatcher("/message.jsp").forward(request, response);
    return ;
    }catch (FileUploadException e) {
    e.printStackTrace();
    }
    }

    //解决同名文件覆盖问题
    public String generateFileName(String filename){
    //UUID.randomUUID().toString() 74e59732-f339-4546-bf91-42c6c83696ea 全球唯一标识
    return UUID.randomUUID().toString() + "_" + filename;
    }

    //解决目录上限(1000个最佳)问题
    public String generateSavePath(String path,String filename){
    int hashcode = filename.hashCode(); //哈希值
    int dir1 = hashcode&15; //一级目录
    //0x 代表16进制  16进制 0 1 2 . . . A(10) B C D E F(15) 则0xf = 1111 最高为补24位 0000 0000 0000 0000 0000 0000 1111 
    //hashcode>>4 哈希值向前移动4位 若原来为0101 1000 0010 0001 1111 1100 1010 1111 移动后为0101 1000 0010 0001 1111 1100 1010
    int dir2 = (hashcode>>4)& 0xf; //二级目录   
    String savepath = path + File.separator + dir1 + File.separator + dir2;
    File file = new File(savepath);
    if(!file.exists()){
    file.mkdirs();
    }
    return savepath;
    }

    }

    4.上传文件测试

     

    运行结果:

    ............

    ............

    ............

    已经读取文件个数:3

    读取了83787776字节
    已经读取文件个数:3
    读取了83791830字节
    已经读取文件个数:3
    读取了83795884字节
    已经读取文件个数:3
    读取了83795968字节
    已经读取文件个数:3
    读取了83800022字节
    已经读取文件个数:3
    读取了83804076字节
    已经读取文件个数:3
    读取了83804160字节
    已经读取文件个数:3
    读取了83808214字节
    已经读取文件个数:3
    读取了83812268字节
    已经读取文件个数:3
    读取了83812352字节
    已经读取文件个数:3
    读取了83816406字节
    已经读取文件个数:3
    读取了83820460字节
    已经读取文件个数:3
    读取了83820544字节
    已经读取文件个数:3
    读取了83824598字节
    已经读取文件个数:3
    读取了83828652字节
    已经读取文件个数:3
    读取了83828736字节
    已经读取文件个数:3
    读取了83831201字节
    username=监听器上传视频数据

    filename:02-处理上传需要注意的细节.avi

     

    展开全文
  • 常见的文件扩展名

    万次阅读 多人点赞 2019-03-01 09:45:58
    常见的文件扩展名 文本 java:java代码文件 xml:具有结构性的标记电子文件 json:轻量级的数据交换格式,层次结构简洁和清晰 conf:配置信息文件 jsp:java嵌入式网页脚本文件 phps:php的源代码文件 asp:...
  • web到底是什么意思。先来看看两个名词:  一、超文本(hypertext)  一种全局性的信息结构,它将文档中的不同部分通过关键字建立链接,使信息得以用交互方式搜索。它是超级文本的简称。  二、超媒体...
  • 常用文件标识符扩展名 我的电脑 我的文档 拨号网络 控制面板 计划任务 回收站 记事本 网络邻居 打印机 公文包 Web 文件夹
  • web工程中的web.xml文件什么作用呢?它是每个web.xml工程都必须的吗? 一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。 那什么时候需要,什么时候可以不需要呢? 要想回答...
  • 什么是web安全测试

    千次阅读 2020-05-08 20:58:54
    1.1什么是web安全测试? Web安全测试就是要提供证据表明,在面对敌意和恶意输入的时候,web系统应用仍然能够充分地满足它的需求 1.2为什么进行Web安全测试 2005年06月,CardSystems,黑客恶意侵入了它的电脑系统,...
  • 修改包方法: 选中你的包右键--》refactor --》rename --》勾选以下两个选项(必须选两个,只选第一个,是新增包) ...修改工程web项目名称)方法:同样的方法,右键--》refactor --》r
  • Web 项目更改项目

    千次阅读 2017-06-25 20:21:25
    更改项目直接修改找到原项目中的.project 文件,更改中项目名称。然后在同目录下找到.mymetadata 文件 并更改name、context-root、archive 中的项目名称。这些名称必须一致。重新导入,项目名称就成功更改了。 ...
  • 什么是Web2.0? — Web2.0图解

    千次阅读 2009-07-26 20:39:00
    如今我们经常说起Web2.0,那么,什么是Web2.0?它与Web1.0有什么不同?事实上,Web2.0没有一个确切的概念,相对于Web1.0,它有明显的特征:每个人都是内容生产与获取者、信息个性化定制自由度大、网页技术不同、长尾...
  • 使用扩展名的内容创建一个zip文件 在Firefox中打开“加载项”菜单 在齿轮菜单中,选择选项“调试加载项” 单击选项“加载临时加载项”,然后选择压缩文件 ??? 更多的小猫! 这种加载扩展的方法仅在重新启动Fire...
  • 众所周之,spring源码解析之默认配置文件名/WEB-INF/applicationContext.xml。但是这个是在spring源代码里记录的呢? 今天就抱着试一试的态度去找到答案。 首先查看工程中的 web.xml,其中配置 spring的代码...
  • Web Components 是什么?它为什么对我们这么重要?原文链接 What are WebComponents and why are they important?摘要 先看一看未来的 WebComponent 标准,再简单了解怎么写 WebComponents,最后说说它的重要性。 ...
  • 什么是WEB服务器? 常用的WEB服务器有哪些?   一、什么是WEB服务器  Web服务器可以解析HTTP协议。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求Web服务器可以...
  • 什么是WEBserver? 经常使用的WEBserver有哪些?   一、什么是WEBserver  Webserver能够解析HTTP协议。当Webserver接收到一个HTTP请求,会返回一个HTTP响应,比如送回一个HTML页面。为了处理一个请求Webserver能够...
  • 今天在实现一个功能"将页面显示的GridView中的数据,导出到Excel表格中"时遇到这样一个错误: C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致。具体提示如图:    根据问题提示,从网上找了一下...
  • 看怎么修改Java Web项目

    千次阅读 2017-04-11 20:08:16
    在新建Web项目时,如果项目写好了,但发现名字写错了,这时候要改名字,如果直接rename,当部署Tomcat后,在浏览器输入新的项目名称的路径,报404找不出文件的错误,解决方法有两种:第一种方法: 打开工程所在目录...
  • 什么是Web数据库应用程序?

    千次阅读 2017-01-12 11:17:24
    什么是Web数据库应用程序? 应用是被设计为由最终用户(例如,客户,成员或马戏杂技演员)使用的程序或一组程序。如果最终用户通过Web浏览器与应用程序交互,则该应用程序是基于WebWeb应用程序。如果Web应用程序...
  • ctf-web:文件上传漏洞和文件解析漏洞

    万次阅读 多人点赞 2020-10-11 21:13:56
    其实我一直想学的就是web渗透,但是一直都不知道web渗透都有什么后来才知道居然就是sql注入,还有这几个漏洞的利用就是web渗透…这不就是我好几年前看的东西么… 当然,其实我也学的不是很精通,只是稍微会一点,就不...
  • 文件类型扩展名显示缩略小图标

    热门讨论 2011-06-01 16:01:55
    本资源包共收集了107种不同类型扩展名文件的缩略小图标,如exe.gif、doc.gif、pdf.gif、ftp.gif、img.gif、rar.gif等。 可以WEB文件上传应用中在取得文件扩展名之后,显示文件的类型小图标
  • Tomcat是一个被广泛使用的Java WEB应用服务器,下面将认识Tomcat:先来...再来了解Tomcat的安装目录结构、Tomcat配置文件、Tomcat部署Web应用程序的目录结构;最后了解Tomcat基本架构、以及Tomcat各组件的一些配置。
  • tomcat web容器 webroot里有啊.txt文件 !...直接浏览器输入无法访问(英文可以) ...有什么方法能够直接访问这个 啊.txt文件(不要让我改成英文)。 查过网上解决办法,都没解决到。 有没有哪位大哥能解决这个问题呢?
  • php获取文件名称和扩展名

    千次阅读 2017-02-03 12:14:34
    php获取文件名称和扩展名
  • JAVA WEB 判断上传的文件是否是图片

    千次阅读 2018-01-30 15:44:59
    Web程序中,如果限制上传文件为图片,大部分方法都采取检查文件扩展名。这样,当把一个非图片文件扩展名改为jpg、gif或者bmp时,就能绕过限制。所以必须得通过读取文件内容来进行判断。这里提供两种实现代码。 ...
  • Java Web工程中的web.xml配置文件

    千次阅读 2018-12-18 08:57:01
    xml文件:Extentsible Markup Language即可扩展标记语言,是用来定义其它语言的一种元语言,其前身是SGML(标准通用标记语言)。xml文件是互联网数据传输的重要工具,因为不受编程语言和操作系统的限制,所以可以跨越...
  • 下载拦截器 Chrome网上应用店链接: : 它是什么? Download Blocker是... 当bannedExtensions设置为[“ *”]时,此功能可用于阻止除少数文件扩展名之外的所有文件扩展名。 仅对于HTML走私文件,当将警报发送到外
  • web.xml文件详解

    千次阅读 2018-01-22 15:28:50
    web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程。web.xml主要用来配置Filter、Listener、Servlet等。但是要说明的是web.xml并不是必须的,一个web工程可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,182,973
精华内容 473,189
关键字:

web的扩展名是什么