ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인코딩, 학생 등록하기 예제 -22.06.10
    웹프로그래밍 2022. 6. 10. 23:13
    728x90

    인코딩

    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. 응답 생성- view

    package 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
Designed by Tistory.