jsp 에서 split 함수 문제 질문 있습니다.
지금 제가 전화부 양식으로 csv 파일을 받아 들여서 html 형식으로 파싱하는 기능을 만들고 있습니다.
jsp 기반으로 만들고 있는데 도저히 풀리지가 않아서 이렇게 질문해봅니다 ㅠ
split 함수에서 문제가 일어나는데(null pointer) 왜 일어나는지 모르겠습니다...
String[] readBuf;
readBuf = new String[5];
readBuf = str.split ( "," ); -> 여기에서 오류가 납니다
혹시 jsp 나 java 에 잘 알고 계신다면 꼭좀 알려주세요 ^^
전체 소스는 밑처럼 작성 하였습니다 ..
<%@ page language="java" contentType="text/html; charset=shift-jis"
pageEncoding="shift-jis"%>
<%@ page import="myutil.MultiPart"%>
<%@ page import="java.net.URLEncoder"%>
<%@ page import="java.io.*"%>
<%
MultiPart multiPart = new MultiPart (request);
String fileName=multiPart.getFileName ("userFile");
BufferedReader reader=null;
PrintWriter writer2=null;
FileReader FileR=null;
String filePath2=application.getRealPath ("/html/phonebookcsv.html");
String filePath=application.getRealPath ("/html/phonebook.csv");
String result;
int i;
int k=1;
String rb_1[]=null;
String rb_2[]=null;
String rb_3[]=null;
String rb_4[]=null;
String rb_5[]=null;
String str=null;
FileR=new FileReader(filePath);
reader = new BufferedReader ( FileR );
if (fileName.indexOf (".csv")!=-1)
{
try{
writer2=new PrintWriter (filePath2);
{
writer2.printf ("
%n"); writer2.printf ("<head>%n"); writer2.printf ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift-jis\">%n"); writer2.printf ("<title>Phone Book</title>%n"); writer2.printf ("</head>%n"); writer2.printf ("<body>%n"); writer2.printf ("<center><h1><font size=20>電話帳</font></h1></center>%n"); writer2.printf ("<center><form action=\"../NewPage.jsp\" method=post enctype=\"multipart/form-data\"><input type=file name=userFile><BR><input type=submit value=\"ファイル読込\"></form></center>"); writer2.printf ("<form ACTION=\"../SavetoFile.jsp\" METHOD=\"post\">%n"); writer2.printf ("<DIV align=\"center\"><TABLE style=\"border: 1px solid #2875C1\" bgcolor=\"#C7E2FE\" cellspacing=\"1\" cellpadding=\"0\" width=\"75%%\" height=\"50%%\">%n"); writer2.printf ("<TR><td align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #f0f0f0\" bgcolor=\"#c1ccf7\" width=\"10%%\" >内線番号</td><td align=\"left\" vAlign=\"middle\" style=\"border: 1px solid #f0f0f0\" bgcolor=\"#c1ccf7\" ><input type=text size=\"10\" name=file ></td><td align=\"left\" vAlign=\"middle\" style=\"border: 1px solid #f0f0f0\" bgcolor=\"#c1ccf7\" colspan=\"3\"><input type=submit value=\"保存\"></td></TR>"); writer2.printf ("<TR>%n"); writer2.printf ("<TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#C7E2FE\" width=\"10%%\">短縮番号</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#C7E2FE\" width=\"30%%\" >名前</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#C7E2FE\" width=\"30%%\" >ヨミガナ</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#C7E2FE\" width=\"30%%\" >電話番号</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#C7E2FE\" width=\"5%%\">タイプ</TD></TR>%n"); for (i=0;i<900;i++){ str=reader.readLine ( ); String[] readBuf; readBuf = new String[5]; readBuf = str.split ( "," ); if(readBuf[0]==null){ readBuf[0] = ""+k+""; readBuf[1] = "0"; readBuf[2] = "0"; readBuf[3] = "0"; readBuf[4] = "0"; } writer2.printf (" <TR> <TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <input type=text name=ShortNumber size=\"8%%\" align = middle readonly value=%s ></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <INPUT TYPE=TEXT NAME=Name SIZE=\"50%%\" value=\"%s\"></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <INPUT TYPE=TEXT NAME=pronunciation SIZE=\"50%%\" value=\"%s\"></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <INPUT TYPE=text NAME=TelephoneNumber SIZE=\"50%%\" value=\"%s\"></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> ",readBuf[0],readBuf[3],readBuf[1],readBuf[2]); if ( readBuf[4].equals ("0") ) writer2.printf ("<select name=\"Type\"><option value=\"0\" selected>外線</option><option value=\"1\">内線</option></select></TD></TR>"); else if ( readBuf[4].equals ("1") ) writer2.printf ("<select name=\"Type\"><option value=\"0\">外線</option><option value=\"1\"selected>内線</option></select></TD></TR>"); k++; } writer2.printf ("</TR>%n"); writer2.printf ("</TABLE></DIV>%n"); writer2.printf ("<center><INPUT TYPE=SUBMIT VALUE=\'保存\'></CENTER>%n"); writer2.printf ("</form>%n"); writer2.printf ("<center><form action = \"http://localhost/In/IntoWeb.html\" method=post><input type=submit value=Home></form></center>%n"); writer2.printf ("</body>%n"); writer2.printf ("
}
}
finally{
try{
writer2.close ();
reader.close ();
}
catch (Exception e){
}
}
}
String url= String.format ("html/"+fileName);
response. sendRedirect (url);
%>
str 객체가 null 인거지요. 읽을 것이 없는데
str 객체가 null 인거지요.
읽을 것이 없는데 읽었기 때문에 reader.readLine() 이 null 을 반환한 겁니다.
일반적인 사용 패턴은 while((str = reader.readLine()) != null) { do something with str } 입니다.
올리신 코드처럼 사용하는 것은 파일에 들어있는 라인의 수가 고정되어 있을 때나 사용할 수 있습니다.
그리고 readBuf = new String[5];
그리고 readBuf = new String[5]; 는 쓰실 필요 없습니다.
split이 새로운 배열을 만들어서 반환하기 때문에 이렇게 만든 배열은 아무 의미도 없습니다.
그 아래에 있는 if 절도 아무 의미
그 아래에 있는 if 절도 아무 의미 없습니다.
split이 반환한 배열은 항상 크기가 1 이상이고, 첫번째 원소가 null일 수도 없습니다.
전체 코드의 의미도 알 수 없군요. 그냥
전체 코드의 의미도 알 수 없군요.
그냥 response 에 직접 쓰면 될 것을 굳이 파일로 쓴 다음에 그 파일로 리다이렉트를 할 필요가 있나요?
댓글 달기