JSP & Servlet

56. model 데이터를 구조화하기

컨트롤러 - 뷰로 나누엇다. 사실 프로그램만들때는 나눠도되고아니어도된다. 프로그램의 크기, 상황, 숙련도에따라 나눠도 안나눠도 된다. 방법의 차이임.
사용자는 관심도 없다. 만드는 방법은 만드는사람은 어떻게 만드는게 유지보수가 편한지를 정하려는 것이다.
데이터를 구조화하지않아서 view단을 정리하지 못햇다
request.setAttribute("title", title);
request.setAttribute("writerId", writerId);
request.setAttribute("regdate", regdate);
request.setAttribute("hit", hit);
request.setAttribute("files", files);
request.setAttribute("content", content);
출력을 위해 이런 데이터를 사용했다. 이런 데이터를 한단어로 말하면 개념적으로 '공지사항'이라 표현할수잇다. 개념적으로 말할수잇는데이터집합을 NTT 객체라고한다.
이걸 묶어서 또 구조적인 데이터라고 한다. 데이터를 속성으로 대체하고 묶어서 표헌하는게 좋다.
-> request.setAttribute("notice", notice);
Notice를 객체화해서 notice.id이런식으로 꺼내쓰기
getId 게터 메소드를 ${notice.id} el로 작성하면 꺼내쓸수잇다.
notice.java보기
1.생성자로 담기
Notice notice = new Notice(id, title, regdate, writerId, hit, files, content);
request.setAttribute("n", notice);

57. 목록페이지도 MVC model2

여러개의 목록을 보여줘야하니 List컬렉션에 객체를 담는다.
List<Notice> list = new ArrayList<>();
list.add(notice);
request.setAttribute("list", list);
RequestDispatcher dispatcher = request.getRequestDispatcher("/notice/list.jsp");
dispatcher.forward(request, response);
그래서 이담은 리스트를 담고 포워드해서 보내기

${list[0].writerId}이런식으로 하나씩 담아서 보여줄수있는데 이것을 어떻게 반복으로 뽑아낼수잇는가?
el에서 반복능력이잇는가? 없다.
반복문을 사용하기 위해 따로 태그라이브러리를 사용하기도하지만 이번에는 코드블록으로 하자.
List<Notice> list = (List) request.getAttribute("list");
for(Notice n : list){
pageContext.setAttribute("n",n);
${n.id} //이런식으로 담기
}
pageContext에 담아서 사용한다.

58. View페이지 은닉하기

컨트롤단이 뷰단에서 만들어졌는데 습관적으로 뷰단에서 실행하려고 한다.
사용자가 요청할수 있는데에 잇어서 요청이 가능해진다. 그러나 컨트롤러가 선택적으로 하기 위해 얘가 나오게 하면안된다.
아예뷰단을 사용차가 요청할수없는데에 넣어야한다.
WEB-INF에 넣기!
컨트롤러를 사용하기 위해 동적으로 만든페이지이기 대문이다.
request.getRequestDispatcher("/WEB-INF/view/notice/detail.jsp");
request.getRequestDispatcher("/WEB-INF/view/notice/list.jsp");
이런식으로 컨트롤러 링크 바꿔주기

59. View(list.jsp)에서 반복문 제거하기

뷰단에서 흐름제어를 위한 자바코드블록을 제거해보자
개념에 맞게 만들었다면 코드블록이 없어져야한다.
그래서 '태그'를 사용한.
보통 태그란 감싸는 것이 무엇인지 WHAT에 대한 내용인데
<forEach> 이녀석은 행위에 해당되는 내용이다. 액션을 가진 태그로 사용한다.
이것을 사용하려면 라이브러리를 다운받아야함
https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
태그사용하는 라이브러리
jstl-1.2 라이브러리 설정하기
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>일 넣어서 사용해야함.
{c:컨트롤스페이스}하면 사용할수 있는 목록들이 나온다.
이중 <c:forEach var="n" items="${list}">
items: 저장소에 담긴거를 뽑아서 담을수잇다. 그리고 반복될때마다 꺼낸것을 담을것 var="n"하면 pageContext에 담아준다.
저장소에서 값을꺼내서 담는것 el이해주고 이것을 담는것을 forEach에서 해주는것.
태그를 사용해서 담는것이 자바코드로 담는것보다는 이해하기 쉽다.

60. Tag 라이브러리와 JSTL

JSTL이란 JSP Standard Tag Library이다.
제어를 담당하는것이다.
5가지범주
Core 태그라이브러리가 필요로하는 제어의 행위
Formation 숫자 날짜 등 포맷하는거
Functions 데이터를 el을 통해서 꺼내쓰는데 저장소의 데이터를 쓸때 문자열을쪼개쓰거나 대소문자할때 이것을 조작하는것임.
SQL, XML은 있지만 사용하지 않는게 좋다. 코드의 구성이 깨지게 되서 사용안함.


1.Core
c:접두사를 사용하지 않으면 재스퍼가 Htmlㅣㅇㄴ지 아닌지 이해하지 못한다.
그래서<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
로 접두사를 제공하고 jstl을 사용한다는 uri를 제공한다.
TagSupport라는 클래스를 만든다고 해보자.

태그를 만들고 사용하기 위해서는 .tld라는 확장자를 가진 태그Descripotor 태그설명서를 만들어줘야한다.
uri는 만든 태그를 식별하기 위해서 만드는 것임.
도메인명이들어가서 다른사람이 만든거와 충돌하지 않도록 하기 전세계에서 유일한 이름을 만들기
이 태그 식별코드를 매번 넣기에는 너무 길기때문에 c라는 접두사에 넣는다는 것을 의미한다.
재스퍼가 taglib임을 알 수 있게 함.
각각의 이벤트에서 발생하는 행위를 하고싶을때 하는것임.

과거에는 이렇게 따로 만들어서 사용했지만 이제 굳이 그럴필요는 없다.

61. 중간 요약 정리

코어부분이외의 추가적인 옵션정보들을 사용해보자.

62. forEach의 속성 사용하기

http://www.notepubs.com사용방법올려주신뎃는데 안올려주심


흰색으로 된부분만 배운다.
begin="" end="" 반복되는 것에서 범위를 한정할 수 있다.
인덱스로따졋을때 0부터시작해서 보여줌
무엇을 기준으로? 반복해서 사용하는 인덱스와 비교해서 사용함.
인덱스를 보고싶다면? varStatus="st"

${st.current} 현재 반복되는 아이템
${st.index} 현재 반복되는 반복 인덱스(0부터 시작함)
${st.count} 현재 반복 횟수
${st.first} 현재 아이템이 첫번째 아이템인지를 알려줌(true 또는 false)
${st.last} 현재 아이템이 마지막 아이템인지를 알려줌(true 또는 false)
${st.begin} begin 속성에 설정한 값
${st.end} end 속성에 설정한 값
${st.step} 반복되는 인덱스의 증가치


${st.index + 1}(인덱스0부터시작이니 +1해서 1부터) / ${n.id}을하면
1/1 1/2 이런식으로 출력이되게됨

63. JSTL : forEach문으로 Pager 번호 만들기

page로 만들기
<ul class="-list- center">
<li><a class="-text- orange bold" href="?p=1&t=&q=" >1</a></li>이부분
레코드가 많아지면 1,2,3,4,5이런식으로 보여지게하고 페이지에 맞게 들어가지게하기
하나씩 복사가아닌 반복문으로 하는게맞다.
클릭했을때 겟요청도하기
<c:forEach var="i" begin="0" end="4">
<li><a class="-text- orange bold" href="?p=${1+i}&t=&q=" >${1+i}</a></li>
그런데 만약 15까지 있는데 7을 선택햇다면? 710이런식으로 나와야한다.
번호를 요청하는 페이지에 따라서 만들기
번호를 만드는 매개값
?p=3 ->15 ?p=17 ->1620 일련번호에 맞게 페이지번호가 나올수있도록 해야한다.
이걸어떻게 구현할것인가? 그런데 이건 일정패턴을 가지고있다.
시작번호가 몇번인지 startNum=???을 사용해서 할수잇고 이 시작번호는 페이지파라미터로 만들수잇다.
현제 번호에서 거리만큼 빼주기
page=3 -> 3 -(3-1)%5 -> 1 이런식으로하면 자신의 스타트 번호를 찾을수있다.
따라서 startNum = page - (page -1)%5; 그래서 이page부터 만들어야함.
<c:set var="page" value="${(param.p = null)?1:param.p}" />
<c:set var="startNum" value="{page - (page -1)%5}" />
JSTL의 set을 사용하면 임시 변수를 만들 수있다.
<c:forEach var="i" begin="0" end="4">
<li><a class="-text- orange bold" href="?p=${startNum+i}&t=&q=" >${startNum+i}</a></li>

64. JSTL : if 문으로 Pager 이전/다음 번호 만들기

<a href="?p=${startNum+5}&t=&q="class="btn btn-next">다음
<span class="btn btn-next" onclick="alert('다음 페이지가 없습니다.');">다음
다음페이지가 있다면 pager가 5추가된 페이지가 나오도록하기 없다면 경고문나오게하기
이를 위해서는 jstl의 if를 사용할 수 있다.
else if가 없기때문에 배타적으로 만들어서 if문에 넣어야한다.
db에연결해서 조건을 설정해주어야하지만 일단 가상으로 lastNum 23으로해서 해보자
상호배타적인 if문을만들어서 하나씩만 나오게 만들기.
페이저를 만드는게아니라 if문을 사용하는 것을 배우는 장이다.

list.jsp 211~ 예제참조
<c:set var="page" value="${(param.p == null)?1:param.p}" />
<c:set var="startNum" value="${page - (page -1)%5}" />
<c:set var="lastNum" value="23" />
<c:if test="${startNum> 1}">
<a class="btn btn-prev" href="?p=${startNum-1}&t=&q=">이전</a>
</c:if>
<c:if test="${startNum<= 1}">
<span class="btn btn-prev" onclick="alert('이전 페이지가 없습니다.');">이전</span>
</c:if>

65. JSTL : forTokens로 첨부파일 목록 출력하기

첨부파일을 서버에 올릴건데 이 파일목록을 컬럼하나에 ','로 구분해서 올릴건데 이것을 어떻게 구분할건지 알아보자.
test.zip, aa.gif, bb.png 이런식으로 넣고 하나하나 하이퍼링크로 감싸야한다.
${n.files} 단일화된게 아니라 ,로 구성된 목록이다.
<c:forTokens items="${n.files}" delims=",">
,단위로 items를 잘라주면 토큰이 만들어지고 이것을 반복해라 변수이름을 만들어서 거기에 담기.
<th>첨부파일</th>
<td colspan="3">
<c:forTokens var="filename" items="${n.files}" delims=",">
<a href= "${fileName}"> ${fileName}</a>
</c:forTokens>
</td>
각각 하이퍼링크가 되서 나온다.
문자사이에 구분자를 넣고싶다면? 넣고싶은 것을 그냥 forTokens사이에 넣어주면된다.
<c:if test="${!st.last}">
/
</c:if>
그런데 마지막문자에는 안나오게 하고싶으니 last가 아닐경우만 나오게 if문을 작성해주자

66. JSTL : format 태그로 날짜 형식 변경하기

${n.regdate}이부분 날짜 형태가 db에는 연월일 시간 초 인데 왜 이것만 나오는지 궁금하다.
이것을 해결하기 위해 어떻게 해야할까?
날짜는 db에 큰 정수로 저장된다. jsp에게 내가 원하는 방식으로 나타내고 싶을때?
구글에 jstl format검색해보고 정리된 종류를 보자
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=imf4&logNo=220654812087
블로그참조
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
을 사용해서 fmt라는 변수에 담아주자.
formatDate 날짜 정보를 담고 있는 객체를 포맷팅하여 출력할 때 사용한다.
<fmt:formatDate pattern="yyyy-MM-dd hh:mm:ss" value="${n.regdate}"/>
월MM 분 mm이니 구분잘하자.

67. JSTL : format 태그로 숫자 출력 형식 지정하기

JSTL:formatNumber
조회수로 해보자 단위를 나누지 않았으니 큰 숫자로 해보자 일반적으로 세자리마다 ,를 넣는다.
<fmt:formatNumber value= "${n.hit}"/>
지정하지않아도 알아서 0,000형태로 보여준다. 원하는데로 변경하고자하면?
https://treasurebear.tistory.com/43 참조
type = "{number | currency | percent}"
pattern = "패턴" ###.### 111.111
currencySymbol="화폐 단위"
groupingUsed="{true | false}"
var="변수 이름"
scope="{page | request | session | application}"
이런식으로 필요한 태그들을 검색해보면서 사용해보자.

68. EL에서 함수 이용하기 JSTL:functions

문서내에서 포맷을 바구는 것도 좋지만 문서내 문자열을 조작하고 싶을때 사용함.
자주사용하지는 않지만 가끔 사용한다.
만약 첨부파일 이름을 전부 대문자로 바꾸고싶다면? 1.db에서 이름다바꾸기 2.출력만바꾸기
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>역시나 추가해주기

특이하게 사용한다. el표기안에서 함수호출하는 패키지 형태로 만든다.
${fn:toUpperCase(fileName)}
조건처리?
<c:forTokens var="fileName" items="${n.files}" delims="," varStatus="st">
<c:if test="${fn:endsWith(fileName, '.zip') }">
<c:set var="style" value="font-weight:nomal; color:#979797;"/>
</c:if>
<a href= "${fileName}" style="${style}">${fn:toUpperCase(fileName)}</a>
<c:if test="${!st.last}">

좀더 복잡한 함수가 필요하다면? 어쩔수없이 함수를 만들어서 클래스파일을 만들고 추가할 수 있다.
jstl function custom exapmle등 검색해서 해보자.
그런데 여기에 복잡한 함수를 넣는다면 정상적으로 하고있는건지 고민해볼 필요가잇다. 데이터변경을 뷰에서 하는게 맞는가?를 고민해보자.

69.기업형으로 레이어를 나누는 이유와 설명

코드분리를 위한 사전설명
기업형일 때는 수많은 사람들이 협업을해서 만든다. 코드를 세분화하게 분담하는데 이것을 나누는 방법.
컨트롤러가 사용차 입출력을하면서 업무처리도 했음. 혼자하면 이렇게 해도되는데 사람이 많아지면 나눠서 해야함.
경험이 적은사람 입출력만들기 경험적은사람 업무서비스(트랜잭션) 만들기
업무서비스는 바꿀일이 별로 없기때문에 분리되어서 화면을 변경할때 부담이 낮아진다.
예를들어 .계좌이체()
때로는 데이터서비스 db를 활용할때 식별문을 이용할때 다른쪽에서 바뀐다면?
업무서비스를 처리할때 데이터가 바뀌는 것을 신경쓰기 싫다.
데이터만 소스를 숨기는 데이터만 처리하는 것을 담당하는 것을 만들 수도있다.
그래서 1.입출력하는 컨트롤러 2.업무서비스 3.실제 데이터를 조작하는 부분
데이터를 하는사람은 sql문을 작성할수있는사람이 객체로 담아서 넘겨줌. 업무는 model을 만들어서 컨트롤러에 담고 뷰에서 보여지게 한다.


먼저 컨트롤러-업무서비스만만들고 dao를 분리하며 어떤문제가있는지 이걸 어떻게 처리하는지 스프링을 배우고자 한다.

70. 서비스 함수 찾아내기

서비스로 어떤 함수를 구현할지를 찾아내보자. 별도의 클래스로 만들어 낼것이다. 데이터베이스 이용하는 코드를 어떻게 나눌것인가?
시스템 단위로써 만들것이다.


관리자는 회원이 하는일을 할수 있어야하기 때문에 상속관계로 둔다.
먼저 구체적인 서비스들은 공지목록조회 공지상세조회 만들고 관리자 페이지에서는 다른 것들을 추가하기.
사용자할수있는것 1.페이지 요청 list나옴 2.15목록 페이지 요청 3.검색요청
-> 서비스해줘야할 내용은 기본적으로 NOTICE이다.
1.getNoticeList() 최근글로부터 10개주기 2.getNoticeList(int page)
3.getNoticeList(String filed, String query, int page)
검색내애서 페이지를 또볼수있으니 페이지도준다.
빼먹지말것: 현재페이지의 계수
4.getNoticeCount() 전체 목록 아무런인자x 1
2에 넣을거
5.getNoticeCount(String filed, String query) 검색시 3에넣을거
5개의 함수가 서비스함수로 필요하다.
detail에서 페이지 요청 사전조건 id를 넘겨받는다.
getNoitce(id)
밑부분에 다음글 이전글 getNextNoitce(id) getPrevNoitce(id)
페이지를 만들때 데이터가 필요하면 각 작업을 하는 역할자가 따로있는것임 서비스 레이어가 따로있게 되는 것임.
데이터가 필요하거나 수정하고자하면 그 쪽으로 가서 하게되는것임.

2023.01.03 후기

뭔가 꼬이고 있다. 잘 해결됬으면 좋겠다.
중요한 것은 꺾이지 않는 마음

'기초단계 > JSP&Servlet' 카테고리의 다른 글

2023.01.06 JSP & Servlet  (0) 2023.01.07
2023.01.04 JSP & Servlet  (0) 2023.01.05
2023.01.02 JSP & Servlet  (0) 2023.01.02
2022.12.31 JSP & Servlet  (0) 2022.12.31
2022.12.30 JSP & Servlet  (0) 2022.12.30

+ Recent posts