Spring Boot
[Ajax] 학생정보시스템 목록 조회, 학급별 목록 조회 (insertAdjacentHTML)
머리방울
2022. 9. 12. 21:13
목록조회(학생목록조회 -> ajax 사용하지 않음, 학급목록조회 -> ajax 사용)
1. mapper
1. 학급목록 조회
<select id="classInfo" resultMap="classInfo">
SELECT CLASS_CODE
, CLASS_NAME
FROM CLASS_INFO
ORDER BY CLASS_CODE
</select>
2. 학생목록정보
<select id="stuInfo" resultMap="student">
방법1 조인
SELECT STU_NUM
, STU_NAME
, STU_AGE
, CLASS_NAME
FROM STUDENT_INFO S, CLASS_INFO C
WHERE S.CLASS_CODE = C.CLASS_CODE
<if test="_parameter!=0">
AND S.CLASS_CODE = #{classCode}
</if>
ORDER BY STU_NUM
방법2 서브쿼리
SELECT STU_NUM
, STU_NAME
, STU_AGE
, (SELECT CLASS_NAME
FROM CLASS_INFO
WHERE CLASS_CODE = S.CLASS_CODE) AS CLASS_NAME
FROM STUDENT_INFO S
<if test="_parameter!=0">
★ int넘기니까 getter 사용불가
controller에서 전체 목록조회 시 classCode를 0으로 줬기 때문에
0이 아닐때만 실행 되도록 한다.
즉, classCode가 1,2,3 일 때는 자바반, 캐드반, 디자인반이 선택된다
WHERE CLASS_CODE = #{classCode}
</if>
ORDER BY STU_NUM
</select>
3. mapper
<mapper namespace="stuMapper">
<resultMap type="kh.study.ajax.vo.ClassVO" id="classInfo">
<id column="CLASS_CODE" property="classCode"/>
<result column="CLASS_NAME" property="className"/>
</resultMap>
<resultMap type="kh.study.ajax.vo.StudentVO" id="student">
<id column="STU_NUM" property="stuNum"/>
<result column="STU_AGE" property="stuAge"/>
<result column="CLASS_CODE" property="classCode"/>
<result column="STU_NAME" property="stuName"/>
<result column="CLASS_NAME" property="className"/>
</resultMap>
2. 인터페이스, serviceImpl
학급목록
List<ClassVO> classInfo();
학생목록
List<StudentVO> stuInfo(int classCode);
@Service("stuService")
public class StudentServiceImpl implements StudentService {
@Autowired
SqlSessionTemplate sqlSession;
학급목록
@Override
public List<ClassVO> classInfo() {
return sqlSession.selectList("stuMapper.classInfo");
}
학생목록, select박스에서 번호 선택했을때 실행되도록 classCode 넣음
@Override
public List<StudentVO> stuInfo(int classCode) {
return sqlSession.selectList("stuMapper.stuInfo", classCode);
}
3. controller
@Controller
@RequestMapping("/stu")
public class StuController {
@Resource(name = "stuService")
private StudentService stuService;
학생목록화면
@GetMapping("/list")
public String selectStuList(Model model) {
model.addAttribute("classInfo", stuService.classInfo());
model.addAttribute("stuInfo", stuService.stuInfo(0));
return "stu_manage";
}
@ResponseBody
@PostMapping("/getStuListAjax")
public List<StudentVO> getStuListAjax(int classCode) {
선택된 학급의 학생 목록 조회
List<StudentVO> list = stuService.stuInfo(classCode);
데이터 넘기기
return list;
}
4. html
<body>
<table class="layout">
<colgroup>
<col width="50%">
<col width="50%">
</colgroup>
<tr>
<td>
<div style="margin-bottom: 30px;">
<select name="classCode" onchange="changeClass();">
(onchange(); 변화 JS 작성)
<option selected value="0">전체</option>
<option th:each="classInfo:${classInfo}"
th:text="${classInfo.className}"
th:value="${classInfo.classCode}"></option>
</select>
</div>
<div>
<table class="stu">
<thead>
<tr>
<td>학번</td>
<td>이름</td>
<td>나이</td>
<td>학급명</td>
<td></td>
</tr>
</thead>
<tbody>
<tr th:each="stu : ${stuInfo}">
<td th:text="${stu.stuNum}"></td>
<td><span th:text="${stu.stuName}"</td>
<td th:text="${stu.stuAge}"></td>
<td th:text="${stu.className}"></td>
<td><input type="button" value="삭제"></td>
</tr>
</tbody>
</table>
</div>
</td>
<td id="detailTd"></td>
</tr>
</table>
<script src="https://code.jquery.com/
jquery-latest.min.js"></script>
<★jquery 실행>
<script type="text/javascript" th:src="@{/stu_manage.js}"></script>
★static폴더 기준
</body>
5. onchange(); js
학급이 변경될 때 실행되는 함수(onchange();)
function changeClass(){
1) classCode값 가져오기
const classCode = document.querySelector('select').value
2) ajax 시작
$.ajax({
url: '/stu/getStuListAjax', ,<-요청경로
type: 'post',
data: {'classCode': classCode}, <-필요한 데이터
3)쿼리작업 끝난 후
success: function(result) { ★return 값 받음
controller 실행 후 자동실행 할 구문
i) 테이블을 다시 그려준다(테이블의 thead, tbody 만들기)
const stuList = document.querySelector('.stu');
(테이블에 class ="stu"로 지정함)
2) tbody 삭제
★select에서 학급을 선택했을 때
기존 내역 삭제하기 위해 tbody 내용 지우기
thead는 동일하니까
//const tbody = document.querySelector('stu > tbody'); 방법도 가능
const tbody = stuList.querySelector('tbody');
stuList.removeChild(tbody);
3) 추가할 태그 생성
let str = '';
4) 새로 들어갈 내용
str += '<tbody>';
for (const stu of result) {
str += '<tr>';
str += `<td>${stu.stuNum}</td>`;
str += `<td>`;
(★stuNum 넘겨줘야 반이 바뀌어도 점수 상세정보 볼 수 있음)
str += `<span onclick="showDetail(${stu.stuNum});">
${stu.stuName}</span>`;
str += `</td>`;
str += `<td>${stu.stuAge}</td>`;
str += `<td>${stu.className}</td>`;
str += `<td><input type="button" value="삭제"
onclick="deleteStu(${stu.stuNum}, this);"></td>`;
str += '</tr>';
}
str += '</tbody>';
stuList.insertAdjacentHTML('beforeend',str);
},
error: function() {
alert('실패');
}
});
4) ajax 끝
insertAdjacentHTML
출처: https://saeatechnote.tistory.com/entry/insertAdjacentHTML-과-innerHTML의-차이 [새아의 테크노트:티스토리]
beforebegin: 선택한 태그 앞에 추가하겠다
afterbegin: 선택한 태그의 첫번째 자식으로 추가하겠다
beforeend: 선택한 태그의 마지막 자식으로 추가하겠다
afterend: 선택한 태그의 뒤에 추가하겠다