본문 바로가기

국비과정/Spring

20230714 _[30일차]_01. Spring 맛보기3

오늘자 프로젝트생성 & 버전변경

오늘은 [ HomeController.java ] & [ home.jsp ] 삭제하고 직접 만들어보자

 

 

[ IndexController.java ] 클래스 생성

@Controller 선언

 

http://localhost:8080/web/

                                    슬러시가 들어왔을 때  =>  첫화면일때  index.jsp 파일로 보내겠다

views 폴더안에 

   [ index.jsp ] 생성 (UTF-8은 미리 해줬으니 잘 설정되어있음)

 

 

 / (슬러시) 요청이 들어온다면 index.jsp (첫화면)를 열어서 보여줌


한글사용하겠다고 <html lang = "ko"> 라고 선언하기도 함 (생략가능)

<meta charset="utf-8"> 만 있어됨! 


( 검색엔진 최적화_SEO )

검색엔진 최적화(SEO), 가장 효율적인 방법은? | 가비아 라이브러리 (gabia.com)

 

가비아 라이브러리

IT 콘텐츠 허브

library.gabia.com


[ index.jsp ]

main으로 보내는 a 태그(링크) 추가 

첫화면에 main 링크생성

눌러보면 연결은 안됨 (404 에러화면 뜸) _ main.jsp 파일이 없으니까

* 단축키 *

shift + end  : 문장한줄 전체선택

ctrl + shift + ? : 주석처리

 

web.xml 에서 에러페이지 처리하는거 만들자

404에러가 뜬다면 '/error404' 요기 위치로 이동해라

 

실행해보면 error 페이지가 없다고 나옴

콘솔창에 요렇게 뜸

WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/web/error404] in DispatcherServlet with name 'appServlet'
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/web/main] in DispatcherServlet with name 'appServlet'
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/web/error404] in DispatcherServlet with name 'appServlet'

 

 

이제 404에러를 위한 페이지인 error404 페이지(error404.jsp파일)를 만들어보자

 

ErrorController.java 클래스 생성

@Controller 선언해주고

@GetMapping 으로 error404 페이지로 보내주는 로직 만들어.

다시 정리하자면 위에서 설정해준 부분에 이어서 최종적으로는 jsp페이지를 반환하도록 설정해준거.

404에러가 뜬다면 '/error404' 요기 위치로 이동  =>  '/error404'  요청이 들어오면 error404.jsp 리턴

 

[ error404.jsp ] 파일 생성 

이제 첫화면에서 main 클릭해서 이동해보면 (404오류가 뜨니까)

내가 설정한 404에러페이지(error404.jsp)로 이동


에러를 이미지로 화면에 나타내보자

 

https://www.iconfinder.com/

 

7,600,000+ free and premium vector icons, illustrations and 3D illustrations

Iconfinder is the world's largest marketplace for icons, illustrations and 3D illustrations in SVG, AI, and PNG format.

www.iconfinder.com

무료이미지 골라와서 png (배경없는 이미지)로 저장

 

error.png 이미지를 resources 폴더에 넣어줌

이미지 파일 열어보면 위에 나온것처럼 이미지 저장경로 확인가능

 

[ error404.jsp ] 에서 body 에 img 태그로 이미지 넣기

<img alt = "(이미지 안뜨면 나올 글자)" src = "(이미지경로)" > 

src 경로에서 맨앞의 콤마 (==> 이게 그... 뭐가 있었는데 기억이 안나 찾아보기 )를 지우면 이미지를 못불러옴 

 

img폴더 만들어서 이미지들 넣어주고 경로 아래처럼 재설정

( img가 여러개인 경우 복잡하니 img용 폴더를 따로 생성하는게 좋음)

이미지 폴더 경로 추가

 

[ servlet-context.xml ] 에서 아래처럼 resources 경로 설정해주면

*** 오타주의 ***

 

[ error404.jsp ] 에서 resources 까지 안써줘도 알아서 경로를 잘 찾아감.

 

이렇게 에러페이지도 원하는대로 설정해 줄 수 있지만 

error 발생 이유를 확인하기 힘드니까 개발단계에서는 주석처리 해주는게 좋음


 

Project - BuildAutomatically 체크  => 자동 서버 재가동


com.phyho.web 패키지 아래에

[ BoardController.java ] 생성

@Controller 선언

 

1. board리스트 관련화면 만들자

/board 요청을 받으면 board.jsp화면을 보여줘

[ board.jsp ] 생성

index.jsp 에서 board.jsp로 연결하는 게시판 (a링크) 만들어주기

 

그럼 첫화면( index.jsp) 에서 게시판 링크를 누르면

board.jsp 화면으로 넘어가서 아래처럼 뜸


이번에는 Model 사용해서 페이지를 넘겨보자

 지정한 이름으로 데이터를 보낼 수 있음

 

model.addAttribute("name", "1234"); 

                                  name    value

 

board.jsp 에서 "name"을 찍으면 1234가 나옴


서비스를 만들자

[ BoardService.java ] 클래스 생성

@Service 선언

 

컨트롤러는 흐름제어만 하고 일을 하는 애가 서비스 

컨트롤러에서 @Autowired 사용해서 서비스와 연결

BoardController 에 

Integer 타입인 list를 생성하고

service에게  boardList() 메소드를 실행하라고 시킴

 

일처리 결과값인 list는  addAttribute () 메소드를 사용해서

 "list"라는 이름으로 model에 넣어보내!

이제 BoardService  boardList()  메소드생성 

내부에 Integer타입인 list 생성하고 for문으로 정수(1~10)값들 넣어주기

(위에서 리턴값 list로 바꿔줘야함***** null을 보내서 오류남 -> 아래 캡쳐 참고)

이제 list 출력해보자 

 


[ BoardController.java ] 

서비스가 일을해서 가져온 list의 사이즈가 1보다 크다면 (데이터가 있다면)

"list" 라는 이름을 붙여서 list의 값을 가지고 board로 가세요

 

데이터 유무를 .isEmpty() 메소드로 다시 표현해보면

/board 요청에 대해

list가 비어있지 않다면, board.jsp 로 이동

list가 비어있다면, index.jsp (첫화면) 로 이동

 

다시 첫화면으로 돌아갈 때는 redirect 이용! 다시 컨트롤러를 지나서 가도록!


list의 데이터를 없애고(비어있음),  index.jsp(첫페이지)에서 게시판을 클릭해보면 그냥 같은 페이지가 뜬다 

페이지는 똑같지만 위의 주소창에 model에 붙인 값이 불러와진걸 보면 컨트롤러를 지나온거 => redirect 실행됨.


저장소 추가할건데 전자정부랑 파일업로드 부분 빼고 (pdf순서대로) 가져와보기

버전수정도 해주기


[ servlet-context.xml ]  하단부분에

 

<beans:import resource="classpath:/spring/*-context.xml"/>  추가

=>  spring폴더아래 ~context.xml 로 끝나는 파일 가져올거다. 

 

* 만약 spring 폴더 아래 다른폴더들이 있다면 요렇게 

<beans:import resource="classpath:/spring/**/*-context.xml"/>


src/main/resource 아래에 spring 폴더 생성

spring폴더에 xml 파일 만들건데 요렇게 선택해서

 

Next 

Next를 눌러서

 

빈즈에 체크하고 Next - Finish

그럼 요렇게 database-context.xml  파일 생성

 

 

DB와 연결을 위해서 pdf에 있는 bean들 넣어주고 계정연결

 

src/main/resource 아래에

   mybis 폴더 생성

       config, mappers 폴더 생성

각각의 폴더 안에 xml 파일들 넣어 _ 파일들은 단톡

 

 

 

[ board-mapper.xml ] 에 

resultType 으로 DTO 넣어주고, 실행할 쿼리문 작성

SELECT * FROM board LIMIT 10

데이터 일단 10개만 가져와보자

 

 

[ BoardDTO.java ] 클래스 생성 & 게시판 필드들 변수선언

getter / setter 생성

 

 

[ BoardDAO.java ] 생성하고

@Repository 선언

@Autowired 선언 _ SqlSession연결_ database-context.xml 에 beans로 이미 연결되어 있어서 사용가능

SqlSessionFactory&SqlSession 관련해서 정리된 글 참고하기 *

 

BoardService.java

(있던 for문 list 출력문 지워주고) 

@Autowired 선언

DAO한테 boardList() 메소드 진행하라고 일시켜

BoardDAO.java 에서는

sqlSession 한테 selectList() 메소드로 값들 가져오라고 일시킴

그전에 list타입을 Integer => BoardDTO로 바꿔줌

다른 곳들에서도 list타입 Integer => BoardDTO 로 바꿔줌

 

BoardService 에서도 바꿈

BoardController 에서도 바꿈

 

오류***

namespace = "boardtest" 로 되어있어서 아래의 오류가 났었음  => namespace = "board"로 수정필요

 

board-mapper.xml 에서의 namespace랑  DAO에서 불러올때의 이름을 맞춰줘야함

 

이제 첫페이지에서 게시판 눌러보면 데이터 가져오기 성공


팀뽑기 

 


board.jsp 에 테이블생성

상단에 core 태그 선언문 추가

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

 

최신글 10개만 가져와보기

쿼리문 변경 : SELECT * FROM board ORDER BY bno DESC LIMIT 10

=>  bno 역순(DESC)으로 10개 가져오기

출력결과


btitle (제목) 에 detail 페이지로 보내는 a링크 추가

요기 캡쳐에서 따옴표주의

 

2. detail 상세보기 화면 = detail.jsp

 

BoardController.java 에서

/detail 요청이 들어오면 detail로 보내는 로직 생성

(클릭하는 글번호) 요청 글번호인 bno를 가져와서 콘솔창에 출력

출력문 정리하고 출력해보자

게시판에서 128번 글의 제목을 눌러보면 해당 글 번호가 아래처럼 주소창에 뜨고 콘솔창에도 뜸


Collection(list 등등) => size() 메소드

String(스트링) => length() 메소드

Array(배열) => .length (상수)


[ 주소창 검사 ]

 

(방법1) 

for문사용

 

Charactor 클래스의 메소드

* isDigit() : 주어진 값이 숫자인지 아닌지 판단해서 true / false 로 반환

 

Character.isDigit(bno.charAt(i))

 클래스      숫자야?      

 

숫자면 콘솔창에 참 (true)

숫자가 아니면 콘솔창에 거짓 (false) 

=> 주소창 bno에 '1번' 이라고 입력해보면 

		for (int i = 0; i < bno.length(); i++) {
			System.out.println(Character.isDigit(bno.charAt(i))); 
		}

 

(방법2)

try / catch 사용

 

숫자면 콘솔창에 "숫자입니다." 출력

숫자가 아니면 콘솔창에 "숫자가 아닙니다" 출력