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

网页设计自学网站营销型网站建设口碑好

网页设计自学网站,营销型网站建设口碑好,wordpress iis7.5 伪静态,wordpress上传主题失败学习完了JavaWeb#xff0c;为了深入了解tomcat#xff0c;打算手撕tomcat搭建自己的tomcat#xff0c;希望对来访小伙伴也有帮助 引言 Tomcat 是一个开源的 Web 服务器和 Servlet 容器#xff0c;它可以提供动态 Web 内容的处理和交互功能。Tomcat 是用 Java 语言编写的为了深入了解tomcat打算手撕tomcat搭建自己的tomcat希望对来访小伙伴也有帮助 引言 Tomcat 是一个开源的 Web 服务器和 Servlet 容器它可以提供动态 Web 内容的处理和交互功能。Tomcat 是用 Java 语言编写的需要运行在 Java 虚拟机上所以它可以跨平台运行并且可以与其他 Java 技术集成。Tomcat 是 Java EE 规范的一个实现它支持 Servlet、JSP、EL、JSTL 等标准技术以及 Struts、Spring、Hibernate 等流行框架。 Tomcat 的设计和实现是基于模块化和可扩展的原则它由多个组件构成每个组件都有自己的功能和职责。Tomcat 的核心组件是 Catalina它是一个 Servlet 容器负责管理和执行 Servlet。其他组件包括 Coyote它是一个连接器负责接收和解析 HTTP 请求Jasper它是一个 JSP 引擎负责编译和执行 JSP 页面Cluster它是一个集群模块负责实现负载均衡和会话复制等功能以及其他一些辅助组件如安全模块、日志模块、管理模块等。 本文将介绍如何使用 Java 编写 Tomcat并实现一个简单的 Web 服务器和 Servlet 容器。本文还将介绍 Tomcat 的基本框架和相关配置并使用 Eclipse 进行开发和调试。本文旨在帮助读者理解和掌握 Tomcat 的原理和用法。 目录 一创建项目 二编写代码 1.Server 2.Connector 3.request 4.response 5.Processor 6.StaticProcessor 7.DynamicProcessor 8.ServletContainer 9.Servlet 10.HelloServlet 三编写配置文件 四编写 Web 应用 五测试和调试 六总结 使用 Java 编写 Tomcat 一创建项目 首先我们需要创建一个 Java 项目并命名为 MyTomcat。我们可以使用 Eclipse 或者其他 IDE 来创建项目也可以使用命令行或者文本编辑器来创建项目。在本文中我们使用 Eclipse 作为开发工具。 在 Eclipse 中我们选择 File - New - Java Project然后输入项目名称 MyTomcat并选择 JDK 作为 JRE System Library。点击 Finish 完成项目的创建。 我们创建的项目的结构如下有一个 src 文件夹用于存放源代码文件有一个 bin 文件夹用于存放编译后的字节码文件有一个 lib 文件夹用于存放依赖的 jar 包有一个 webapps 文件夹用于存放 Web 应用有一个 conf 文件夹用于存放配置文件有一个 logs 文件夹用于存放日志文件。 二编写代码 接下来我们需要编写代码来实现 Tomcat 的功能。我们需要实现以下几个类 Server这是 Tomcat 的主类负责启动 Tomcat 服务器并初始化各个组件。Connector这是连接器类负责接收客户端的 HTTP 请求并将其封装成 Request 对象。Request这是请求类负责存储请求的相关信息如请求方法、请求路径、请求参数等。Response这是响应类负责存储响应的相关信息如响应状态码、响应头、响应体等。Processor这是处理器类负责根据请求的类型静态或动态来选择不同的处理方式并将结果写入 Response 对象。StaticProcessor这是静态处理器类负责处理静态资源的请求如 HTML、CSS、JS、图片等。DynamicProcessor这是动态处理器类负责处理动态资源的请求如 Servlet、JSP 等。ServletContainer这是 Servlet 容器类负责管理和执行 Servlet。Servlet这是一个接口定义了 Servlet 的规范所有的 Servlet 都必须实现这个接口。HelloServlet这是一个具体的 Servlet 类用于演示 Tomcat 的功能。 下面逐一介绍这些类的代码和功能。 1.Server Server 类是 Tomcat 的主类它有一个 main 方法用于启动 Tomcat 服务器并初始化各个组件。它有一个 ServerSocket 属性用于监听客户端的连接请求。它有一个 Connector 属性用于创建和管理连接器。它有一个 port 属性用于指定服务器的监听端口。它有一个 webapps 属性用于指定 Web 应用的根目录。它有一个 conf 属性用于指定配置文件的路径。它有一个 servletContainer 属性用于创建和管理 Servlet 容器。 Server 类的代码如下 package com.mytomcat;import java.io.File; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;/*** Tomcat 的主类负责启动服务器并初始化各个组件*/ public class Server {// 服务器套接字private ServerSocket serverSocket;// 连接器private Connector connector;// 服务器监听端口private int port 8080;// Web 应用根目录private String webapps webapps;// 配置文件路径private String conf conf/web.xml;// Servlet 容器private ServletContainer servletContainer;/*** 构造方法初始化各个组件*/public Server() {try {// 创建服务器套接字并绑定端口serverSocket new ServerSocket(port);System.out.println(Server started at port: port);// 创建连接器connector new Connector();// 创建 Servlet 容器并加载配置文件servletContainer new ServletContainer(new File(conf));} catch (IOException e) {e.printStackTrace();}}/*** 启动服务器的方法*/public void start() {while (true) {try {// 接受客户端的连接请求返回一个套接字Socket socket serverSocket.accept();System.out.println(Client connected: socket.getInetAddress());// 交给连接器处理connector.process(socket, webapps, servletContainer);} catch (IOException e) {e.printStackTrace();}}}/*** 主方法创建并启动服务器实例* param args 命令行参数*/public static void main(String[] args) {Server server new Server();server.start();} }2.Connector Connector 类是连接器类它负责接收客户端的 HTTP 请求并将其封装成 Request 对象。它有一个 process 方法用于处理客户端的连接请求。它有一个 Processor 属性用于创建和管理处理器。 Connector 类的代码如下 package com.mytomcat;import java.io.IOException; import java.io.InputStream; import java.net.Socket;/*** 连接器类负责接收客户端的 HTTP 请求并将其封装成 Request 对象*/ public class Connector {// 处理器private Processor processor;/*** 构造方法初始化处理器*/public Connector() {processor new Processor();}/*** 处理客户端连接请求的方法* param socket 套接字* param webapps Web 应用根目录* param servletContainer Servlet 容器*/public void process(Socket socket, String webapps, ServletContainer servletContainer) {try {// 获取输入流读取请求内容InputStream inputStream socket.getInputStream();// 创建请求对象并解析请求内容Request request new Request(inputStream);// 创建响应对象并关联套接字的输出流Response response new Response(socket.getOutputStream());// 交给处理器处理processor.process(request, response, webapps, servletContainer);} catch (IOException e) {e.printStackTrace();} finally {// 关闭套接字try {socket.close();} catch (IOException e) {e.printStackTrace();}}} }3.request Request 类是请求类负责存储请求的相关信息如请求方法、请求路径、请求参数等。它有一个构造方法用于接收输入流并解析请求内容。它有一些属性和方法用于获取和设置请求的相关信息。 Request 类的代码如下 package com.mytomcat;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map;/*** 请求类负责存储请求的相关信息如请求方法、请求路径、请求参数等*/ public class Request {// 输入流private InputStream inputStream;// 请求方法private String method;// 请求路径private String uri;// 请求参数private MapString, String parameters;/*** 构造方法接收输入流并解析请求内容* param inputStream 输入流*/public Request(InputStream inputStream) {this.inputStream inputStream;// 创建参数映射对象parameters new HashMap();// 解析请求内容parse();}/*** 解析请求内容的方法*/private void parse() {try {// 创建缓冲读取器读取输入流中的内容BufferedReader br new BufferedReader(new InputStreamReader(inputStream));// 读取第一行内容即请求行String requestLine br.readLine();System.out.println(Request Line: requestLine);// 如果请求行不为空则继续解析if (requestLine ! null) {// 将请求行按空格分割成三部分分别是请求方法、请求路径和协议版本String[] parts requestLine.split( );// 获取并设置请求方法method parts[0];// 获取并设置请求路径uri parts[1];// 如果请求路径中包含 ? 则表示有查询字符串需要进一步解析if (uri.contains(?)) {// 将请求路径按 ? 分割成两部分分别是路径和查询字符串parts uri.split(\\?);// 重新设置请求路径为 ? 前面的部分uri parts[0];// 获取查询字符串String queryString parts[1];// 如果查询字符串不为空则继续解析if (queryString ! null !queryString.isEmpty()) {// 将查询字符串按 分割成多个键值对parts queryString.split();// 遍历每个键值对for (String part : parts) {// 将键值对按 分割成两部分分别是键和值String[] pair part.split();// 获取并设置参数的键和值并放入参数映射对象中parameters.put(pair[0], pair[1]);}}}}} catch (IOException e) {e.printStackTrace();}}/*** 获取输入流的方法* return 输入流对象*/public InputStream getInputStream() {return inputStream;}/*** 获取请求方法的方法* return 请求方法字符串*/public String getMethod() {return method;}/*** 获取请求路径的方法* return 请求路径字符串*/public String getUri() {return uri;}/*** 根据参数名获取参数值的方法* param name 参数名字符串* return 参数值字符串如果没有找到则返回 null*/public String getParameter(String name) {return parameters.get(name);} }4.response Response 类是响应类负责存储响应的相关信息如响应状态码、响应头、响应体等。它有一个构造方法用于接收输出流并初始化响应内容。它有一些属性和方法用于获取和设置响应的相关信息。它还有一个 send 方法用于发送响应内容到输出流中。 Request 类的代码如下 package com.mytomcat;import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map;/*** 响应类负责存储响应的相关信息如响应状态码、响应头、响应体等*/ public class Response {// 输出流private OutputStream outputStream;// 响应状态码private int status;// 响应头private MapString, String headers;// 响应体private StringBuilder body;// 缓冲写入器private PrintWriter writer;/*** 构造方法接收输出流并初始化响应内容* param outputStream 输出流*/public Response(OutputStream outputStream) {this.outputStream outputStream;// 创建响应头映射对象headers new HashMap();// 创建响应体字符串对象body new StringBuilder();// 创建缓冲写入器关联响应体字符串对象writer new PrintWriter(body);}/*** 获取输出流的方法* return 输出流对象*/public OutputStream getOutputStream() {return outputStream;}/*** 获取缓冲写入器的方法* return 缓冲写入器对象*/public PrintWriter getWriter() {return writer;}/*** 设置响应状态码的方法* param status 响应状态码整数*/public void setStatus(int status) {this.status status;}/*** 设置响应头的方法* param name 响应头名字符串* param value 响应头值字符串*/public void setHeader(String name, String value) {headers.put(name, value);}/*** 设置响应头 Content-Type 的方法* param contentType Content-Type 字符串*/public void setContentType(String contentType) {setHeader(Content-Type, contentType);}/*** 设置响应头 Content-Length 的方法* param contentLength Content-Length 整数*/public void setContentLength(int contentLength) {setHeader(Content-Length, String.valueOf(contentLength));}/*** 向响应体中写入字符串的方法* param s 字符串对象*/public void println(String s) {writer.println(s);}/*** 向响应体中写入字节数组的方法* param b 字节数组对象* param off 起始位置整数* param len 长度整数*/public void write(byte[] b, int off, int len) {writer.write(new String(b, off, len));}5.Processor Processor 类是处理器类它负责根据请求的类型静态或动态来选择不同的处理方式并将结果写入 Response 对象。它有一个 process 方法用于处理请求和响应。它有一个 StaticProcessor 属性用于创建和管理静态处理器。它有一个 DynamicProcessor 属性用于创建和管理动态处理器。 Processor 类的代码如下 package com.mytomcat;/*** 处理器类负责根据请求的类型静态或动态来选择不同的处理方式并将结果写入 Response 对象*/ public class Processor {// 静态处理器private StaticProcessor staticProcessor;// 动态处理器private DynamicProcessor dynamicProcessor;/*** 构造方法初始化静态处理器和动态处理器*/public Processor() {staticProcessor new StaticProcessor();dynamicProcessor new DynamicProcessor();}/*** 处理请求和响应的方法* param request 请求对象* param response 响应对象* param webapps Web 应用根目录* param servletContainer Servlet 容器*/public void process(Request request, Response response, String webapps, ServletContainer servletContainer) {// 获取请求路径String uri request.getUri();// 判断请求路径是否以 /servlet/ 开头如果是则表示请求动态资源否则表示请求静态资源if (uri.startsWith(/servlet/)) {// 交给动态处理器处理dynamicProcessor.process(request, response, servletContainer);} else {// 交给静态处理器处理staticProcessor.process(request, response, webapps);}} }6.StaticProcessor StaticProcessor 类是静态处理器类它负责处理静态资源的请求如 HTML、CSS、JS、图片等。它有一个 process 方法用于读取静态资源文件并将其内容写入 Response 对象。 StaticProcessor 类的代码如下 package com.mytomcat;import java.io.File; import java.io.FileInputStream; import java.io.IOException;/*** 静态处理器类负责处理静态资源的请求如 HTML、CSS、JS、图片等*/ public class StaticProcessor {/*** 处理静态资源请求的方法* param request 请求对象* param response 响应对象* param webapps Web 应用根目录*/public void process(Request request, Response response, String webapps) {try {// 获取请求路径String uri request.getUri();// 根据 Web 应用根目录和请求路径构造文件路径String filePath webapps uri;// 创建文件对象File file new File(filePath);// 判断文件是否存在且可读如果是则表示找到了对应的静态资源否则表示没有找到对应的静态资源if (file.exists() file.canRead()) {// 设置响应状态码为 200 OKresponse.setStatus(200);// 设置响应头 Content-Type 为根据文件扩展名判断的 MIME 类型response.setContentType(getContentType(file));// 设置响应头 Content-Length 为文件长度response.setContentLength((int) file.length());// 创建文件输入流读取文件内容FileInputStream fis new FileInputStream(file);byte[] buffer new byte[1024];int len 0;while ((len fis.read(buffer)) ! -1) {// 将文件内容写入响应体中response.write(buffer, 0, len);}// 关闭文件输入流fis.close();} else {// 设置响应状态码为 404 Not Foundresponse.setStatus(404);// 设置响应头 Content-Type 为 text/htmlresponse.setContentType(text/html);// 设置响应体为一个简单的错误页面response.println(htmlheadtitle404 Not Found/title/headbody);response.println(h1404 Not Found/h1);response.println(pThe requested resource uri was not found on this server./p);response.println(/body/html);}// 发送响应response.send();} catch (IOException e) {e.printStackTrace();}}/*** 根据文件扩展名判断 MIME 类型的方法* param file 文件对象* return MIME 类型字符串*/private String getContentType(File file) {// 获取文件名String fileName file.getName();// 获取文件扩展名String extension fileName.substring(fileName.lastIndexOf(.) 1);// 根据文件扩展名判断 MIME 类型这里只列举了一些常见的类型实际上还有很多其他的类型switch (extension) {case html:case htm:return text/html;case css:return text/css;case js:return text/javascript;case jpg:case jpeg:return image/jpeg;case png:return image/png;case gif:return image/gif;default:return application/octet-stream;}} }7.DynamicProcessor DynamicProcessor 类是动态处理器类它负责处理动态资源的请求如 Servlet、JSP 等。它有一个 process 方法用于根据请求路径找到对应的 Servlet并调用其 service 方法并将结果写入 Response 对象。 DynamicProcessor 类的代码如下 package com.mytomcat;/*** 动态处理器类负责处理动态资源的请求如 Servlet、JSP 等*/ public class DynamicProcessor {/*** 处理动态资源请求的方法* param request 请求对象* param response 响应对象* param servletContainer Servlet 容器*/public void process(Request request, Response response, ServletContainer servletContainer) {try {// 获取请求路径String uri request.getUri();// 根据请求路径从 Servlet 容器中获取对应的 Servlet 实例如果没有找到则返回 nullServlet servlet servletContainer.getServlet(uri);// 判断是否找到了对应的 Servlet如果是则表示找到了对应的动态资源否则表示没有找到对应的动态资源if (servlet ! null) {// 设置响应状态码为 200 OKresponse.setStatus(200);// 调用 Servlet 的 service 方法传入请求对象和响应对象让 Servlet 处理业务逻辑并生成响应内容servlet.service(request, response);} else {// 设置响应状态码为 404 Not Foundresponse.setStatus(404);// 设置响应头 Content-Type 为 text/htmlresponse.setContentType(text/html);// 设置响应体为一个简单的错误页面response.println(htmlheadtitle404 Not Found/title/headbody);response.println(h1404 Not Found/h1);response.println(pThe requested resource uri was not found on this server./p);response.println(/body/html);}// 发送响应response.send();} catch (Exception e) {e.printStackTrace();}} }8.ServletContainer ServletContainer 类是 Servlet 容器类它负责管理和执行 Servlet。它有一个 load 方法用于加载配置文件并根据配置文件中的信息创建和注册 Servlet 实例。它有一个 getServlet 方法用于根据请求路径获取对应的 Servlet 实例。它有一个 Map 属性用于存储请求路径和 Servlet 实例之间的映射关系。 ServletContainer 类的代码如下 package com.mytomcat;import java.io.File; import java.io.FileInputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties;/*** Servlet 容器类负责管理和执行 Servlet*/ public class ServletContainer {// 请求路径和 Servlet 实例之间的映射关系private MapString, Servlet servletMap;/*** 构造方法加载配置文件并创建和注册 Servlet 实例* param configFile 配置文件对象*/public ServletContainer(File configFile) {// 创建映射关系对象servletMap new HashMap();// 加载配置文件load(configFile);}/*** 加载配置文件并创建和注册 Servlet 实例的方法* param configFile 配置文件对象*/private void load(File configFile) {try {// 创建属性对象用于存储配置文件中的键值对Properties properties new Properties();// 创建文件输入流读取配置文件内容FileInputStream fis new FileInputStream(configFile);// 加载配置文件内容到属性对象中properties.load(fis);// 关闭文件输入流fis.close();// 遍历属性对象中的所有键值对for (Map.EntryObject, Object entry : properties.entrySet()) {// 获取键即请求路径String uri (String) entry.getKey();// 获取值即 Servlet 类名String className (String) entry.getValue();// 通过反射机制根据类名创建 Servlet 类的实例Class? clazz Class.forName(className);Servlet servlet (Servlet) clazz.newInstance();// 将请求路径和 Servlet 实例放入映射关系对象中servletMap.put(uri, servlet);}} catch (Exception e) {e.printStackTrace();}}/*** 根据请求路径获取对应的 Servlet 实例的方法* param uri 请求路径* return 对应的 Servlet 实例如果没有找到则返回 null*/public Servlet getServlet(String uri) {// 从映射关系对象中根据请求路径获取对应的 Servlet 实例并返回return servletMap.get(uri);} }9.Servlet Servlet 是一个接口定义了 Servlet 的规范所有的 Servlet 都必须实现这个接口。Servlet 接口有一个 service 方法用于处理客户端的请求并生成响应内容。Servlet 接口还有一些其他的方法如 init、destroy、getServletConfig、getServletInfo 等但在本文中我们不需要实现这些方法。 Servlet 接口的代码如下 package com.mytomcat;import java.io.IOException;/*** Servlet 接口定义了 Servlet 的规范所有的 Servlet 都必须实现这个接口*/ public interface Servlet {/*** 处理客户端请求并生成响应内容的方法* param request 请求对象* param response 响应对象* throws IOException 输入输出异常*/public void service(Request request, Response response) throws IOException; }10.HelloServlet HelloServlet 是一个具体的 Servlet 类用于演示 Tomcat 的功能。它实现了 Servlet 接口并重写了 service 方法。在 service 方法中它根据请求参数 name 的值生成一个简单的欢迎页面并将其写入响应对象中。 HelloServlet 类的代码如下 package com.mytomcat;import java.io.IOException;/*** 一个具体的 Servlet 类用于演示 Tomcat 的功能*/ public class HelloServlet implements Servlet {/*** 处理客户端请求并生成响应内容的方法* param request 请求对象* param response 响应对象* throws IOException 输入输出异常*/Overridepublic void service(Request request, Response response) throws IOException {// 获取请求参数 name 的值如果没有则默认为 WorldString name request.getParameter(name);if (name null) {name World;}// 设置响应头 Content-Type 为 text/htmlresponse.setContentType(text/html);// 设置响应体为一个简单的欢迎页面response.println(htmlheadtitleHello Servlet/title/headbody);response.println(h1Hello, name !/h1);response.println(pThis is a simple Servlet example./p);response.println(/body/html);} }三编写配置文件 接下来我们需要编写配置文件用于指定请求路径和 Servlet 类名之间的映射关系。我们使用一个简单的属性文件web.xml来存储这些信息。属性文件中的每一行都是一个键值对键是请求路径值是 Servlet 类名。我们需要将属性文件放在 conf 文件夹中。 属性文件的内容如下 /servlet/HelloServletcom.mytomcat.HelloServlet这表示当客户端请求 /servlet/HelloServlet 路径时服务器会调用 com.mytomcat.HelloServlet 类的实例来处理请求。 四编写 Web 应用 最后我们需要编写 Web 应用用于测试 Tomcat 的功能。我们使用一个简单的 HTML 文件index.html来作为 Web 应用的入口页面。HTML 文件中有一个表单用于向服务器发送请求并携带一个 name 参数。我们需要将 HTML 文件放在 webapps 文件夹中。 HTML 文件的内容如下 html headtitleTomcat Test/title /head bodyh1Tomcat Test/h1pThis is a simple Web application to test Tomcat./pform action/servlet/HelloServlet methodgetpPlease enter your name:/pinput typetext namenameinput typesubmit valueSubmit/form /body /html这表示当用户点击提交按钮时浏览器会向服务器发送一个 GET 请求并携带一个 name 参数请求路径为 /servlet/HelloServlet。 五测试和调试 现在我们已经完成了 Tomcat 的编写和配置我们可以运行 Server 类的 main 方法来启动 Tomcat 服务器并在浏览器中访问 http://localhost:8080/index.html 来测试 Tomcat 的功能。 如果我们遇到了任何问题或错误我们可以使用 Eclipse 的调试功能来进行调试。我们可以在代码中设置断点然后使用 Debug As - Java Application 来运行 Server 类的 main 方法。这样当程序执行到断点时Eclipse 会暂停程序的执行并显示当前的变量值、堆栈信息、控制台输出等信息。我们可以使用 Step Into、Step Over、Step Return 等命令来逐步执行程序并观察程序的运行情况。 六总结 本文介绍了如何使用 Java 编写 Tomcat并实现一个简单的 Web 服务器和 Servlet 容器。本文还介绍了 Tomcat 的基本框架和相关配置并使用 Eclipse 进行开发和调试。本文旨在帮助伙伴们理解和掌握 Tomcat 的原理和用法。 Tomcat 是一个开源的 Web 服务器和 Servlet 容器它可以提供动态 Web 内容的处理和交互功能。Tomcat 是用 Java 语言编写的需要运行在 Java 虚拟机上所以它可以跨平台运行并且可以与其他 Java 技术集成。Tomcat 是 Java EE 规范的一个实现它支持 Servlet、JSP、EL、JSTL 等标准技术以及 Struts、Spring、Hibernate 等流行框架。 Tomcat 的设计和实现是基于模块化和可扩展的原则它由多个组件构成每个组件都有自己的功能和职责。Tomcat 的核心组件是 Catalina它是一个 Servlet 容器负责管理和执行 Servlet。其他组件包括 Coyote它是一个连接器负责接收和解析 HTTP 请求Jasper它是一个 JSP 引擎负责编译和执行 JSP 页面Cluster它是一个集群模块负责实现负载均衡和会话复制等功能以及其他一些辅助组件如安全模块、日志模块、管理模块等。 以上就是全部内容啦~
http://www.laogonggong.com/news/109313.html

相关文章:

  • 巴彦淖尔市百家姓网站建设教育类的网站案例
  • 网站的开发建设费音乐网站开发分享
  • 做pc端网站哪家好flash网站推荐
  • 怎么给喜欢的人做网站模拟网站效果
  • 学包装设计网站如何给wordpress增加表单
  • 济南外贸网站注册商标怎么注册商标
  • 湛江做网站开发医院网址
  • 苏州市城乡建设局网站首页360网站建设服务器
  • 网站制作网页制作网站内容模板
  • 电脑在哪里制作网站wordpress 手机端访问
  • html网站可以做访问统计吗网页设计欣赏怎么写
  • Wordpress外贸网站搭建公司温州网站链接怎么做
  • 制作网站过程群辉怎么做网站服务器
  • 我要浏览国外网站怎么做企业网站建设实训
  • 网站开发合同印花税深圳罗湖区网站建设
  • 做学分网站网页设计模板html代码地方介绍
  • 知名的设计网站西部数码手机网站
  • 设计师做兼职的网站有哪些沈阳互联网公司排名
  • 网站分站系扬州建设工程招聘信息网站
  • 蒙古文网站建设汇报材料系统管理在哪里
  • 潍坊网站建设一品网络小程序专业做灯具的网站
  • 设计得好的美食网站镇江网站建设个
  • 上海专业建站公南昌做网站优化的公司
  • 如何自己免费做网站网站布局策划的流程图
  • 学生自做网站优秀作品潮州网站开发
  • 网站建设和域名的关系响应式页面
  • wordpress网站数据迁移昆明大型网页开发企业
  • 免费搭建手机网站wordpress如何更换编辑器
  • 安丘网站开发杭州建设网页
  • 如何利用div做网站wordpress插件内链