doodle是一个简易的 Java MVC 框架,它提供了类似于spring 的Bean容器、IOC、AOP、MVC等功能。
代码简洁、轻量,适合用于参考学习spring。
DispatcherServlet
请求逻辑处理采用责任链模式,方便增加修改规则。doodle暂时功能没有完善,在使用过程中有一些约束条件
@Component
只应用于类,应用于接口或抽象类将无效Controller
被@RequestMapping
标注的方法,其参数必须必须被@RequestParam
注解,且参数必须是java的基本数据类型或者基本数据的包装类(如int,Integer等)git clone https://github.com/zzzzbw/doodle.git
或直接下载代码到本地
将项目导入到IDE中,这是maven工程,确保你已经安装maven
执行doodle-example/src/main/java
下的github.zzzzbw.App
类的main()
方法即可启动Tomcat服务器。
浏览器访问http://localhost:9090/user/list
和http://localhost:9090/user/detail?id=1
链接
通过'Postman'等工具用post
方式请求到链接http://localhost:9090/user/add?name=zzzzbw
和http://localhost:9090/user/delete?id=1
修改数据
创建一个 maven 项目,引入核心依赖。
<dependency> <groupId>com.github.zzzzbw</groupId> <artifactId>doodle-core</artifactId> <version>0.1</version> </dependency>
启动类:
public class App { public static void main(String[] args) { Doodle.run(App.class, 9090); } }
使用方式与spring基本一致,不过只支持类型注入,即如果被注入对象为类,则注入其实例,如果被注入对象为接口,则注入其实现类。
@Component public class EmailComponent { // do something }
为UserController
注入EmailComponent
@Controller public class UserController { @Autowired private EmailComponent emailComponent; // do something }
MethodBeforeAdvice
,AfterReturningAdvice
,ThrowsAdvice
,AroundAdvice
中的一个或者多个接口@Aspect
注解,且有正确的aspectj切点表达式@Order
注解来决定增强处理类的先后顺序@Order(1) @Aspect(pointcut = "@within(Controller)") public class Aspect1 implements AroundAdvice { @Override public void afterReturning(Class<?> clz, Object returnValue, Method method, Object[] args) throws Throwable { // do something } @Override public void before(Class<?> clz, Method method, Object[] args) throws Throwable { // do something } @Override public void afterThrowing(Class<?> clz, Method method, Object[] args, Throwable e) { // do something } }
@Order(2) @Aspect(pointcut = "@within(Controller)") public class Aspect2 implements AroundAdvice { @Override public void afterReturning(Class<?> clz, Object returnValue, Method method, Object[] args) throws Throwable { // do something } @Override public void before(Class<?> clz, Method method, Object[] args) throws Throwable { // do something } @Override public void afterThrowing(Class<?> clz, Method method, Object[] args, Throwable e) { // do something } }
上面两个增强处理类Aspect1
和Aspect2
,会增强被@Controller
注解的类下的方法,且顺序为:
Aspect1@before()->Aspect2@before()->method.invoke()->Aspect2@afterReturning()->Aspect1@afterReturning()。
使用几乎与spring一致
返回String类型的则返回jsp页面的路径,返回ModelAndView则在其view中设置jsp页面路径,同时可以传一些参数给jsp页面。
被@ResponseBody
注解的则返回的是json格式数据。
@Controller @RequestMapping(value = "/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/list", method = RequestMethod.GET) public ModelAndView getUserList() { List<User> list = userService.getUser(); return new ModelAndView().setView("user_list.jsp").addObject("list", list); } @RequestMapping(value = "/detail", method = RequestMethod.GET) public ModelAndView getUser(@RequestParam(value = "id") long id) { User user = userService.getUserById(id); return new ModelAndView().setView("user_detail.jsp").addObject("user", user); } @RequestMapping(value = "/add", method = RequestMethod.POST) @ResponseBody public Result<User> addUser(@RequestParam(value = "name") String name) { User user = userService.addUser(name); return new Result<>(user, 0, ""); } @RequestMapping(value = "/delete", method = RequestMethod.POST) @ResponseBody public Result<String> deleteUser(@RequestParam(value = "id") long id) { userService.deleteUser(id); return new Result<>("success", 0, ""); } }
本项目不仅参考了spring-boot,同时还参考了:
这些都是国人写的更轻量而且也很优秀的框架,相比spring-boot来说阅读源码的难度会小一些。感谢这些框架给我提供学习的思路,同时给我们更多的选择。
css-doodle CSS帮助我们以各种方式发挥创造力,今天,我们将把CSS创造力提升到一个新的水平。 我们将使用一个称为CSS Doodle的工具来创建一些很棒的重复模式。 CSS Doodle是一个Web组件,您可以像使用其他任何HTML标记(例如<css-doodle> )一样使用它。 我们将从基础知识开始,学习如何安装和使用它,然后我们将创建四个独特的模式。 查看视频教程,或向下滚动以阅
css-doodle 一、 入门 1. 安装 1.1. 直接下最新版本或直接从 CDN : <script src = "https://unpkg.com/css-doodle@0.19.2/css-doodle.min.js" ></script> <css-doodle > /* 把你的代码放在这里 */ </css-doodle> 1.2. npm 或者 yarn导入 yarn a
turing-doodle 是一款益智游戏,用来纪念 Alan Turing 的 100 岁生日。
从广义上讲,有web3j支持三种类型的以太坊交易: 1.以太币从一方交易到另一方 2.创建一个智能合约 3.与智能合约交易 为了进行这些交易,必须有以太币(以太坊区块链的代币)存在于交易发生的以太坊账户中。这是为了支付gas成本,这是为支付参与交易的以太坊客户端的交易执行成本,支付了这个成本就能将结果提交到以太坊区块链上。获得以太币的说明下文会说到。 此外,我们还可以查询智能合约的状态。
利用AudioToolbox实现一个简单的钢琴,可以奏出7个音阶的声音。 [Code4App.com]
PS:该教程以 Visual Studio 2015 为例 前提工作 首先配置好你的开发环境,建立一个Win32动态链接库项目 然后复制Dism++SDK(Dism++目录\Dism++SDK目录中的内容)到你的项目目录,并加入你的解决方案 接下来就应该编写插件配置文件了,详情可以参考本文档的 插件信息文件编写参考 在“空间回收”增加一个自定义的清理项目 然后你可以在cpp文件中根据加入如下代码(
实现可连续运算的简易计算器。 E.g.,3 4=display 7=display 11=display 15..... [Code4App.com]
实现一个简易记事本,可以添加、删除、保存日记。导入日记的动画也挺不错的。 [Code4App.com]