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

建设网站一般要多久到账html5网站引导页模板

建设网站一般要多久到账,html5网站引导页模板,视频网站VIP卡怎么做赠品,昆明网站定制文章目录 声明Bean的注解Component注解Controller注解Service注解Repository Spring注解的使用选择性实例化Bean负责注入的注解ValueAutowired与QuaifierResource 全注解式开发 注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发 注解怎么定义#xff0c;注解中的属性… 文章目录 声明Bean的注解Component注解Controller注解Service注解Repository Spring注解的使用选择性实例化Bean负责注入的注解ValueAutowired与QuaifierResource 全注解式开发 注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发 注解怎么定义注解中的属性怎么定义注解怎么使用通过反射机制怎么读取注解 注解怎么定义注解中的属性怎么定义 package com.powernode.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(value {ElementType.TYPE}) Retention(value RetentionPolicy.RUNTIME) public interface Component {String value(); }以上是自定义了一个注解Component 该注解上面修饰的注解包括Target注解和Retention注解这两个注解被称为元注解。 Target注解用来设置Component注解可以出现的位置以上代表表示Component注解只能用在类和接口上。 Retention注解用来设置Component注解的保持性策略以上代表Component注解可以被反射机制读取。 String value是Component注解中的一个属性。该属性类型String属性名是value。 //使用User package com.powernode.bean;import com.powernode.annotation.Component;Component(value userBean) public class User { }语法格式注解类型名属性名属性值属性名属性值属性名属性值.... userBean为什么使用双引号括起来因为value属性是String类型字符串 另外如果属性名是value则在使用的时候可以省略属性名 package com.powernode.bean;import com.powernode.annotation.Component;//Component(value userBean) Component(userBean) public class User { }通过反射机制怎么读取注解 //有注解的Bean package com.powernode.bean;import com.powernode.annotation.Component;Component(userBean) public class User { }//没有注解的Bean package com.powernode.bean;public class Vip { }//反射解析注解 package com.powernode.test;import com.powernode.annotation.Component;import java.io.File; import java.net.URL; import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.Map;/*** author 动力节点* version 1.0* className Test* since 1.0**/ public class Test {public static void main(String[] args) throws Exception {// 存放Bean的Map集合。key存储beanId。value存储Bean。MapString,Object beanMap new HashMap();String packageName com.powernode.bean;String path packageName.replaceAll(\\., /);URL url ClassLoader.getSystemClassLoader().getResource(path);File file new File(url.getPath());File[] files file.listFiles();Arrays.stream(files).forEach(f - {String className packageName . f.getName().split(\\.)[0];try {Class? clazz Class.forName(className);if (clazz.isAnnotationPresent(Component.class)) {Component component clazz.getAnnotation(Component.class);String beanId component.value();Object bean clazz.newInstance();beanMap.put(beanId, bean);}} catch (Exception e) {e.printStackTrace();}});System.out.println(beanMap);} }声明Bean的注解 负责声明Bean的注解常见的包括四个 ComponentControllerServiceRespository Component注解 package com.powernode.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(value {ElementType.TYPE}) Retention(value RetentionPolicy.RUNTIME) public interface Component {String value(); }Controller注解 package org.springframework.stereotype;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor;Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Controller {AliasFor(annotation Component.class)String value() default ; } Service注解 package org.springframework.stereotype;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor;Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Service {AliasFor(annotation Component.class)String value() default ; } Repository package org.springframework.stereotype;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor;Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Repository {AliasFor(annotation Component.class)String value() default ; } 其实Controller、Service、Repository这三个注解都是Component注解的别名 也就是说这四个注解的功能都一样用哪个都可以 只是为了增强程序的可读性建议 控制类上使用Controllerservice类上使用Servicedao类上使用Respsitory 它们都是只有一个value属性。value属性用来指定bean的id也就是bean的名字 Spring注解的使用 第一步加入aop的依赖第二步在配置文件中添加context命名空间第三步在配置文件中指定扫描的包第四步在Bean类上使用注解 第一步加入aop的依赖 当加入spring-context依赖之后会关联加入aop的依赖。所以不需要再加什么另外的依赖 第二步在配置文件中添加context命名空间 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd/beans第三步在配置文件中指定要扫描的包 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.powernode.spring6.bean/ /beans第四步在Bean类上使用注解 package com.powernode.spring6.bean;import org.springframework.stereotype.Component;Component(value userBean) public class User { } //test package com.powernode.spring6.test;import com.powernode.spring6.bean.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationTest {Testpublic void testBean(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);User userBean applicationContext.getBean(userBean, User.class);System.out.println(userBean);} } 如果注解的属性名是value那么value是可以省略的。 package com.powernode.spring6.bean;import org.springframework.stereotype.Component;Component(vipBean) public class Vip { } package com.powernode.spring6.test;import com.powernode.spring6.bean.Vip; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationTest {Testpublic void testBean(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);Vip vipBean applicationContext.getBean(vipBean, Vip.class);System.out.println(vipBean);} } 如果把value属性彻底去掉spring会被Bean自动取名默认名字的规律是Bean类名首字母小写即可 如果是多个包怎么办有两种解决方案 第一种在配置文件中指定多个包用逗号隔开第二种指定多个包的共同父包 用逗号隔开 package com.powernode.spring6.bean2;import org.springframework.stereotype.Service;Service public class Order { } ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.powernode.spring6.bean,com.powernode.spring6.bean2/ /beans//test package com.powernode.spring6.test;import com.powernode.spring6.bean.BankDao; import com.powernode.spring6.bean2.Order; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationTest {Testpublic void testBean(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);BankDao bankDao applicationContext.getBean(bankDao, BankDao.class);System.out.println(bankDao);Order order applicationContext.getBean(order, Order.class);System.out.println(order);} } 指定父包 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.powernode.spring6/ /beans选择性实例化Bean 假设在某个包下有很多Bean,有的Bean上标注了Component,有的标注了Controller,有的标注了Service,有的标注了Repository,现在由于某种特殊业务的需求,只允许其中所有的Controller参与Bean管理,其他的都不是实例化。该如何实现 package com.powernode.spring6.bean3;import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service;Component public class A {public A() {System.out.println(A的无参数构造方法执行);} }Controller class B {public B() {System.out.println(B的无参数构造方法执行);} }Service class C {public C() {System.out.println(C的无参数构造方法执行);} }Repository class D {public D() {System.out.println(D的无参数构造方法执行);} }Controller class E {public E() {System.out.println(E的无参数构造方法执行);} }Controller class F {public F() {System.out.println(F的无参数构造方法执行);} }!-- spring-choose.xml -- ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.powernode.spring6.bean3 use-default-filtersfalsecontext:include-filter typeannotation expressionorg.springframework.stereotype.Controller//context:component-scan/beans其中: use-default-filterstrue表示:使用spring默认的规则,只要有Compoment、Controller、Service、Repository中的任意一个注解标注,则进行实例化。 use-default-filtersfalse标识:不再spring默认实例化规则,即使有Component、Controller、Service、Repository这些注解标注也不再实例化. context:include-filter typeannotation expressionorg.springframework.stereotype.Controller/表示只有Controller进行实例化。 //test Test public void testChoose(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-choose.xml); }也可以将use-default-filters设置为true(不写就是true),并且采用exclude-filter方式排除哪些注解标注的Bean不参与实例化: !-- spring-choose.xml -- context:component-scan base-packagecom.powernode.spring6.bean3context:exclude-filter typeannotation expressionorg.springframework.stereotype.Repository/context:exclude-filter typeannotation expressionorg.springframework.stereotype.Service/context:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/ /context:component-scan负责注入的注解 ComponentControllerServiceRepository这四个注解是用来声明Bean的声明后这些Bean将被实例化。 给Bean属性赋值需要用到这些注解: ValueAutowiredQualifierResource Value 当属性的类型是简单类型时,可以使用Value注解进行注入 //User package com.powernode.spring6.bean4;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;Component public class User {Value(value zhangsan)private String name;Value(20)private int age;Overridepublic String toString() {return User{ name name \ , age age };} }开启包扫描 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.powernode.spring6.bean4/ /beans//test Test public void testValue(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-injection.xml);Object user applicationContext.getBean(user);System.out.println(user); }通过测试可以发现我们并没有给属性提供setter方法但仍然可以完成属性赋值 如果提供setter方法并且再setter方法上添加Value注解更能完成此功能 package com.powernode.spring6.bean4;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;Component public class User {private String name;private int age;Value(李四)public void setName(String name) {this.name name;}Value(30)public void setAge(int age) {this.age age;}Overridepublic String toString() {return User{ name name \ , age age };} } Value可以直接使用在属性上也可以使用在setter方法上都是可以的都可以完成属性的赋值 为了简化代码一般是不提供setter方法直接在属性上使用Value注解完成属性赋值。 package com.powernode.spring6.bean4;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;Component public class User {private String name;private int age;public User(Value(隔壁老王) String name, Value(33) int age) {this.name name;this.age age;}Overridepublic String toString() {return User{ name name \ , age age };} }Value注解可以出现在属性上、setter方法上、以及构造方法的形参上。 Autowired与Quaifier Autowired注解可以用来注入非简单类型翻译为自动连线的或者自动装配 单独使用Autowired注解默认根据类型装配。默认是byType //Autowired源码 package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface Autowired {boolean required() default true; }源码中有两处需要注意 该注解可以标注在哪里 构造方法上方法上形参上属性上注解上 该注解有一个required属性默认值是true表示在注入的时候要求被注入的Bean必须是存在的如果不存在则报错。如果required属性设置为false表示注入的Bean存在或者不存在都没关系存在的话就注入不存在的话也不报错 在属性上使用Autowired注解 // package com.powernode.spring6.dao;public interface UserDao {void insert(); }package com.powernode.spring6.dao;import org.springframework.stereotype.Repository;Repository //纳入bean管理 public class UserDaoForMySQL implements UserDao{Overridepublic void insert() {System.out.println(正在向mysql数据库插入User数据);} } package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;Service // 纳入bean管理 public class UserService {Autowired // 在属性上注入private UserDao userDao;// 没有提供构造方法和setter方法。public void save(){userDao.insert();} }!-- 配置包扫描 -- ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.powernode.spring6.dao,com.powernode.spring6.service/ /beans//test Test public void testAutowired(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-injection.xml);UserService userService applicationContext.getBean(userService, UserService.class);userService.save(); }没有提供构造方法和setter方法仍然可以注入成功 Autowired注解出现在setter方法上 package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;Autowiredpublic void setUserDao(UserDao userDao) {this.userDao userDao;}public void save(){userDao.insert();} } Autowired出现在构造方法上 package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;Autowiredpublic UserService(UserDao userDao) {this.userDao userDao;}public void save(){userDao.insert();} } Autowired只标注在构造方法的形参上 package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;public UserService(Autowired UserDao userDao) {this.userDao userDao;}public void save(){userDao.insert();} } 当参数的构造方法只有一个时Autowired注解可以省略 package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;public UserService(UserDao userDao) {this.userDao userDao;}public void save(){userDao.insert();} } 如果有多个构造方法Autowired肯定是不能省略的 package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;public UserService(UserDao userDao) {this.userDao userDao;}public UserService(){}public void save(){userDao.insert();} } Autowired注解默认是byType进行注入的也就是说根据类型注入的 如果以上程序中UserDao接口还有另外一个实现类会出现什么问题 会提示出错不能装配UseDao这个Bean的数量大于一 怎么解决这个问题当然要byName根据名称进行装配。 Autowired注解和Qualifier注解联合起来才可以根据名称进行装配在Qualifier注解中指定Bean名称 package com.powernode.spring6.dao;import org.springframework.stereotype.Repository;Repository // 这里没有给bean起名默认名字是userDaoForOracle public class UserDaoForOracle implements UserDao{Overridepublic void insert() {System.out.println(正在向Oracle数据库插入User数据);} } package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;AutowiredQualifier(userDaoForOracle) // 这个是bean的名字。public void setUserDao(UserDao userDao) {this.userDao userDao;}public void save(){userDao.insert();} }总结 Autowired注解可以出现在属性上、构造方法上、构造方法的参数上、setter方法上。当带参数的构造方法只有一个Autowired注解可以省略Autowired注解默认根据类型注入。如果要根据名称注入的话需要配合Qualifier注解一起使用。 Resource Resource注解也可以完成非简单类型注入。那它和Autowired注解有什么区别 Resource注解是JDK拓展包中的也就是说属于JDK的一部分。所有该注解是标准注解更加具有通用性。JSR-250标准中制定的注解类型。JSR是Java规范提案。Autowired注解是Spring框架自己的Resorce注解默认根据名称装配byName未指定name时使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。Autowired注解默认根据类型装配byType如果想根据名称装配需要配合Qualifier注解一起用Resource注解用在属性上、setter方法上。Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上 Resource注解属于JDK拓展包所以不再JDK当中需要额外引入以下依赖如果时JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖 !-- spring-6 -- dependencygroupIdjakarta.annotation/groupIdartifactIdjakarta.annotation-api/artifactIdversion2.1.1/version /dependency一定要注意如果你用Spring6要知道Spring6不再支持JavaEE它支持的是JakartaEE9。 Oracle把JavaEE贡献给Apache了Apache把JavaEE的名字改成JaKartaEE了所以之前所接触的所有javax.*包名统一修改为jakarta.*包名了 !-- spring-5 -- dependencygroupIdjavax.annotation/groupIdartifactIdjavax.annotation-api/artifactIdversion1.3.2/version /dependencypackage com.powernode.spring6.dao;import org.springframework.stereotype.Repository;Repository(xyz) public class UserDaoForOracle implements UserDao{Overridepublic void insert() {System.out.println(正在向Oracle数据库插入User数据);} }package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import jakarta.annotation.Resource; import org.springframework.stereotype.Service;Service public class UserService {Resource(name xyz)private UserDao userDao;public void save(){userDao.insert();} }把UseDaoForOracle的名字xyz修改为userDao让这个Bean的名字和UserService类中的UseDao属性名一致 package com.powernode.spring6.dao;import org.springframework.stereotype.Repository;Repository(userDao) public class UserDaoForOracle implements UserDao{Overridepublic void insert() {System.out.println(正在向Oracle数据库插入User数据);} }package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import jakarta.annotation.Resource; import org.springframework.stereotype.Service;Service public class UserService {Resourceprivate UserDao userDao;public void save(){userDao.insert();} } 当Resource注解使用时没有指定name的时候还是根据name进行查找这个name是属性名 当通过name找不到的时候自然会启动byType进行注入。 package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import jakarta.annotation.Resource; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;Resourcepublic void setUserDao(UserDao userDao) {this.userDao userDao;}public void save(){userDao.insert();} } setUserDao去掉set之后将首字母小写userDaouserDao就是name 也可以指定name package com.powernode.spring6.service;import com.powernode.spring6.dao.UserDao; import jakarta.annotation.Resource; import org.springframework.stereotype.Service;Service public class UserService {private UserDao userDao;Resource(name userDaoForMySQL)public void setUserDao(UserDao userDao) {this.userDao userDao;}public void save(){userDao.insert();} } Resource注解默认byName注入没有指定name时把属性名当作name根据name找不到时才会byType注入。byType注入时某种类型的Bean只能有一个 全注解式开发 省略省略省略省略还有这个全部省略 所谓的全注解开发就是不再使用spring配置文件了。写一个配置类来代替配置文件 package com.powernode.spring6.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScans; import org.springframework.context.annotation.Configuration;Configuration ComponentScan({com.powernode.spring6.dao, com.powernode.spring6.service}) public class Spring6Configuration { } 编写test程序时不用再new ClassPathXmlApplicationContext()对象了 Test public void testNoXml(){ApplicationContext applicationContext new AnnotationConfigApplicationContext(Spring6Configuration.class);UserService userService applicationContext.getBean(userService, UserService.class);userService.save(); }
http://www.w-s-a.com/news/525669/

相关文章:

  • .name后缀的网站做房产网站多少钱
  • 手机上传网站源码网站app封装怎么做
  • 做的网站放在阿里云网站建设投标书范本
  • 做文化传播公司网站wordpress仿简书
  • 什么网站有题目做西宁网站制作哪里好
  • 网站上添加图片的原则优易主机 wordpress
  • 用php做的网站源代码那里有做像美团的网站的
  • 网站建设百科有什么做兼职的网站
  • 创造网站电商网站建设方案道客巴巴
  • 南通设计网站建设wordpress时光轴
  • 郑州做网站企起网站建设 风险
  • 北京市保障性住房建设投资中心网站6大连广告设计与制作公司
  • 建站之星网站模板国内f型网页布局的网站
  • 怎么做网站关键词优化外贸网站 开源
  • 广东公司响应式网站建设设计seo系统是什么
  • 清丰网站建设费用网站建设的前途
  • 网站上那些兼职网页怎么做的北京网页
  • 桂林建站平台哪家好品牌设计公司宣传文案
  • 平面设计和建设网站的区别公司官网静态
  • h5网站建设+案例住房住房和城乡建设部网站
  • 建设股公司网站东莞建设网网上平台
  • 湖州吴兴建设局网站加强网站建设的
  • 茌平做网站公司专业商城网站建设报价
  • 网站结构图怎么画wordpress注册不发送件
  • 个人备案网站可以做论坛吗电商推广方式有哪些
  • 网站建设 自适应国内最近的新闻
  • 校园网站开发背景吴江网站建设公司
  • 网站开发工程师发展趋势山东省建设工程电子信息网站
  • 适合大学生创业的网站建设类型吉林省舒兰市建设银行网站
  • 呼和浩特网站建设哪家好培训学校加盟费用