변경점
web.xml
원래 /
였던 url-pattern을 *.do
로 바꿈.
root-context.xml은 이제 필요없다고 한다.
**
은 안 써도 되는데 하위 모든 폴더 뒤져서 찾아낸다는 뜻이라고 한다.
pdf 따라서 mapper dao service controller 만듦
url 이곳
http://localhost/web/main.do
더 추가할 수 있다.
build.gradle을 보면
지금 쓰는 게 mvnrepository에서 Gradle(Short) 버전이다.
- 스프링 레거시 (스프링)
<스프링 + view + DB>
스프링 + JSP + Mybatis
스프링 + JSP + JPA
스프링 + view(SPA) + JPA- 스프링 부트 (스프링 경량화)
스프링부트 + JSP + Mybatis
스프링부트 + JSP + JPA(ORM) //찾아보자
스프링부트 + Thymeleaf + Mybatis
스프링부트 + SPA + JPA(ORM)
스프링부트 + SPA + Mybatis
암튼 여러가지 분화 버전이 있따.
대체 가능성을 염두에 두고 있어야~~
#
은 주석이다.mybatis.type-aliases-package
: dto들
Maven update처럼
build.gradle 우클릭 - refresh gradle~
할 수 있다.
main/webapp/WEB-INF/views 경로를 생성
원래 톰캣으로 하게 돼있는게 아닌데(thymeleaf) 톰캣으로 설정(..?)
둘 중 뭐가 구동 파일인지 알아보자,,
/index를 매핑해주는 controller는 com.apple.web
패키지에 만들어준다. (따로 com.apple.controller
에다가 만들면 localhost/index url에서 안 뜨고 오류페이지를 보여주고 localhost/ 에서 뜬다)
taglibrary 오류가 떠서 build.gradle에 dependency를 추가해줘야 한다.
implementation 'jakarta.servlet:jakarta.servlet-api'
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
에서
<%@ taglib uri="jakarta.tags.core" prefix="c"%>
로 교체
application.properties에서
dto 패키지 경로를 적어주면
testMapper.xml에서 resultType을 패키지 경로 전체 안 적고 BoardDTO라고만 적어도 프로퍼티에 적어준 패키지 경로 밑에 있는 BoardDTO를 찾는다.
(패키지명)Application.java가 구동해주는 애다.
testMapper.xml에러는
체크 안 된 걸 체크하면 된다. (난 안해도 에러줄 안 그였지만)
index.jsp 첫줄 에러는
buildpath - Classpath에 tomcat이 없어서 그렇다.
add library - server runtime - tomcat
(근데 해결이 안된다)
템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어.
[WEB] 템플릿 엔진(Template Engine)
새 프로젝트
설정을 다시...
mariadb도 추가해줬다(저번에 했던 거에서)
타임리프도 추가해줬어야 했나보다
full url은 친구한테 보내주면 프로젝트 규모가 같아질 것.
com.apple.web.controller 아래에
index controller 만들고
resources 폴더 아래 templates 패키지에 index.html을 생성.(부트는 타임리프랑 짝궁이어서 알아서 잘 된다.)
이렇게 ERROR 뜬 건 심각 -> 프로젝트 실행이 안된다. (기억)
application.properties 내용을 가져온다.
jsp는 안 쓰니까 빼고.
Thymeleaf 말고 Freemarker라는 것도 있다.
jsp랑 얘네랑도 문법이 다 다르다
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
안써도 되지만 쓰는 게 좋다.
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>인덱스</title>
</head>
<body>
<h1>index</h1>
<span th:text="${text}">출력</span>
</body>
</html>
<span th:text="${text}">출력</span>
에서
th:text="${text}"
의 뜻은 출력
자리, 태그 안의 텍스트를 ${text}
로 바꾸겠다는 뜻이다.
결과는
pdf p6
이렇게 쓰면 string일 경우 따옴표도 알아서 붙여준다고 한다.
결과
<ul th:each="string : ${list}">
<li>[[${string}]]</li>
</ul>
<ul th:each="string : ${list}">
<li th:text="${string}"></li>
</ul>
둘 다 되는데,,, 뭐가 다를까?
<ul th:each="string, i : ${list}">
<li>[[${i.index}]] / [[${string}]] / [[${i.size}]]</li>
</ul>
이렇게 하면 안 찍힘.
선언하고 다음줄로 가면
<th:block th:with="name=나나"></th:block>
<div th:text="${name}">안 찍힘</div>
그 줄에서만 찍힘
<!-- 변수 선언 -->
<th:block th:with="name=나나" th:text="${name}"></th:block>
<div th:text="${text}">text가 찍힘</div>
<th:block>
으로 감싸고 있다면 그 안에서는 선언한 변수 사용 가능
<!-- 변수 선언 -->
<th:block th:with="name=나나바">
<div th:text="${name}"></div>
</th:block>
<h2 th:text="${t}">시간 찍어요</h2>
<div th:text="${#temporals.day(t)}">day</div>
<div th:text="${#temporals.month(t)}">month</div>
<div th:text="${#temporals.year(t)}">year</div>
<div th:text="${#temporals.hour(t)}">시</div>
<div th:text="${#temporals.minute(t)}">분</div>
<div th:text="${#temporals.second(t)}">초</div>
이건 안된다.
<!-- ||문자열 연결 -->
<div th:with="id=hachu" th:text="${id}님 반갑습니다."></div>
|
로 감싸줘야<!-- ||문자열 연결 -->
<div th:with="id=hachu" th:text="|${id}님 반갑습니다.|"></div>
<div th:text="1 > 2"></div>
이렇게 안 쓰고 gt
, lt
쓰기로 했다.
<div th:text="1 gt 2"> > </div>
<div th:text="1 lt 2"> < </div>
<div th:text="1 ge 2"> >= </div>
<div th:text="1 le 2"> <= </div>
<div th:text="1 ne 2"> != </div>
<div th:text="1 eq 2"> == </div>
<!-- 삼항연산자 -->
<!-- if(조건, 참, 거짓) -->
<div th:text="1 eq 2 ? '같아' : '달라'"></div>
<div th:text="1 + 2 == 3 ?'같아2'"></div> <!-- 거짓이 없을 때 -->
<div th:text="1 + 2 == 4 ?'': '달라3'"></div> <!-- 참이 없을 때 -->
꼭 다 들어있을 필요는 없다. 예를 들어 참 부분을 없애도 된다.
위처럼 저렇게 해야 출력이 됐다,,,
<div th:text="${#request}"></div>
<div th:text="${#response}"></div>
<div th:text="${#session}"></div>
<div th:text="${#servletContext}"></div>
<div th:text="${#locale}"></div>
오류메시지
java.lang.IllegalArgumentException: The 'request','session','servletContext' and 'response' expression utility objects are no longer available by default for template expressions and their use is not recommended. In cases where they are really needed, they should be manually added as context variables.
<div th:text="${session}"></div>
<div th:text="${param.no}"></div>
<a href="naver">http://www.naver.com</a>
<a th:href="@{/main}">main</a>
결과
localhost/naver
localhost/main
<a th:href="@{/detail(no=205)}">상세보기</a>
<a th:href="@{/detail(no-205, page=5)}">상세보기</a>
결과
/detail?no=205
/detail?no=205&page=5
역시
~~~