Программа и как Консоль и как GUI [дубликат]

Ниже приведен пример одного метода включения настраиваемого фильтра в приложение Spring Boot MVC. Не забудьте включить пакет в сканирование компонентов:

package com.dearheart.gtsc.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
public class XClacksOverhead implements Filter {

  public static final String X_CLACKS_OVERHEAD = "X-Clacks-Overhead";

  @Override
  public void doFilter(ServletRequest req, ServletResponse res,
      FilterChain chain) throws IOException, ServletException {

    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader(X_CLACKS_OVERHEAD, "GNU Terry Pratchett");
    chain.doFilter(req, res);
  }

  @Override
  public void destroy() {}

  @Override
  public void init(FilterConfig arg0) throws ServletException {}

}
24
задан HeartWare 27 October 2009 в 07:52
поделиться

4 ответа

В Windows это немного сложно. На самом деле различие между консольным приложением и приложением с графическим интерфейсом - это отдельный флаг в заголовке PE. Вы можете легко писать консольные приложения, которые создают окна, но таким образом у вас всегда есть окно консоли (хотя вы можете его скрыть, но это не будет хорошо, когда люди запускают вашу программу из cmd).

Вы можете, , однако, написать приложение с графическим интерфейсом, которое создает консоль при необходимости, используя функцию AllocConsole :

Процесс может быть связан только с одной консолью, поэтому функция AllocConsole завершается ошибкой, если вызывающий процесс уже имеет консоль. Процесс может использовать функцию FreeConsole , чтобы отсоединиться от своей текущей консоли, затем он может вызвать AllocConsole для создания новой консоли или AttachConsole для подключения к другой консоли.

Если вызывающий процесс создает дочерний процесс, дочерний процесс наследует новую консоль.

AllocConsole инициализирует стандартный ввод, стандартный вывод и стандартные дескрипторы ошибок для новой консоли. Стандартный дескриптор ввода - это дескриптор буфера ввода консоли, а стандартные дескрипторы вывода и стандартные ошибки - дескрипторы буфера экрана консоли. Чтобы получить эти дескрипторы, используйте функцию GetStdHandle .

Эта функция в основном используется приложением с графическим пользовательским интерфейсом для создания окна консоли. Приложения с графическим интерфейсом инициализируются без консоли. Консольные приложения инициализируются консолью, если они не созданы как отдельные процессы (путем вызова функции CreateProcess с флагом DETACHED_PROCESS).

Однако при запуске из cmd это, скорее всего, вызовет появление другого окна консоли вместо повторного использования существующего. Я не знаю, существует ли там хорошее решение.

13
ответ дан Joey 28 November 2019 в 23:30
поделиться

Windows имеет разные значения в заголовке исполняемого файла для консоли и приложения пользовательского интерфейса (подробнее см. здесь ). Поэтому кажется невозможным сделать один и тот же исполняемый файл для работы в обоих режимах.

В качестве альтернативы вы можете открыть консоль в своем приложении пользовательского интерфейса, но это будет новая консоль, а не та, с которой вы запустили приложение.

4
ответ дан Community 28 November 2019 в 23:30
поделиться

ИМО, лучший подход здесь - иметь невизуальные классы, которые фактически выполняют работу программы. Затем вы можете вызвать это из программы с графическим интерфейсом, а также вы можете вызвать его из отдельной программы командной строки. Обе программы являются просто оболочкой для функциональности вашего класса (ов).

Это заставляет дизайн также быть чистым - ваши классы обязательно отделены от уровня GUI вашего приложения.

12
ответ дан 28 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: