
1. JSTL ํจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ธํฉ๋๋ค.
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:forEach> ํ๊ทธ์์ varStatus๋ฅผ ์ฌ์ฉํฉ๋๋ค. varStatus์ ์์ฑ์ index, count, first, last ๋ฑ์ด ์์ต๋๋ค.<c:forEach items="${memberList}" var="member" varStatus="status">
fn:length() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ memberList์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ณ , ์ด๋ฅผ ์ด์ฉํ์ฌ ๋ฒํธ๋ฅผ ์ญ์์ผ๋ก ๋ง๋ญ๋๋ค. ๋ฒํธ๋ฅผ ์ญ์์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฆฌ์คํธ์ ์ ์ฒด ๊ธธ์ด์์ ์ธ๋ฑ์ค 0๋ถํฐ ๋นผ์ฃผ๋ฉด ๋ฒํธ๊ฐ ์ญ์์ผ๋ก ๋์ต๋๋ค.<%-- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ฌ ๋ฒํธ๋ฅผ ์ญ์์ผ๋ก ๋ง๋ญ๋๋ค --%>
<c:set var="reverseIndex" value="${fn:length(memberList) - status.index}" />
<c:forEach items="${memberList}" var="member" varStatus="status">
~~~~
<td style="color: blue">
${fn:length(memberList)-status.index}
</td>
~~
</c:forEach>
${์ ์ฒด ๊ฒ์๊ธ ์ - (ํ์ฌ ํ์ด์ง-1) * ํ์ด์ง๋น ๋ณด์ฌ์ง๋ ๊ฒ์๋ฌผ์(10) - status.index}
- ์ ์ฒด ๊ฒ์๊ธ ์ , ํ์ฌ ํ์ด์ง๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์์ model์ ์ถ๊ฐํ์ฌ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
<c:forEach items="${memberList}" var="member" varStatus="status">
~~~~
<td style="color:blue;">
${(pageInfo.numberOfBoard)- (pageInfo.currentPageNumber-1) * 10 - status.index}
</td>
~~
</c:forEach>

tr ํ๊ทธ์ onclick ์์ฑ์ ์ฌ์ฉํ์ฌ ํด๋น ํ์ ์ ๋ณด ๋งํฌ๋ฅผ ์ ๋ ฅํด์ค๋๋ค.
<tr onclick="location.href='ํ์ ์ ๋ณด ๋งํฌ'">
ํ ํด๋ฆญ ์ /member/id=?๋ก ์ด๋ํฉ๋๋ค.
<c:url value="/member" var="viewMember">
<c:param name="id" value="${member.id}"/>
</c:url>
<tr onclick="location.href='${viewMember}'">
<form ~token tag"><script>
function checkValues() {
const password = document.getElementById("pwdInput").value;
const passwordCheck = document.getElementById("pwdCheckInput").value;
if (password != "" && password == passwordCheck) {
return true;
} else {
alert("ํจ์ค์๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
return false;
}
}
</script>
onsubmit ์์ฑ์ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ์ ๋น๋ฐ๋ฒํธ ํ์ธ ์
๋ ฅ๋์ ๊ฐ์ ๋น๊ตํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.<input oninput="passwordCheck()" id="pwdInput" >
<input oninput="passwordCheck()" id="pwdCheckInput" >
function passwordCheck() {
const password = document.querySelector("#pwdInput").value;
const passwordCheck = document.querySelector("#pwdCheckInput").value;
if (password != passwordCheck) {
//๋ฉ์์ง ๋ณด์ฌ์ฃผ๊ธฐ
document.querySelector("#passwordMessage").textContent = "ํจ์ค์๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.";
} else {
document.querySelector("#passwordMessage").textContent = "";
}
}
oninput ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ passwordCheck ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.ํ์ ๊ฐ์ผ ํ ๋ ์ด๋ฉ์ผ ์ค๋ณต์ ํ์ธํ๊ธฐ ์ํด์๋ ํ๋ฉด์ ์ด๋ํ์ง ์๊ณ ์ด๋ฉ์ผ ์ค๋ณต ํ์ธ๋ง ํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๊ธฐ ์ํด ajax๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ajax๋ ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ ์๋ฒ ํต์ ์ ์ํด ํด๋ผ์ด์ธํธ๋ฅผ ์์ํ๋ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค. ๋ถ๋ถ์ ์ผ๋ก ํ์ด์ง๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
ajax๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์๋ฐ์คํธ๋ฆฝํธ์ fetch ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ajax๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌ
ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ , ๋ชจ๋ธ์ ๋ด์ง ์๊ณ view๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์๋ต๋ฉ๋๋ค.
1. ์ด๋ฉ์ผ ์ค๋ณต ํ์ธ ๋ฒํผ ๋ง๋ค๊ธฐ
<button onclick="emailCheck();" type="button" id="btnEmailCheck" ~>
2. ์ปจํธ๋กค๋ฌ
//์ด๋ฉ์ผ check
@GetMapping("email")
@ResponseBody
public String emailCheck(String email) {
String message = service.emailCheck(email);
return message;
}
@ResponseBody๋ฅผ ์ฌ์ฉํฉ๋๋ค.3. ์๋น์ค
public String emailCheck(String email) {
Member member = mapper.selectByEmail(email);
if (member == null) {
//์ฌ์ฉ ๊ฐ๋ฅํ ์ด๋ฉ์ผ
return "์ฌ์ฉ ๊ฐ๋ฅํ ์ด๋ฉ์ผ์
๋๋ค.";
} else {
// ์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฉ์ผ
return "์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฉ์ผ์
๋๋ค.";
}
}
4. mapper
@Select("SELECT * FROM member WHERE email = #{email}")
Member selectByEmail(String email);
5. emailCheck() ํจ์
async function emailCheck() {
const emailValue = document.querySelector("#emailInput").value;
const url = "/member/email?email=" + emailValue;
//ajax ์์ฒญ
const response = await fetch(encodeURI(url));
// ์๋ต์ฒ๋ฆฌ
// console.log(response.text());
alert(await response.text())
}
emailInput ์์์ ๊ฐ์ ๊ฐ์ ธ์ /member/email?email=?๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์ด๋ฉ์ผ ๊ฐ์ ์ฟผ๋ฆฌ ๋ฌธ์์ด๋ก ์ ๋ฌํฉ๋๋ค.fetch() ํจ์๋ await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ reponse ๋ณ์์ ์ ์ฅํฉ๋๋ค.response.text() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ ํ์์ผ๋ก ์๋ต์ ๊ฐ์ ธ์ await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๊ธฐ๋ค๋ฆฐ ํ, alert() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต ๋ด์ฉ์ ์๋ฆผ์ฐฝ์ผ๋ก ํ์ํฉ๋๋ค.async ํจ์ ์์์ await ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋ ๋๊น์ง ํจ์๊ฐ ์ผ์ ์ค์ง๋๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ์์ฒ๋ผ ์์ฑํ ์ ์์ต๋๋ค.async : ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ก ์ ์ธํ๋ ํค์๋์
๋๋ค. ์ด ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ ๋ด์์ await ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.await : ๋น๋๊ธฐ ํจ์ ๋ด์์ ์ฌ์ฉ๋๋ฉฐ, Promise๊ฐ ์ดํ๋ ๋๊น์ง ํจ์์ ์คํ์ ์ผ์ ์ค์งํฉ๋๋ค. ์ดํ๋ ๊ฐ์ด๋ ์ดํ๋ Promise์ ๊ฐ์ ๋ฐํํฉ๋๋ค.
emailCheck()ํจ์๋ ๋น๋๊ธฐ ํจ์๋ก ์ ์ธ๋์ด ์๊ณ ,fetch()ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํดawaitํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ AJAX ์์ฒญ์ด ์๋ฃ๋ ๋๊น์ง ํจ์๊ฐ ๋ฉ์ถ๋ฉฐ, ์๋ต์ ๋ฐ์ ํ์์ผ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.