当前位置: 首页 > news >正文

如何做网站流量分析报表成免费crm推广网站

如何做网站流量分析报表,成免费crm推广网站,wordpress论坛程序,模板网站多钱1.1 spring介绍 spring Boot使开发独立的#xff0c;产品级别的基于Spring的应用变得非常简单#xff0c;你只需just run。 我们为Spring平台及第三方库提供开箱即用的设置#xff0c;这样你就可以有条不紊地开始。多数Spring Boot应用需要很少的Spring配置。 你… 1.1 spring介绍 spring Boot使开发独立的产品级别的基于Spring的应用变得非常简单你只需just run。 我们为Spring平台及第三方库提供开箱即用的设置这样你就可以有条不紊地开始。多数Spring Boot应用需要很少的Spring配置。 你可以使用Spring Boot创建Java应用并使用java -jar启动它或采用传统的war部署方式。 1.2 系统要求 默认情况下Spring Boot 1.3.0.BUILD-SNAPSHOT 需要Java7和Spring框架4.1.3或以上。你可以在Java6下使用Spring Boot不过需要添加额外配置。具体参考Section 73.9, “How to use Java 6” 。构建环境明确支持的有Maven3.2和Gradle1.12。 Servlet容器 下列内嵌容器支持开箱即用out of the box 名称 Servlet版本 Java版本 Tomcat 8 3.1 Java 7 Tomcat 7 3.0 Java 6 Jetty 9 3.1 Java 7 Jetty 8 3.0 Java 6 Undertow 1.1 3.1 Java 7你也可以将Spring Boot应用部署到任何兼容Servlet 3.0的容器。 1.3 第一个spring boot应用 在开始前你需要打开一个终端检查是否安装可用的Java版本和Maven $ mvn -v Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00) Maven home: /Users/user/tools/apache-maven-3.1.1 Java version: 1.7.0_51, vendor: Oracle Corporation创建pom.xml文件 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.example/groupIdartifactIdmyproject/artifactIdversion0.0.1-SNAPSHOT/versionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.3.0.BUILD-SNAPSHOT/version/parent!-- Additional lines to be added here... --!-- (you dont need this if you are using a .RELEASE version) --repositoriesrepositoryidspring-snapshots/idurlhttp://repo.spring.io/snapshot/urlsnapshotsenabledtrue/enabled/snapshots/repositoryrepositoryidspring-milestones/idurlhttp://repo.spring.io/milestone/url/repository/repositoriespluginRepositoriespluginRepositoryidspring-snapshots/idurlhttp://repo.spring.io/snapshot/url/pluginRepositorypluginRepositoryidspring-milestones/idurlhttp://repo.spring.io/milestone/url/pluginRepository/pluginRepositories /project添加classpath依赖 Spring Boot提供很多Starter POMs这能够让你轻松的将jars添加到你的classpath下。我们的示例程序已经在POM的partent节点使用了spring-boot-starter-parent。spring-boot-starter-parent是一个特殊的starter它提供了有用的Maven默认设置。同时它也提供了一个dependency-management节点这样对于”blessed“依赖你可以省略version标记。 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency /dependencies如果再次运行mvn dependency:tree你将看到现在有了一些其他依赖包括Tomcat web服务器和Spring Boot自身。 编写代码 为了完成应用程序我们需要创建一个单独的Java文件。Maven默认会编译src/main/java下的源码所以你需要创建那样的文件结构然后添加一个名为src/main/java/Example.java的文件 import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.stereotype.*; import org.springframework.web.bind.annotation.*;RestController EnableAutoConfiguration public class Example {RequestMapping(/)String home() {return Hello World!;}public static void main(String[] args) throws Exception {SpringApplication.run(Example.class, args);} }RestController和RequestMapping说明 RestController。这被称为一个构造型stereotype注解。它为阅读代码的人们提供建议。对于Spring该类扮演了一个特殊角色。在本示例中我们的类是一个web Controller所以当处理进来的web请求时Spring会询问它。 RequestMapping注解提供路由信息。它告诉Spring任何来自/路径的HTTP请求都应该被映射到home方法。RestController注解告诉Spring以字符串的形式渲染结果并直接返回给调用者。 EnableAutoConfiguration。这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。 main方法。这只是一个标准的方法它遵循Java对于一个应用程序入口点的约定。我们的main方法通过调用run将业务委托给了Spring Boot的SpringApplication类。SpringApplication将引导我们的应用启动Spring相应地启动被自动配置的Tomcat web服务器。我们需要将Example.class作为参数传递给run方法来告诉SpringApplication谁是主要的Spring组件。 运行 mvn spring-boot:run如果使用一个浏览器打开 localhost:8080以下输出 Hello World!创建可执行jar 为了创建可执行的jar需要将spring-boot-maven-plugin添加到我们的pom.xml中。在dependencies节点下插入以下内容 buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins /build注spring-boot-starter-parent POM包含用于绑定repackage目标的配置。如果你不使用parent POM你将需要自己声明该配置。具体参考插件文档。 保存你的pom.xml然后从命令行运行mvn package mvn package如果查看target目录你应该看到myproject-0.0.1-SNAPSHOT.jar。该文件应该有10Mb左右的大小。如果想偷看内部结构你可以运行jar tvf jar tvf target/myproject-0.0.1-SNAPSHOT.jar在target目录下你应该也能看到一个很小的名为myproject-0.0.1-SNAPSHOT.jar.original的文件。这是在Spring Boot重新打包前Maven创建的原始jar文件。 为了运行该应用程序你可以使用java -jar命令 java -jar target/myproject-0.0.1-SNAPSHOT.jar2. 使用Spring Boot 2.1 maven Maven用户可以继承spring-boot-starter-parent项目来获取合适的默认设置。该父项目提供以下特性 默认编译级别为Java 1.6 源码编码为UTF-8 一个依赖管理节点允许你省略普通依赖的version标签继承自spring-boot-dependencies POM。 合适的资源过滤 合适的插件配置exec插件surefireGit commit IDshade 针对application.properties和application.xml的资源过滤最后一点由于默认配置文件接收Spring风格的占位符${...}Maven filtering改用..占位符你可以使用Maven属性resource.delimiter来覆盖它。 想配置你的项目继承spring-boot-starter-parent只需要简单地设置parent为 !-- Inherit defaults from Spring Boot -- parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.3.0.BUILD-SNAPSHOT/version /parent注你应该只需要在该依赖上指定Spring Boot版本。如果导入其他的starters你可以放心的省略版本号。 使用没有父POM的Spring Boot 不是每个人都喜欢继承spring-boot-starter-parent POM。你可能需要使用公司标准parent或你可能倾向于显式声明所有Maven配置。 如果你不使用spring-boot-starter-parent通过使用一个scopeimport的依赖你仍能获取到依赖管理的好处 dependencyManagementdependenciesdependency!-- Import dependency management from Spring Boot --groupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion1.3.0.BUILD-SNAPSHOT/versiontypepom/typescopeimport/scope/dependency/dependencies /dependencyManagement改变Java版本 spring-boot-starter-parent选择相当保守的Java兼容策略。如果你遵循我们的建议使用最新的Java版本你可以添加一个java.version属性 propertiesjava.version1.8/java.version /properties** 使用Spring Boot Maven插件** Spring Boot包含一个Maven插件它可以将项目打包成一个可执行jar。如果想使用它你可以将该插件添加到节点处 buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins /build注如果使用Spring Boot starter parent pom你只需要添加该插件而无需配置它除非你想改变定义在partent中的设置。 2.2 组织代码 Spring Boot不需要使用任何特殊的代码结构然而这里有一些有用的最佳实践。 使用default包 当类没有包含package声明时它被认为处于default package下。通常不推荐使用default package并应该避免使用它。因为对于使用ComponentScanEntityScan或SpringBootApplication注解的Spring Boot应用来说来自每个jar的类都会被读取这会造成一定的问题。 定位main应用类 我们通常建议你将main应用类放在位于其他类上面的根包root package中。通常使用EnableAutoConfiguration注解你的main类并且暗地里为某些项定义了一个基础“search package”。例如如果你正在编写一个JPA应用被EnableAutoConfiguration注解的类所在包将被用来搜索Entity项。 使用根包允许你使用ComponentScan注解而不需要定义一个basePackage属性。如果main类位于根包中你也可以使用SpringBootApplication注解。 下面是一个典型的结构 com- example- myproject- Application.java|- domain| - Customer.java| - CustomerRepository.java|- service| - CustomerService.java|- web- CustomerController.javaApplication.java文件将声明main方法还有基本的Configuration。 package com.example.myproject;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;Configuration EnableAutoConfiguration ComponentScan public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}2.3 配置类 Spring Boot提倡基于Java的配置。尽管你可以使用一个XML源来调用SpringApplication.run()我们通常建议你使用Configuration类作为主要源。一般定义main方法的类也是主要Configuration的一个很好候选。 1、导入其他配置类 你不需要将所有的Configuration放进一个单独的类。Import注解可以用来导入其他配置类。另外你也可以使用ComponentScan注解自动收集所有的Spring组件包括Configuration类。 2、导入XML配置 如果你绝对需要使用基于XML的配置我们建议你仍旧从一个Configuration类开始。你可以使用附加的ImportResource注解加载XML配置文件。 2.4 自动配置 Spring Boot自动配置auto-configuration尝试根据你添加的jar依赖自动配置你的Spring应用。例如如果你的classpath下存在HSQLDB并且你没有手动配置任何数据库连接beans那么我们将自动配置一个内存型in-memory数据库。 你可以通过将EnableAutoConfiguration或SpringBootApplication注解添加到一个Configuration类上来选择自动配置。 注你只需要添加一个EnableAutoConfiguration注解。我们建议你将它添加到主Configuration类上。 禁用特定的自动配置 如果发现应用了你不想要的特定自动配置类你可以使用EnableAutoConfiguration注解的排除属性来禁用它们。 import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.*; import org.springframework.context.annotation.*;Configuration EnableAutoConfiguration(exclude{DataSourceAutoConfiguration.class}) public class MyConfiguration { }2.5 Spring Beans和依赖注入 你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。简单起见我们经常使用ComponentScan注解搜索beans并结合Autowired构造器注入。 如果使用上面建议的结构组织代码将应用类放到根包下你可以添加ComponentScan注解而不需要任何参数。你的所有应用程序组件Component, Service, Repository, Controller等将被自动注册为Spring Beans。 下面是一个Service Bean的示例它使用构建器注入获取一个需要的RiskAssessor bean。 package com.example.service;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;Service public class DatabaseAccountService implements AccountService {private final RiskAssessor riskAssessor;Autowiredpublic DatabaseAccountService(RiskAssessor riskAssessor) {this.riskAssessor riskAssessor;}// ... }注注意如何使用构建器注入来允许riskAssessor字段被标记为final这意味着riskAssessor后续是不能改变的。 2.6 使用SpringBootApplication注解 很多Spring Boot开发者总是使用ConfigurationEnableAutoConfiguration和ComponentScan注解他们的main类。由于这些注解被如此频繁地一块使用特别是你遵循以上最佳实践时Spring Boot提供一个方便的SpringBootApplication选择。 该SpringBootApplication注解等价于以默认属性使用ConfigurationEnableAutoConfiguration和ComponentScan。 package com.example.myproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication // same as Configuration EnableAutoConfiguration ComponentScan public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}2.7 作为一个打包后的应用运行 如果使用Spring Boot Maven或Gradle插件创建一个可执行jar你可以使用java -jar运行你的应用。例如 java -jar target/myproject-0.0.1-SNAPSHOT.jar运行一个打包的程序并开启远程调试支持是可能的这允许你将调试器附加到打包的应用程序上 java -Xdebug -Xrunjdwp:servery,transportdt_socket,address8000,suspendn \-jar target/myproject-0.0.1-SNAPSHOT.jar2.8 使用Maven插件运行 Spring Boot Maven插件包含一个run目标它可以用来快速编译和运行应用程序。应用程序以一种暴露的方式运行由于即时热加载你可以编辑资源。 mvn spring-boot:run你可能想使用有用的操作系统环境变量 export MAVEN_OPTS-Xmx1024m -XX:MaxPermSize128M -Djava.security.egdfile:/dev/./urandom3 Spring Boot特性 3.1 SpringApplication SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下你只需委托给SpringApplication.run这个静态方法 public static void main(String[] args){SpringApplication.run(MySpringConfiguration.class, args); }当应用启动时你应该会看到类似下面的东西这是何方神兽 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___//_/_/_/:: Spring Boot :: v1.2.2.BUILD-SNAPSHOT2013-07-31 00:08:16.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb) 2013-07-31 00:08:16.166 INFO 56603 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy 2014-03-04 13:09:54.912 INFO 41370 --- [ main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080 2014-03-04 13:09:56.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : S默认情况下会显示INFO级别的日志信息包括一些相关的启动详情比如启动应用的用户等。 3.1.1 自定义Banner 通过在classpath下添加一个banner.txt或设置banner.location来指定相应的文件可以改变启动过程中打印的banner。如果这个文件有特殊的编码你可以使用banner.encoding设置它默认为UTF-8。 在banner.txt中可以使用如下的变量 变量 描述 ${application.version} MANIFEST.MF中声明的应用版本号例如1.0 ${application.formatted-version} MANIFEST.MF中声明的被格式化后的应用版本号被括号包裹且以v作为前缀用于显示例如(v1.0) ${spring-boot.version} 正在使用的Spring Boot版本号例如1.2.2.BUILD-SNAPSHOT ${spring-boot.formatted-version} 正在使用的Spring Boot被格式化后的版本号被括号包裹且以v作为前缀, 用于显示例如(v1.2.2.BUILD-SNAPSHOT)注如果想以编程的方式产生一个banner可以使用SpringBootApplication.setBanner(…)方法。使用org.springframework.boot.Banner接口实现你自己的printBanner()方法。 3.1.2 自定义SpringApplication 如果默认的SpringApplication不符合你的口味你可以创建一个本地的实例并自定义它。例如关闭banner你可以这样写 public static void main(String[] args){SpringApplication app new SpringApplication(MySpringConfiguration.class);app.setShowBanner(false);app.run(args); }注传递给SpringApplication的构造器参数是spring beans的配置源。在大多数情况下这些将是Configuration类的引用但它们也可能是XML配置或要扫描包的引用。 3.1.3 流畅的构建API 如果你需要创建一个分层的ApplicationContext多个具有父子关系的上下文或你只是喜欢使用流畅的构建API你可以使用SpringApplicationBuilder。SpringApplicationBuilder允许你以链式方式调用多个方法包括可以创建层次结构的parent和child方法。 new SpringApplicationBuilder().showBanner(false).sources(Parent.class).child(Application.class).run(args);注创建ApplicationContext层次时有些限制比如Web组件(components)必须包含在子上下文(child context)中且相同的Environment即用于父上下文也用于子上下文中。 3.1.4 Application事件和监听器 除了常见的Spring框架事件比如ContextRefreshedEvent一个SpringApplication也发送一些额外的应用事件。一些事件实际上是在ApplicationContext被创建前触发的。 你可以使用多种方式注册事件监听器最普通的是使用SpringApplication.addListeners(…)方法。在你的应用运行时应用事件会以下面的次序发送 在运行开始但除了监听器注册和初始化以外的任何处理之前会发送一个ApplicationStartedEvent。在Environment将被用于已知的上下文但在上下文被创建前会发送一个ApplicationEnvironmentPreparedEvent。在refresh开始前但在bean定义已被加载后会发送一个ApplicationPreparedEvent。启动过程中如果出现异常会发送一个ApplicationFailedEvent。注你通常不需要使用应用程序事件但知道它们的存在会很方便在某些场合可能会使用到。在Spring内部Spring Boot使用事件处理各种各样的任务。 3.1.5 Web环境 一个SpringApplication将尝试为你创建正确类型的ApplicationContext。在默认情况下使用AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext取决于你正在开发的是否是web应用。 用于确定一个web环境的算法相当简单基于是否存在某些类。如果需要覆盖默认行为你可以使用setWebEnvironment(boolean webEnvironment)。通过调用setApplicationContextClass(…)你可以完全控制ApplicationContext的类型。 注当JUnit测试里使用SpringApplication时调用setWebEnvironment(false)是可取的。 3.1.6 命令行启动器 如果你想获取原始的命令行参数或一旦SpringApplication启动你需要运行一些特定的代码你可以实现CommandLineRunner接口。在所有实现该接口的Spring beans上将调用run(String… args)方法。 import org.springframework.boot.* import org.springframework.stereotype.*Component public class MyBean implements CommandLineRunner {public void run(String... args) {// Do something...} }如果一些CommandLineRunner beans被定义必须以特定的次序调用你可以额外实现org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解。 3.1.7 Application退出 每个SpringApplication在退出时为了确保ApplicationContext被优雅的关闭将会注册一个JVM的shutdown钩子。所有标准的Spring生命周期回调比如DisposableBean接口或PreDestroy注解都能使用。 此外如果beans想在应用结束时返回一个特定的退出码exit code可以实现org.springframework.boot.ExitCodeGenerator接口。 4 外化配置 Spring Boot允许外化externalize你的配置这样你能够在不同的环境下使用相同的代码。你可以使用properties文件YAML文件环境变量和命令行参数来外化配置。使用Value注解可以直接将属性值注入到你的beans中并通过Spring的Environment抽象或绑定到结构化对象来访问。 Spring Boot使用一个非常特别的PropertySource次序来允许对值进行合理的覆盖需要以下面的次序考虑属性 命令行参数 来自于java:comp/env的JNDI属性 Java系统属性System.getProperties() 操作系统环境变量 只有在random.*里包含的属性会产生一个RandomValuePropertySource 在打包的jar外的应用程序配置文件application.properties包含YAML和profile变量 在打包的jar内的应用程序配置文件application.properties包含YAML和profile变量 在Configuration类上的PropertySource注解 默认属性使用SpringApplication.setDefaultProperties指定下面是一个具体的示例假设你开发一个使用name属性的Component import org.springframework.stereotype.* import org.springframework.beans.factory.annotation.*Component public class MyBean {Value(${name})private String name;// ... }你可以将一个application.properties文件捆绑到jar内用来提供一个合理的默认name属性值。当运行在生产环境时可以在jar外提供一个application.properties文件来覆盖name属性。对于一次性的测试你可以使用特定的命令行开关启动比如java -jar app.jar --nameSpring。 4.1 配置随机值 RandomValuePropertySource在注入随机值比如密钥或测试用例时很有用。它能产生整数longs或字符串比如 my.secret${random.value} my.number${random.int} my.bignumber${random.long} my.number.less.than.ten${random.int(10)} my.number.in.range${random.int[1024,65536]}random.int*语法是OPEN value (,max) CLOSE此处OPENCLOSE可以是任何字符并且valuemax是整数。如果提供max那么value是最小的值max是最大的值不包含在内。 4.2访问命令行属性 默认情况下SpringApplication将任何可选的命令行参数以--开头比如--server.port9000转化为property并将其添加到Spring Environment中。如上所述命令行属性总是优先于其他属性源。 如果你不想将命令行属性添加到Environment里你可以使用SpringApplication.setAddCommandLineProperties(false)来禁止它们。 4.3 Application属性文件 SpringApplication将从以下位置加载application.properties文件并把它们添加到Spring Environment中 当前目录下的一个/config子目录 当前目录 一个classpath下的/config包 classpath根路径root这个列表是按优先级排序的列表中位置高的将覆盖位置低的。 注你可以使用YAML.yml文件替代.properties。 如果不喜欢将application.properties作为配置文件名你可以通过指定spring.config.name环境属性来切换其他的名称。你也可以使用spring.config.location环境属性来引用一个明确的路径目录位置或文件路径列表以逗号分割。 $ java -jar myproject.jar --spring.config.namemyproject //or $ java -jar myproject.jar --spring.config.locationclasspath:/default.properties,classpath:/override.properties如果spring.config.location包含目录相对于文件那它们应该以/结尾在加载前spring.config.name产生的名称将被追加到后面。不管spring.config.location是什么值默认的搜索路径classpath:,classpath:/config,file:,file:config/总会被使用。以这种方式你可以在application.properties中为应用设置默认值然后在运行的时候使用不同的文件覆盖它同时保留默认配置。 注如果你使用环境变量而不是系统配置大多数操作系统不允许以句号分割period-separated的key名称但你可以使用下划线underscores代替比如使用SPRINGCONFIGNAME代替spring.config.name。如果你的应用运行在一个容器中那么JNDI属性java:comp/env或servlet上下文初始化参数可以用来取代环境变量或系统属性当然也可以使用环境变量或系统属性。 4.4 特定的Profile属性 除了application.properties文件特定配置属性也能通过命令惯例application-{profile}.properties来定义。特定Profile属性从跟标准application.properties相同的路径加载并且特定profile文件会覆盖默认的配置。 4.5 属性占位符 当application.properties里的值被使用时它们会被存在的Environment过滤所以你能够引用先前定义的值比如系统属性。 app.nameMyApp app.description${app.name} is a Spring Boot application4.6 使用YAML代替Properties YAML是JSON的一个超集也是一种方便的定义层次配置数据的格式。无论你何时将SnakeYAML 库放到classpath下SpringApplication类都会自动支持YAML作为properties的替换。 注如果你使用starter POMsspring-boot-starter会自动提供SnakeYAML。 4.6.1. 加载YAML Spring框架提供两个便利的类用于加载YAML文档YamlPropertiesFactoryBean会将YAML作为Properties来加载YamlMapFactoryBean会将YAML作为Map来加载。 示例 environments:dev:url: http://dev.bar.comname: Developer Setupprod:url: http://foo.bar.comname: My Cool App上面的YAML文档会被转化到下面的属性中 environments.dev.urlhttp://dev.bar.com environments.dev.nameDeveloper Setup environments.prod.urlhttp://foo.bar.com environments.prod.nameMy Cool AppYAML列表被表示成使用[index]间接引用作为属性keys的形式例如下面的YAML my:servers:- dev.bar.com- foo.bar.com将会转化到下面的属性中: my.servers[0]dev.bar.com my.servers[1]foo.bar.com使用Spring DataBinder工具绑定那样的属性这是ConfigurationProperties做的事你需要确定目标bean中有个java.util.List或Set类型的属性并且需要提供一个setter或使用可变的值初始化它比如下面的代码将绑定上面的属性 ConfigurationProperties(prefixmy) public class Config {private ListString servers new ArrayListString();public ListString getServers() {return this.servers;} }4.6.2. 在Spring环境中使用YAML暴露属性 YamlPropertySourceLoader类能够用于将YAML作为一个PropertySource导出到Sprig Environment。这允许你使用熟悉的Value注解和占位符语法访问YAML属性。 4.6.3. Multi-profile YAML文档 你可以在单个文件中定义多个特定配置profile-specific的YAML文档并通过一个spring.profiles key标示应用的文档。例如 server:address: 192.168.1.100 --- spring:profiles: development server:address: 127.0.0.1 --- spring:profiles: production server:address: 192.168.1.120在上面的例子中如果development配置被激活那server.address属性将是127.0.0.1。如果development和production配置profiles没有启用则该属性的值将是192.168.1.100。 YAML缺点 YAML文件不能通过PropertySource注解加载。所以在这种情况下如果需要使用PropertySource注解的方式加载值那就要使用properties文件。 4.7. 类型安全的配置属性 使用Value(${property})注解注入配置属性有时可能比较笨重特别是需要使用多个properties或你的数据本身有层次结构。为了控制和校验你的应用配置Spring Boot提供一个允许强类型beans的替代方法来使用properties。 示例 Component ConfigurationProperties(prefixconnection) public class ConnectionSettings {private String username;private InetAddress remoteAddress;// ... getters and setters }当EnableConfigurationProperties注解应用到你的Configuration时任何被ConfigurationProperties注解的beans将自动被Environment属性配置。这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。 # application.yml connection:username: adminremoteAddress: 192.168.1.1 # additional configuration as required为了使用ConfigurationProperties beans你可以使用与其他任何bean相同的方式注入它们。 Service public class MyService {Autowiredprivate ConnectionSettings connection;//...PostConstructpublic void openConnection() {Server server new Server();this.connection.configure(server);} }你可以通过在EnableConfigurationProperties注解中直接简单的列出属性类来快捷的注册ConfigurationProperties bean的定义。 Configuration EnableConfigurationProperties(ConnectionSettings.class) public class MyConfiguration { }注使用ConfigurationProperties能够产生可被IDEs使用的元数据文件。具体参考Appendix B, Configuration meta-data。 4.7.1. 第三方配置 正如使用ConfigurationProperties注解一个类你也可以在Bean方法上使用它。当你需要绑定属性到不受你控制的第三方组件时这种方式非常有用。 为了从Environment属性配置一个bean将ConfigurationProperties添加到它的bean注册过程 ConfigurationProperties(prefix foo) Bean public FooComponent fooComponent() {... }和上面ConnectionSettings的示例方式相同任何以foo为前缀的属性定义都会被映射到FooComponent上。 4.7.2. 松散的绑定Relaxed binding Spring Boot使用一些宽松的规则用于绑定Environment属性到ConfigurationProperties beans所以Environment属性名和bean属性名不需要精确匹配。常见的示例中有用的包括虚线分割比如context--path绑定到contextPath和将环境属性转为大写字母比如PORT绑定port。 示例 Component ConfigurationProperties(prefixperson) public class ConnectionSettings {private String firstName; }下面的属性名都能用于上面的ConfigurationProperties类 属性 说明 person.firstName 标准驼峰规则 person.first-name 虚线表示推荐用于.properties和.yml文件中 PERSON_FIRST_NAME 大写形式使用系统环境变量时推荐Spring会尝试强制外部的应用属性在绑定到ConfigurationProperties beans时类型是正确的。如果需要自定义类型转换你可以提供一个ConversionService beanbean id为conversionService或自定义属性编辑器通过一个CustomEditorConfigurer bean。 4.7.3. ConfigurationProperties校验 Spring Boot将尝试校验外部的配置默认使用JSR-303如果在classpath路径中。你可以轻松的为你的ConfigurationProperties类添加JSR-303 javax.validation约束注解 Component ConfigurationProperties(prefixconnection) public class ConnectionSettings {NotNullprivate InetAddress remoteAddress;// ... getters and setters }你也可以通过创建一个叫做configurationPropertiesValidator的bean来添加自定义的Spring Validator。 注spring-boot-actuator模块包含一个暴露所有ConfigurationProperties beans的端点。 5 Profiles Spring Profiles提供了一种隔离应用程序配置的方式并让这些配置只能在特定的环境下生效。任何Component或Configuration都能被Profile标记从而限制加载它的时机。 Configuration Profile(production) public class ProductionConfiguration {// ... }以正常的Spring方式你可以使用一个spring.profiles.active的Environment属性来指定哪个配置生效。你可以使用平常的任何方式来指定该属性例如可以将它包含到你的application.properties中 spring.profiles.activedev,hsqldb 或使用命令行开关--spring.profiles.activedev,hsqldb5.1. 添加激活的配置(profiles) spring.profiles.active属性和其他属性一样都遵循相同的排列规则最高的PropertySource获胜。也就是说你可以在application.properties中指定生效的配置然后使用命令行开关替换它们。 有时将特定的配置属性添加到生效的配置中而不是替换它们是有用的。spring.profiles.include属性可以用来无条件的添加生效的配置。SpringApplication的入口点也提供了一个用于设置额外配置的java API比如在那些通过spring.profiles.active属性生效的配置之上参考setAdditionalProfiles()方法。 示例当一个应用使用下面的属性并用--spring.profiles.activeprod开关运行那proddb和prodmq配置也会生效 --- my.property: fromyamlfile --- spring.profiles: prod spring.profiles.include: proddb,prodmq注spring.profiles属性可以定义到一个YAML文档中用于决定什么时候该文档被包含进配置中。 5.2.以编程方式设置profiles 在应用运行前你可以通过调用SpringApplication.setAdditionalProfiles(…)方法以编程的方式设置生效的配置。使用Spring的ConfigurableEnvironment接口激动配置也是可行的。 5.3. Profile特定配置文件 application.properties或application.yml和通过ConfigurationProperties引用的文件这两种配置特定变种都被当作文件来加载的具体参考Section 23.3, “Profile specific properties”。 6 日志 Spring Boot内部日志系统使用的是Commons Logging但开放底层的日志实现。默认为会Java Util Logging, Log4J, Log4J2和Logback提供配置。每种情况下都会预先配置使用控制台输出也可以使用可选的文件输出。 默认情况下如果你使用Starter POMs那么就会使用Logback记录日志。为了确保那些使用Java Util Logging, Commons Logging, Log4J或SLF4J的依赖库能够正常工作正确的Logback路由也被包含进来。 注如果上面的列表看起来令人困惑不要担心Java有很多可用的日志框架。通常你不需要改变日志依赖Spring Boot默认的就能很好的工作。 6.1. 日志格式 Spring Boot默认的日志输出格式如下 2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52 2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms 2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: dispatcherServlet to [/] 2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: hiddenHttpMethodFilter to: [/*]输出的节点items如下 日期和时间 - 精确到毫秒且易于排序。 日志级别 - ERROR, WARN, INFO, DEBUG 或 TRACE。 Process ID。 一个用于区分实际日志信息开头的---分隔符。 线程名 - 包括在方括号中控制台输出可能会被截断。 日志名 - 通常是源class的类名缩写。 日志信息。5.2. 控制台输出 默认的日志配置会在写日志消息时将它们回显到控制台。默认ERROR, WARN和INFO级别的消息会被记录。可以在启动应用时通过--debug标识开启控制台的DEBUG级别日志记录。 java -jar myapp.jar --debug如果你的终端支持ANSI为了增加可读性将会使用彩色的日志输出。你可以设置spring.output.ansi.enabled为一个支持的值来覆盖自动检测。 5.3. 文件输出 默认情况下Spring Boot只会将日志记录到控制台而不会写进日志文件。如果除了输出到控制台你还想写入到日志文件那你需要设置logging.file或logging.path属性例如在你的application.properties中。 下表显示如何组合使用logging.* logging.file logging.path 示例 描述 (none) (none) 只记录到控制台 Specific file (none) my.log 写到特定的日志文件里名称可以是一个精确的位置或相对于当前目录 (none) Specific folder /var/log 写到特定文件夹下的spring.log里名称可以是一个精确的位置或相对于当前目录日志文件每达到10M就会被轮换分割和控制台一样默认记录ERROR, WARN和INFO级别的信息。 5.4. 日志级别 所有支持的日志系统在Spring的Environment例如在application.properties里都有通过logging.level.*LEVELLEVEL是TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF中的一个设置的日志级别。 示例application.properties logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR5.5. 自定义日志配置 通过将适当的库添加到classpath可以激活各种日志系统。然后在classpath的根目录(root)或通过Spring Environment的logging.config属性指定的位置提供一个合适的配置文件来达到进一步的定制注意由于日志是在ApplicationContext被创建之前初始化的所以不可能在Spring的Configuration文件中通过PropertySources控制日志。系统属性和平常的Spring Boot外部配置文件能正常工作。 根据你的日志系统下面的文件会被加载 日志系统 定制 Logback logback.xml Log4j log4j.properties或log4j.xml Log4j2 log4j2.xml JDK (Java Util Logging) logging.properties为了帮助定制一些其他的属性从Spring的Envrionment转换到系统属性 Spring Environment System Property 评价 logging.file LOG_FILE 如果定义在默认的日志配置中使用 logging.path LOG_PATH 如果定义在默认的日志配置中使用 PID PID 当前的处理进程(process)ID如果能够被发现且还没有作为操作系统环境变量被定义所有支持的日志系统在解析它们的配置文件时都能查询系统属性。具体可以参考spring-boot.jar中的默认配置。 注在运行可执行的jar时Java Util Logging有类加载问题我们建议你尽可能避免使用它。 6 开发Web应用 Spring Boot非常适合开发web应用程序。你可以使用内嵌的TomcatJetty或Undertow轻轻松松地创建一个HTTP服务器。大多数的web应用都使用spring-boot-starter-web模块进行快速搭建和运行。 6.1. Spring Web MVC框架 Spring Web MVC框架通常简称为Spring MVC是一个富模型视图控制器的web框架。 Spring MVC允许你创建特定的Controller或RestController beans来处理传入的HTTP请求。 使用RequestMapping注解可以将控制器中的方法映射到相应的HTTP请求。 示例 RestController RequestMapping(value/users) public class MyRestController {RequestMapping(value/{user}, methodRequestMethod.GET)public User getUser(PathVariable Long user) {// ...}RequestMapping(value/{user}/customers, methodRequestMethod.GET)ListCustomer getUserCustomers(PathVariable Long user) {// ...}RequestMapping(value/{user}, methodRequestMethod.DELETE)public User deleteUser(PathVariable Long user) {// ...} }6.1.1. Spring MVC自动配置 Spring Boot为Spring MVC提供适用于多数应用的自动配置功能。在Spring默认基础上自动配置添加了以下特性 引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。 对静态资源的支持包括对WebJars的支持。 自动注册ConverterGenericConverterFormatter beans。 对HttpMessageConverters的支持。 自动注册MessageCodeResolver。 对静态index.html的支持。 对自定义Favicon的支持。如果想全面控制Spring MVC你可以添加自己的Configuration并使用EnableWebMvc对其注解。如果想保留Spring Boot MVC的特性并只是添加其他的MVC配置(拦截器formatters视图控制器等)你可以添加自己的WebMvcConfigurerAdapter类型的Bean不使用EnableWebMvc注解。 6.1.2. HttpMessageConverters Spring MVC使用HttpMessageConverter接口转换HTTP请求和响应。合理的缺省值被包含的恰到好处out of the box例如对象可以自动转换为JSON使用Jackson库或XML如果Jackson XML扩展可用则使用它否则使用JAXB。字符串默认使用UTF-8编码。 如果需要添加或自定义转换器你可以使用Spring Boot的HttpMessageConverters类 import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.context.annotation.*; import org.springframework.http.converter.*;Configuration public class MyConfiguration {Beanpublic HttpMessageConverters customConverters() {HttpMessageConverter? additional ...HttpMessageConverter? another ...return new HttpMessageConverters(additional, another);} }任何在上下文中出现的HttpMessageConverter bean将会添加到converters列表你可以通过这种方式覆盖默认的转换器converters。 6.1.3. MessageCodesResolver Spring MVC有一个策略用于从绑定的errors产生用来渲染错误信息的错误码MessageCodesResolver。如果设置spring.mvc.message-codes-resolver.format属性为PREFIXERRORCODE或POSTFIXERRORCODE具体查看DefaultMessageCodesResolver.Format枚举值Spring Boot会为你创建一个MessageCodesResolver。 6.1.4. 静态内容 默认情况下Spring Boot从classpath下一个叫/static/public/resources或/META-INF/resources的文件夹或从ServletContext根目录提供静态内容。这使用了Spring MVC的ResourceHttpRequestHandler所以你可以通过添加自己的WebMvcConfigurerAdapter并覆写addResourceHandlers方法来改变这个行为加载静态文件。 在一个单独的web应用中容器默认的servlet是开启的如果Spring决定不处理某些请求默认的servlet作为一个回退降级将从ServletContext根目录加载内容。大多数时候这不会发生除非你修改默认的MVC配置因为Spring总能够通过DispatcherServlet处理请求。 此外上述标准的静态资源位置有个例外情况是Webjars内容。任何在/webjars/**路径下的资源都将从jar文件中提供只要它们以Webjars的格式打包。 注如果你的应用将被打包成jar那就不要使用src/main/webapp文件夹。尽管该文件夹是一个共同的标准但它仅在打包成war的情况下起作用并且如果产生一个jar多数构建工具都会静悄悄的忽略它。 6.1.5. 模板引擎 正如REST web服务你也可以使用Spring MVC提供动态HTML内容。Spring MVC支持各种各样的模板技术包括Velocity, FreeMarker和JSPs。很多其他的模板引擎也提供它们自己的Spring MVC集成。 Spring Boot为以下的模板引擎提供自动配置支持 FreeMarker Groovy Thymeleaf Velocity注如果可能的话应该忽略JSPs因为在内嵌的servlet容器使用它们时存在一些已知的限制。 当你使用这些引擎的任何一种并采用默认的配置你的模板将会从src/main/resources/templates目录下自动加载。 注IntelliJ IDEA根据你运行应用的方式会对classpath进行不同的整理。在IDE里通过main方法运行你的应用跟从Maven或Gradle或打包好的jar中运行相比会导致不同的顺序。这可能导致Spring Boot不能从classpath下成功地找到模板。如果遇到这个问题你可以在IDE里重新对classpath进行排序将模块的类和资源放到第一位。或者你可以配置模块的前缀为classpath*:/templates/这样会查找classpath下的所有模板目录。 6.1.6. 错误处理 Spring Boot默认提供一个/error映射用来以合适的方式处理所有的错误并且它在servlet容器中注册了一个全局的 错误页面。对于机器客户端相对于浏览器而言浏览器偏重于人的行为它会产生一个具有详细错误HTTP状态异常信息的JSON响应。对于浏览器客户端它会产生一个白色标签样式whitelabel的错误视图该视图将以HTML格式显示同样的数据可以添加一个解析为erro的View来自定义它。为了完全替换默认的行为你可以实现ErrorController并注册一个该类型的bean定义或简单地添加一个ErrorAttributes类型的bean以使用现存的机制只是替换显示的内容。 如果在某些条件下需要比较多的错误页面内嵌的servlet容器提供了一个统一的Java DSL领域特定语言来自定义错误处理。 示例 Bean public EmbeddedServletContainerCustomizer containerCustomizer(){return new MyCustomizer(); }// ... private static class MyCustomizer implements EmbeddedServletContainerCustomizer {Overridepublic void customize(ConfigurableEmbeddedServletContainer container) {container.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, /400));} }你也可以使用常规的Spring MVC特性来处理错误比如ExceptionHandler方法和ControllerAdvice。ErrorController将会捡起任何没有处理的异常。 N.B. 如果你为一个路径注册一个ErrorPage最终被一个过滤器Filter处理对于一些非Spring web框架像Jersey和Wicket这很常见然后过滤器需要显式注册为一个ERROR分发器dispatcher。 Bean public FilterRegistrationBean myFilter() {FilterRegistrationBean registration new FilterRegistrationBean();registration.setFilter(new MyFilter());...registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));return registration; }注默认的FilterRegistrationBean没有包含ERROR分发器类型。 6.1.7. Spring HATEOAS 如果你正在开发一个使用超媒体的RESTful APISpring Boot将为Spring HATEOAS提供自动配置这在多数应用中都工作良好。自动配置替换了对使用EnableHypermediaSupport的需求并注册一定数量的beans来简化构建基于超媒体的应用这些beans包括一个LinkDiscoverer和配置好的用于将响应正确编排为想要的表示的ObjectMapper。ObjectMapper可以根据spring.jackson.*属性或一个存在的Jackson2ObjectMapperBuilder bean进行自定义。 通过使用EnableHypermediaSupport你可以控制Spring HATEOAS的配置。注意这会禁用上述的对ObjectMapper的自定义。 6.2. JAX-RS和Jersey 如果喜欢JAX-RS为REST端点提供的编程模型你可以使用可用的实现替代Spring MVC。如果在你的应用上下文中将Jersey 1.x和Apache Celtix的Servlet或Filter注册为一个Bean那它们工作的相当好。Jersey 2.x有一些原生的Spring支持所以我们会在Spring Boot为它提供自动配置支持连同一个启动器starter。 想要开始使用Jersey 2.x只需要加入spring-boot-starter-jersey依赖然后你需要一个ResourceConfig类型的Bean用于注册所有的端点endpoints。 Component public class JerseyConfig extends ResourceConfig {public JerseyConfig() {register(Endpoint.class);} }所有注册的端点都应该被Components和HTTP资源annotations比如GET注解。 Component Path(/hello) public class Endpoint {GETpublic String message() {return Hello;} }由于Endpoint是一个Spring组件Component所以它的生命周期受Spring管理并且你可以使用Autowired添加依赖及使用Value注入外部配置。Jersey servlet将被注册并默认映射到/*。你可以将ApplicationPath添加到ResourceConfig来改变该映射。 默认情况下Jersey将在一个ServletRegistrationBean类型的Bean中被设置成名称为jerseyServletRegistration的Servlet。通过创建自己的相同名称的bean你可以禁止或覆盖这个bean。你也可以通过设置spring.jersey.typefilter来使用一个Filter代替Servlet在这种情况下被覆盖或替换的Bean是jerseyFilterRegistration。该servlet有Order属性你可以通过spring.jersey.filter.order进行设置。不管是Servlet还是Filter注册都可以使用spring.jersey.init.*定义一个属性集合作为初始化参数传递过去。 这里有一个Jersey示例你可以查看如何设置相关事项。 6.3. 内嵌servlet容器支持 Spring Boot支持内嵌的Tomcat, Jetty和Undertow服务器。多数开发者只需要使用合适的Starter POM来获取一个完全配置好的实例即可。默认情况下内嵌的服务器会在8080端口监听HTTP请求。 6.3.1. Servlets和Filters 当使用内嵌的servlet容器时你可以直接将servlet和filter注册为Spring的beans。在配置期间如果你想引用来自application.properties的值这是非常方便的。默认情况下如果上下文只包含单一的Servlet那它将被映射到根路径/。在多Servlet beans的情况下bean的名称将被用作路径的前缀。过滤器会被映射到/*。 如果基于约定convention-based的映射不够灵活你可以使用ServletRegistrationBean和FilterRegistrationBean类实现完全的控制。如果你的bean实现了ServletContextInitializer接口也可以直接注册它们。 6.3.2. EmbeddedWebApplicationContext Spring Boot底层使用了一个新的ApplicationContext类型用于对内嵌servlet容器的支持。EmbeddedWebApplicationContext是一个特殊类型的WebApplicationContext它通过搜索一个单一的EmbeddedServletContainerFactory bean来启动自己。通常TomcatEmbeddedServletContainerFactoryJettyEmbeddedServletContainerFactory或UndertowEmbeddedServletContainerFactory将被自动配置。 注你通常不需要知道这些实现类。大多数应用将被自动配置并根据你的行为创建合适的ApplicationContext和EmbeddedServletContainerFactory。 6.3.3. 自定义内嵌servlet容器 常见的Servlet容器设置可以通过Spring Environment属性进行配置。通常你会把这些属性定义到application.properties文件中。 常见的服务器设置包括 server.port - 进来的HTTP请求的监听端口号 server.address - 绑定的接口地址 server.sessionTimeout - session超时时间具体参考ServerProperties。 编程方式的自定义 如果需要以编程的方式配置内嵌的servlet容器你可以注册一个实现EmbeddedServletContainerCustomizer接口的Spring bean。EmbeddedServletContainerCustomizer提供对ConfigurableEmbeddedServletContainer的访问ConfigurableEmbeddedServletContainer包含很多自定义的setter方法。 import org.springframework.boot.context.embedded.*; import org.springframework.stereotype.Component;Component public class CustomizationBean implements EmbeddedServletContainerCustomizer {Overridepublic void customize(ConfigurableEmbeddedServletContainer container) {container.setPort(9000);} }直接自定义ConfigurableEmbeddedServletContainer 如果上面的自定义手法过于受限你可以自己注册TomcatEmbeddedServletContainerFactoryJettyEmbeddedServletContainerFactory或UndertowEmbeddedServletContainerFactory。 Bean public EmbeddedServletContainerFactory servletContainer() {TomcatEmbeddedServletContainerFactory factory new TomcatEmbeddedServletContainerFactory();factory.setPort(9000);factory.setSessionTimeout(10, TimeUnit.MINUTES);factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, /notfound.html);return factory; }很多可选的配置都提供了setter方法也提供了一些受保护的钩子方法以满足你的某些特殊需求。具体参考相关文档。 6.3.4. JSP的限制 在内嵌的servlet容器中运行一个Spring Boot应用时并打包成一个可执行的存档archive容器对JSP的支持有一些限制。 tomcat只支持war的打包方式不支持可执行的jar。 内嵌的Jetty目前不支持JSPs。 Undertow不支持JSPs。这里有个JSP示例你可以查看如何设置相关事项。转载于:https://www.cnblogs.com/HHR-SUN/p/7084932.html
http://www.pierceye.com/news/125621/

相关文章:

  • 建设信用卡网站登录网站建设和微信小程序
  • 邓州企业网站艺术设计方案
  • 广州市住房住建局网站永久免费的云电脑
  • 建设网站后如何上线不用服务器做网站
  • 建站服务论坛国外做外贸哪个网站好些
  • 营销型网站试运营调忧仿别人网站
  • 低价网站制作企业云南网站开发公司
  • 成都市建设厅网站查询十九冶成都建设有限公司网站
  • 建电商网站要多少钱建设绿色食品网站
  • 建行个人网上登录入口优化网站结构一般包括
  • 好看的网站页面WordPress知更鸟主题怎样安装
  • 如何查网站是否备案免费建网站代码
  • 曲沃网站开发新注册的公司怎么做网站
  • 企业网站无线端怎么做塑胶科技东莞网站建设
  • 图片发到哪些网站 seo阜沙网站建设
  • 企业开源建站系统大连百度首页优化
  • 通辽做网站有没有智慧软文发稿平台
  • 网站别人做的我自己怎么续费福州网站建站公司
  • 青岛高端网站开发wordpress修改logo地址
  • 做网站实名认证有什么用青岛网站建设运营
  • 大数据分析网站做汽车保养的网站上
  • 网站开发费用一般是多少怎么建设宣传网站
  • 做网站的背景怎么做ps免费模板网站
  • 为什么要建设应急管理网站sketch做网站
  • 做的网站在百度上搜不出来的宁波关键词优化平台
  • 哪里有手机网站建设公司有道网站收录提交入口
  • 赣州网站建设较好的公司贵州网站建设hsyunso
  • 网站建设和管理是教什么科目鹤壁网站建设鹤壁
  • 网站域名和邮箱域名解析国外网站国内做二维码
  • 万万州州微微网站网站建建设设福州建设网站效果图