1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/I-TAKE-TODAY-today-web

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

TODAY Web

🍎 Библиотека Java для создания веб-приложений

Java8 GPLv3 Author Codacy Badge Java CI

Предыстория

Не смотреть сейчас

С 2016 года, когда я был в старшей школе, я начал изучать Java. Точнее, это началось в последние несколько недель перед окончанием школы. Интерес — лучший учитель, и я продолжал писать свой личный сайт: TODAY BLOG, самостоятельно с первого курса до последнего курса. От регистрации домена до успешной публикации сайта я столкнулся с бесчисленными трудностями. Но я упорствовал, потому что мне было интересно. Я использовал чистый Servlet для первой версии. После этого я узнал о множестве открытых фреймворков на Java, которые могли бы упростить мою разработку. И я снова погрузился в новое обучение... После изучения Struts2 я написал небольшой фреймворк: TODAY Web 1.0, который может анализировать XML-определённые действия и обрабатывать соответствующие запросы. После изучения Spring MVC я написал этот проект: TODAY Web 2.0.

Установка

<dependency>
    <groupId>cn.taketoday</groupId>
    <artifactId>today-web</artifactId>
    <version>3.0.2.RELEASE</version>
</dependency>

Пример использования

Документация

Использование

Функциональный маршрутизатор

@Component
@ResponseBody
public class FunctionController {

    public String function(RequestContext request) {
        return "body:" + request.method() + " requestURI -> " + request.requestURI();
    }

    public String test(RequestContext request) {
        return "body:" + request.method() + " test -> " + request.requestURI();
    }

    public void script(RequestContext request) throws IOException {

        ModelAndView modelAndView = new ModelAndView();
        request.modelAndView(modelAndView);

        modelAndView.setContentType("text/html;charset=UTF-8");
        modelAndView.setView(new StringBuilder("<script>alert('HELLO, 你好 script');</script>"));
    }
}

@Configuration
//@EnableDefaultMybatis
//@EnableRedissonCaching
public class WebMvcConfig implements WebMvcConfiguration {

    @Autowired
    private FunctionController functionController;

    @Override
    public void configureFunctionHandler(FunctionHandlerRegistry registry) {

        registry.get("/function", functionController::function);
        registry.get("/function/test", functionController::test);
        registry.get("/function/script", functionController::script);

        registry.get("/function/error/500", (context) -> {
            context.sendError(500);
        });
    }
}

Маршрутизация с использованием аннотаций

//@Controller
@RestController
@RequestMapping("/users")
public class UserController {
    

    @GET("index")
    @POST("post")
    @PUT("articles/{id}")
    ......
    @RequestMapping("/users/{id}")
    @RequestMapping(value = "/**", method = {RequestMethod.GET})
    @RequestMapping(value = "/*.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 </>;
    }
}

ViewController

@Configuration
public class WebMvcConfig implements WebMvcConfiguration {

    @Override
    public void configureViewController(ViewControllerHandlerRegistry registry) {
        registry.addViewController("/github", "redirect:https://github.com");

``` ### Также можно через XML-файл настроить простые представления

```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.7.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;
}

### Файл загружен, поддерживается загрузка нескольких файлов

```java
@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('Ошибка загрузки !')</script>";
            //response.getWriter().print("<script>alert('upload error !')</script>");
        }
    }
    //response.getWriter().print("<script>alert('Успешная загрузка !')</script>");
    return "<script>alert('Успешная загрузка !')</script>";
}
## 🙏 Спасибо
Этот проект не мог бы появиться без следующих проектов с открытым исходным кодом:
* [Freemarker](https://github.com/apache/freemarker): Apache Freemarker
* [Slf4j](https://github.com/qos-ch/slf4j): Simple Logging Facade for Java
* [Spring](https://github.com/spring-projects/spring-framework): Spring Framework
* [EL](https://github.com/TAKETODAY/today-expression): Java Unified Expression Language
* [FastJSON](https://github.com/alibaba/fastjson): A fast JSON parser/generator for Java
* [Lombok](https://github.com/rzwitserloot/lombok): Very spicy additions to the Java programming language
* [Today Context](https://github.com/TAKETODAY/today-context): A Java library for dependency injection and aspect oriented programing
* [Hibernate Validator](https://github.com/hibernate/hibernate-validator): Hibernate Validator - Bean Validation 2.0 (JSR 380) Reference Implementation

## 📄 Лицензия с открытым исходным кодом
Пожалуйста, ознакомьтесь с [GNU GENERAL PUBLIC LICENSE](https://github.com/TAKETODAY/today-web/blob/master/LICENSE).

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека Java для создания веб-приложений. Развернуть Свернуть
GPL-3.0
Отмена

Обновления (2)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/I-TAKE-TODAY-today-web.git
git@api.gitlife.ru:oschina-mirror/I-TAKE-TODAY-today-web.git
oschina-mirror
I-TAKE-TODAY-today-web
I-TAKE-TODAY-today-web
master