리퀘스트맵을 수정할수가없는데 꺼낸것처럼하고싶기떄문에
임의대로 멀티파트파서라는클래스를만들어서 마지 파일아이템으을 겟형시으로 할수있게끔
파서는 리퀘스트래핑도아니고 필터도 아니고 그냥 편의를위해만든 클래스임
필요할때 갖닸느느 방식으로해야 나중에 간섭을 최소화하룻잇음
왜 슬래시?:? 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에 담는 이유
중복체크하고 하고 아이디바꾸고 서브밋하면 그냥 그렇게 넘어갈수도있기때문에
중복체크한아이디 바뀌면 중복체크다시받아야하므로
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를 돌리는 것으로...
파라미터의 이름이 같으면 (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;
}
}