카테고리 없음

0219 JSP 오전

logloglog 2021. 2. 19. 13:46

리퀘스트맵을 수정할수가없는데 꺼낸것처럼하고싶기떄문에

임의대로 멀티파트파서라는클래스를만들어서 마지 파일아이템으을 겟형시으로 할수있게끔

 

파서는 리퀘스트래핑도아니고  필터도 아니고 그냥 편의를위해만든 클래스임

필요할때 갖닸느느 방식으로해야 나중에 간섭을 최소화하룻잇음

 

모든회원의 이미지는 member/picture/upload에 저장된다.

왜 슬래시?:? os마다 물리적경로의 구분자가 다르기떄문에.. /로 일단하는데 이게 채택됨 그래서 톰캣도 이걸쓰고

톰캣이 사용하는 web.xml에 물리적경로를 주고자할경우 /를 줘야 물리적경로가 들어간다

 

저장을 도와주는 해결사

fileuploadresolver

:파일아이템 리스트를 받을수있음(멀티파서를 이용해서) 그 받은거를 효율적으로 저장하고

경로를 줄거니까 그 두개를 조합해서 파일을 저장할방법을 생각해보자

파일리스트를 반복문으로 하나싞 뺴서 그 아이템을 파일로 변환시켜야 (io패키지이용)

주어진경로에 파일로 저장하고

파일명은 UUID이용함

 

ㅈ파일아이템리스트받은거를 어태치vo를 이용할거임

 

util에 리졸버만들기

 

입력 처리 출력 항상생각하기

 

입력은 파라미터로 받을거고

출력은 어태치vo리스트를 할건데 ㅇ안에암것도없으므로

인ㅇ스턴스하나만들고 그걸 리턴

 

 

package com.jquery.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.fileupload.FileItem;

import com.jquery.dto.AttachVO;

public class FileUploadResolver {

	public static List<AttachVO> fileUpload(FileItem[] items, String uploadPath) throws Exception{
		List<AttachVO> attachList = new ArrayList<AttachVO>();
		
		//파일형태로 바꾸는게먼저임
		File file = new File(uploadPath);
		if(!file.mkdirs()) {//만들어내는데 실패하면 false를 리턴함,경로가잇어도 false
			System.out.println(uploadPath + "가 이미 존재하거나 생성을 실패했습니다.");
		}
		
		if(items!=null) for (FileItem item : items) {
			if(!item.isFormField()) {//파일인지아닌지구분
				//해당아이템을 파일형태로 변환하기위한작업시작
//				String fileName = item.getName();// 파일명이 나온다. 근데 이렇게 하면 오페라브라우저는 파일명+경로까지ㅇ나온다
				String fileName = new File(item.getName()).getName();//그래서 예방차이렇게
				fileName = MakeFileName.toUUIDFileName(fileName, "$$");
				String filePath = uploadPath + File.separator + fileName;
				File storeFile = new File(filePath);
				
				//local HDD에 저장
				try {
					item.write(storeFile);
				}catch (Exception e) {
					e.printStackTrace();
					throw e;
				}
			}
		}
		
		return attachList;
	}
	
	
	
}

이제 attach를 만드는 과정 (db에 저장할 목적으로 만든거임)

 

이제 업로드하면 경로에 저장이되어야함


아이디중복검사

 

이렇게 <% %>  스크립트릿을 써서 적어두면 다른 곳에서 이걸 쓸수가없음 다른데는 이 <%%>가 없기떄문임 그래서 이런식의 코드는 재활용성이 매우떨어져서 실무에서는 스지않음.. js에도 담을수없음 이럴떄는 JSP module로 만들어야함. 자바스크립트를 통쨰로 모듈화해서 인클루드하는..

 

.js에 담는 이유

 

중복체크하고 하고 아이디바꾸고 서브밋하면 그냥 그렇게 넘어갈수도있기때문에

중복체크한아이디 바뀌면 중복체크다시받아야하므로 

flag  변수가 필요함. 

 

resist.jsp

<script>
var checkedID="";
function idCheck_go(){
	var input_ID =$('input[name="id"]');
	if(input_ID.val()==""){
		alert("아이디를 입력하세요");
		input_ID.focus();
		return;
	}else{
		//아이디는 4~12자의 영문자와 숫자로만 입력
		var reqID=/^[a-z]{1}[a-zA-Z0-9]{3,12}$/;
		if(!reqID.test($('input[name="id"]').val())){
			alert("아이디는 첫글자는 영소문자이며,ㅣ \n4~13자의 영문자와 숫자로만 입력해야 합니다.");
			$('input[name="id"]').focus();
			return;
		}
	}
	var data = {id : input_ID.val().trim()};
	
	$.ajax({
		url : "<%=request.getContextPath()%>/member/idCheck/do",
		data:data,
		type:'post',
		success:function(result){
			console.log(result);
			if(result=="duplicated"){
				alert("중복된 아이디 입니다.");
				$('input[name="id"]').focus();
			}else{
				alert("사용가능한 아이디입니다.");
				checkedID=input_ID.val().trim();
				$('input[name="id"]').val(input_ID.val().trim());
				}
		},
		error : function(error){
			alert("시스템 장애로 가입이 불가합니다.");
		}
	})
}
</script>

 

 

handler만들기

package com.jquery.handler;

import java.io.PrintWriter;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jquery.dto.MemberVO;
import com.jquery.service.MemberService;
import com.jquery.service.MemberServiceImpl;

public class MemberIdCheckHandler implements CommandHandler {

	
	private MemberService memberService = new MemberServiceImpl();
	public void setMemberService(MemberService memberService) {
		this.memberService = memberService;
	}

	
	@Override
	public boolean isRedirect(HttpServletRequest request) {
		return false;
	}

	@Override
	public String process(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String url=null;
		
		String id = request.getParameter("id");
		
		MemberVO member = null;
		
		try {
			member = memberService.getMember(id);
			
			if(member!=null) {
				PrintWriter out = response.getWriter();
				out.print("duplicated");
				out.close();
			}
		}catch (SQLException e) {
			e.printStackTrace();
		}
		
		return url;
	}

}

이미지 업로드, 아이디 유무에 대한 확인

<script>
/* 회원등록 */

function regist_go(){
	//이미지업로드가 되엇는지확인이 가장 먼저임
	var uploadCheck = $('input[name="checkUpload"]').val();
	if(!(uploadCheck>0)){
		alert("사진 업로드는 필수입니다.");
		return;
	}
	if($('input[name="id"]').val()==""){
		alert("아이디는 필수입니다.");
		return;
	}
	if($('input[name="id"]').val()!=checkedID){
		alert("아이디 중복확인이 필요합니다.");
		return;
	}
	if($('input[name="pwd"]').val()==""){
		alert("패스워드는 필수입니다.");
		return;
	}
	if($('input[name="name"]').val()==""){
		alert("이름은 필수입니다.");
		return;
	}
	var form = $('form[role="form"]');
	form.submit();
}
</script>

 

 

이제 핸들러만들러

 

//.리다이렉트 해야함 list로 .. 근데 그냥 리다이렉트해버리면 열려있는 레지스트창이 리스트로가버림
//그니까 그냥 센드리다이렉트해버리면 안되므로 여긴 그대로 false
//스크립트로 창 닫고 opener를 돌리는 것으로...

 

근데 phone이 빠져잇다
values를 해야한다

파라미터의 이름이 같으면 (radio 든 checkbox든 뭐든간에) 배열로 같이들어감 그리고 브라우저가 읽게되는 순서대로 들어감

 

	String phone = "";
		for (String data : request.getParameterValues("phone")) {
			phone += data;
		}
		
package com.jquery.handler;

import java.io.PrintWriter;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jquery.dto.MemberVO;
import com.jquery.service.MemberService;
import com.jquery.service.MemberServiceImpl;

public class MemberRegistHandler implements CommandHandler {

	private MemberService memberService = new MemberServiceImpl();
	public void setMemberService(MemberService memberService) {
		this.memberService = memberService;
	}
	
	@Override
	public boolean isRedirect(HttpServletRequest request) {
		//.리다이렉트 해야함 list로 .. 근데 그냥 리다이렉트해버리면 열려있는 레지스트창이 리스트로가버림
		//그니까 그냥 센드리다이렉트해버리면 안되므로 여긴 그대로 false
		//스크립트로 창 닫고 opener를 돌리는 것으로...
		return false;
	}

	@Override
	public String process(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String url = null;
		
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		String email = request.getParameter("email");
		String picture = request.getParameter("picture");
		String authority = request.getParameter("authority");
		String name = request.getParameter("name");
		
		String phone = "";
		for (String data : request.getParameterValues("phone")) {
			phone += data;
		}
		
		MemberVO member = new MemberVO();
		member.setId(id);
		member.setPwd(pwd);
		member.setPhone(phone);
		member.setEmail(email);
		member.setPicture(picture);
		member.setAuthority(authority);
		member.setName(name);
		
		
		PrintWriter out =  response.getWriter();//이짓을 하는게싫으면 포워드로 돌리고
		//실패앴을떄 성공했을떄 각각 jsp 만들어서 거기서 보여주기 
		
		//처리
		try {
			memberService.regist(member);
			out.println("<script>");
			out.println("window.opener.location.href='"+request.getContextPath()+"/member/list.do';");
			out.println("window.close();");
			out.println("</script>");
		}catch (SQLException e) {
			e.printStackTrace();
			out.println("<script>");
			out.println("alert('회원등록이 실패했습니다.');");
			out.println("window.close();");
			out.println("</script>");
		}
		//화면정의
		//화면을 던져줄수는 없음 왜냐면 레지스트가 오픈윈도우에서 열리니까 
		//열린화면을 닫고 부모창으로 가서 아이프레임의 내용을 리다이렉트 시켜야하므로 스크립트를 사용해야한다.
		
		return url;
	}

}