-
인코딩, 학생 등록하기 예제 -22.06.10웹프로그래밍 2022. 6. 10. 23:13728x90
인코딩
package kr.or.ddit.encoding; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; /** * 인코딩(Encoding) * : 데이터를 전송하거나 저장하기 위해서 매체가 인지할 수 있는 방식으로 데이터의 표현 방법을 바꾸는 작업. * ex) URLEncoding(network), Base64(범용 인코딩) * */ public class EncodingDesc { public static void main(String[] args) throws UnsupportedEncodingException { String original ="ABC123한글"; String urlEncoded = URLEncoder.encode(original, "UTF-8"); //인코딩 original = URLDecoder.decode(urlEncoded, "UTF-8"); //디코딩 System.out.println(urlEncoded); System.out.println(original); } }
=> 인코딩은 시스템을 위한 글자임
원래 우리가 보려고 하는 글자를 보려면 디코딩을 해줘야 한다.
학생정보등록하기 예제
모델 2 방식이라면 ..
1: 서블릿, 컨트롤러 역할
2: jsp, 뷰 역할
post 방식일때 데이터로 인코딩 되어서 보내지는것을 확인할 수 있다.
<DDITStudentRegistServlet.java>
리플랙트 reflect개념 더 공부
1. 요청 분석- controller
1) 요청 검증
- 파라미터 확보
- 검증
- 통과
2) 요청 컨텐츠(model) 생성
-> 등록 완료 메시지를 가지고(/07/resultView.jsp 로 이동.)
- 통과X
3) 입력 UI 로 복귀 (메시지, 기존 클라이언트 입력 값. )
2. 응답 생성- viewpackage kr.or.ddit.servlet06; import java.io.IOException; import java.lang.reflect.Field; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import kr.or.ddit.vo.DDITStudentVO; @WebServlet("/07/dditProcess.do") public class DDITStudentRegistServlet extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); DDITStudentVO vo = new DDITStudentVO(); req.setAttribute("student", vo); vo.setName(req.getParameter("name")); vo.setHp(req.getParameter("hp")); // 1. reflection 을 몰라도 파리미터를 Vo 로 바인딩하려면??? Map<String, String[]> parameterMap = req.getParameterMap(); for(String parameterName : parameterMap.keySet()) { Class<? extends DDITStudentVO> type = vo.getClass(); try { // Reflection으로 parameterName 변수를 취득한다. Field field = type.getDeclaredField(parameterName); // setAccessible는 private, protected도 접근 가능하게 한다 field.setAccessible(true); if(field.getType().equals(int.class)) { field.set(vo, Integer.parseInt(req.getParameter(parameterName))); }else if(field.getType().equals(String[].class)) { field.set(vo, req.getParameterValues(parameterName)); }else { field.set(vo, req.getParameter(parameterName)); } System.out.println(field); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } boolean valid = validata(vo); String view = null; String message = null; if(valid) { message = "등록 완료"; req.getSession().setAttribute("student", vo); req.getSession().setAttribute("message", message); view = "redirect:/07/resultView.jsp"; }else { message = "등록 실패, 검증 실패"; view = "/07/registForm.jsp"; } req.setAttribute("message", message); if(view.startsWith("redirect:")) { view = view.substring("redirect:".length()); resp.sendRedirect(req.getContextPath() + view); }else { req.getRequestDispatcher(view).forward(req, resp); } } boolean validata(DDITStudentVO vo){ boolean valid = true; //2. 문자열 데이터의 empty 여부를 쉽게 확인하려면??? if(vo.getName()==null || vo.getName().isEmpty()) { valid = false; } if(vo.getHp()==null || vo.getHp().isEmpty()) { valid = false; } return valid; } }
System.out.println(filed)출력한 결과
<? extends T>
-매개변수의 자료형을 특정 클래스를 상속받은 클래스로만 제한함
-상속관계로 이루어진 클래스만 자료형을 받는다.
-?(자식 클래스),T(부모클래스)로 부모클래스와 자식클래스의 임의의 자료형만 받는다.
<getParameterNames()>
내장 객체 request의 메소드 getparameterNames()는 반환 값이 Enumeration유형으로 요청 페이지의 모든 인자 이름이 저장된 목록을 반환한다.
<getParameterValues()>
체크박스의 경우는 여러개의 값이 들어갈 수 있습니다.
그래서 name이 같은 경우는 배열로 값이 들어가도록
파라미터 값을 출력할 때 주로 request.getParameter("name") 이런식으로 해야 한다.
이렇게 할 경우 넘겨주는 파라미터의 이름이 바뀌거나 추가될 경우 컨트롤러도 수정해야 한다.
모든 파라미터를 어딘가에 이용해야 하는 경우 컨트롤러 수정없이 다 이용할 수 있는 방법이 있다.
request.getParameterMap().keySet()를 이용하거나 request.getParameterNames()를 이용하면 된다.
Set<String> keySet = request.getParameterMap().keySet(); for(String key: keySet) { System.out.println(key + ": " + request.getParameter(key)); } Enumeration names = request.getParameterNames(); while(names.hasMoreElements()) { String key = (String) names.nextElement(); System.out.println(key + ": " + request.getParameter(key)); }
<DDITStudentVO.java>
package kr.or.ddit.vo; import java.io.Serializable; import java.util.Arrays; /** * 등록할 학생 한명의 정보를 담을 ValueObject * JavaBean 규약(ValueObject, DataTransferObject). * 1. value 담을 수 있는 property 필요. * 2. property 캡슐화 * 3. property 상태를 변경할 수 있는 인터페이스(setter) * 4. property 상태를 접근할 수 있는 인터페이스(getter) * -> set[get]프로퍼티명을 첫문자만 대문자로 바꾼 suffix ex) getName * 5. 객체의 상태를 비교할 수 있는 인터페이스 제공. * a==b, a.equals(b) * 6. 상태를 직접 확인할 수 있는 인터페이스 : toString * 7. 객체가 매체를 통해 전송 혹은 저장될 수 있는 직렬화가 가능. */ public class DDITStudentVO implements Serializable{ private String id = "a001"; private String name; // 전역변수, property, field private int age; private String hp; private String email; private String address; private String grade; private String school; private String subject; private String gdt; private String gender; private String[] licenses; private String photo; // 이미지 파일의 이름 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getHp() { return hp; } public void setHp(String hp) { this.hp = hp; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getGdt() { return gdt; } public void setGdt(String gdt) { this.gdt = gdt; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String[] getLicenses() { return licenses; } public void setLicenses(String[] licenses) { this.licenses = licenses; } public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DDITStudentVO other = (DDITStudentVO) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } @Override public String toString() { return "DDITStudentVO [id=" + id + ", name=" + name + ", hp=" + hp + ", email=" + email + "]"; } }
<registForm.jsp>
DB의 테이블과 비슷한 컬렉션 사용
Map은 순서가 없지만 LinkedHashMap을 사용하면 순서있도록 사용 가능하다.
<%@page import="java.util.Map.Entry"%> <%@page import="java.util.LinkedHashMap"%> <%@page import="java.util.Map"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% Map<String,String[]> gradeMap = new LinkedHashMap<>(); gradeMap.put("G001", new String[]{"G001", "고졸"}); gradeMap.put("G002", new String[]{"G001", "초대졸"}); gradeMap.put("G003", new String[]{"G001", "대졸"}); gradeMap.put("G004", new String[]{"G001", "석사"}); gradeMap.put("G005", new String[]{"G001", "박사"}); Map<String,String[]> licenseMap = new LinkedHashMap<>(); licenseMap.put("L001", new String[]{"L001", "정보처리산업기사"}); licenseMap.put("L002", new String[]{"L002", "정보처리기사"}); licenseMap.put("L003", new String[]{"L003", "정보보안산업기사"}); licenseMap.put("L004", new String[]{"L004", "정보보안기사"}); licenseMap.put("L005", new String[]{"L005", "SQLD"}); licenseMap.put("L006", new String[]{"L006", "SQLP"}); String message =(String) request.getAttribute("message"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <% if(message!=null && !message.isEmpty()){ %> <script type="text/javascript"> alert('<%=message %>'); </script> <% } %> </head> <body> <h4> 대덕인재 개발원 학생 등록 양식 </h4> <!-- 학생 : 이름(필), 나이, 전화번호(필), 이메일, 주소(필), 최종학력(필), 학교(필), 학과(필), 졸업여부, 사진, 성별(필), 자격증 --> <form action="<%=request.getContextPath() %>/07/dditProcess.do" method="post" enctype="application/x-www-form-urlencoded"> <ul> <li> 이름 : <input type="text" name="name" value="${student.name }" /> </li> <li> 나이 : <input type="number" name="age" value="${student.age }"/> </li> <li> 전화번호 : <input type="text" name="hp" value="${student.hp }"/> </li> <li> 이메일 : <input type="email" name="email" value="${student.email }"/> </li> <li> 주소 : <input type="text" name="address" value="${student.address }"/> </li> <li> 최종학력 : <select name="grade"> <option value>학력</option> <% for(Entry<String,String[]> entry:gradeMap.entrySet()){ String gradeCode = entry.getKey(); String gradeText = entry.getValue()[1]; %> <option value='<%=gradeCode %>'><%=gradeText %></option> <% } %> </select> </li> <li> 학교 : <input type="text" name="school" /> </li> <li> 학과 : <input type="text" name="subject" /> </li> <li> 졸업여부 : <input type="radio" name="gdt" value="졸업"/>여 <input type="radio" name="gdt" value="예정" />부 </li> <li> 성별 : <input type="radio" name="gender" value="F"/>여 <input type="radio" name="gender" value="M" />남 </li> <li> 자격증 : <select name="licenses" multiple size="10"> <% for(Entry<String,String[]> entry:licenseMap.entrySet()){ String licCode = entry.getKey(); String licText = entry.getValue()[1]; %> <option value='<%=licCode %>'><%=licText %></option> <% } %> </select> </li> <li> 사진 : <input type="file" name="photo" /> </li> <li> <input type="submit" value="등록" /> </li> </ul> </form> </body> </html>
<resultView.jsp>
<%@page import="kr.or.ddit.vo.DDITStudentVO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <pre> <%-- //3. 속성데이터를 전달하는 영역에 무관하게 속성데이터에 접근하려면??? String message = (String) session.getAttribute("message"); DDITStudentVO vo = (DDITStudentVO) session.getAttribute("student"); --%> 전달된 메시지 : <%--=message --%>, ${message } 등록 완료된 학생의 이름 : <%--=vo.getName() --%>, ${student.name } </pre> </body> </html>
<성공했을때>
<실패했을때>
이름을 넣지 않아서 유효성검사에 걸리게 됨
728x90'웹프로그래밍' 카테고리의 다른 글
maven2, 마셜링 -22.06.15 (0) 2022.06.15 Maven 설정환경-22.06.14 (0) 2022.06.14 request, header - 22.06.09 (0) 2022.06.10 모델1 모델2 책임 분리, JSON, Header-22.06.07~22.06.08 (0) 2022.06.08 JQuery 보강-22.06.07 (0) 2022.06.07