TODAY WEB 是一个轻量级 Web 框架
<dependency> <groupId>cn.taketoday</groupId> <artifactId>today-web</artifactId> <version>2.3.6.RELEASE</version> </dependency>
通过 @Controller @RestController 配置控制器
@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>"; }