JavaWeb三层架构详解

11 篇文章 1 订阅
订阅专栏

什么是三层架构?

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了 高内聚低耦合的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层(又称为持久层)业务逻辑层(又或称为领域层)表示层

 

表示层(UI层):

表示层也称为界面层,位于最外层(最上层),离用户最近。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。

 

业务逻辑层(BLL层):

负责关键业务的处理和数据的传递。复杂的逻辑判断和涉及到数据库的数据验证都需要在此做出处理。主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

 

数据访问层(DAL层):

主要负责对数据库的直接访问为业务逻辑层提供数据,根据传入的值来操作数据库,增、删、改、查。

 

为什么要用三层架构呢?

1.团队开发,便于管理

三层架构使得合作开发成为可能,由于各层相互独立,一个小组只需负责一小块就可以。结构化的编程方法面对大型的项目会感到力不从心,因为结构化设计必定会使程序变的错综复杂。逻辑主要在BLL层,就使得UI层也就是客户端不承担太多的职责,即使更新业务逻辑,也无需修改客户端,不用重新部署。

 

2.解耦

上一层依赖于下一层,如果测试下一层没有问题,那么问题就只有可能发现在本层了,便于发现和改正BUG。体现了高内聚,低耦合的思想。比如楼房是分层的,我们要到哪一层楼非常方便,只需在电梯里按下那个楼层的层号即可。而三层架构就好比开发的软件“楼”,哪层出现Bug,哪层有问题,我们作为开发人员能够随时找到,并修正。 各个层次分工明确,将一个复杂问题简单拆分了。

 

 3.代码的复用和劳动成本的减少

 分层的根本在于代码的复用和劳动成本的减少。分层的最理想化的结果是实现层与层之间的互不依赖的内部实现,所谓的即插即用!

 

当然啦,三层架构也是有一定的缺点,但是总的来说,利大于弊。

 

那么下面写一个小项目来具体地深入了解一下三层架构

 

项目目录如下:

 

表示层Model:

package com.gpnu.book.entity;

public class Books {
	@Override
	public String toString() {
		return "Books [book_id=" + book_id + ", book_name=" + book_name + ", isbn=" + isbn + ", author=" + author + "]";
	}
	public Books() {
	}
	public Books(int book_id, String book_name, String isbn, String author) {
		super();
		this.book_id = book_id;
		this.book_name = book_name;
		this.isbn = isbn;
		this.author = author;
	}
	private int book_id;
	private String book_name;
	private String isbn;
	private String author;
	public int getBook_id() {
		return book_id;
	}
	public void setBook_id(int book_id) {
		this.book_id = book_id;
	}
	public String getBook_name() {
		return book_name;
	}
	public void setBook_name(String book_name) {
		this.book_name = book_name;
	}
	public String getIsbn() {
		return isbn;
	}
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
}

 

表示层Controller:

BooksServlet.java

package com.gpnu.book.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
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 com.gpnu.book.entity.Books;
import com.gpnu.book.service.BooksService;
import com.gpnu.book.service.impl.BooksServiceImpl;

/**
 * Servlet implementation class Books
 */
@WebServlet("/BooksServlet")
public class BooksServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	BooksService booksService = BooksServiceImpl.getInstance();
    /**
     * @see HttpServlet#HttpServlet()
     */
    public BooksServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String action = request.getParameter("action");
		System.out.println("action:" + action);
		if (action.equals("add")) {
			doAddBooks(request, response);
			response.sendRedirect("index.jsp");
		}else if (action.equals("select")) {
			response.sendRedirect(request.getContextPath() + "/Books/selBooks.jsp");
		}else if (action.equals("remove")) {
			doDelBooks(request, response);
			response.sendRedirect("SelBooksServlet");
		}
	}
	
	
	private void doAddBooks(HttpServletRequest request, HttpServletResponse response) throws IOException {
		Books book = new Books();
		//book.setBook_id(Integer.parseInt(request.getParameter("book_id")));
		book.setBook_name(request.getParameter("book_name"));
		book.setIsbn(request.getParameter("isbn"));
		book.setAuthor(request.getParameter("author"));
		int result = booksService.addBooks(book);
		if (result > 0)
			System.out.println("添加book成功");
		else
			System.out.println("添加book失败");
	}
	
	private void doDelBooks(HttpServletRequest request, HttpServletResponse response) throws IOException {
		int id = Integer.parseInt(request.getParameter("id"));
		int result = booksService.delBooks(id);
		if (result > 0)
			System.out.println("删除book成功");
		else
			System.out.println("删除book失败");

	}
}

 

SelBooksServlet.java

package com.gpnu.book.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
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 com.gpnu.book.entity.Books;
import com.gpnu.book.service.BooksService;
import com.gpnu.book.service.impl.BooksServiceImpl;

/**
 * Servlet implementation class SelBooksServlet
 */
@WebServlet("/SelBooksServlet")
public class SelBooksServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	BooksService booksService = BooksServiceImpl.getInstance();
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SelBooksServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	private static String keyword = "";
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		keyword = request.getParameter("keyword");
		System.out.println("keyword:" + keyword);
		if (keyword == "")
			doSelAllBooks(request, response);
		else
			doSelBooks(request, response);
	}

	private void doSelAllBooks(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		List<Books> list = booksService.selAllBooks();
		request.setAttribute("books", list);
		System.out.println("查询所有");
		RequestDispatcher view = request.getRequestDispatcher("/Books/selResult.jsp");
		view.forward(request, response);
	}  
 
	private void doSelBooks(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		Books book = booksService.selBooks(keyword);
		List list = new ArrayList();
		list.add(book);
		request.setAttribute("books", list);
		System.out.println("条件查询");
		RequestDispatcher view = request.getRequestDispatcher("/Books/selResult.jsp");
		view.forward(request, response);
	}
	
}

 

表示层View:

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="Books/addBooks.jsp">添加</a>
<a href="BooksServlet?action=select">查询</a>
</body>
</html>

addBooks.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/book/BooksServlet?action=add" method="post">
<table border="1" cellspacing="0" cellpadding="0" style="align:center;">
    <tr><td>图书名称:</td><td><input type="text" name="book_name"></td></tr>
    <tr><td>国际标准书号:</td><td><input type="text" name="isbn"></td></tr>
    <tr><td>作者:</td><td><input type="text" name="author"></td></tr>
    <tr><td><input type="submit" value="提交"></td><td><input type="button" value="返回"></td>
 	</tr>
 </table>
 </form>
</body>
</html>

selBooks.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/book/SelBooksServlet" method="post">
<input type="text" name="keyword"><input type="submit" value="查询">
</form>
</body>
</html>

selResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.gpnu.book.entity.Books,java.util.List" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="Books/addBooks.jsp">新增</a>
<br>
<table border="1" cellspacing="0" cellpadding="0" style="align:center;">
    <tr bgcolor="ff9900" style="font-weight:bold;">
    <th>图书编号</th><th>图书名称</th><th>国际标准号</th><th>作者</th></tr>
<%
	List<Books> book = (List)request.getAttribute("books");
	if(book.size()!=0){
    	for(int i=0;i<book.size();i++) {
       		pageContext.setAttribute("book",book.get(i)); 
%>  
	<tr>
      <td>${book.book_id }</td>    
      <td>${book.book_name }</td>
      <td>${book.isbn }</td>
      <td>${book.author }</td>
      <td>|<a href="BooksServlet?action=remove&id=${book.book_id }" onclick='return confirm("确定要删除吗?")'
          >删除</a></td>
   </tr> 
     <%
      }
    }else{
     %>
<tr><td colspan="6">数据库中没有数据!</td></tr>
    <%
    }
    %>
</table>
</body>
</html>

 

持久层接口:

package com.gpnu.book.dao;

import java.util.List;

import com.gpnu.book.entity.Books;

public interface BooksDao {
	List<Books> selAllBooks();
	Books selBooks(String keyword);
	int addBooks(Books book);
	int delBooks(int book_id);
	int booksCount();
}

 

持久层实现类:

package com.gpnu.book.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.gpnu.book.dao.BooksDao;
import com.gpnu.book.entity.Books;
import com.gpnu.book.common.DBUtils;

public class BooksDaoImpl implements BooksDao {

	private Connection conn;
	
	public BooksDaoImpl(Connection conn) {
		this.conn = conn;
	}
	
	@Override
	public List<Books> selAllBooks() {
		List list = new ArrayList();
		PreparedStatement pstam = null;
		ResultSet rs = null;
		Books book = null;		try {
			pstam = conn.prepareStatement("select * from tbl_book");
			rs = pstam.executeQuery();
			while (rs.next()) {
				book = new Books();
				book.setBook_id(rs.getInt("book_id"));
				book.setBook_name(rs.getString("book_name"));
				book.setIsbn(rs.getString("isbn"));
				book.setAuthor(rs.getString("author"));
				list.add(book);
			}
		} catch (SQLException e) {
			System.out.println("在查询全部book的时候出错了.错误信息是 :" + e.getMessage());
		} finally {
			DBUtils.closeStatement(rs, pstam);
		}
		return list;
	}

	@Override
	public int booksCount() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Books selBooks(String keyword) {
		Books book = new Books();
		PreparedStatement pStatement = null;
		ResultSet rSet = null;
		try {
			pStatement = conn.prepareStatement("select * from tbl_book where book_name like ?");
			pStatement.setString(1, "%" + keyword + "%");
			rSet = pStatement.executeQuery();
			if (rSet.next()) {
				book.setBook_id(rSet.getInt("book_id"));
				book.setBook_name(rSet.getString("book_name"));	
				book.setIsbn(rSet.getString("isbn"));
				book.setAuthor(rSet.getString("author"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtils.closeStatement(rSet, pStatement);
		}
		return book;
	}

	@Override
	public int addBooks(Books book) {
		int result = 0;
		PreparedStatement pstam = null;
		try {
			pstam = conn.prepareStatement("insert into tbl_book(book_name,isbn,author) values(?,?,?)");
			//pstam.setInt(1, book.getBook_id());
			pstam.setString(1, book.getBook_name());
			pstam.setString(2, book.getIsbn());
			pstam.setString(3, book.getAuthor());
			result = pstam.executeUpdate();
		} catch (SQLException e) {
			System.out.println("添加book出错.错误信息是 :" + e.getMessage());
		} finally {
			DBUtils.closeStatement(null, pstam);
		}
		return result;
	}

	@Override
	public int delBooks(int book_id) {
		int result = 0;
		PreparedStatement pstam = null;
		try {
			pstam = conn.prepareStatement("DELETE FROM tbl_book WHERE book_id =?");
			pstam.setInt(1, book_id);
			result = pstam.executeUpdate();
		} catch (SQLException e) {
			System.out.println("删除book出错.错误信息是 :" + e.getMessage());
		} finally {
			DBUtils.closeStatement(null, pstam);
		}
		return result;
	}

}

 

业务逻辑层接口:

package com.gpnu.book.service;

import java.util.List;

import com.gpnu.book.entity.Books;

public interface BooksService {
	List<Books> selAllBooks();
	Books selBooks(String keyword);
	int addBooks(Books book);
	int delBooks(int book_id);
}

 

业务逻辑层实现类

package com.gpnu.book.service.impl;

import java.sql.Connection;
import java.util.List;

import com.gpnu.book.entity.Books;
import com.gpnu.book.service.BooksService;
import com.gpnu.book.common.DBUtils;
import com.gpnu.book.dao.BooksDao;
import com.gpnu.book.dao.impl.BooksDaoImpl;

public class BooksServiceImpl implements BooksService {

	private static final BooksService instance = new BooksServiceImpl();
	public static BooksService getInstance() {
		return instance;
	}
	
	@Override
	public List<Books> selAllBooks() {
		Connection conn = null;
		List list = null;
		try {
			conn = DBUtils.getConnection();
			DBUtils.beginTransaction(conn);
			BooksDao booksDao = new BooksDaoImpl(conn);
			list = booksDao.selAllBooks();
			DBUtils.commit(conn);
		} catch (Exception e) {
			System.out.println("查询所有books错误" + e.getMessage());
		} finally {
			DBUtils.closeConnection(conn);
		}
		return list;
	}

	@Override
	public Books selBooks(String keyword) {
		Connection conn = null;
		Books book = null;
		try {
			conn = DBUtils.getConnection();
			DBUtils.beginTransaction(conn);
			BooksDao booksDao = new BooksDaoImpl(conn);
			book = booksDao.selBooks(keyword);
			DBUtils.commit(conn);
		} catch (Exception e) {
			System.out.println("条件查询books错误" + e.getMessage());
		} finally {
			DBUtils.closeConnection(conn);
		}
		return book;
	}

	@Override
	public int addBooks(Books book) {
		Connection conn = null;
		int result = 0;
		try {
			conn = DBUtils.getConnection();
			DBUtils.beginTransaction(conn);
			BooksDao booksDao = new BooksDaoImpl(conn);
			result = booksDao.addBooks(book);
			DBUtils.commit(conn);
		} catch (Exception e) {
			System.out.println("增加books错误" + e.getMessage());
		} finally {
			DBUtils.closeConnection(conn);
		}
		return result;
	}

	@Override
	public int delBooks(int book_id) {
		Connection conn = null;
		int result = 0;
		try {
			conn = DBUtils.getConnection();
			DBUtils.beginTransaction(conn);
			BooksDao booksDao = new BooksDaoImpl(conn);
			result = booksDao.delBooks(book_id);
			DBUtils.commit(conn);
		} catch (Exception e) {
			System.out.println("删除books错误" + e.getMessage());
		} finally {			DBUtils.closeConnection(conn);
		}
		return result;
	}

}

 

我们启动一下项目,我们作为用户直接看到的就是表示层的视图了

 

而当我们点击查询,会跳转到查询的视图

 

点击查询,我们会跳转到表示层的控制器,也就是Servlet,此时Servle会调用业务逻辑层的方法

 

而业务逻辑层则会调用持久层(DAO层)的方法

 

最后持久层连接到数据库,读取数据库的数据,保存为一个Model类

 

将结果原路返回给表示层的视图View

 

整个运行过程可以浓缩为一张图:

 

 

 

WEB开发三层架构概述
Lucker's PowerSpace
12-06 8644
关于 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。 1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,
java三层架构是哪三层_Java web 中的 三层架构 (建议收藏)
weixin_39976413的博客
12-02 5813
可能软件开发中很多地方都会用到三层结构,不过由于我首先是在Java web中接触到的三层结构,那么我就结合Java web 的注册登录系统为实例,好好讲讲三层结构。感觉三层架构弄明白了MVC也就触类旁通了。一、什么是三层架构三层架构就是把整个软件系统分为三个层次表现层(Presentation layer)业务逻辑层(Business Logic Layer)数据访问层(Data access l...
JavaWeb-分层解耦【三层架构、IOC、DI】
最新发布
MMF博客园
01-04 857
JavaWeb-分层解耦【三层架构、IOC、DI】
Web三层架构
02-24
Web三层架构
Web开发之三层架构
yifei_345678的博客
04-09 7858
点击进入,标题虽简,内容丰富💖💖
Web 三层架构概述
悠悠炜少
08-19 4314
web三层架构概述
JavaWeb三层架构的配置详解
08-10
JavaWeb三层架构的配置详解
JavaWeb三层架构和五层架构介绍
01-07
开发业务应用角度对程序的划分,其分层逻辑来源于“高内聚低耦合”的思想,在开发中针对这种有三层架构和五层架构
JavaWeb三层架构案例 信息管理系统 ThreeTireSample
05-15
Java Web 三层架构案例 信息管理系统.其实有了这个案例,信息管理系统基本就没问题了,大家可以按照自己的需求增加实体类的属性。
javaweb三层架构源代码
08-29
实现Java的MVC三层架构, servlet是控制层 View是界面层 Model是模型层
web三层架构体系 web架构
11-14
三层架构即―表现层‖,―业务层‖,―持久化层‖。表现层实现的代表作品是Struts框架,业务层实现的代表作品是Spring,持久层实现的代表作品是Hibernate。
javaweb三层架构实现用户登录实例.rar
08-15
javaweb三层架构实现用户登录实例.rar
javaweb三层架构程序实例步骤详解.rar
01-04
Javaweb三层架构程序实例步骤详解,主要讲的 1.实例创建步骤 2.具体代码 3.运行结果 对于初学者有一定的帮助。
javaweb三层架构
06-20
javaweb三层架构
web三层架构
weixin_67150631的博客
04-10 7467
三层架构,架构的使用,三层架构的演示
Web三层框架
m0_67331668的博客
04-12 1327
什么是三层? 表示层 :主要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据 业务逻辑层 :表示层和数据库访问层之间的桥梁,实现业务逻辑,具体包含:验证、计算、业务规则等等 数据访问层 :与数据库打交道,主要实现对数据的增、删、改、查 三层架构的理解 单体数据 new NewsDao().queryAll(); 多个表的数据 1.多表查询语句 2.从dao里面取出连个表的数据 拿数据:仓库...
Web开发三层架构
weixin_30485379的博客
03-26 892
web开发三层架构:表现层,业务逻辑层,数据访问层 (系统的处理逻辑图) 表现层UI:表层所见,负责展现页面外观和人机交互接口 业务逻辑层BLL:系统实现的功能,包含接受数据,封装数据,处理数据等操作。最外围层需要相应的JSP页面负责接收用户提交的数据,并调用业务逻辑层方法完成业务逻辑操作。JavaBean类中封装了数据。 数据访问层DAL:与数据库交互,位于dao和dao.imp包中...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Uncaught ReferenceError: Vue is not defined-解决方案 70166
  • JavaWeb三层架构详解 54036
  • Eclipse如何修改默认工作空间路径 46837
  • Python初始化列表 32090
  • Java中compareTo()方法详解 26512

分类专栏

  • go-zero 1篇
  • 计算机网络 1篇
  • PHP 20篇
  • elasticsearch 1篇
  • mac 2篇
  • Redis 1篇
  • SpringCloud 2篇
  • jQuery 3篇
  • 基础训练 8篇
  • Java常用类总结 1篇
  • JavaWeb 11篇
  • SQL 14篇
  • Java 8篇
  • Java基础 5篇
  • JavaScript 1篇
  • Springboot 8篇
  • jQuery 3篇
  • git 3篇
  • Maven 1篇
  • J2EE 3篇
  • SSM 3篇
  • linux 8篇
  • VUE 1篇
  • Gradle 1篇
  • Python 6篇

最新评论

  • 原码、补码、反码的关系

    qq_38636379: 你好,我想问一下那个[10000000]补,怎么算出来是[00000000]原的了?

  • Git reset 和 revert的区别

    shangbobozaizai: 想问reset之后,需要rebase一下当前分支代码吧

  • Laravel实现文件(图片)上传

    TAT245: 导入WebUploader的语句放哪个文件呢

  • Springboot搭建文件服务器

    乂十一: 这是全部代码?

  • 原码、补码、反码的关系

    萧彩姬: 图片消失了一张表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Go-zero从入门到精通(一)
  • Error: node: unknown or unsupported macOS version: :dunno 错误解决
  • TCP 的粘包和拆包以及解决方案
2023年4篇
2022年12篇
2021年14篇
2020年22篇
2019年47篇
2018年42篇

目录

目录

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

哆哆女性网网易算命网餐饮店一般用什么收银系统慷慨淋漓的意思新材料 起名我的邻居民是exo第三集画册设计 网站zjgrc梦到撒网捕鱼周公解梦约翰纳什姓阚起名字免费起名称的网站网站制作哪儿好薇网名 起名网福州网站设计哪家好西班牙人队周易预测吉凶有寓意的科技公司起名设计师必上去的网站风雨中作文澳洲本土购物网站建设网站建设培训哪家好饭店起名叫什么小酒馆窦氏起名周公解梦,梦见蟒蛇用心做事云南卫视直播殳俏网站怎样优化推广周易生辰八字起名打分集结号下载淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化