안녕하세요 워누입니다😀

오늘 포스팅은 STS에서 새 프로젝트 생성 시 JAVA 11을 고를 수 없었던 

이상한 오류가 발생되어 기록을 남겨보고자 합니다😂

 

우선 오류 화면은 다음과 같습니다!

 

 

 

새로운 프로젝트 하나를 따기 위해서 "Spring Starter Project"를 클릭했으나..

 

 

Java Version 선택 옵션이 17과 21만 존재하더군요. 

기본 옵션은 아래 링크에서 작성한 것처럼 제대로 세팅되어 있는 상황이었구요!

 

https://seoneu.tistory.com/51

 

[JAVA/Spring Boot] STS4 기본 설정 및 첫 프로젝트 띄우기

안녕하세요 워누입니다! 지난 포스팅에 이어 이번에는 STS4 기본 설정 후 첫 프로젝트를 띄워보고자 합니다. 우선 STS4를 실행해주세요! 첫번째로 세팅할 것은 JRE 설정입니다! 이제 상단 매뉴에서

seoneu.tistory.com

 

STS를 밀고 다시 설치해보아도, Java 환경변수를 다시 설정해주어도 동일하게 11버전은 안되더라구요.

(17/21은 잘만 선택되는데 말이죠)

 

구글에 검색해도 해당 이슈에 대한 현상이 나오지 않아 여러모로 불편하던 중

Spring 공식 사이트에서 2.7.x 버전의 지원 종료에 대한 내용을 볼 수 있었습니다.

(https://spring.io/projects/spring-boot#support)

 

 

이것 때문인지 아닌지는 모르겠지만 여튼 저는 STS에서 11버전을 사용할 수 없는 상태입니다.

일단 boot 3.x 버전을 공부해보기 위해서라도 17 이상을 설치해보긴 하겠지만 

여러모로 레거시에 대한 서비스 종료가 너무 빠르게 진행된다는 건 아쉽긴 하네요ㅜㅜ

 

혹시 저와 같은 문제를 겪고 계시거나 문제를 해결하신 분이 있다면 댓글로 달아주시면 감사하겠습니다😂

(저는 결국 해결 못하고 맥에 설치한 인텔리제이로 프로젝트를 진행해보겠습니다...😅)

안녕하세요 워누입니다!

지난 포스팅에 이어 이번에는 STS4 기본 설정 후 첫 프로젝트를 띄워보고자 합니다. 

 

우선 STS4를 실행해주세요!

첫번째로 세팅할 것은 JRE 설정입니다! 

이제 상단 매뉴에서 [Windows > Reference] 를 클릭해주세요.

 

Preference 창에서 [JAVA > Installed JREs] 매뉴로 접속해보면

위와 같이 STS에 이미 설치된 JRE가 있다는 것을 알 수 있습니다.

그렇지만 저는 이전 포스팅에서 JDK를 설치했었기 때문에 설치한 JDK로 세팅을 바꾸도록 하겠습니다!

.

오른쪽 위 [Add...] 버튼을 클릭해봅시다. 

여기서 [Standard VM]을 선택하고 [Next >] 버튼을 클릭해주세요!

여기서 [Directory]를 클릭한 후 JDK가 설치된 경로의 폴더를 선택해주세요.

그러면 아래와 같이 나올 것입니다!

이제 [Finish] 버튼을 클릭해서 완료해주세요!

그럼 아래와 같이 [Preferernce] 화면으로 돌아오면서 위에서 세팅한 JDK가 함께 추가된 것을 볼 수 있습니다.

새로 설치한 JDK 옆 체크박스를 클릭한 다음 [Apply] 버튼을 클릭해주세요.

이후 왼쪽 매뉴에서 [JAVA > Compiler]를 클릭해주세요!

JDK Compliance level에서 자신이 설치한 JDK 버전과 맞는지 확인해서 수정해주세요!

저는 11버전을 설치했기 때문에 11로 수정했습니다. 

버전 수정이 완료되었다면 [Apply] 버튼을 클릭해줍시다!

.

이번에는 인코딩을 설정해보겠습니다. 

왼쪽 매뉴에서 [General > Content Types]를 클릭해줍시다. 

 

화면 내 Content types 항목 중 Text를 클릭하여 Default encoding이 어떻게 나오는지 확인해주세요!

저는 아무것도 안 떠 있어서 아래와 같이 "UTF-8"을 입력해주었습니다.

 

저처럼 입력을 직접 해주신 분이 계시다면 오른쪽 [Update] 버튼을 꼭 클릭해주세요!

 

[Text] 항목에서 "UTF-8" 적용을 완료했다 하더라도 하위 항목 중

인코딩이 제대로 설정이 안되어있는 케이스들이 있을 수 있어요.

 

저의 경우에는 [Java Properties File]과 [Spring Properties File]이 "ISO-8859-1"으로 세팅이 되어 있었습니다!

이렇게 세팅되어 있는 경우도 있으니 꼭 찾아서 "UTF-8"로 설정을 변경하고 [Update]를 클릭해주세요. 

 

다음은 [General > Workspace] 매뉴로 이동해봅시다!

저는 이미 [Text file encoding] 항목에 "Other: UTF-8"이 잘 적용되어 있었습니다!

만약 다른 인코딩으로 세팅된 분이 있다면 여기도 "UTF-8"로 수정한 다음 [Apply] 버튼을 클릭해주세요!

.

인코딩 세팅을 마무리하고, 마지막으로 [Gradle] 매뉴로 이동해보겠습니다. 

[Java home] 항목에 [Browse] 버튼을 클릭하여 JDK가 설치된 경로를 입력합니다. 

그리고 위와 같이 [Authmatic Project Synchronization] 항목에 체크가 되어 있지 않다면 체크박스 버튼을 클릭해주세요!

 

위와 같이 되었다면 세팅이 정상적으로 마무리 된 것입니다. 

이제 [Apply] 버튼을 클릭한 후 [Apply and Close] 버튼을 클릭해서 [Preference] 화면을 종료해주세요!

.

다시 처음화면으로 돌아왔네요 ㅎㅎ

이제  [Project Explorer]에서 [Create new Spring Starter Project]를 클릭해줍시다!

저는 [Type]을 "Gradle - Groovy"로, [Java Version]을 "11"로, Name은 "Sample", Package 명은 "sample"로 했습니다. 

이 글을 보고 세팅하시는 분들은 PC 환경에 맞게 세팅을 수정해주시고 [Next >] 버튼을 클릭해주세요!

여기서는 스프링 부트 버전 및 의존성을 설정할 수 있어요!

지금은 간단한 웹 프로젝트를 실행할 예정이므로 아래 두 가지만 추가해줍시다🙂

 

[Developer Tools > Spring Boot DevTools]

[Web > Spring Web]

 

다른 의존성에 대한 도구들은 나중에 알아가보도록 하고 우선 [Next] 버튼을 클릭해줍시다!

 

이 화면에서는 Spring Boot의 구성 정보를 확인할 수 있습니다. 

아직 아무것도 모르므로 일단 [Finish] 버튼을 클릭해줍시다!

 

.....? 이 오류는 무엇인가...

 

오류 메세지:

'Import Getting Started Content' has encountered a problem.

NoMatchingConfigurationSelectionException

 

해당 내용을 구글링해서 찾아보니

Spring Boot 3.x 버전으로 사용하려면 JAVA 17 버전 이상으로 세팅이 되어야 한다는군요...

 

처음 다뤄보니 별 실수를 다하는군요..😂

여러분은 저같은 실수 하지 마시고 Spring Boot 버전을 JAVA 버전에 맞게 사용하세요!!

여튼 저는 생성했던 프로젝트를 삭제하고 아래와 같이 다시 생성했습니다. 

(나중에는 JDK 17 버전 다시 설치하고 돌아오겠습니다ㅋㅋ)

처음과 다르게 Spring Boot 버전을 2.7.11로 세팅하고 프로젝트를 생성했습니다!

.

이번에는 문제 없이 정상적으로 생성이 된 것 같군요..!

그렇다면 이제 실제로 Run을 시켜보도록 하겠습니다. 

.

프로젝트를 우클릭한 상태에서 [Run As > Spring Boot App] 을 클릭해주세요!

콘솔 창을 보면 위와 같이 출력된 것을 볼 수 있습니다! 

이 중에서 5번째 줄을 살펴보자면, 

STS에 내장된 Tomcat 서버가 8080 포트로 구동되었다는 사실을 알 수가 있습니다!

그럼 이제, Browser에 접속해서 결과를 볼까요?

.

브라우저를 하나 띄워주시고 "localhost:8080"을 입력해서 접속해주세요!

 

....??? 이번엔 또 무엇인가..싶겠지만 이번에는 다행히 정상적인 결과입니다. 

프로젝트를 띄우기는 했지만 화면에 보이는 부분은 자동으로 만들어지지 않기 때문에 이런 화면이 나온 것이죠!

.

프로그래밍의 첫 관문인 "Hello World!"를 띄워보면 조금이나마 감을 잡을 수 있을 것 같네요 ㅎㅎ

 

이번엔 sample package 밑에 Controller 패키지를 생성해봅시다!

위 화면에서 sample 패키지를 우클릭 한 후 [New > Package]를 클릭합니다!

화면을 띄웠다면 [Name]에 "sample.controller"를 입력해준 후 [Finish]  버튼을 클릭합니다. 

[Finish] 버튼을 클릭하여 완료하면 아래 화면과 같이

sample 패키지 안에 controller 패키지가 추가된 것을 볼 수 있습니다!

이제 controller 패키지 밑에 HelloWorldController 클래스를 생성해봅시다!

controller 패키지 우클릭 후 [New > Class]를 클릭해주세요!

Name에만 "HelloWorldController"라고 이름합시다. 

원래 Java에서는 [public static void main(String[] args)] 항목을 추가하지만

여기서는 그럴 필요 없이 여러 어노테이션들이 대신 기능을 수행해줄겁니다 ㅎㅎ

.

[Finish] 버튼을 클릭하면 아래와 같이 나올 겁니다. 

자, 이제 여기다가 아래의 코드를 작성해볼까요?

 

package sample.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

	@RequestMapping("/")
	public String hello() {
		return "Hello World!";
	}
}

코드에 대하여 짤막하게 설명하자면,

@RestController 어노테이션은 REST 컨트롤러 기능을 수행하도록 하는 어노테이션이며, 

@RequestMapping 어노테이션은 해당 메서드를 실행할 수 있는 주소를 설정하는 어노테이션입니다. 

여기서는 기본 주소를 " / "로 지정하였습니다. 

 

대충 설명했지만 나중에 조금 더 복잡한 코드가 나올 때 자세히 설명드릴 수 있을 것 같아요! 

우선 작성한 코드를 가지고 다시 한 번 프로젝트를 실행하겠습니다!

로그도 정상적으로 실행이 되었구요!

무사히 "Hello World!"도 띄웠습니다!

 .

조금은 다사다난 했지만 Spring Boot의 첫 발걸음을 뗀 기분입니다! 

첫 발걸음을 떼는 다른 분들은 저보다는 덜 실수하기를 바라며 이만 글을 마치겠습니다😀

 

감사합니다!

 

안녕하세요 워누입니다😀

오늘은 윈도우 PC에 Spring Boot 설치하는 방법에 대해서 포스팅하겠습니다! 

 

우선 Spring boot 설치를 하기 전에 JDK는 기본적으로 설치가 되어 있어야 합니다.

JDK 설치가 되어 있지 않으신 분은 아래 사이트에서 JDK를 1.8 버전 이상으로 설치해주세요..!

 

https://www.oracle.com/java/technologies/downloads/

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

 

JDK 설치 및 환경 변수 편집 방법은 따로 설명드리지 않고 바로 넘어가도록 할게요😁

편집이 완료되신 분은 아래 사이트로 접속해주세요.

 

https://spring.io/tools

 

Spring | Home

Cloud Your code, any cloud—we’ve got you covered. Connect and scale your services, whatever your platform.

spring.io

 

해당 사이트에 접속하시면 아래와 같이 운영체제에 맞게 다운받을 수 있게 작성이 되어 있어요!

 

여기에서 설치하시는 PC의 운영체제에 맞는 tool을 클릭하시면 됩니다.

저는 여기서 "4.18.0 - WINDOWS X86_64"로 클릭하여 다운로드 받았습니다.

 

다운받은 파일은 "Spring-tool-suite-4-4.18.0.RELEASE.(이하 생략)"라는 이름의 jar 파일입니다!

버전이 업데이트 되면 제가 받은 파일명과는 달라질 수 있을 것 같네요ㅎㅎ

 

 

압축 파일 구성은 위 이미지와 같이 되어 있는데요,

압축을 한번 풀어보겠습니다..!

(압축을 풀어보니 contents.zip 압축파일이 포함되어 있어 함께 해제해 주겠습니다..!)

 

여기 있는 파일을 압축 해제해보니...?!?!

실패한 친구들이 꽤 있긴 해서 걱정되긴 합니다만 (나중에 프로젝트 띄울 때 실패되진 않겠죠..?)

나머지는 압축 해제가 성공적으로 된 것 같네요ㅎㅎ 

 

 

그럼 이제 SpringToolSuite4.exe 파일을 실행해보도록 하죠!

 

클릭해보면 위 화면과 같이 나옵니다!!

 

그리고 eclipse에서 본 것처럼 workspace 경로 설정 단계가 있네요 ㅎㅎ

각자 자신의 환경에 맞게 해당 경로를 수정해주시면 됩니다!

.

그리고 Launch 버튼을 클릭하면..!

 

STS가 정상적으로 실행된 것을 볼 수 있습니다!!

 

이번 포스팅은 여기서 마무리하고 

다음 포스팅에서는 기본 환경 설정 후 첫 프로젝트를 만드는 과정을 포스팅하도록 하겠습니다! 

 

 

블로거 워누입니다. 

 

지난번 포스팅에 이어 String 메소드에서 제공하는 equals에 대해서 포스팅하고자 합니다! 

equals는 문자열을 비교할 때 사용하는 메소드입니다. 이 메소드를 이용해서 서로 다른 문자열 타입 변수의 문자열을 서로 비교합니다. 

....

그런데 말입니다.. 우리가 일반적으로 변수 타입을 비교하려면 같다는 의미의 이항연산자인 "==" 연산자를 통해서 많이 비교하는데, 문자열은 굳이 equals를 쓸 필요가 있을까요?

 

 

확인을 위해 직접 실험해 보았습니다. 우리에게 늘 익숙한 Hello 시리즈로 소스코드를 만들었습니다.


[equalsPrac.java 소스코드]

public class equalsPrac {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = new String("HelloJava");
		String str2 = "HelloJava";
		String str3 = "HelloJava";
		
		if(str1 == str2) 
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
		if(str2 == str3) 
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
	}

}

결과는 아래와 같이 나옵니다. 

equalsPrac.java 실행화면

.

.

.

?

분명 똑같이 비교연산자를 썼는데 str1과 str2가 왜 다른걸까요..?

(대학교에서 이 내용을 가르쳐주지 않았습니다. 교수님이 몰랐을수도...ㅎ)

 

사실 자바는 문자열 값이 완전히 똑같으면, 동일한 String 객체를 참조합니다. 즉, str2와 str3는 같은 객체라는 것인데요, 반면 str1은 new 연산자를 사용하는 바람에 다른 String 객체를 참조하게 되버린 것입니다.

 

쉽게 말하면 클래스를 하나 만들어놓고 객체를 따로 만들어놓은 것처럼 말이죠!

.

Class cl1 = new Class();

Class cl2 = new Class();.

.

대충 이런 느낌인데 여기서 cl1과 cl2는 완전히 다른 객체인 것처럼, str1과 str2, str3 사이도 마찬가지라고 합니다. 

 

이런 경우, "=="을 사용하면 다른 객체간 문자열 비교가 불가능하겠죠?

이래서 equals를 사용합니다. 

 

이번엔 지난 포스팅에서 사용했던 substring() 메소드까지 같이 써서 비교해볼게요!

 


[equalsPrac2.java 소스코드]

public class equalsPrac2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = new String("Java");
		String str2 = "Java";
		String str3 = new String("HelloJava");
		String str4 = "HelloJavaProject";
		
		if(str1 == str2) 
			System.out.println("같은 String 객체를 지정");
		else
			System.out.println("다른 String 객체를 지정");
		
		if(str2.equals(str1))
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
		if(str3.substring(5).equals(str1))
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
		if(str4.substring(5,9) == str2)
			System.out.println("같은 String 객체를 지정");
		else
			System.out.println("다른 String 객체를 지정");
		
		if(str4.substring(5,9).equals(str2))
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
	}

}

이번 결과는 아래와 같이 나옵니다.

equalsPrac2.java 실행결과

.

어떤 느낌인지 대략 감이 오시나요..? "==" 연산자를 사용해버리면 객체의 값만 비교하는게 아니라 객체 동일 여부까지 따지게 되서, 문자열 비교할 때 원하는 값을 가져오지 못할 수도 있습니다.

이전 포스팅에서 언급한 것처럼 자바에서의 String은 단순한 문자열 타입 변수가 아닌 Class로 분류되기 때문에

문자열의 값 자체를 비교할 때는 비교 연산자 "=="이 아닌 equals() 메소드로 비교해야 정확한 값을 가져올 수 있습니다. 

(이거땜에 회사에서 쓸때없이 잡아먹은 시간이 얼만지 모르겠습니다...)

 

만약 이 글을 읽으시는 초급개발자분들은 예시를 보면서 직접 소스도 짜보고 여기저기 바꿔가면서 테스트 해보셨으면 좋겠습니다! 그래야 저처럼 버리는 시간 없이 효율적으로 개발하실 수 있거든요... ㅎ

 

오늘 포스팅은 여기까지 작성하고 다음 포스팅에서 뵙겠습니다 ㅎㅎ

안녕하세요 블로거 워누입니다! 

어느새 Tistory 블로그를 버려둔지 꽤 시간이 지나버렸네요..ㅎ 

하지만 어떤 계기로 인해 이 블로그를 다시 살리게 되었습니다! 공부한 내용들을 조금씩 올리는 용도로 작성 예정이니 즐감하셨으면 좋겠습니다! 

오랜만에 java 공부하다가 java에 향상된 For문이라는 것이 있더라구요! 

그래서 간단한 예제를 만들어보고 이렇게 쓰는 거구나 싶어서 아래와 같이 작성해보았습니다. 

 

<소스코드>

향상된 For문 소스코드

 

<결과>

소스코드 결과

 

많은 자바 책에서 이미 소개되고 있어서 저만 너무 늦게 알았나 싶습니다.. ㅎㅎ 

기존의 for문은 소괄호 안에 (반복변수; 조건; 반복변수증감) 형태로 작성하고 중괄호에 {실행문}을 작성하였으나 

향상된 for문에서는 소괄호 안에 (타입 변수 : 배열) 이런 형태로 작성하고 중괄호에 {실행문}을 작성합니다.

 

즉, 향상된 for문의 형태는 아래 형태를 가지고 있는데, 

====================

for( 타입변수 : 배열 ) {

    실행문;

}

====================

for문이 처음 실행될 때 배열에서 가져올 첫번째 값이 있는지 판단한 후 값이 있으면 해당 값을 변수에 저장합니다.

그리고 실행문을 실행하며 이게 하나의 루프입니다. 

해당 루프는 배열 안에서 가져올 다음 값이 없을 때까지 실행되며, 배열안에 가져올 값이 없게 되면 해당 반복문을 종료합니다. 따라서, 향상된 for문의 반복 횟수는 배열의 항목 수(=배열.length)가 됩니다.  

 

배열은 어디서나 많이 쓰이니까 향상된 for문도 공부해둔다면 개발하다가 유용하게 쓸 수 있을것 같네요 ㅎㅎ

앞으로도 공부하다가 공유할 내용이 있다면 블로그에 소개하겠습니다! 오늘은 여기까지 작성할게요!!

블로거 워누입니다!

 

오늘은 Java를 html과 융합하여 JSP와 Servlet(서블릿)이라는 것들을 이용하여 웹 페이지를 만들어 보았는데요! 코드가 조금 기니까 자세히 보셔야 해요ㅎㅎ 총 세개의 파일로 구성되어 있구요!하나는 JSP, 하나는 서블릿, 하나는 자바스크립트 파일입니다!

 

아래 코드와 결과를 같이 봐주세요!

 

1) 11_testpage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>WebTest Page</title>
<script type="text/javascript" src="testScript.js"></script>
</head>
<body>
<form method="get" action="testServlet" name="frm">
<h2> 회원 가입 페이지 </h2>

 <label for="userName"> 이름 </label><span style="color:blue;"> * </span>
 <input type="text" id="userName" name="userName"> <br>
 
 <label> 주민등록번호 </label><span style="color:blue;"> * </span>
 <input type="text" id="userNoBir" name="userNoBir"> -
  <input type="password" id="userNoSec" name="userNoSec"> <br>

  <label for="userID"> 아이디 </label><span style="color:blue;"> * </span>
  <input type="text" id="userID" name="userID"> <br>

  <label for="userPwd"> 비밀번호 </label><span style="color:blue;"> * </span>
  <input type="password" id="userPwd" name="userPwd"> <br>

  <label for="userPwdchk"> 비밀번호확인 </label><span style="color:blue;"> * </span>
 <input type="password" id="userPwdchk" name="userPwdchk"> <br>
 
 <label for="userEmail"> 이메일 </label><span style="color:blue;"> * </span>
  <input type="text" name="userEmail" id="userEmail"> @
  <input type="text" name="Emailaddr" id="Emailaddr">

  <label for="EmailSelect" style="float: left;"> </label>
     <select id="EmailSelect" name="EmailSelect" size="1">
      <option value="직접입력">직접입력 </option>
      <option value="naver.com"> naver.com </option>
      <option value="nate.com"> nate.com </option>
      <option value="hanmail.net"> hanmail.net </option>
      <option value="gmail.com"> gmail.com </option>
    </select>
    <br>

 <label for="userHomeNo"> 우편번호 </label> &nbsp;
    <input type="text" id="userHomeNo" name="userHomeNo"> <br>
   
    <label for="userAddr1"> 주소 </label> &nbsp;
  <input type="text" id="userAddr1" name="userAddr1">
  <input type="text" id="userAddr2" name="userAddr2"> <br>
  
  <label for="userHP"> 전화번호 </label> &nbsp;
  <input type="text" name="userHP"> <br>
 
 <label for="job" style="float: left;"> 직업 </label>
    <select id="job" name="job" size="1">
      <option value="학생"> 학생 </option>
      <option value="공무원"> 공무원 </option>
      <option value="언론"> 언론 </option>
      <option value="컴퓨터/인터넷"> 컴퓨터/인터넷 </option>
   </select>
   <br>

  <label for="chkMailSMS"> 메일/SMS 정보 수신 여부 </label> &nbsp;
  <input type="radio" id="chkMailSMS" name="chkMailSMS" value="yes" checked> 수신
  <input type="radio" id="chkMailSMS" name="chkMailSMS" value="no"> 거부 <br><br>

 <label for="pl"> 개발언어 관심 분야 </label> &nbsp; <br>
 <input type="checkbox" name="pl" value="C"> C
 <input type="checkbox" name="pl" value="C++"> C++
  <input type="checkbox" name="pl" value="Java"> Java <br>
  <input type="checkbox" name="pl" value="C#"> C#
  <input type="checkbox" name="pl" value="JavaScript"> JavaScript
 <input type="checkbox" name="pl" value="python"> python <br>

 <br><br>
 <input type="submit" value="회원가입" style="float: center;" onclick="return check()">
 <input type="reset" value="취소" style="float: center;margin-right:50px">

</form>
</body>
</html>

 

2) testServlet.java <- 얘가 서블릿이에요!

package unit11;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class testServlet
 */

@WebServlet("/testServlet")

public class testServlet extends HttpServlet {

 private static final long serialVersionUID = 1L;

 /**
  * @see HttpServlet#HttpServlet()
  */

 public testServlet() {
  super();
  // TODO Auto-generated constructor stub
 }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
  *      response)
  */

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  // TODO Auto-generated method stub
  response.setContentType("text/html; charset=UTF-8");

  String userName = request.getParameter("userName");
  int userNoBir = Integer.parseInt(request.getParameter("userNoBir"));
  int userNoSec = Integer.parseInt(request.getParameter("userNoSec"));
  String userID = request.getParameter("userID");
  String userPwd = request.getParameter("userPwd");
  String userPwdchk = request.getParameter("userPwdchk");
  String userEmail = request.getParameter("userEmail");
  String Emailaddr = request.getParameter("Emailaddr");
  String EmailSelect = request.getParameter("EmailSelect");
  int userHomeNo = Integer.parseInt(request.getParameter("userHomeNo"));
  String userAddr1 = request.getParameter("userAddr1");
  String userAddr2 = request.getParameter("userAddr2");
  String userHP = request.getParameter("userHP");
  String Job = request.getParameter("job");
  String chkMailSMS = request.getParameter("chkMailSMS");

  PrintWriter out = response.getWriter();

  out.print("<html><body>");
  out.print("<h1> 회원 정보 <h1> <br><hr>");
  out.println("이름 : <b>" + userName);
  out.print("<br>");
  out.println("</b>주민등록번호 : <b>" + userNoBir + "-" + userNoSec);
  out.print("<br>");
  out.println("</b>아이디 : <b>" + userID);
  out.print("<br>");
  out.println("</b>비밀번호 : <b>" + userPwd);
  out.print("<br>");
  

  if (Emailaddr.trim() == "")
   out.println("</b>이메일 : <b>" + userEmail + "@" + EmailSelect);
  else
   out.println("</b>이메일 : <b>" + userEmail + "@" + Emailaddr);  
  out.print("<br>");

  out.println("</b>우편번호 : <b>" + userHomeNo);
  out.print("<br>");
  out.println("</b>주소 : <b>" + userAddr1);
  out.print(userAddr2);
  out.print("<br>");
  out.println("</b>핸드폰번호 : <b>" + userHP);
  out.print("<br>");
  out.println("</b>직업 : <b>" + Job);
  out.print("<br>");
  out.println("</b>메일/문자 수신 여부 : <b>" + chkMailSMS);
  out.print("<br>");

  String pls[] = request.getParameterValues("pl");
  if (pls == null) {
   out.print("</b>선택한 항목이 없습니다. <b>");
  } else {
   out.println("</b>관심분야 : <b>");
   for (String pl : pls)
    out.print(pl + " ");
  }

  out.print("</b><br>");
  out.println("</b><br><br><a href='javascript:history.go(-1)'>다시</a>");
  out.print("</body></html>");
  out.close();
 }

 /**
  *
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
  *      response)
  *
  */

 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  // TODO Auto-generated method stub

  doGet(request, response);

 }

}

 

3) testScript.js

/**
 *
 * 입력된 값에 대하여 유효성을 검사하는 자바스크립트입니다.
 *
 */

function check() {

 if (document.frm.userName.value == "") {
  alert("이름을 입력해주세요.");
  document.frm.userName.focus();
  return false;
 } else if (document.frm.userNoBir.value == "") {
  alert("주민번호 앞자리를 입력해주세요.");
  document.frm.userNoBir.focus();
  return false;
 } else if (isNaN(document.frm.userNoBir.value)) {
  alert("숫자로 입력해주세요.");
  document.frm.userNoBir.focus();
  return false;
 } else if (document.frm.userNoBir.length == 6) {
  alert("주민번호 앞자리는 6자리여야 합니다. 다시 입력해주세요.");
  document.frm.userNoBir.focus();
  return false;
 } else if (document.frm.userNoSec.value == "") {
  alert("주민번호 뒷자리를 입력해주세요.");
  document.frm.userNoSec.focus();
  return false;
 } else if (document.frm.userNoSec.length == 7) {
  alert("주민번호 앞자리는 7자리여야 합니다. 다시 입력해주세요.");
  document.frm.userNoSec.focus();
  return false;
 } else if (isNaN(document.frm.userNoSec.value)) {
  alert("숫자로 입력해주세요.");
  document.frm.userNoSec.focus();
  return false;
 } else if (document.frm.userID.value == "") {
  alert("아이디를 입력해주세요.");
  document.frm.userID.focus();
  return false;
 } else if (document.frm.userID.length < 4) {
  alert("아이디는 최소 4자리 이상이어야 합니다.");
  document.frm.userID.focus();
  return false;
 } else if (document.frm.userPwd.value == "") {
  alert("비밀번호를 입력해주세요.")
  document.frm.userPwd.focus();
  return false;
 } else if (document.frm.userPwdchk.value == "") {
  alert("비밀번호 확인란에 비밀번호를 재입력해주세요.");
  document.frm.userPwdchk.focus();
  return false;
 } else if (document.frm.userPwd.length < 6) {
  alert("비밀번호는 최소 6자리 이상이어야 합니다.");
  document.frm.userPwd.focus();
  return false;
 } else if (document.frm.userPwd.value != document.frm.userPwdchk.value) {
  alert("비밀번호가 일치하지 않습니다. 다시 확인해주세요.");
  document.frm.userPwd.focus();
  return false;
 } else if (document.frm.userEmail.value == "") {
  alert("이메일 계정을 입력해주세요.");
  document.frm.userEmail.focus();
  return false;
 } else
  return true;

}

---------------------------------------------------------------------------------------------

 

뭔가 좀 많죠..? ㅎㅎ 그럼 바로 아래 결과를 보겠습니다.

 

1. 출력 화면

.

.

2. 정보 입력

.

.

3. 결과 확인

.

.

나름 괜찮나요? 만약 이름이나 비밀번호 등 * 표시 된것들 중에서 하나 빼고 확인 누르거나 취소 버튼 눌러보거나 하는 액션을 취해주시면 흥미로운 결과도 발견됩니다. 확인해 보시고 이상이 있거나, 지적할 사항, 보충해야 되는 부분들 확인해 주시면 감사하겠습니다 ㅎㅎ 

 

아직 데이터베이스를 구축하지 않아 저장은 되지 않네요 ㅎㅎ 앞으로 데이터베이스를 빨리 익혀서 회원 정보를 구축하는 법도 익혀야겠어요! 그러면 하나의 웹 페이지를 제작할 수 있는 능력이 생기겠죠?? 얼른 제대로 된 웹개발자가 되어야 겠습니다! 그 전까지 같이 공부하고 응원합시다!

 

밤이 늦었으니 전 이만 자러 가볼께요! 다음 포스팅에서 봅시다!! 안녕!!

 

 

 

 

오랜만에 찾아뵙는 블로거 워누입니다.

 

오늘 포스팅은 심심해서 만들어본 자바 달력 프로그램입니다.

생각나는 대로 만들어본거라 조금은 어설플 수 있지만 도움이 될 것 같으신 분들은 참고하셔도 좋을 것 같네요! ㅎㅎ

 

 

[코드 참조]

package standard;

import java.util.Scanner;

public class Calendar {

 public static void main(String[] args) {
      // TODO Auto-generated method stub
  
      Scanner sc = new Scanner(System.in);
  
      /*
       * monthSet은 각 달에 대한 날짜들을 저장한 배열,
       * year은 연도, month는 달, week는 요일, day는 일, i는 반복문을 사용하기 위한 변수.
       */
      int year=0, month=0, week=0, day=0, i=0; 
      int monthSet[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  
  
      while(true) {
       System.out.println("원하는 연도를 입력하세요. (0을 누르면 프로그램을 종료합니다.)");
       year = sc.nextInt();
       if(year==0) {
        System.exit(0);
        break;
       }
       System.out.println("원하는 달을 입력하세요.");
       month = sc.nextInt();
       if(month<1 || month>12) {
        System.out.println("1월에서 12월 사이의 달을 입력해주세요.");
        return;
       }
       System.out.println("");
   
       if(year%4 == 0 && year%100 != 0 || year%400 == 0) // 윤년의 조건.
        monthSet[1] = 29; // 윤년이면 2월 (monthSet[1])은 29일,
       else
        monthSet[1] = 28; // 윤년이 아니면 2월은 28일이다.
   
       // 01년 1월 1일부터 계산.
       day = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400;
       for(i=0;i<month-1;i++) {
        day += monthSet[i];  
       }
       week=day%7; // 구하고자 하는 달의 시작일(1일)의 요일을 구함.
   
       System.out.printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n", "월", "화", "수", "목", "금", "토", "일");   
       for(i=0;i<week;i++) {
        System.out.print("\t"); // 1일이 시작하기 전 공백을 위한 반복문.
       }
       for(i=1;i<=monthSet[month-1];i++) {
        System.out.printf("%d\t", i); // i를 입력한 달의 일수만큼 찍음.
        week++;   
        if(week%7 == 0)        // 요일이 일요일이 지나면
         System.out.println(); // 줄을 바꿈.
    
       }
       if(week%7 != 0) {
        System.out.println();
       }
      }
  
 }

}

 

코드는 생각보다는 간단하더라구요.

윤년을 반영하는 부분이 초보자분들에게는 어려울 것 같습니다.ㅎㅎ 아래는 결과화면인데요, 코드를 작성한 날짜와, 가장 최근 윤달이었던 달, 그리고 제가 태어난 생년월일을 맞추어보았습니다. 0을 누르면 종료하게 되어 있습니다!

 

 

.

[결과 화면]

 

.

혹시 과제 때 필요해서 들어오신 분들이라면 참고하셔도 좋습니다만, Ctrl+C,V 가 아니라 직접 코딩해보는 것을 추천합니다! 그래야 실력이 늘겠죠?

.

 

시간이 늦었으니 저는 이만 자러갈게요~ 안녕! 

블로거 워누입니다!

최근에는 너무 SDN만 건드린거 같아요! 이제 자바와 HTML도 다시 업데이트 해야 겠습니다! (아무래도 SDN이 프로젝트이다 보니 힘들긴 합니다..)

그럼 바로 본론으로 넘어갈게요!

.

이번 포스팅에서는 자바 Swing에서 지원해주는 JComboBox와 ImageIcon을 활용해서 원하는 이미지를 불러오고자 합니다! 코드는 주석을 합쳐도 100줄이 안넘어가니 부담없이 봅시다!

 

<소스 코드>

import java.awt.*;    // java.awt의 모든 라이브러리 클래스들을 제공받습니다.
import java.awt.event.*; // java.awt.event의 모든 라이브러리 클래스들을 제공받습니다.
import javax.swing.*;  // javax.swing의 모든 라이브러리 클래스들을 제공받습니다.

/*
 * ComboActionEx 클래스를 선언합니다.
 * JFrame을 상속받습니다.
 */

public class ComboActionEx extends JFrame{

 String[] fruits = {"apple", "banana", "mango"}; // String 타입 배열 friuts를 선언합니다.
 // 안의 원소들은 apple, banana, mango입니다. (파일 명이기도 합니다.)
 
 /*
  *  Swing에서 지원해주는 ImageIcon 클래스입니다.
  *  이미지 경로를 저장한 후 화면에 출력하는 역할을 합니다.
  *  ImageIcon 객체를 생성할 때 이름은 일반적으로 이미지 경로의 상위폴더명과 동일하게 합니다.
  *  즉, images라는 폴더는 apple, banana, mango 파일을 가지고 있어야 합니다.
  */
 ImageIcon[] images = { // ImageIcon 클래스 객체 images를 배열로 선언합니다.
   new ImageIcon("images/apple.jpg"), // [0]
   new ImageIcon("images/banana.jpg"), // [1]
   new ImageIcon("images/mango.jpg"), // [2]
 };
 
 // JLabel 객체 imgLabel을 생성합니다. 초기값은 images[0]입니다.
 JLabel imgLabel = new JLabel(images[0]);

ComboActionEx(){ //ComboActionEx를 재정의합니다.
  
  setTitle("ComboBox 활용"); // 창의 이름은 ComboBox로 저장합니다.
  /*
   * Container는 Swing에서 제공하는 라이브러리 클래스입니다.
   * 자바에서 창의 역할을 담당하며 Component들이 올려질 영역입니다.
   * contentPane은 화면에 출력될 Component들이 부착될 공간입니다.
   */
  
  Container c = getContentPane();
  
  // Container 클래스 객체 C를 생성 후 contentPane을 가져옵니다.  
  c.setLayout(new FlowLayout()); // c의 레이아웃를 FlowLayout 클래스를 생성하여 잡아줍니다.
  JComboBox combo = new JComboBox(fruits); // ComboBox 클래스 객체 combo를 선언합니다. fruits[0]을 초기값으로 합니다.
  c.add(combo); // 컨테이너(창)에 combo를 더합니다.
  c.add(imgLabel); // 컨테이너에 imgLabel을 더합니다.
  
  /*
   * ActionListener는 보통 버튼에 이벤트가 발생하면 실행됩니다.
   * 아래 코드를 통해 콤보박스에서 선택한 것에 대한
   * 이벤트 처리입니다.
   */
  combo.addActionListener(new ActionListener(){ // combo에 ActionListner를 설정합니다.
   public void actionPerformed(ActionEvent e){ // actionPerformed 메서드를 통해 이벤트 처리에 대한 동작을 구현합니다.
    JComboBox cb = (JComboBox) e.getSource(); // 동작이 일어날 소스를 JComboBox 형태로 받습니다.
    int index = cb.getSelectedIndex(); // int 타입 index를 선언하고 콤보박스에서 선택된 번호 값으로 저장합니다.
    imgLabel.setIcon(images[index]); // imgLabel에 image[index]를 불러옵니다.
   } // end actionPerformed()
  }); // end combo.addActionListener
  
  setBounds(50, 50, 400, 400); // 윈도우 상에서 위치를 잡아 준 후(가로 50, 세로 50) 창의 크기를 설정합니다.(가로 400, 세로 400)
  setVisible(true); // 윈도우에서 클래스를 구현한 창이 보이게끔 합니다.
 } // end ComboActionEx()
 
 public static void main(String[] args) { // 프로그램의 실행지점인 main 메서드입니다.
  // TODO Auto-generated method stub
  new ComboActionEx(); // new 연산자를 이용하여 ComboActionEx()를 실행합니다.
 } // end main

} // end class

 

 

이클립스에서 보니 70줄도 안되네요ㅎㅎ 주석도 한줄마다 달아서 쉽게 이해하실 수 있을 겁니다!

.

여기서 주의하실 점!

(아래 그림을 참고하세요!!!)

.

 

.

이렇게 이미지 경로를 잡아주어야 합니다!

(이클립스 내에서 폴더 생성을 하고 이미지를 Ctrl+C / Ctrl + V로 밀어 넣으셔도 됩니다.)

이걸 안해주시면 당연히 이미지를 불러 올 수 없으므로 에러가 발생하겠죠?

자, 그럼 어떻게 빌드가 되었는지 한번 볼까요?

.

.

와아~ 이미지가 보여요!

이미지 중에 제일 작은 망고 이미지에 맞추다 보니 사과 사진이 좀 잘렸네요..ㅜ 나중에 업그레이드 시켜야겠습니다ㅎㅎ 그럼 다른 항목들은 괜찮은지 콤보박스를 이용해 목록을 바꿔보겠습니다.

.

.

오오.. 망고는 잘 맞고.. 바나나는 잘렸네요!ㅜㅜ 괜찮습니다!

지금은 GUI를 이용해 이미지를 가지고 놀아봤다는 거 자체로 만족할려고 합니다! 그리고 조금씩 실력을 키워서 저런 것들을 능숙하게 다룰 수 있도록 노력해봐야 겠습니다!

.

코드는 짧은데 포스팅이 길어지면 읽기도 지루하시겠죠?ㅋㅋ

(쓰는 저도 살짝 지루해질뻔...ㅎ)

그러므로 저는 이만 포스팅을 마무리하겠습니다. 다음 포스팅에서 만나요~

안녕~~~

+ Recent posts