基于servlet网站源码分享(servlet源代码)

很多朋友对于基于servlet网站源码分享和servlet源代码不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

前言

在上一篇终于实现了一门属于自己的编程语言介绍了自己写的编程语言GScript,在文中提到希望最终可以使用GScript开发一个网站。

到目前为止确实是做到了,首页地址:

https://gscript.crossoverjie.top/index

要称为一个网站确实有点勉强,不过也是一个动态网页,因为返回的是HTML,所以在当前阶段只要不嫌麻烦其实也能写一个“合格”的网站,有点像以前我们学习Java时的servlet。

该页面的源码地址在这里:https://github.com/crossoverjie/gscript-homepage

其实总共也就40来行代码:

classGScript{\nstringauthor;\nstring[]features;\nstringsince;\n\nGScript(stringa,string[]f,strings){\nauthor=a;\nfeatures=f;\nsince=s;\n}\n}\n\nfunc(HttpContext)index(HttpContextctx){\nstring[]features={&34;,&34;};\nGScriptgs=GScript(&34;,features,&34;);\nstringj=JSON(gs);\nprintln(j);\nstringlocal=getCurrentTime(&34;,&34;);\nprintln(&34;+local);\nstringhtml=^\n<html>\n<title>GScript</title>\n<pre>\n__\n____________|_|___||_\n|.|_-|_|_||.|_|\n|_|___|___|_||_|_|_|\n|___||_|v0.0.7\n\n^+j+^\n</pre>\n<h1>current^+local+^</h1>\n<p><ahref=&34;>GScript-homepacesourcecode</a></p>\n</html>\n^;\nctx.HTML(200,html);\n}\n\nhttpHandle(&34;,&34;,index);\nstring[]args=getOSArgs();\nif(len(args)==3){\nhttpRun(&34;+args[2]);\n}else{\nhttpRun(&34;);\n}\n

全是利用GScript所提供的标准库实现的,后文会详细聊聊内置HTTP包。

更新内容

下面重点来看看v0.0.8这个版本相较于上一个更新了哪些地方。

因为我是把自己当做一个开发者的角度去实现了一个http服务,同时还用GScript刷了两道简单的LeetCode;为了让这个过程更流畅,更符合一个现代语言的使用方式,所以本次真的更新不少东西。

刷题源码:https://github.com/crossoverJie/gscript/tree/main/example/leetcode

大概如下:

any类型的支持,简化标准库的实现。可以用^^来声明多行字符串,方便声明复杂字符串。更完善的类型推导,修复了上个版本中某些情况推导不出类型的bug。支持运算符重载。基本的http包,可以开发出http服务,目前能响应JSON以及HTML。新增内置函数:根据时区获取当前时间、获取应用启动参数等。JSON的序列表以及查询,语法级适配了XJSON。修复了在多个block嵌套情况下不能正确return的bug。

其实从这些更新中也能看出,上个版本只是一个简单能用的状态,而现在这个版本已经可以拿来写复杂逻辑了,当然目前还缺乏一些更友好的编译提示以及运行时错误。

下面仔细聊聊一些更新内容。

any类型

首先是any通用类型,这个类似于Java中的Object和Go中的interface{},极大的方便了我们编写一些标准库。

以之前内置的hash和len函数为例,需要对每种类型都实现一遍,非常麻烦而且毫无必要;现在只需要定义一次即可,代码量直接省几倍。

同理,之前实现的Map只支持存放string类型,现在便能存放任何类型的数据。

对any的实现过程感兴趣的朋友,今后可以单独分享一下。

运算符重载

写go或者是Java的朋友应该知道,这两门语言都无法对两个对象进行运算,编译器会直接报错。

但在一些特殊场景下还是蛮好用的,于是我参考了C34;p3.age=&34;abc&34;a&34;age&34;man&34;name&34;abc&34;weight&34;abc&34;age&34;age&34;abc&34;def&34;def&34;list&34;abc.def&34;def&34;list[0]&34;name&34;bob&34;age&34;skill&34;lang&34;go&34;feature&34;goroutine&34;channel&34;simple&34;skill.lang[0].go.feature[0]&34;goroutine&34;path=”+path);\nHttpContextctx=HttpContext();\nhandle(ctx);\n}\n//Runhttpserver.\nhttpRun(stringaddr){}\n

具体的使用流程:

通过定义一个函数变量实现自己的业务逻辑。注册路由。启动HTTP服务。

在自己的handle中可以通过HttpContext对象拿到请求上下文,可以获取请求参数以及响应数据。具体使用示例可以参考这份代码。

总结

本次更新比我预期的要顺利一些,因为语法树和编译器已经基本实现完毕,不会怎么改了,现在新增的特性无非就是运行时实现一些语法糖,大部分都是体力劳动;可能是新鲜感带来的兴奋剂效果,大部分时间都是痛并快乐着。

比如这两天主要就是在修复多层block嵌套时遇到return语句无法正确返回的bug,死活折腾了两夜;终于在无数次分析AST找到了解决方案,现在想想确实还是相关经验太少。

对这个Bug感兴趣的朋友可以点个赞,后面可以分享一下。

下一阶段重点就是将编译信息好好整理,让开发体验更好。之后抽空再把SQL标准库实现了,这样就能愉快的CURD了。

最后希望对该项目或者是编译原理感兴趣的朋友可以下载使用,提出宝贵意见,欢迎加我微信交流。

v0.0.8下载地址:https://github.com/crossoverJie/gscript/releases/tag/v0.0.8

如果你还想了解更多这方面的信息,记得收藏关注本站。

站内搜索