안녕하세요~
[jsp] 회원 수정 삭제 등록
안녕하세요~ 오늘도 퇴근하고 돌아온 jju_developer 입니다. 저는 백엔드 프런트엔드 둘다 맡고 있습니다. 메인은 백엔드지만 간단한 수정이나 페이지 제작은 직접 합니다! 그럼 오늘은 회원 수
jju240.tistory.com
아직 안보신 분들은 꼭 위 로직을 먼저 봐주셔야 이해가 잘갑니당~~
회원 정보 수정 및 삭제하는 로직을 같이 보도록 하겠습니다~
Spring MVC 패턴 기능 정리
기능 :
사용자 1명당 5명의 보호자를 지정하여
등록, 삭제, 수정이 가능하여야 한다.
- 컨트롤러 : 1개
- jsp 페이지 : 3개
- 서비스, 서비스임플 : 각1
- xml : update, delete문
3. 보호자 등록 페이지 (NEW 개발 항목) - 사용자1의 보호자 list 표출 (지난시간 완료!)
- >>> 사용자1의 보호자 list 수정, 삭제
오늘은 3번의 사용자1의 보호자 list 수정, 삭제 로직입니다.
우선 수정, 삭제하는 SQL 문을 먼저 작성을 해야합니다!
1. userMng_SQL.xml 에 보호자 정보 수정문 작성
<updateGuardianMng>
<update id="updateGuardianMng" parameterType="java.util.Map">
UPDATE TB_EMERGENCY_CONTACTS
SET GUARDIAN_NM = #{guardianNm}
, GUARDIAN_TYPE = #{guardianType}
, MOBILE = #{mobile}
, ADDR = #{addr}
<if test='sortOrder != null and sortOrder != ""'>
, SORT_ORDER = #{sortOrder}
</if>
<if test='sortOrder == null or sortOrder == ""'>
, SORT_ORDER = NULL
</if>
, UPD_ID = #{loginId}
, UPD_DT = NOW()
WHERE GUARDIAN_ID = #{guardianId}
</update>
보호자 성명, 보호자 타입, 전화번호, 주소, 우선순위, 수정자 아이디, 수정일, 보호자id
<deleteGuardians>
<delete id="deleteGuardians" parameterType="java.util.Map">
DELETE FROM TB_EMERGENCY_CONTACTS
WHERE GUARDIAN_ID = #{guardianId}
</delete>
만약,
실제로 삭제하지 않고 삭제 버튼을 누르면 그냥 사용여부를 N으로 해주고 싶으면
아래 사진처럼 그냥 update 해주면 끝,,,
하지만 그럼 테이블 select 해올때 꼭 사용여부 Y인것만
골라서 표출해줘야함.
2. UserMngController.java
-- 수정 로직
/**
* 여러명의 보호자 정보 동시 수정.
* @autor OGJ
* @param request
* @return 수정한 글
* @exception Exception
*/
@RequestMapping(value = "/admin/manage/updateGuardianMng.do")
public String updateGuardianMng(@RequestParam Map<String, Object> commandMap, ModelMap model, SessionStatus status, HttpServletRequest request) throws Exception {
// 수정한 사람 알기 위함
commandMap.put("loginId", EgovUserDetailsHelper.getAdminLoginId());
// 여러명의 보호자 정보 동시 수정
// 1. guardianMngRegist.jsp에서 입력한 보호자 정보를 HttpServletRequest request로 받아서 배열로 저장한다.
String bizId = request.getParameter("bizId"); // 기관 아이디 : 단일값
String searchUserId = request.getParameter("searchUserId"); // 사용자 아이디 : 단일값
String[] guardianId = request.getParameterValues("guardianId"); // guardian ID key 값
String[] guardianNm = request.getParameterValues("guardianNm"); // 그 외 : 다중값
String[] guardianType = request.getParameterValues("guardianType");
String[] mobile = request.getParameterValues("mobile");
String[] addr = request.getParameterValues("addr");
String[] sortOrder = request.getParameterValues("sortOrder");
String[] updateYn = request.getParameterValues("updateYn");
// 2. for문을 돌려서 paramMap에 담아 Update 할때 정보를 같이 넘겨준다.
HashMap<String, Object> paramMap = new HashMap<String, Object>();
if(null != guardianNm && guardianNm.length > 0) {
for(int i = 0 ; i < guardianNm.length ; i++ ) {
paramMap.put("bizId", bizId);
paramMap.put("searchUserId", searchUserId);
paramMap.put("guardianNm", guardianNm[i]);
paramMap.put("guardianType", guardianType[i]);
paramMap.put("mobile", mobile[i]);
paramMap.put("addr", addr[i]);
paramMap.put("sortOrder", sortOrder[i]);
paramMap.put("loginId", EgovUserDetailsHelper.getAdminLoginId());
// 3. TB_EMERGENCY_CONTACTS에 보호자 정보 insert (수정 페이지에서 보호자 추가 버튼 으로 추가 등록된 데이터)
if("".equals(EgovStringUtil.nullConvert(guardianId[i]))) {//신규 입력
userMngService.insertGuardianMng(paramMap);
} else {//수정입력
// 3. TB_EMERGENCY_CONTACTS에 보호자 정보 수정 update
if("Y".equals(updateYn[i])) {
paramMap.put("guardianId", guardianId[i]);
userMngService.updateGuardianMng(paramMap);
}
}
}
}
수정은 사용자 1명당 여러명의 보호자 정보를 함께 수정하고 저장을 누를때 로직입니다.
그렇기 때문에 배열에 담고, 해당 배열 값을 DB의 기존 보호자 id와 동일하지 않으면 신규 등록하는 로직을 타고
기존 보호자 아이디와 일치하다면, update 문을 실행하게 됩니다.
이때 파라미터맵에 담을것을 전부 넘겨주죠!
-- 삭제 로직
/**
* 사용자 지정 후 등록 된 보호자 삭제 로직
* @author OGJ
* @param request
* @return 조회한 글
* @exception Exception
*/
@ResponseBody
@RequestMapping(value = "/admin/manage/deleteGuards.do", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json; charset=UTF-8")
public String deleteGuards(@RequestParam Map<String, Object> commandMap, ModelMap model, SessionStatus status, HttpServletRequest request) throws Exception {
Gson gson = new Gson();
HashMap<String, Object> responseMap = new HashMap<>();
commandMap.put("loginId", EgovUserDetailsHelper.getAdminLoginId());
// guardianId를 request에서 가져오기
String guardianId = request.getParameter("guardianId");
commandMap.put("guardianId", guardianId);
// 로그 추가
logger.info("deleteGuards called with guardianId: {}", guardianId);
logger.info("deleteGuards called with commandMap: {}", commandMap);
try {
// 삭제
userMngService.deleteGuardians(commandMap); // guardianId만 전달
responseMap.put("success", true); // 성공 시 success 플래그 추가
} catch (Exception e) {
logger.error("Error deleting guardians", e);
responseMap.put("success", false); // 실패 시 success 플래그 추가
}
status.setComplete();
String jsonString = gson.toJson(responseMap);
logger.info("deleteGuards response: {}", jsonString);
return jsonString;
}
삭제 로직은 간단합니다.
보호자 한명씩 삭제할것이기 때문에,
따로 맵에 담을 필요는 없고, guardianId가 필요하기 때문에 String으로 받아서
보냈습니다.
중간 중간에 로그 찍어가면서
guardianId가 jsp에서 잘 넘어왔는지 확인하는 작업이 있습니다.
guardianId가 자꾸 null이 들어온다면
아래 jsp에 form 태그 밖에 guardianId가 있는지 확인하고
꼭 form 태그 안에 name = guardianId를 해주어야 합니다.
기능 상세 설명 |
@RequestMapping 어노테이션: /admin/manage/deleteGuards.do 경로에 대해 GET 및 POST 요청을 처리합니다. |
@ResponseBody 어노테이션: 메서드가 직접 HTTP 응답 본문을 작성하여 반환한다는 것을 나타냅니다. |
**@RequestParam Map<string, object> commandMap**: HTTP 요청 파라미터를 Map 형태로 받습니다.</string, object> |
ModelMap model, SessionStatus status, HttpServletRequest request: 요청 처리에 필요한 추가적인 파라미터들입니다 |
Gson gson = new Gson();: Gson 라이브러리를 사용하여 JSON 문자열로 변환할 준비를 합니다. |
commandMap.put("loginId", EgovUserDetailsHelper.getAdminLoginId());: 로그인한 관리자의 아이디를 commandMap에 추가합니다. |
String guardianId = request.getParameter("guardianId");: HTTP 요청에서 guardianId 파라미터를 가져와 commandMap에 추가합니다. |
userMngService.deleteGuardians(commandMap);: 서비스 계층에서 deleteGuardians 메서드를 호출하여 보호자를 삭제합니다. |
responseMap.put("success", true);: 성공적으로 삭제되면 success 플래그를 true로 설정합니다. |
status.setComplete();: 세션의 상태를 완료로 표시합니다. |
String jsonString = gson.toJson(responseMap);: responseMap을 JSON 문자열로 변환합니다. |
return jsonString;: JSON 형식의 응답을 클라이언트에 반환합니다. |
3. UserMngService.java
public interface UserMngService {
/**
* 사용자 1명당 보호자 목록을 조회한다.
* @param vo - 조회할 정보가 담긴 VO
* @return 글 목록
* @exception Exception
*/
List<?> selectGuardianMngList(Map<String, Object> vo) throws Exception;
/**
* 총 보호자 수를 조회한다.
* @param searchVO
* @return 총 갯수
* @exception
*/
public int selectGuardianMngListTotCnt(Map<String, Object> vo);
/**
* 보호자를 신규 입력한다.
* @param vo
* @return void형
* @exception Exception
*/
public void insertGuardianMng(Map<String, Object> vo) throws Exception;
/**
* 보호자 정보를 수정한다.
* @param vo
* @return void형
* @exception Exception
*/
public void updateGuardianMng(Map<String, Object> vo) throws Exception;
/**
* 보호자 여러명을 한명씩 삭제한다.
* @param vo
* @return void형
* @exception Exception
*/
public int deleteGuardians(Map<String, Object> vo) throws Exception;
}
생각해보니까 지난번에 service 부분을 빼먹었....
아무튼,,, 삭제 서비스 등록
public int deleteGuardians(Map<String, Object> vo) throws Exception;
4. UserMngServiceImpl.java
@Service("userMngService")
public class UserMngServiceImpl extends EgovAbstractServiceImpl implements UserMngService {
/** userDAO */
@Resource(name="userMngMapper")
private UserMngMapper userMngDAO;
/**
* 보호자 목록을 조회한다.
* @param vo - 조회할 정보가 담긴 VO
* @return 목록
* @exception Exception
*/
@Override
public List<?> selectGuardianMngList(Map<String, Object> vo) throws Exception {
return userMngDAO.selectGuardianMngList(vo);
}
/**
* 총 보호자 수를 조회한다.
* @param vo
* @return 총 갯수
* @exception
*/
@Override
public int selectGuardianMngListTotCnt(Map<String, Object> vo) {
return userMngDAO.selectGuardianMngListTotCnt(vo);
}
/**
* 보호자 신규 입력한다.
* @param vo
* @return void형
* @exception Exception
*/
@Override
public void insertGuardianMng(Map<String, Object> vo) throws Exception {
userMngDAO.insertGuardianMng(vo);
}
/**
* 보호자 수정한다.
* @param vo
* @return void형
* @exception Exception
*/
@Override
public void updateGuardianMng(Map<String, Object> vo) throws Exception {
userMngDAO.updateGuardianMng(vo);
}
/**
* 보호자 여러명을 한명씩 삭제한다.
* @param vo
* @return int : 성공1, 실패0
* @exception Exception
*/
@Override
public int deleteGuardians(Map<String, Object> vo) throws Exception {
LOGGER.info("deleteGuardians called with vo: {}", vo);
// 실제 삭제 로직 수행
int result = userMngDAO.deleteGuardians(vo);
LOGGER.info("deleteGuardians result: {}", result);
return result;
}
}
logger는 디버깅 할때 쓴거고 실제로는 필요없는 부분 제거!
아래 코드입니당.
@Override
public int deleteGuardians(Map<String, Object> vo) throws Exception {
return userMngDAO.deleteGuardians(vo);
}
5. UserMngMapper.java
@Mapper("userMngMapper")
public interface UserMngMapper {
/**
* 보호자 목록을 조회한다.
* @param vo
* @return 글 목록
* @exception Exception
*/
List<?> selectGuardianMngList(Map<String, Object> vo) throws Exception;
/**
* 총 보호자 수를 조회한다.
* @param searchVO
* @return 총 갯수
* @exception
*/
int selectGuardianMngListTotCnt(Map<String, Object> vo);
/**
* 보호자 등록한다.
* @param vo
* @return 등록 결과
* @exception Exception
*/
void insertGuardianMng(Map<String, Object> vo) throws Exception;
/**
* 보호자 수정한다.
* @param vo
* @return void형
* @exception Exception
*/
void updateGuardianMng(Map<String, Object> vo) throws Exception;
/**
* 보호자 여러명을 한명씩 삭제한다.
* @param vo
* @return int : 성공1, 실패0
* @exception Exception
*/
int deleteGuardians(Map<String, Object> vo) throws Exception;
}
int deleteGuardians(Map<String, Object> vo) throws Exception;
6. JSP
-- 보호자 등록 하는 부분
// 중략...
<form:form commandName="frm" name="frm" action="${pageContext.request.contextPath}/admin/manage/guardianMngDetail.do?gid=lm_07&mid=lm_07_05" method="post">
<div class="card-block">
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value='${commandMap.pageIndex}'/>"/>
<input type="hidden" id="cmd" name="cmd" value="<c:out value='${commandMap.cmd}'/>"/>
<input type="hidden" id="searchBizId" name="searchBizId" value="<c:out value='${commandMap.searchBizId}'/>"/>
<input type="hidden" id="bizId" name="bizId" value="<c:out value='${commandMap.searchBizId}'/>"/>
<!-- TODO OGJ: 보호자 추가 페이지 시작 -->
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="installType">보호자 정보</label>
<button type="button" class="btn btn-rounded btn-info btn-sm" style="float:right;margin-bottom: 10px" onclick="addSectionGard()">보호자 추가</button>
<div class="table-responsive">
<table class="table table-striped table-hover">
<colgroup>
<col style="width: 15%">
<col style="width: 20%">
<col style="width: 15%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr>
<th rowspan="2" class="inteTh">정렬순서</th>
<th rowspan="2" class="inteTh">성명</th>
<th rowspan="2" class="inteTh">보호자 타입</th>
<th rowspan="2" class="inteTh">전화번호</th>
<th colspan="2" class="inteTh">주소</th>
<th rowspan="2" class="inteTh">삭제</th>
</tr>
</thead>
<tbody id="guardianList">
<c:forEach var="result" items="${selectGuardianMngList}" varStatus="status">
<tr>
<td>
<input type="text" class="form-control form-control-lg guardian_input" id="sortOrder" name="sortOrder" value="${result.sortOrder}" oninput="this.value = this.value.replace(/[^0-9]/g, '').replace(/(\..*)\./g, '');">
<input type="hidden" value="N" name="updateYn"/>
<input type="hidden" class="form-control form-control-lg guardian_input" id="guardianId" name="guardianId" value="${result.guardianId}">
</td>
<td>
<input type="text" class="form-control form-control-lg guardian_input" id="guardianNm" name="guardianNm" value="${result.guardianNm}" maxlength="50">
</td>
<td>
<select id="guardianType" name="guardianType" class="form-control guardian_input">
<c:forEach var="result2" items="${guardianTypeList}" varStatus="status">
<option value="<c:out value='${result2.codeId}'/>" ${uifunc:getSelected(result.guardianType, result2.codeId)}><c:out value='${result2.codeNm}'/></option>
</c:forEach>
</select>
<!-- <span>
복지사 : 문자 긴급알림 O, ARS 전화<br>
보호자 : 문자 알림 O <br>
</span> -->
</td>
<td>
<input type="text" class="form-control form-control-lg guardian_input" id="mobile" name="mobile" maxlength="13" oninput="autoHyphen(this)" placeholder="숫자만 입력해주세요" value="${result.mobile}">
</td>
<td colspan="2">
<input type="text" class="form-control form-control-lg guardian_input" id="addr" name="addr" value="${result.addr}">
</td>
<td><button type="button" class="btn btn-danger btn-sm m-0 btn_deleteGuard">삭제</button></td>
</tr>
</c:forEach>
<c:if test="${fn:length(selectGuardianMngList) eq 0}">
<tr class="nodata">
<td colspan="10"><p class="nodata">등록된 데이터가 없습니다</p></td>
</tr>
</c:if>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</form:form>
// 중략
<!-- 신규/수정 저장 START -->
<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true" id="alertConfirmPop">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">알림</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body">
<p id="confirmMsg">저장하시겠습니까?</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">취소</button>
<button type="button" class="btn btn-primary" onclick="saveDB()">확인</button>
</div>
</div>
</div>
</div>
<!-- 삭제 저장 START -->
<!-- 삭제 확인 모달 -->
<div class="modal fade" id="alertDeletePop" tabindex="-1" role="dialog" aria-labelledby="alertDeletePopLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="alertDeletePopLabel">삭제 확인</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
삭제하시겠습니까?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">취소</button>
<button type="button" class="btn btn-danger" onclick="deleteDB()">삭제</button>
</div>
</div>
</div>
</div>
<!-- 삭제 저장 END -->
-- 자바스크립트 : 기능
<script>
$(document).ready(function(){
});
//사용자 검색후 보호자 디테일 리스트 출력
function selectList() {
$("#frm").attr("action", "<c:url value='/admin/manage/guardianMngDetail.do?gid=lm_07&mid=lm_07_05'/>");
$("#frm").attr("target","_self");
$("#frm").submit();
}
//돌아가기 클릭시 보호자 관리 페이지로 이동
function backList() {
$("#searchUserId").val("");
$("#searchUserNm").val("");
$("#frm").attr("action", "<c:url value='jju/admin/controller/url'/>");
$("#frm").attr("target","_self");
$("#frm").submit();
}
// 저장
function saveDB() {
if ($("#cmd").val() == "update") {
updateDB();
} else {
insertDB();
}
}
// 신규등록
function insertDB() {
if(!insertValidateChk()) return;
$("#frm").attr("action", "<c:url value='/admin/manage/insertGuardianMng.do?gid=lm_07&mid=lm_07_05'/>");
$("#frm").attr("target","_self");
$("#frm").submit();
}
// 보호자 수정 저장
function updateDB() {
$("#frm").attr("action", "<c:url value='/admin/manage/updateGuardianMng.do?gid=lm_07&mid=lm_07_05'/>");
$("#frm").attr("target","_self");
$("#frm").submit();
}
// 보호자 삭제 버튼 클릭
var delGuardId = "";
var deleteRow; // 삭제할 행을 저장할 변수
$(".btn_deleteGuard").on("click", function(){
delGuardId = $(this).parents("tr").find("input[name=guardianId]").attr("value");
deleteRow = $(this).parents("tr"); // 삭제할 행을 저장
$('#alertDeletePop').modal('show'); // 삭제 확인 모달 띄우기
});
// 보호자 삭제
function deleteDB() {
$.ajax({
type: "POST",
url: "<c:url value='/admin/manage/deleteGuards.do'/>",
data: { guardianId: delGuardId },
dataType: 'json', // 서버에서 오는 응답이 JSON 형식임을 명시
success: function(data) {
if (data.success) {
deleteRow.remove();
if ($("#guardianList").find("tr").length == 0) {
var nodataContent = '<tr class="nodata">' +
'<td colspan="10"><p class="nodata">등록된 데이터가 없습니다</p></td>' +
'</tr>';
$("#guardianList").append(nodataContent);
}
} else {
alert("삭제에 실패했습니다.");
}
},
error: function(request, status, error) {
alert("삭제 중 오류가 발생했습니다.");
},
complete: function() {
// 모달 닫기
$("#alertDeletePop").modal('hide');
}
});
}
function validateChk() {
if ($("#guardianNm").val() == "") {
$("#alertMsgBtn").click();
$("#alertContent").text("성명을 입력해주세요.");
$("#guardianNm").focus();
return false;
}
return true;
}
// 보호자 추가
function addSectionGard(){
if ($("#guardianList").find("tr").hasClass("nodata")) {
$("#guardianList").empty();
}
var content = '<tr>' +
'<td>' +
'<input type="hidden" name="guardianId"/>' +
'<input type="hidden" value="N" name="updateYn"/>' +
'<input type="text" class="form-control" name="sortOrder" oninput="this.value = this.value.replace(/[^0-9]/g, \'\').replace(/(\..*)\./g, \'\');">' +
'</td>' +
'<td>' +
'<input type="text" class="form-control" name="guardianNm" maxlength="50">' +
'</td>' +
'<td>' +
'<select name="guardianType" class="form-control guardian_input">' +
'<c:forEach var="result" items="${guardianTypeList}" varStatus="status">' +
'<option value="${result.codeId}">${result.codeNm}</option>' +
'</c:forEach>' +
'</select>' +
// '<span>' +
// '복지사 : 문자 알림 O, ARS 전화 부가서비스 신청자 한정 가능 <br>' +
// '보호자 : 문자 알림 O <br>' +
// '</span>' +
'</td>' +
'<td>' +
'<input type="text" class="form-control form-control-lg" id="mobile" name="mobile" maxlength="13" oninput="autoHyphen(this)" placeholder="숫자만 입력해주세요">' +
'</td>' +
'<td colspan="2">' +
'<input type="text" class="form-control" name="addr">' +
'</td>' +
'<td><button type="button" class="btn btn-danger btn-sm m-0 btn_deleteGuard">삭제</button></td>' +
'</tr>';
$("#guardianList").append(content);
$(".btn_deleteGuard").on("click", function(){
$(this).parents("tr").remove();
if ($("#guardianList").find("tr").length == 0) {
content = '<tr class="nodata">' +
'<td colspan="7"><p class="nodata">등록된 데이터가 없습니다</p></td>' +
'</tr>';
$("#guardianList").append(content);
}
});
}
// 수정 사항
$(".guardian_input").on("change", function(){
//수정된 항목만 upd_id, upd_dt를 update해주기 위함
$(this).parents("tr").find("input[name=updateYn]").attr("value","Y");
$(this).parents("tr").find("select[name=updateYn]").attr("value","Y");
});
// 사용자 검색
// USER POP
function userSearchPop(pageIndex, searchUserNm, searchPhone) {
// 생략
});
}
// SET USER INFO
function setUserInfo(userId, userNm){
$("#cmd").val("update");
$("#searchUserId").val(userId);
$("#searchUserNm").val(userNm);
selectList();
}
// 전화번호 autoHyphen 하이픈 자동 입력
const autoHyphen = (target) => {
target.value = target.value
.replace(/[^0-9]/g, '') // 숫자 이외의 문자 제거
.replace(/^(\d{2,3})(\d{3,4})(\d{4})$/, "$1-$2-$3") // 전화번호 형식으로 변환
.replace(/(\-{1,2})$/, ""); // 연속된 하이픈 제거
}
// 보호자 저장시 사용자 id validation 처리
function insertValidateChk() {
var flag = true;
if($("#searchUserId").val() == null || $("#searchUserId").val() == ""){
$("#alertMsgBtn").click();
$("#alertContent").text("사용자를 선택해주세요.");
return false;
}
return flag;
}
</script>
// 삭제시
deleteDB() 호출
// 수정시
updateDB() 호출
해당 frm (폼태그)에 action 주소는
Controller에 아까 만든 RequestMapping URL 입니다.
※ 코드는 흐름상 생략된 부분이 있습니다!
오류사항
자꾸 do 파일이 저장되는 이유...?
해당 코드는 서버에서 클라이언트로 응답할 때 Content-Disposition 헤더를 제대로 설정하지 않아서 발생하는 문제입니다. 이 헤더는 브라우저에게 응답을 파일로 다운로드할지 아니면 인라인으로 표시할지 알려줍니다.
이 문제를 해결하려면 두 가지 부분을 확인하고 수정해야 합니다.
- 서버 코드 (Controller)
- JSP 파일 (클라이언트 측)
저는 1번 서버 코드 문제였습니다!
1. 서버 코드 (Controller)
지금 deleteGuards 메소드에서 반환하는 응답은 JSON 형태입니다.
하지만 Content-Disposition 헤더가 제대로 설정되지 않아
브라우저가 이 응답을 파일로 다운로드하려고 시도하는 것 같습니다.
이를 해결하려면 Content-Disposition 헤더를 추가하거나 produces 속성을 수정해야 합니다.
jsp는 문제 없고 Controller에 json으로 받는다고 해야하는데
text로 받는다고 되어있어서,,, 자꾸 다운로드가 되었나봐용...!
한참 찾았네.........
오류 끝!
그럼 이만,,,
작성하는것도 굉장히 오랜 시간이 걸리는군요!
그래도 퇴근하고 아는것 한번더 정리하니까 개운합니다...!
오늘도 즐거운 코딩하세요~
공감 꾹 ❤, 구독, 댓글 환영입니다~

'주니어 기초 코딩공부 > JSP 기초' 카테고리의 다른 글
[jsp] 네이버 지도 api 연동 신청방법 (75) | 2024.07.22 |
---|---|
[JSTL] 변수 선언_property, scope, target, value, var 정리 및 예시 (42) | 2024.07.03 |
[jsp] 로그인시 비밀번호 표시하는 로직 완벽정리 (0) | 2024.07.02 |
[jsp] 회원 수정 삭제 등록 (0) | 2024.07.01 |
[JSTL] 비교 연산할 때 소수점 없애기 formatNumber (0) | 2023.11.08 |