2.4. 빠른 시작 예 확인
2.4.1. helloworld 빠른 시작 살펴보기 링크 복사링크가 클립보드에 복사되었습니다!
helloworld 빠른 시작에서는 JBoss EAP에 간단한 서블릿을 배포하는 방법을 보여줍니다. 비즈니스 로직은 서비스에 캡슐화되며 Jakarta Contexts and Dependency Injection bean으로 제공되며 서블릿에 주입됩니다. 이 빠른 시작 지점은 서버를 올바르게 구성 및 시작했는지 확인하는 시작 지점입니다.
명령줄을 사용하여 이 빠른 시작을 빌드하고 배포하기 위한 자세한 지침은 README.html 파일에 있습니다 . README.html 파일은 helloworld 빠른 시작 디렉터리의 root에 있습니다. 이 주제에서는 Red Hat CodeReady Studio를 사용하여 빠른 시작을 실행하고 Maven이 구성된 Red Hat CodeReady Studio, 가져오기 및 성공적으로 helloworld 빠른 시작을 실행했다고 가정합니다.
사전 요구 사항
- Red Hat CodeReady Studio 설치. 자세한 내용은 Red Hat CodeReady Studio 설치 가이드에서 Installer를 사용하여 CodeReady Studio 독립 실행형 설치 가이드를 참조하십시오.
-
helloworld빠른 시작을 실행합니다. 자세한 내용은 Run the Quickstarts in Red Hat CodeReady Studio 를 참조하십시오. -
웹 브라우저를 열고 http://localhost:8080/helloworld 에서 애플리케이션에 액세스하여
helloworld빠른 시작이 JBoss EAP에 성공적으로 배포되었는지 확인합니다.
디렉터리 구조 검사
helloworld 빠른 시작 코드는 QUICKSTART_HOME/helloworld/ 디렉터리에 있습니다. helloworld 빠른 시작은 서블릿 및 자카르타 컨텍스트 및 종속성 주입 빈으로 구성됩니다. 또한 버전 번호 1.1과 bean- 파일이 포함되어 있습니다 discovery .xml-mode가 있는 애플리케이션의 WEB-INF/ 디렉토리에 bean. 이 마커 파일은 WAR를 빈 아카이브로 식별하고 JBoss EAP에 이 애플리케이션에서 빈을 찾고 자카르타 컨텍스트 및 종속성 주입을 활성화하도록 지시합니다.
src/main/webapp/ 디렉터리에는 빠른 시작 파일을 포함합니다. 이 예제의 모든 구성 파일은 beans. xml 파일을 포함하여 src / 디렉터리에 있습니다. /main/webapp/ 내의 WEB-INFsrc/main/webapp/ 디렉터리에는 간단한 메타 새로 고침을 사용하여 사용자의 브라우저를 http://localhost:8080/helloworld/HelloWorld 있는 서블릿으로 리디렉션하는 index.html 파일이 포함되어 있습니다. 빠른 시작에는 web.xml 파일이 필요하지 않습니다.
코드 검사
패키지 선언 및 가져오기는 이러한 목록에서 제외되었습니다. 전체 목록은 빠른 시작 소스 코드에서 사용할 수 있습니다.
HelloWorldServlet코드를 검토합니다.HelloWorldServlet.java파일은src/main/java/org/jboss/as/quickstarts/helloworld/디렉터리에 있습니다. 이 서블릿은 정보를 브라우저로 전송합니다.예제: HelloWorldServlet Class Code
42 @SuppressWarnings("serial") 43 @WebServlet("/HelloWorld") 44 public class HelloWorldServlet extends HttpServlet { 45 46 static String PAGE_HEADER = "<html><head><title>helloworld</title></head><body>"; 47 48 static String PAGE_FOOTER = "</body></html>"; 49 50 @Inject 51 HelloService helloService; 52 53 @Override 54 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 55 resp.setContentType("text/html"); 56 PrintWriter writer = resp.getWriter(); 57 writer.println(PAGE_HEADER); 58 writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>"); 59 writer.println(PAGE_FOOTER); 60 writer.close(); 61 } 62 63 }Expand 표 2.1. HelloWorldServlet Details 행 참고 43
@WebServlet주석을 추가하고 서블릿에 액세스하는 데 사용되는 URL에 매핑을 제공하는 것입니다.46-48
모든 웹 페이지에는 올바르게 구성된 HTML이 필요합니다. 이 빠른 시작에서는 정적 문자열을 사용하여 최소 헤더 및 바닥글 출력을 작성합니다.
50-51
이러한 행은 실제 메시지를 생성하는 HelloService Jakarta Contexts 및 Dependency Injection Bean을 주입합니다. HelloService의 API를 변경하지 않는 한, 이 방법을 사용하면 보기 계층을 변경하지 않고 나중에 HelloService 구현을 변경할 수 있습니다.
58
이 행은 서비스로 호출하여 "Hello World" 메시지를 생성하고 HTTP 요청에 씁니다.
HelloService코드를 검토합니다.HelloService.java파일은src/main/java/org/jboss/as/quickstarts/helloworld/디렉터리에 있습니다. 이 서비스는 단순히 메시지를 반환합니다. XML 또는 주석 등록이 필요하지 않습니다.예제: HelloService 클래스 코드
public class HelloService { String createHelloMessage(String name) { return "Hello " + name + "!"; } }
2.4.2. 숫자 측정 빠른 시작 살펴보기 링크 복사링크가 클립보드에 복사되었습니다!
숫자 측정 빠른 시작 에서는 JBoss EAP에 단순한 비영구적 애플리케이션을 생성하고 배포하는 방법을 보여줍니다. 정보는 Jakarta Server Faces 보기를 사용하여 표시되며 비즈니스 로직은 두 개의 Jakarta Contexts 및 Dependency Injection Bean으로 캡슐화됩니다. 숫자 측정 빠른 시작 에는 1에서 100 사이의 숫자를 추측하려는 10번 시도가 있습니다. 시도한 후에 추측이 너무 높거나 너무 낮은지 알 수 있습니다.
숫자 측정 빠른 시작 코드는 QUICKSTART_HOME/numberguess/ 디렉터리에서 확인할 수 있습니다. 여기서 QUICKSTART_HOME 은 다운로드한 JBoss EAP 빠른 시작의 압축을 풉니다. 숫자 측정 빠른 시작은 다수의 빈, 구성 파일 및 Facelets Jakarta Server Faces 뷰로 구성되며 WAR 모듈로 패키징됩니다.
명령줄을 사용하여 이 빠른 시작을 빌드하고 배포하는 자세한 지침은 README.html 파일에서 숫자 측정 빠른 시작 디렉터리의 루트에 있습니다. 다음 예제에서는 Red Hat CodeReady Studio를 사용하여 빠른 시작을 실행합니다.
사전 요구 사항
- Red Hat CodeReady Studio 설치. 자세한 내용은 Red Hat CodeReady Studio 설치 가이드에서 Installer를 사용하여 CodeReady Studio 독립 실행형 설치 가이드를 참조하십시오.
-
numberguess빠른 시작을 실행합니다. 자세한 내용은 Run the Quickstarts in Red Hat CodeReady Studio 를 참조하십시오. 지침에서대체합니다.helloworld를 번호로 -
웹 브라우저를 열고 이 URL에서 애플리케이션에 액세스하여
숫자 추측 빠른시작이 JBoss EAP에 성공적으로 배포되었는지 확인합니다 . http://localhost:8080/numberguess.
구성 파일 검사
이 예제의 모든 구성 파일은 빠른 시작의 QUICKSTART_HOME/numberguess/src/main/webapp/WEB-INF/ 디렉터리에 있습니다.
faces-config.xml파일을 검사합니다.이 빠른 시작은 Jakarta Server Faces 2.2 버전의
faces-config.xmlfilename을 사용합니다. 표준화된 버전의 Facelets은 Jakarta Server Faces 2.2의 기본 보기 처리기이므로 구성이 필요하지 않습니다. 이 파일은 루트 요소로만 구성되며 애플리케이션에서 JSF를 활성화해야 함을 나타내는 마커 파일입니다.<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"> </faces-config>beans.xml파일을 검사합니다.bean.xml파일에는 버전 번호 1.1과all의bean-discovery-mode가 포함되어 있습니다. 이 파일은 WAR를 빈 아카이브로 식별하고 JBoss EAP에 이 애플리케이션에서 빈을 찾고 Jakarta Contexts 및 Dependency Injection을 활성화하도록 지시하는 마커 파일입니다.<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all"> </beans>
이 빠른 시작에는 web.xml 파일이 필요하지 않습니다.
2.4.2.1. Jakarta Server Faces Code 검사 링크 복사링크가 클립보드에 복사되었습니다!
Jakarta Server Faces는 소스 파일에 .xhtml 파일 확장자를 사용하지만 .jsf 확장자와 함께 렌더링된 뷰를 제공합니다. home.xhtml 파일은 src/main/webapp/ 디렉터리에 있습니다.
예제: Jakarta Server Faces 소스 코드
19<html xmlns="http://www.w3.org/1999/xhtml"
20 xmlns:ui="http://java.sun.com/jsf/facelets"
21 xmlns:h="http://java.sun.com/jsf/html"
22 xmlns:f="http://java.sun.com/jsf/core">
23
24 <head>
25 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
26 <title>Numberguess</title>
27 </head>
28
29 <body>
30 <div id="content">
31 <h1>Guess a number...</h1>
32 <h:form id="numberGuess">
33
34 <!-- Feedback for the user on their guess -->
35 <div style="color: red">
36 <h:messages id="messages" globalOnly="false" />
37 <h:outputText id="Higher" value="Higher!"
38 rendered="#{game.number gt game.guess and game.guess ne 0}" />
39 <h:outputText id="Lower" value="Lower!"
40 rendered="#{game.number lt game.guess and game.guess ne 0}" />
41 </div>
42
43 <!-- Instructions for the user -->
44 <div>
45 I'm thinking of a number between <span
46 id="numberGuess:smallest">#{game.smallest}</span> and <span
47 id="numberGuess:biggest">#{game.biggest}</span>. You have
48 #{game.remainingGuesses} guesses remaining.
49 </div>
50
51 <!-- Input box for the users guess, plus a button to submit, and reset -->
52 <!-- These are bound using EL to our Jakarta Contexts and Dependency Injection beans -->
53 <div>
54 Your guess:
55 <h:inputText id="inputGuess" value="#{game.guess}"
56 required="true" size="3"
57 disabled="#{game.number eq game.guess}"
58 validator="#{game.validateNumberRange}" />
59 <h:commandButton id="guessButton" value="Guess"
60 action="#{game.check}"
61 disabled="#{game.number eq game.guess}" />
62 </div>
63 <div>
64 <h:commandButton id="restartButton" value="Reset"
65 action="#{game.reset}" immediate="true" />
66 </div>
67 </h:form>
68
69 </div>
70
71 <br style="clear: both" />
72
73 </body>
74</html>
다음 줄 번호는 Red Hat CodeReady Studio에서 파일을 볼 때 표시되는 번호에 해당합니다.
| 행 | 참고 |
|---|---|
| 36-40 | 다음은 사용자에게 전송할 수 있는 메시지입니다. "더 높음!" 및 "Lower!" |
| 45-48 | 사용자가 추측할 수 있듯이 추측할 수 있는 숫자의 범위가 작아집니다. 이 문장이 변경되어 유효한 추측의 개수를 알 수 있습니다. |
| 55-58 | 이 입력 필드는 값 표현식을 사용하여 빈 속성에 바인딩됩니다. |
| 58 | 유효성 검사기 바인딩은 사용자가 추측할 수 있는 범위 외부의 숫자를 실수로 입력하지 않는지 확인하는 데 사용됩니다. 유효성 검사기가 여기에 없으면 사용자는 바운드 번호에서 추측을 사용할 수 있습니다. |
| 59-61 | 사용자가 서버에 추측을 보낼 수 있는 방법이 있어야 합니다. 여기에서 빈의 작업 메서드에 바인딩합니다. |
2.4.2.2. 클래스 파일 검사 링크 복사링크가 클립보드에 복사되었습니다!
모든 숫자 퀵스타트 소스 파일은 QUICKSTART_HOME/numberguess/src/main/java/org/jboss/as/quickstarts/numberguess/ 디렉터리에서 찾을 수 있습니다. 패키지 선언 및 가져오기는 이러한 목록에서 제외되었습니다. 전체 목록은 빠른 시작 소스 코드에서 사용할 수 있습니다.
Random.java 한정자코드 검토한정자를 사용하여 두 빈 간의 모호성을 제거하는 데 사용되며, 둘 다 유형에 따라 주입할 수 있습니다. 한정자에 대한 자세한 내용은 JBoss EAP 개발 가이드에서 한정자를 사용하여 모호한 주입 해결을 참조하십시오.
@Random한정자는 임의 숫자를 주입하는 데 사용됩니다.@Target({ TYPE, METHOD, PARAMETER, FIELD }) @Retention(RUNTIME) @Documented @Qualifier public @interface Random { }MaxNumber.java 한정자코드 검토@MaxNumber한정자는 허용되는 최대 번호를 주입하는 데 사용됩니다.@Target({ TYPE, METHOD, PARAMETER, FIELD }) @Retention(RUNTIME) @Documented @Qualifier public @interface MaxNumber { }generate
.java코드 검토generate
클래스는 생산자 메서드를 통해 임의 숫자를 생성하고 동일한 방법을 통해 가능한 최대 숫자를 노출합니다. 이 클래스는 애플리케이션 범위이므로 매번 다른 무작위로 설정되지 않습니다.@SuppressWarnings("serial") @ApplicationScoped public class Generator implements Serializable { private java.util.Random random = new java.util.Random(System.currentTimeMillis()); private int maxNumber = 100; java.util.Random getRandom() { return random; } @Produces @Random int next() { // a number between 1 and 100 return getRandom().nextInt(maxNumber - 1) + 1; } @Produces @MaxNumber int getMaxNumber() { return maxNumber; } }Game.java코드 검토세션 범위
게임클래스는 애플리케이션의 기본 진입점입니다. 게임 설정 또는 재설정, 사용자의 추측을 캡처 및 검증,FacesMessage를 사용하여 사용자에게 피드백을 제공하는 역할을 담당합니다. 사후 구축 라이프사이클 방법을 사용하여@Random Instance<Integer>빈에서 임의 숫자를 검색하여 문제를 초기화합니다.클래스에서
@Named주석을 확인합니다. 이 주석은 Jakarta Expression Language (이 경우#{game})를 사용하여 Jakarta Server Faces 뷰에서 빈에 액세스할 수 있도록 하려는 경우에만 필요합니다.@SuppressWarnings("serial") @Named @SessionScoped public class Game implements Serializable { /** * The number that the user needs to guess */ private int number; /** * The users latest guess */ private int guess; /** * The smallest number guessed so far (so we can track the valid guess range). */ private int smallest; /** * The largest number guessed so far */ private int biggest; /** * The number of guesses remaining */ private int remainingGuesses; /** * The maximum number we should ask them to guess */ @Inject @MaxNumber private int maxNumber; /** * The random number to guess */ @Inject @Random Instance<Integer> randomNumber; public Game() { } public int getNumber() { return number; } public int getGuess() { return guess; } public void setGuess(int guess) { this.guess = guess; } public int getSmallest() { return smallest; } public int getBiggest() { return biggest; } public int getRemainingGuesses() { return remainingGuesses; } /** * Check whether the current guess is correct, and update the biggest/smallest guesses as needed. Give feedback to the user * if they are correct. */ public void check() { if (guess > number) { biggest = guess - 1; } else if (guess < number) { smallest = guess + 1; } else if (guess == number) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Correct!")); } remainingGuesses--; } /** * Reset the game, by putting all values back to their defaults, and getting a new random number. We also call this method * when the user starts playing for the first time using {@linkplain PostConstruct @PostConstruct} to set the initial * values. */ @PostConstruct public void reset() { this.smallest = 0; this.guess = 0; this.remainingGuesses = 10; this.biggest = maxNumber; this.number = randomNumber.get(); } /** * A Jakarta Server Faces validation method which checks whether the guess is valid. It might not be valid because there are no guesses left, * or because the guess is not in range. * */ public void validateNumberRange(FacesContext context, UIComponent toValidate, Object value) { if (remainingGuesses <= 0) { FacesMessage message = new FacesMessage("No guesses left!"); context.addMessage(toValidate.getClientId(context), message); ((UIInput) toValidate).setValid(false); return; } int input = (Integer) value; if (input < smallest || input > biggest) { ((UIInput) toValidate).setValid(false); FacesMessage message = new FacesMessage("Invalid guess"); context.addMessage(toValidate.getClientId(context), message); } } }