TODAY WEB 是一个轻量级 Web 框架
<dependency> <groupId>cn.taketoday</groupId> <artifactId>today-web</artifactId> <version>2.3.6.RELEASE</version> </dependency>
通过
@Controller
@RestController
配置控制器
//@Controller @RestController @RequestMapping("/users") public class IndexController { }
配置请求
@GET("index") @POST("post") @PUT("articles/{id}") ...... @RequestMapping("/users/{id}") @RequestMapping(value = "/users/**", method = {RequestMethod.GET}) @RequestMapping(value = "/users/*.html", method = {RequestMethod.GET}) @RequestMapping(value = {"/index.action", "/index.do", "/index"}, method = RequestMethod.GET) @Interceptor({LoginInterceptor.class, ...}) public (String|List<?>|Set<?>|Map<?>|void|File|Image|...) \\w+ (request, request, session,servletContext, str, int, long , byte, short, boolean, @Session("loginUser"), @Header("User-Agent"), @Cookie("JSESSIONID"), @PathVariable("id"), @RequestBody("users"), @Multipart("uploadFiles") MultipartFile[]) { service... return </>; }
自定义参数转换器
@ParameterConverter public class DateConverter implements Converter<String, Date> { @Override public Date doConvert(String source) throws ConversionException { ... } }
也可以通过xml文件配置简单视图,静态资源,自定义视图解析器,文件上传解析器,异常处理器,参数解析器
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Web-Configuration PUBLIC "-//TODAY BLOG//Web - Configuration DTD 2.0//CN" "https://taketoday.cn/framework/web/dtd/web-configuration-2.3.3.dtd"> <Web-Configuration> <controller prefix="/error/"> <action resource="400" name="BadRequest" status="400" /> <action resource="403" name="Forbidden" status="403" /> <action resource="404" name="NotFound" status="404" /> <action resource="500" name="ServerIsBusy" status="500" /> <action resource="405" name="MethodNotAllowed" status="405" /> </controller> <controller> <action resource="redirect:http://pipe.b3log.org/blogs/Today" name="today-blog-pipe" /> <action resource="redirect:https://taketoday.cn" name="today" /> <action resource="redirect:https://github.com" name="github" /> <action resource="redirect:/login" name="login.do" /> </controller> <controller class="cn.taketoday.web.demo.controller.XMLController" name="xmlController" prefix="/xml/"> <action name="obj" method="obj" /> <action name="test" resource="test" method="test"/> </controller> </Web-Configuration>
登录实例
@Controller public class UserController { /* <controller prefix="/WEB-INF/view/" suffix=".ftl"> <action resource="login" name="login" /> <action resource="register" name="register" /> </controller> */ // @GET("login") @RequestMapping(value = "/login" , method = RequestMethod.GET) public String login() { return "/login/login";//支持jsp,FreeMarker,Thymeleaf,自定义视图 } @Logger("登录") //@POST("/login") //@RequestMapping(value = "/login" , method = RequestMethod.POST) @ActionMapping(value = "/login", method = RequestMethod.POST) public String login(HttpSession session, RedirectModel redirectModel, @Valid User user, Errors error) { if (error.hasErrors()) { System.err.println(error.getAllErrors()); redirectModel.attribute("msg", error.getAllErrors().toString()); return "redirect:/login"; } User login = userService.login(user); if (login == null) { redirectModel.attribute("userId", user.getUserId()); redirectModel.attribute("msg", "登录失败"); return "redirect:/login"; } redirectModel.attribute("msg", "登录成功"); session.setAttribute(USER_INFO, login); return "redirect:/user/info"; } }
文件下载,支持直接返回给浏览器图片
@RequestMapping(value = {"/download"}, method = RequestMethod.GET) public File download(String path) { return new File(path); }
@GET("/display") public final BufferedImage display(HttpServletResponse response) throws IOException { response.setContentType("image/jpeg"); return ImageIO.read(new File("D:/taketoday.cn/webapps/upload/logo.png")); } @GET("captcha") public final BufferedImage captcha(HttpServletRequest request) throws IOException { BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics graphics = image.getGraphics(); graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT); Graphics2D graphics2d = (Graphics2D) graphics; drawRandomNum(graphics2d, request); return image; }
文件上传,支持多文件
@RequestMapping(value = { "/upload" }, method = RequestMethod.POST) public final String upload(@Multipart MultipartFile uploadFile) throws IOException { String upload = "D:/www.yhj.com/webapps/upload/"; String path = upload + uploadFile.getFileName(); File file = new File(path); uploadFile.save(file); return "/upload/" + uploadFile.getFileName(); } @POST({"/upload/multi"}) public final String multiUpload(HttpServletResponse response, @Multipart MultipartFile[] files) throws IOException { String upload = "D:/www.yhj.com/webapps/upload/"; for (MultipartFile multipartFile : files) { String path = upload + multipartFile.getFileName(); File file = new File(path); System.out.println(path); if (!multipartFile.save(file)) { return "<script>alert('upload error !')</script>"; //response.getWriter().print("<script>alert('upload error !')</script>"); } } //response.getWriter().print("<script>alert('upload success !')</script>"); return "<script>alert('upload success !')</script>"; }
建议使用vue2版本 安装 1.安装 npm install web3 2.引入 import Web3 from 'web3'(VUE2) import Web3 from 'web3/dist/web3.min.js' (VUE3) 3.实列化 const web3 = new Web3(Web3.givenProvider) 提示:如果合约是部署某个链上的 则实列化时改成 如下,或者问写合约
本文向大家介绍轻量级的Web框架Flask 中模块化应用的实现,包括了轻量级的Web框架Flask 中模块化应用的实现的使用技巧和注意事项,需要的朋友参考一下 Flask是一个轻量级的Web框架。虽然是轻量级的,但是对于组件一个大型的、模块化应用也是能够实现的,“蓝图”就是这样一种实现。对于模块化应用的实现,在Flask 0.2版本中进行了设计。本文暂时不对“蓝图”做详细的介绍,而是先从0.2版本
本文向大家介绍轻量级javascript 框架Backbone使用指南,包括了轻量级javascript 框架Backbone使用指南的使用技巧和注意事项,需要的朋友参考一下 Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用。 借助Backbone 我们可以使用REST的方式来最小化客户端和服务器间的数据传输,
本文向大家介绍前端轻量级MVC框架CanJS详解,包括了前端轻量级MVC框架CanJS详解的使用技巧和注意事项,需要的朋友参考一下 选择正确的库 创建一个JS APP没有好的工具是很有难度的,jQuery只是操作DOM的库,没有提供任何创建APP的基础,这就是为什么我们要一个类似CanJS的专门的库。 CanJS 是一个轻量级的MVC库,提供你创建一个JS APP所需的工具。 CanJS 是一个轻
问题内容: 是否有一个提供发布/订阅模式的Java轻量级框架? 一些理想的功能 支持泛型 向发布者注册多个订阅者 API主要是接口和一些有用的实现 完全不需要内存,持久性和事务保证。 我了解JMS,但这对我来说太过分了。发布/订阅的数据是文件系统扫描的结果,扫描结果被馈送到另一个组件进行处理,然后在将其馈给另一个组件之前进行处理,依此类推。 编辑:所有在同一过程中。bean的PropertyCha
本文向大家介绍浅谈Android轻量级的数据缓存框架RxCache,包括了浅谈Android轻量级的数据缓存框架RxCache的使用技巧和注意事项,需要的朋友参考一下 请求网络数据是在安卓开发中使用最频繁的一个功能,网络请求的体验决定了用户对整个APP的感觉,因此合理地使用缓存对网络请求的数据进行处理极为重要。合理的进行缓存和网络请求,可以为APP带来更优秀的体验。图片的缓存有Picasso、Gl
问题内容: 我一直在使用jQuery在基于Web的应用程序中完成整个AJAX魔术。但是,我来到了一个决定,我并不需要所有这些神奇功能jQuery有,除了它的AJAX功能(例如,,,和)。 您能推荐轻量级的跨浏览器AJAX库/框架(最大10 kb)吗? 问题答案: 您可以通过删除不需要的模块来缩小jQuery的大小,只需修改Makefile文件即可。
本文向大家介绍详解Spring Batch 轻量级批处理框架实践,包括了详解Spring Batch 轻量级批处理框架实践的使用技巧和注意事项,需要的朋友参考一下 实践内容 从 MariaDB 一张表内读 10 万条记录,经处理后写到 MongoDB 。 具体实现 1、新建 Spring Boot 应用,依赖如下: 2、创建一张表,并生成 10 万条数据 3、创建 Person 类 4、创建一个中
主要内容:使用普通函数创建 goroutine,使用匿名函数创建goroutine在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任务频繁地在线程间切换执行而损失效率。 虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,线程池就不是非常直观和方便了。能否