程序员圈有这么一句话:“不要重复造轮子” ,这句话也带来许多争议。
有的人认为这是一种“拿来主义”的傲慢体现,因为你不造自己的轮子,就会缺乏核心技术,由此将一直受限,创新力也大幅度下降,发展空间将会一直被“卡脖子”,从而陷入落后于率先造轮者的步伐;而也有一部分人认为这是一种卓越的工作方式,他们认为并非每个人都能原创出核心的技术,也并非每个程序员都能成为项目的架构师或技术大牛,不重复造轮,而是拿到一个框架,在上面进行二次开发然后拿来去用,学习过程中也提高了效率,这不是什么不屑一顾的事。
本周的主题并非是不鼓励自主创新,而是推崇自主创新,毕竟只有自主创新才能创造出属于自己的技术,才能提前避免一些风险,对抗现实世界的变化带来的动荡与不安,提高抗风险能力。“不要重复造轮子”并不是适用核心技术和空白领域,这方面还是鼓励与支持“造轮”一说。
只是时至今日,国内的软件行业已然不同于过往的空白期,为了在更快的时间内进步,我们需要快速学习造轮子的套路。换句话说, “站在巨人的肩膀上会让你事半功倍” 。如果你遇到问题,可以尝试这样一个角度:不要只想着自己从头搞定,先去看看有没有前人经验,看看是否有什么人在什么地方遇到过类似的问题,找到这个人,和对方建立联系获取相关信息,能够帮助你节约非常多的时间来做更重要的事情。
这其中学习新技术、新框架是十分重要一方面,另一方面就是不能只是简单地学习这些技术、框架是怎么用的,要知其然,还要知其所以然。如果想要开发一套稳定的,容易维护的系统,在使用“轮子”的时候,就需要对轮子有足够的了解。知道这个“轮子”适用于什么样的场景,有什么样的特点、优点,会有什么样缺点。这样才能做到扬长避短,更好地使用轮子。因此今天,我们以此为契机,给大家分享一些优秀的开源 Web 开发框架,在先行者的经验上,一同学习、进步。如果你对“不必重复造轮子”或者下列“ Web 开发框架”项目有更深入的见解,欢迎大家在评论中一同讨论
开源许可证: Apache-2.0
项目作者: JFinal
项目地址: https://gitee.com/jfinal/jfinal
推荐原因: JFinal 是一款基于 Java 语言的极速 WEB + ORM 框架,拥有 Java 语言优势的同时,拥有 Ruby、Python 等动态语言的开发效率。
主要编程语言: Java
项目示例:
1.控制器(支持 Enjoy、JSP、Velocity、JSON 等等以及自定义视图渲染)。
@Before(BlogInterceptor.class)
public class BlogController extends Controller {
@Inject
BlogService service;
public void index() {
set("blogPage", service.paginate(getParaToInt(0, 1), 10));
render("blog.html");
}
public void add() {
}
@Before(BlogValidator.class)
public void save() {
getModel(Blog.class).save();
redirect("/blog");
}
public void edit() {
set("blog", service.findById(getParaToInt()));
}
@Before(BlogValidator.class)
public void update() {
getModel(Blog.class).update();
redirect("/blog");
}
public void delete() {
service.deleteById(getParaToInt());
redirect("/blog");
}
}
2.Service所有业务与sql全部放在Service层。
public class BlogService {
private Blog dao = new Blog().dao();
public Page paginate(int pageNumber, int pageSize) {
return dao.paginate(pageNumber, pageSize, "select *", "from blog order by id asc");
}
public Blog findById(int id) {
return dao.findById(id);
}
public void deleteById(int id) {
dao.deleteById(id);
}
}
3.Model(无xml、无annotaion、无attribute)
public class Blog extends Model {
}
4.Validator(API引导式校验,比xml校验方便N倍,有代码检查不易出错)
public class BlogValidator extends Validator {
protected void validate(Controller controller) {
validateRequiredString("blog.title", "titleMsg", "请输入Blog标题!");
validateRequiredString("blog.content", "contentMsg", "请输入Blog内容!");
}
protected void handleError(Controller controller) {
controller.keepModel(Blog.class);
}
}
5.拦截器(在此demo中仅为示例,本demo不需要此拦截器)
public class BlogInterceptor implements Interceptor {
public void intercept(Invocation inv) {
System.out.println("Before invoking " + inv.getActionKey());
inv.invoke();
System.out.println("After invoking " + inv.getActionKey());
}
}
开源许可证: Apache-2.0
项目作者: 有理想的鱼
项目地址: https://gitee.com/suninformation/ymate-platform-v2
推荐原因: ymate-platform-v2 是一个简单、易用的轻量级 Java 应用开发框架
主要编程语言: Java
项目模块功能:
开源许可证: Apache-2.0
项目作者: HServer
项目地址: https://gitee.com/HServer/HServer
推荐原因: HServer 是一个开发灵活,轻量级,低入侵,高并发的新型 Web 开发框架。
主要编程语言: Java
项目原理及流程:
开源许可证: MIT
项目作者: an-tao
项目地址: https://gitee.com/an-tao/drogon
推荐原因: 基于 C++14/17 的跨平台、高性能 HTTP Web 应用框架
主要编程语言: C++
操作案例:
1.创建一个HttpSimpleController对象。
/// The TestCtrl.h file
#pragma once
#include
using namespace drogon;
class TestCtrl:public drogon::HttpSimpleController
{
public:
virtual void asyncHandleHttpRequest(const HttpRequestPtr& req, std::function &&callback) override;
PATH_LIST_BEGIN
PATH_ADD("/test",Get);
PATH_LIST_END
};
/// The TestCtrl.cc file
#include "TestCtrl.h"
void TestCtrl::asyncHandleHttpRequest(const HttpRequestPtr& req,
std::function &&callback)
{
//write your application logic here
auto resp = HttpResponse::newHttpResponse();
resp->setBody("Hello, world!
");
resp->setExpiredTime(0);
callback(resp);
}
2.代码都可以由 drogon_ctl
命令创建后这样创建控制器:
/// The header file
#pragma once
#include
using namespace drogon;
class JsonCtrl : public drogon::HttpSimpleController
{
public:
virtual void asyncHandleHttpRequest(const HttpRequestPtr &req, std::function &&callback) override;
PATH_LIST_BEGIN
//list path definitions here;
PATH_ADD("/json", Get);
PATH_LIST_END
};
/// The source file
#include "JsonCtrl.h"
void JsonCtrl::asyncHandleHttpRequest(const HttpRequestPtr &req,
std::function &&callback)
{
Json::Value ret;
ret["message"] = "Hello, World!";
auto resp = HttpResponse::newHttpJsonResponse(ret);
callback(resp);
}
3.通过 HttpController 类创建一个 RESTful API:
/// The header file
#pragma once
#include
using namespace drogon;
namespace api
{
namespace v1
{
class User : public drogon::HttpController
{
public:
METHOD_LIST_BEGIN
//use METHOD_ADD to add your custom processing function here;
METHOD_ADD(User::getInfo, "/{id}", Get); //path is /api/v1/User/{arg1}
METHOD_ADD(User::getDetailInfo, "/{id}/detailinfo", Get); //path is /api/v1/User/{arg1}/detailinfo
METHOD_ADD(User::newUser, "/{name}", Post); //path is /api/v1/User/{arg1}
METHOD_LIST_END
//your declaration of processing function maybe like this:
void getInfo(const HttpRequestPtr &req, std::function &&callback, int userId) const;
void getDetailInfo(const HttpRequestPtr &req, std::function &&callback, int userId) const;
void newUser(const HttpRequestPtr &req, std::function &&callback, std::string &&userName);
public:
User()
{
LOG_DEBUG << "User constructor!";
}
};
} // namespace v1
} // namespace api
项目作者: 寻根
项目地址: https://gitee.com/xungen/cppweb
推荐原因: cppweb 是基于 C++ 开发的 Web 服务器,支持 C/C++、Python、Java 等多语言混合开发 Web 应用。
主要编程语言: C++
项目功能展示: