zoukankan      html  css  js  c++  java
  • jsp 部署

      部署一个Servlet 3.0应用程序是一件轻而易举的 事。通过Servlet注解类型,对于不太复杂的应用程序, 可以部署没有描述符的Servlet/JSP应用程序。尽管如 此,在需要更加精细配置的情况下,部署描述符仍然需 要。首先,部署描述符必须被命名为web.xml并且位于 WEB-INF目录下,Java类必须放置在WEB-INF/classes 目录下,而Java类库则必须位于WEB-INF/lib目录下。 所有的应用程序资源必须打包成一个以.war为后缀的 JAR文件。

    一. 概述

      在Servlet 3.0之前,部署工作必然涉及部署描述 符,即web.xml文件,我们在该文件中配置应用程序的 各个方面。但在Servlet 3.0中,部署描述符是可选的, 因为我们可以使用标注来映射一个URL模式的资源。不 过,若存在如下场景,则依然需要部署描述符:

    • 需要传递初始参数给ServletContext。
    • 有多个过滤器,并要指定调用顺序。
    • 需要更改会话超时设置。
    • 要限制资源的访问,并配置用户身份验证方式。

    下面展示了部署描述符的框架。它必须被命名 为web.xml且合并在应用目录的WEB-INF目录下。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    ➥ http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="4.0"
    [metadata-complete="true|false"]
    >
    ...
    </web-app>

      xsi:schemaLocation属性指定了模式文档的位置,以 便可以进行验证。version属性指定了Servlet规范的版 本。

       可选的metadata-complete属性指定部署描述符是否 是完整的,若值为True,则Servlet/JSP容器将忽略 Servlet注解。若值为False或不存在,则容器必须检查类 文件的Servlet注解,并扫描web fragments文件。

      web-app元素是文档的根元素,并且可以具有如下 子元素:

    • Servlet声明
    • Servlet映射
    • ServletContext的初始化参数
    • 会话配置
    • 监听器类
    • 过滤器定义和映射
    • MIME类型映射
    • 欢迎文件列表
    • 错误页面
    • JSP特定的设置
    • JNDI设置

    每个元素的配置规则可见app_4_0.xsd文档,可以 从如下网站下载:

    http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd

      url-pattern元素用来指定可应用相应属性配置的 URL模式。

      app_4_0.xsd包括另一种模式 (webcommon_4_0.xsd),其中包含了大部分信息。可 从如下网站下载:

    https://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_4_0.xsd

      webcommon_3_0.xsd包括以下两种模式:

    • javaee_7.xsd,定义了其他Java共享公共元素EE7的 部署类型(EAR、JAR和RAR)。
    • jsp_2_3.xsd,根据JSP 2.3规范,通过配置应用程序 的JSP部分来定义元素。

    1. 核心元素

      web-app的子 元素可以以任何顺序出现。某些元素,如sessionconfig、jsp-config和login-config只能出现一次,而另一 些,如Servlet、filter和welcome-file-list可以出现很多 次。 

    2. context-param

      可用context-param元素传值给ServletContext。这些 值可以被任何Servlet/JSP页面读取。context-param元素 由名称/值对构成,并可以通过调用ServletContext的 getInitParameter方法来读取。可以定义多个 contextparam 元素,每个参数名在本应用中必须唯一。 ServletContext. getInitParameterNames()方法会返回所有 的参数名称。

      每个context-param元素必须包含一个param-name元 素和一个param-value元素。param-name定义参数名,而 param-value定义参数值。另有一个可选的元素,即 description元素,用来描述参数。

      下面是context-param元素的两个例子:

    <context-param>
    <param-name>location</param-name>
    <param-value>localhost</param-value>
    </context-param>
    <context-param>
    <param-name>port</param-name>
    <param-value>8080</param-value>
    <description>The port number used</description>
    </context-param>

    3. distributable

      若定义了distributable元素,则表明应用程序已部署 到分布式的Servlet/JSP容器。distributable元素必须是空 的。例如,下面是一个distributable例子:

    <distributable/>

    4. error-page

      error-page元素包含一个HTTP错误代码与资源路径 或Java异常类型与资源路径之间的映射关系。error-page 元素定义容器在特定HTTP错误或异常时应返回的资源 路径。

      Error-page元素由如下成分构成:

    • error-code,指定一个HTTP错误代码
    • exception-type,指定Java的异常类型(全路径名 称)。
    • location,指定要被显示的资源位置。该元素必须 以“/”开始。

      下面的配置告诉Servlet/JSP容器,当出现HTTP 404 时,显示位于应用目录下的error.html页面。

    <error-page>
    <error-code>404</error-code>
    <location>/error.html</location>
    </error-page>

      下面的配置告诉Servlet/JSP容器,当发生 ServletException时,显示exception.html页面。

      

    <error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/exception.html</location>
    </error-page>

    5. filter

      filter指定一个Servlet过滤器。该元素至少包括一个 filter-name元素和一个filter-class元素。此外,它也可以 包含以下元素:icon、display-name、discription、initparam以及async-supported。

      filter-name元素定义了过滤器的名称。过滤器名称 必须全局唯一。filter-class元素指定过滤器类的全路径 名称。可由init-param元素来配置过滤器的初始参数 (类似于<context-param>),一个过滤器可以有多个 init-param。

      下面是Upper Case Filter和Image Filter两个filter元 素。

    <filter>
    <filter-name>Upper Case Filter</filter-name>
    <filter-class>com.example.UpperCaseFilter</filter-class>
    </filter>
    <filter>
    <filter-name>Image Filter</filter-name>
    <filter-class>com.example.ImageFilter</filter-class>
    <init-param>
    <param-name>frequency</param-name>
    <param-value>1909</param-value>
    </init-param>
    <init-param>
    <param-name>resolution</param-name>
    <param-value>1024</param-value>
    </init-param>
    </filter>

    6.filter-mapping

      过滤器映射元素是指定过滤器要被映射到的一个或 多个资源。过滤器可以被映射到servlet或者URL模式。 将过滤器映射到servlet会致使过滤器对该servlet产生作 用。将过滤器映射到URL模式,则会使其对所有URL与 该URL模式匹配的资源进行过滤。过滤的顺序与过滤器 映射元素在部署描述符中的顺序一致。

      过滤器映射元素中包含一个filter-name元素和一个 URL模式元素或者servlet-name元素。

      filter-name元素的值必须与利用filter元素声明的某 一个过滤器名称相匹配。

      下面的例子中是两个过滤器元素和两个过滤器映射 元素。

    <filter>
    <filter-name>Logging Filter</filter-name>
    <filter-class>com.example.LoggingFilter</filter-class>
    </filter>
    <filter>
    <filter-name>Security Filter</filter-name>
    <filter-class>com.example.SecurityFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>Logging Filter</filter-name>
    <servlet-name>FirstServlet</servlet-name>
    </filter-mapping>
    <filter-mapping>
    <filter-name>Security Filter</filter-name>
    <url-pattern>/ *</url-pattern>
    </filter-mapping>

    7. listener

      listener元素用来注册一个侦听器,其子元素 listener-class包含监听器类的全路径名。如下是一个示 例:

    <listener>
    <listener-class>com.example.AppListener</listener-class>
    </listener>

    8. locale-encoding-mapping-list和 locale-encoding-mapping

      locale-encoding-mapping-list元素包含了一个或多个 locale-encoding-mapping元素。每个locale-encodingmapping定义了locale以及编码的映射,分别用locale以 及encoding元素定义。locale元素的值必须是定义在ISO 639中的语言编码,如en,或者是采用“语言编码_国家 编码”格式,如en_US。其中,国家编码值必须定义在 ISO 3166中。

      如下是一个示例:

    <locale-encoding-mapping-list>
    <locale-encoding-mapping>
    <locale>ja</locale>
    <encoding>Shift_JIS</encoding>
    </locale-encoding-mapping>
    </locale-encoding-mapping-list>

    9. login-config

      login-config元素包括auth-method、realm-name以及 form-login-config元素,每个元素都是可选的。

      auth-method元素定义了认证方式,可选值为 BASIC、DIGEST、FORM、CLIENT-CERT

      realm-name元素定义了用于BASIC以及DIGEST认 证方式的realm名称。

      form-login-config则定义了用于FORM认证方式的 登录页面和失败页面。若没有采用FORM认证方式,则 该元素被忽略。

      orm-login-config元素包括form-login-page和formerror-page两个子元素。其中,form- login-page配置了显 示登录页面的资源路径,路径为应用目录的相对路径, 且必须以“/”开始;form-error-page则配置了登录失败时

    显示错误页面的资源路径,同样,路径为应用目录的相 对路径,且必须以“/”开始。

      下面是一个示例

    <login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>Members Only</realm-name>
    </login-config>

      另一个示例如下:

    <login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
    <form-login-page>/loginForm.jsp</form-login-page>
    <form-error-page>/errorPage.jsp</form-error-page>
    </form-login-config>
    </login-config>

    10. mime-mapping

      mime-mapping元素用来映射一个MIME类型到一个 扩展名,它由一个extension元素和一个mime-type元素 组成。示例如下:

    <mime-mapping>
    <extension>txt</extension>
    <mime-type>text/plain</mime-type>
    </mime-mapping>

    11. security-constraint

      security-constraint元素允许对一组资源进行限制访 问。

      security-constraint元素有如下子元素:一个可选的 display-name元素、一个或多个web- resource-collection 元素、可选的auth-constraint元素和一个可选的user-dataconstraint元素。

      web-resource-collection 元素标识了一组需要进行限 制访问的资源集合。这里,你可以定义URL模式和所限 制的HTTP方法。如果没有定义HTTP方法,则表示应用 于所有HTTP方法。

      auth-constraint元素指明哪些角色可以访问受限制的 资源集合。如果没有指定,则应用于所有角色。

      user-data-constraint元素用于指示在客户端和 Servlet/JSP容器传输的数据是否保护。

      web-resource-collection元素包含一个web-resourcename元素、一个可选的description元素、零个或多个 url-pattern元素,以及零个或多个http-method元素。

      web-resource-name元素指定受保护的资源名称。

      http-method元素指定HTTP方法,如GET、POST或 TRACE。

      auth-constraint元素包含一个可选的description元 素、零个或多个role-name元素。role-name元素指定角 色名称。

      user-data-constraint元素包含一个可选的description 元素和一个transport-guarantee元素。transport-guarantee 元素的取值范围有:NONE、INTEGRAL或 CONFIDENTIAL。NONE表示该应用程序不需要安全 传输保障。INTEGRAL意味着服务器和客户端之间的数 据在传输过程中不能被篡改。CONFIDENTIAL意味着 必须加密传输数据。大多数情况下,安全套接字层 (SSL)会被应用于INTEGRAL或CONFIDENTIAL。

      下面是一个例子:

    <security-constraint>
    <web-resource-collection>
    <web-resource-name>Members Only</web-resource-name>
    <url-pattern>/members/ *</url-pattern>
    </web-resource-collection>
    <auth-constraint>
    <role-name>payingMember</role-name>
    </auth-constraint>
    </security-constraint>
    <login-config>
    <auth-method>Digest</auth-method>
    <realm-name>Digest Access Authentication</realm-name>
    </login-config>

    12. security-role

      security-role元素声明用于安全限制的安全角色。 这个元素有一个可选的description元素和role-name元素。下面是一个例子:

    <security-role>
    <role-name>payingMember</role-name>
    </security-role>

    13.  Servlet

      Servlet元素用来配置Servlet,包括如下子元素:

    • 一个可选的icon元素
    • 一个可选的description元素
    • 可选的display-name元素
    • 一个servlet-name元素
    • 一个servlet-class元素或一个jsp-file元素
    • 零个或更多的init-param元素
    • 一个可选的load-on-startup元素
    • 可选的run-as元素
    • 可选的enabled元素
    • 可选的async-supported元素
    • 可选的multipart-config元素
    • 零个或多个security-role-ref元素

      一个Servlet元素至少必须包含一个servlet-name元素 和一个servlet-class元素,或者一个servlet-name元素和 一个jsp-file元素。

      servlet-name元素定义的Servlet名称必须在应用程序 中是唯一的。

      servlet-class元素指定的类名为全路径名。

      jsp-file元素指定JSP页面的路径,该路径是应用程 序的相对路径,必须以“/”开始。

      init-param的子元素可以用来传递一个初始参数给 Servlet。init-param元素的构成同context-param。

      可以使用load-on-startup元素在Servlet/JSP容器启动 时自动加载Servlet。加载一个Servlet是指实例化Servlet 和调用它的init方法。使用此元素可以避免由于加载 Servlet而导致对第一个请求的响应延迟。如果该元素指 定了jsp-file元素,则JSP文件被预编译成Servlet,并加 载该Servlet。

      load-on-startup可以指定用一个整数值来指定加载 顺序。例如,如果有两个Servlet且都包含一个load-onstartup元素,则值小的Servlet优先加载。若没有指定值 或值为负数,则由Web容器决定如何加载。若两个 Servlet具有相同的load-on-startup值,则加载Servlet的顺 序不能确定。

      run-as用来覆盖调用EJB的安全标识。角色名是当 前Web应用程序定义的安全角色之一。

      security-role-ref元素映射在调用Servlet的 isUserInRole方法时角色名到应用程序定义的安全角 色。security-role-ref元素包含一个可选的description元 素、一个role-name元素和一个role-link元素。

      role-link元素用于安全角色映射到一个已定义的安 全角色,必须包含一个定义在security-role元素中的安 全角色。

      async-supported元素是一个可选的元素,其值可以 是True或False。它表示Servlet是否支持异步处理。

      enabled元素也是一个可选的元素,它的值可以是 True或False。设置此元素为False,则禁用这个Servlet。

      例如,映射安全角色“PM”与角色名 字“payingMember”的配置如下:

    <security-role-ref>
    <role-name>PM</role-name>
    <role-link>payingMember</role-link>
    </security-role-ref>

      这样,若属于payingMember角色的用户调用Servlet 的isUserInRole(“payingMember”)方法,则结果为 真。

      下面是Servlet元素的两个例子:

    <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.brainysoftware.UploadServlet</servlet-cl
    ass>
    <load-on-startup>10</load-on-startup>
    </servlet>
    <servlet>
    <servlet-name>SecureServlet</servlet-name>
    <servlet-class>com.brainysoftware.SecureServlet</servlet-cl
    ass>
    <load-on-startup>20</load-on-startup>
    </servlet>

    14. servlet-mapping

      servlet-mapping元素映射一个Servlet到一个URL模 式。该元素必须有一个servlet-name元素和url-pattern元 素。

      下面的servlet-mapping元素映射一个Servlet 到/first:

    <servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>com.brainysoftware.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/first</url-pattern>
    </servlet-mapping>

    15. session-config

      session-config元素定义了用于 javax.servlet.http.HttpSession实例的参数。此元素可包含 一个或更多的以下内容:session-timeout、cookie-config 或tracking-mode。

      session-timeout元素指定会话超时间隔(分钟)。 该值必须是整数。如果该值是零或负数,则会话将永不 超时。

      cookie-config元素定义了跟踪会话创建的cookie的 配置。

      tracking-mode元素定义了跟踪会话模式,其有效值 是COOKIE、URL或SSL。

      下面定义的session-config元素使得应用的 HttpSession对象在不活动12分钟后失效:

    <session-config>
    <session-timeout>12</session-timeout>
    </session-config>

    16. welcome-file-list

      welcome-file-list元素指定当用户在浏览器中输入的 URL不包含一个Servlet名称或JSP页面或静态资源时显 示的文件或Servlet。

      welcome-file-list元素包含一个或多个welcome-file 元素。welcome-file元素包含默认的文件名。如果在第 一个welcome-file元素中指定的文件没有找到,则在 Web容器将尝试显示第二个,直到最后一个。

      下面是一个welcome-file-list元素的例子:

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

      下面的示例,第一个welcome-file元素指定了一个 在应用程序目录下的index.html;第二个welcome-file为 Servlet目录下的欢迎文件:  

    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>servlet/welcome</welcome-file>
    </welcome-file-list>

    17.  JSP-Specific Elements

      元素下的jsp-config元素,可以指定JSP 配置。它可以具有零个或多个taglib元素和零个或多个 jsp-property-group元素。下面首先介绍taglib元素,然后 介绍jsp-property-group元素。

    18. taglib

      taglib元素定义了JSP定制标签库。taglib元素包含 一个taglib-uri元素和taglib-location元素。taglib-uri元素 定义了Servlet/JSP应用程序所用的标签库的URI,其值 相当于部署描述符路径。

      taglib-location元素指定TLD文件的位置。

      下面是一个taglib元素的例子:

    <jsp-config>
    <taglib>
    <!-- taglib-uri 指定了taglib元素的路径 -->
    <taglib-uri>http://brainysoftware.com/taglib/complex</taglib-uri>
    <!-- taglib-location元素指定TLD文件的位置  -->
    <taglib-location>/WEB-INF/jsp/complex.tld</taglib-location>
    </taglib>
    </jsp-config>

    19. jsp-property-group

      jsp-property-group中的元素可为一组JSP文件统一 配置属性。使用子元素可做到以下 几点:

    • 指示EL显示是否忽略;
    • 指示脚本元素是否允许;
    • 指明页面的编码信息;
    • 指示一个资源是JSP文件(XML编写);
    • 预包括和代码自动包含。 

    jsp-property-group包含如下子元素:

    • 一个可选的description元素
    • 一个可选的display-name元素
    • 一个可选的icon元素
    • 一个或多个url-pattern元件
    • 一个可选的el-ignored元素
    • 一个可选的page-encoding元素
    • 一个可选的scripting-invalid元素
    • 一个可选的is-xml元素
    • 零个或多个include-prelude元素
    • 零个或多个include-code元素

      url-pattern元素用来指定可应用相应属性配置的 URL模式。

      el-ignored元素值为True或False。True值表示匹配 URL模式的jsp页面中,EL表达式无法被计算,该元素 的默认值是False。

      page-encoding元素指定JSP页面的编码。pageencoding的有效值同页面的pageEncoding有效值。若 page-encoding指定值与匹配URL模式的JSP页面中的 pageEncoding属性值不同,则会产生一个转换时间错 误。同样,若page-encoding指定值与XML文档申明的 编码不同,也会产生一个转换时间错误。

      scripting-invalid元素值为True或False。True值是指 匹配URL模式的JSP页面不支持<% scripting %>语法。 scripting-invalid元素的默认值是False。

      is-xml元素值为True或False,True表示匹配URL模 式的页面是JSP文件。

      include-prelude元素值为相对于Servlet/JSP应用的相对路径。若设定该元素,则匹配URL模式的JSP页面开头处会自动包含给定路径文件(同include指令)。

      include-coda元素值为相对于Servlet/JSP应用的相对 路径。若设定该元素,则匹配URL模式的JSP页面结尾 处会自动包含给定路径文件(同include指令)。

      下面的例子中,jsp-property-group配置所有的JSP 页面无法执行EL表达式:

    <jsp-config>
    <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <el-ignored>true</el-ignored>
    </jsp-property-group>
    </jsp-config>

      下面的例子中,jsp-property-group配置所有的JSP 页面不支持<% scripting %>语法

    <jsp-config>
    <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
    </jsp-config>

    二. 部署

      从Servlet 1.0开始,可以很方便地部署一个 Servlet/JSP应用程序。仅需要将应用原始目录结构压缩 成一个WAR文件。可以在JDK中使用jar工具或流行的 工具,如WinZip。需要确保压缩文件有.war扩展名。如 果使用WinZip,则在压缩完成后重命名文件。

      WAR文件必须包含所有库文件、类文件、HTML 文件、JSP页面、图像文件以及版权声明(如果有的 话)等,但不包括Java源文件。任何人都可以获取一个 WAR文件的副本,并部署到一个Servlet/JSP容器上。

    三. web fragment

      Servlet 3添加了web fragment特性,用来为已有的 Web应用部署插件或框架。web fragment被设计成部署 描述符的补充,而无须编辑web.xml文件。一个web fragment基本上包含了常用的Web对象,如Servlet、过 滤器和监听器,其他资源如JSP页面和静态图像的包文 件(JAR文件)。一个web fragment也可以有一个描述 符,类似的部署描述符的XML文档。web fragment描述 符必须命名为web-fragment.xml,并位于包的METAINF目录下。一个web fragment描述可能包含任意可出 现在部署描述符web-app元素下的所有元素,再加上一 些web fragment的特定元素。一个应用程序可以有多个 Web片段。

      清单显示了web fragment描述,以黑体形式突 出显示与部署描述符之间的不同内容。在web fragment 的根元素必须是web-fragment元素,其可以有metadatacomplete属性。如果metadata-complete属性的值为 True,则包含在web fragment中所有的类注释将被跳 过。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    ➥ http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
    version="3.0"
    [metadata-complete="true|false"]
    >
    ...
    </web-fragment>

      作为一个例子,在app13a应用程序中包含的 fragment.jar文件是一个web fragment。该JAR文件已经 导入到WEB-INF/lib目录下。本实例的重点不在于 app13a,而是web fragment项目。该项目包含一个 Servlet(FragmentServlet)和 webfragment.xml文。

    FragmentServlet类

    package fragment.servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class FragmentServlet extends HttpServlet {
    private static final long serialVersionUID = 940L;
    public void doGet(HttpServletRequest request, HttpServletRe
    sponse
    response)
    throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("A plug-in");
    }
    }

    webfragment.xml文件

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    ➥ http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
        version="3.0">
        <servlet>
            <servlet-name>FragmentServlet</servlet-name>
            <servlet-class>servlet.FragmentServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>FragmentServlet</servlet-name>
            <url-pattern>/fragment</url-pattern>
        </servlet-mapping>
    </web-fragment>

    FragmentServlet是一个发送一个字符串到浏览器的 简单的Servlet。web-fragment.xml文件注册并映射该 Servlet。fragment.jar文件结构如图所示。

     调用如下URL测试该Servlet: 

    http://localhost:8080/app13a/fragment
  • 相关阅读:
    一致性hash算法
    运算符的重载
    HTTP协议详解
    SOA 新业务语言 新系统架构——什么是SOA
    js中几种实用的跨域方法原理详解
    Linq基于两个属性的分组
    BackBone结合ASP.NET MVC实现页面路由操作
    CSS学习总结
    单页应用 WebApp SPA 骨架 框架 路由 页面切换 转场
    2016年最值得学习的五大开源项目
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10727302.html
Copyright © 2011-2022 走看看