[setCharacterEncoding, setContentType 정리]
- request.setCharacterEncoding("UTF-8");
- POST 방식에서만 사용
- 서블릿에서 POST 방식으로 정보를 서버에 전달해줄 때 사용
- FROM 태그에서 입력한 값을 전송할 때 GET/POSET 방식으로 나뉘는데 POST 방식으로 보내는 값이 한글일 경우 한글이 제대로 출력되지 않는 경우가 발생하는데 이를 방지하기 위해 사용
- GET 방식에서 사용 하려면 설정 필요(톰켓의 경우 기본적으로 UTF-8 문자코드가 적용 되어 있어 자동으로 한글 처리를 해줌)
=> 설정 방법<server.xml 파일> < Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/> => useBodyEncodingForURI 또는 URIEncoding 사용
- response.setCharacterEncoding("UTF-8");
- GET/POST 방식 둘 다 가능
- 서블릿에서 직접 브라우저에 출력해줄 때 사용
- 서블릿에서 화면에 직접 출력하기 위해서는 out.print를 사용 하는데 이때 out.print("안녕")을 출력하면 "안녕"이 출력되는 것이 아닌 물음표(???)가 출력 됨, 이러한 것을 해결하기 위해 사용
- response.setContentType("text/html;charset=utf-8");
- GET/POST 방식 둘 다 가능
- 서블릿에서 직접 브라우저에 출력해줄 때 사용
- 브라우저마다 기본적으로 문자코드를 해석하는 default가 다르기 때문에 브라우저에게 사용할 문자 코드가 무엇인지를 알려주기 위해 사용
- 사용하지 않았을 경우 한글이 제대로 출력되지 않고 '뀖땖' 처럼 이상한 형태로 출력 됨
- 파일 업로드/다운로드
enctype="multipart/form-data" : 파일 전달하기 위해 필수 요소!! enctype="multipart/form-data" 형식으로 전송된 데이터는 request.getParameter()와 같은 메서드로는 접근 할 수 없다. 서블릿 3.0에 새롭게 추가된 Part 인터페이스를 사용해서 접근해야 한다. <접근 방식> - 1. HttpServletRequest, getContentType()을 이용해서 "multipart/form-data" 인지 확인한다. - 2. "multipart/form-data"인 경우 => HttpServletRequest의 getParts()나 getPart(name) 메서드를 이용해서 Part를 구한다. => Part의 Content-Disposition 헤더가 "filename="을 포함하면, 파일로 처리한다. => "filename="을 포함하지 않으면 파라미터로 처리한다.
- HTML 영역
accept : 업로드 파일 종류, 미지정 할 경우 모든 파일
-ex : .txt, .xlsx, .jpg(확장명 기재);capcure : 모바일 디바이스에 적용 - user : 전면 카메라 사용 - enviroment : 후면 카메라 사용 files : 파일을 선택하면, 선택된 파일 목록을 fileList 객체 형태로 files 속성에 저장됨 선택된 파일목록을 가져오려면 files 속성을 참고하면 됨 multiple : 다중 파일 업로드, 값(value)이없으며 기재하면 true값을 잦음 required : form이 전송될때 필수 선택여부를 지원하는 속성, 이속성을 지정할 경우 파일을 선택하지 않고 form을 전송할 경우 파일을 선택하라는 메세지가 나옴, boolean value : 서택한 파일의 경로, 다중파일 선택의 경우 첫번째 파일을 기준으로 함 악의적인 사용 방지를 위해 "C:\fakepth\"가 포함됨
<enctype="multipart/form-data" : 파일 전달하기 위해 필수 요소!!> <form name = "fn" action="fu" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile" id="uploadFile" multiple required> <input type="button" name="btnFile" id="btnFile" value="다중파일선택"> </form>
- JavaScript(JS) 영역
$().ready(function(){ $("#uploadFile").on("change",function(ev){ const filesList = this.files; fn.method = "post"; fn.action = "fu"; fn.submit(); }); // e:$(#btnFile) });
- Servlet 영역
<파일업로드> - 서블릿 3.0에서는 InputStream이나 외부 라이브러리를 사용하지 않고도 웹 브라우저가 업로드한 파일을 읽어올 수 있는 기능이 추가 되었음 1. HttpServletRequest의 getPart()메서드를 이용해서 업로드 데이터 접근 2. 서블릿이 multipart() 데이터를 처리할 수 있도록 설정 --> @MultipartConfig 애노테이션을 사용하거나 --> web.xml에서 < multipart-config > 태그 사용 @MultipartConfig( 1. location = "업로드할 파일의 저장 폴더 로컬절대 경로", --> 파일 업로드 시에 임시 저장 디렉터리를 지정한다. 자료형(String) 2. maxFileSize = -1(무한대), --> 업로드할 파일의 최대 크기를 지정한다. 자료형(long) 3. maxRequestSize = -1 // ==> request 시에 최대 크기를 지정한다. 자료형(long) 4. fileSizeThreshold = 1024 --> fileUpload 시에 메모리에 저장되는 임시 파일 크기를 정의, 자료형(int) ) ============================================================================== @MultipartConfig( maxFileSize = 1024*1024*5, // 5m maxRequestSize = 1024*1024*5 // 50m ) @WebServlet("/fu") public class FileUpload extends HttpServlet { private static final long serialVersionUID = 1L; public FileUpload() { } // String file = "C:\\파일경로\\파일명"; // // //----------- 파일의 이름 및 경로------------------------------------- // String fileName = file.getName(); // 경로를 제외한 파일 이름 // String parentFolder = file.getParent(); // 파일을 제외한 경로 // String fileAllName = file.getPath(); // 경로를 포함한 파일이름 // String filePath = file.getAbsolutePath(); // 파일의 경로 // // out.write("<p>파일명: " + fileName +"<br />"); // out.write("폴더경로: " + parentFolder +"<br />"); // out.write("전체경로: " + fileAllName +"<br />"); // out.write("절대경로: " + filePath +"<p/>"); // // //------------------확인------------------------------ // File folder = new File("데이터파일 위치 경로"); // out.write("<p>파일존재여부: " + file +"<br />"); // out.write("폴더존재여부: " + folder.exists() +"<br />"); // out.write("디렉토리여부: " + folder.isDirectory() +"<br />"); // out.write("디렉토리여부: " + file.isDirectory() +"<p/>"); // // File[] files = folder.listFiles(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String firstName=""; String exName = ""; String orgName = ""; String folderName ="파일폴더경로"; request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 브라우저에 값을 출력하기 위함 // 업로드된 파일은 getPart()를 통해 받는다. //Part part = request.getPart("uploadFile"); // 받아오는 파일명과 같아야함, requset.getParameter()와 동일 사용법 //-----------------파일 하나만 등록하는 경우-------------------------------------------------- // out.print(part.getSubmittedFileName()); //전송된 파일의 이름값 출력 // String ContentType = part.getHeader("Content-Disposition"); // part.getHeader("Content-Disposition");에 filename=을 포함하고 있으면 파일에 해당하므로 업로드한 파일 데이터를 처리 //------------- part.getSumittedFileName(); 만들시 사용 // int hpos = ContentType.indexOf("filename") + 10; // filename의 인덱스 값 구하는 곳 // String orgName= ContentType.substring(hpos).trim(); // 맨앞 " 제외하고 맨위 글자 까지 가져 오는 것 // // //orgName = "자바 작명 규칙.txt\"".substring(0,"자바 작명규칙.txt\" ..indexof("\"")); // orgName = orgName.substring(0, orgName.indexOf("\"")); // 맨마지막 " 제외 //------------- 여러개 파일 값 ----------------------------------------------- Collection<Part>parts = request.getParts(); // 여러개 파일 받아오는 것 for(Part part : request.getParts()) { // 요청된 파일의 갯수 만큼 반복 orgName = part.getSubmittedFileName(); // 요청된 파일의 이름 가져오는 것 // System.out.println(orgName); firstName = orgName.substring(0,orgName.lastIndexOf(".")); // 파일 앞 이름 => 01_JSP&Servlet1 exName = orgName.substring(orgName.indexOf(".")); // 파일 뒤쪽 이름 => .pdf // System.out.println(firstName + " " + exName); // String filePath = folderName + "\\" + orgName; // 파일 저장 경로 = 폴더명 : 파일원본이름 // String filePath; File file = new File(folderName + "\\" + orgName); // folderName \ orgName // String fileName = ""; String regName = orgName; // 데이터베이스에 저장할 파일명, 새로운 파일을 추가할때 원본 이름을 저장하기 위함 int cnt =1; // 파일명 변경을 위한 변수 while(file.exists()) { // 파일이 존재할 경우 반복 abcdef.txt = 파일 있는지 ? => abcdef1.txt(중복) => abcdef2.txt(중복) => 저장 regName = firstName + cnt++ + exName; // 중복되는 파일이 있는 경우 숫자를 붙여줘서 파일 중복을 없앤다 file = new File(folderName + "\\" + regName); // out.write(folderName + "\\" + regName); } part.write(folderName + "\\" + regName); out.print("<a href='fd?filename=" + regName + "'>파일다운로드("+ regName +")</a><br>" ); // 파일 다운로드 } //out.print(orgName.substring(orgName.indexOf("."))); // orgName을 기준으로 확장자명 앞 .위치 까지 찾기 // out.print(orgName); } }
<파일다운로드> - 파일 다운로드 시 한글 및 특수문자 깨짐 처리(브라우저별로 다름) String encodingFileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1"); String encodingFileName = new String(fileNameOrg.getBytes("UTF-8")); ==================================================================================== @WebServlet("/fd") public class FileDownLoad extends HttpServlet { private static final long serialVersionUID = 1L; public FileDownLoad() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("filename"); String folder = "C:\\Users\\KoTaehoon\\Desktop\\cloud_edu\\JSP_Servlet\\study\\FileTest\\src\\main\\webapp\\fileupload\\"; // 파일 업로드한 폴더 DownLoadPath String filePath = folder + fileName; // 파일 이름이 한글일 경우를 대비해 URF-8로 인코딩함 String encodingFileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1"); // request.setCharacterEncoding("UTF-8"); // response.setContentType("text/html;charset=UTF-8"); byte[] b = new byte[4096]; // 4kb FileInputStream fileInputStream = new FileInputStream(filePath); // 다운 받은 파일 경로 String sMimeType = getServletContext().getMimeType(filePath); if(sMimeType == null) { sMimeType = "application/octet-stream"; } // 다운 로드 받을 수 있게 설정(파일 MINE 타입 얻어오기) response.setContentType(sMimeType); response.setHeader("Content-Disposition", "attachment; filename=" + encodingFileName); // 다운받을 때 원본 파일 이름과 같은 것 다운 받게 하는 것 ServletOutputStream stream = response.getOutputStream(); int read; while((read = fileInputStream.read(b,0,b.length))!= -1) { // -1 데이터 최대 크기 지정 stream.write(b,0,read); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
- JDBC(Java DataBase Connectivity)
- 자바에서 데이터 관련된 작업을 처리할 때 사용하는 API
3.1 JDBC 구조
- JSP를 포함한 자바 어플리케이션에서 데이터베이스를 사용할 때 데이터베이스 종류에 상관없이 JDBC API를 이용해서 데이터베이스에 접근
- JDBC API를 사용하면 DBMS에 알맞은 JDBC 드라이버만 있으면 어떤 데이터베이스라도 사용 가능
- MySQL, ORACLE, MS-SQL 등 주요 DBMS에 맞는 JDBC 드라이버 제공
3.2 JDBC 드라이버 준비
- mysql-connector-java-bin.jar 파일 다운로드 -> WebContent/WEB-INF/lib 폴더에 다운받은 JDBC 파일 복사
3.3 JDBC 프로그래밍 코딩 방법
3.3.1 실행 순서
-> 1. JDBC 드라이버 로딩
Class.forName("com.mysql.jdbc.Driver");
-> 2. 데이터베이스 커넥션 설정
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
-> 3. 쿼리 실행을 위한 Statement 객체 생성
stmt = conn.createStatement();
-> 4. 쿼리 실행
rs=stmt.excuteQuery(query);
-> 5. 쿼리 실행 결과 사용
while(rs.next(){
rs.getString("");
}
-> 6. Statement 종료
if(rs!=null) try {rs.close();} catch(SQLException ex){}
if(stmt!=null) try {conn.close();} catch(SQLException ex){}
-> 7. 데이터베이스 커넥션 종료
if(conn!=null)try{conn.close();} catch(SQLException ex){}<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Servlet : 데이터 전송 예제 1</title> <link href="style.css" rel="stylesheet" /> <script src="https://code.jquery.com/jquery-3.6.1.js"></script> <script src="mem_regForm.js"></script> </head> <body> <div id="container"> <h4>회원가입</h4> <form name="fn" action="./rsd/" method="get" enctype="multipart/form-data"> <table> <caption> 회원가입을 위한 양식 문서 </caption> <colgroup> <col> <col> </colgroup> <tbody> <tr> <th> <label for="temail">이메일</label> </th> <td> <input type="text" name="temail" id="temail" minlength="5" maxlength="50" value="" /> </td> </tr> <tr> <th> <label for="tname">이름</label> </th> <td> <input type="text" name="tname" id="tname" minlength="2" maxlength="20" value="" /> </td> </tr> <tr> <th> <label for="tpwd">비밀번호</label> </th> <td> <input type="password" name="tpwd" id="tpwd" minlength="8" maxlength="16" value="" /> </td> </tr> <tr> <th> <label for="tpwd2">비밀번호 확인</label> </th> <td> <input type="password" name="tpwd2" id="tpwd2" minlength="8" maxlength="16" value="" /> </td> </tr> <tr> <th> 취미 </th> <td> <input type="checkbox" name="thobby" id="thobby1" value="1" /> <label for="thobby1">운동</label> <input type="checkbox" name="thobby" id="thobby2" value="2" /> <label for="thobby2">독서</label> <input type="checkbox" name="thobby" id="thobby3" value="3" /> <label for="thobby3">낚시</label> <input type="checkbox" name="thobby" id="thobby4" value="4" /> <label for="thobby4">등산</label> <input type="checkbox" name="thobby" id="thobby5" value="5" /> <label for="thobby5">음악감상</label> </td> </tr> <tr> <th> <label for="taddr">거주지역</label> </th> <td> <select name="taddr"> <option value="">== 거주지역 선택 ==</option> <option value="부산">부산광역시</option> <option value="대구">대구광역시</option> <option value="인천">인천광역시</option> <option value="광주">광주광역시</option> <option value="대전">대전광역시</option> <option value="울산">울산광역시</option> <option value="서울">서울특별시</option> <option value="제주">제주특별자치도</option> <option value="경기">경기도</option> <option value="강원">강원도</option> <option value="충북">충청북도</option> <option value="충남">충청남도</option> <option value="경북">경상북도</option> <option value="경남">경상남도</option> <option value="잔북">전라북도</option> <option value="전남">전라남도</option> </select> </td> </tr> </tbody> <tfoot> <tr> <td colspan="2"> <span id="btnReg">회원가입</span> <span>가입취소</span> </td> </tr> </tfoot> </table> </form> <div id="resultArea"> <table> <thead> <th>이름</th><th>이메일</th><th>취미</th><th>거주지</th><th>가입일</th> </thead> <tbody> </tbody> <tfoot></tfoot> </table> </div> </div> </body> </html>
$().ready(function() { // jQery 시작 var passChk = false; $("#btnReg").on("click",function(ev){ if(fn.temail.value=="") { alert("비밀번호는 반드시 입력해야 합니다."); fn.temail.focus(); return; } if(fn.tname.value=="") { alert("이름은 반드시 입력해야 합니다."); fn.tname.focus(); return; } if(fn.tpwd.value=="") { alert("비밀번호는 반드시 입력해야 합니다."); fn.tpwd.focus(); return; } if(fn.tpwd2.value=="") { alert("확인을 위한 비밀번호도 반드시 입력해야 합니다."); fn.tpwd2.focus(); return; } if($("input:checked").length==0) { alert("취미는 하나 이상을 선택하셔야 합니다."); return; } if(fn.taddr.value=="") { alert("거주지를 선택해 주세요."); return; } fn.method="get"; // 전송할 타입(get/post) fn.action = "/jdbcCtr/JDBCCtr"; // 이동할 페이지(회원가입) fn.submit(); });//e:$("form").on("submit") var select_obj = ''; $('input[type="checkbox"]:checked').each(function (index) { if (index != 0) { select_obj += ','; } select_obj += $(this).val(); }); //alert(select_obj); var jsonList; $.ajax({ url: "/prjJDBCList/JDBCList", // 해당 서블릿 주소 data:{ // htlm value 값 (변수명 : 전달할 value 값) start : 0, len : 2, temail:fn.temail.value, tname:fn.tname.value, tpwd: fn.tpwd.value, thobby: select_obj, taddr : fn.taddr.value }, method:"GET", dataType: "text",/*json / text / html / xml / csv */ success : function(jsonData) { // 서블릿에서 넘어오는 값의 변수 값과 동일하게 선언해야함 jsonList=JSON.parse(jsonData); //console.log(jsonList); var keyName = ["fname","femail","fhobby","faddr","fdate"]; // JSON 키 값 가져 오기 for(var i =0;i<jsonList.length;i++){ var $tr = $("<tr></tr>"); for(var j= 0;j<keyName.length;j++){ var $td = $("<td></td>"); $td.append(jsonList[i][keyName[j]]); $tr.append($td); } $("#resultArea tbody").append($tr); } }, error:function(request,status,error){ console.log("code:"+request.status); console.log("message:"+request.responseText); console.log("error:"+error); } }); $("#pwd2").on("keypress",function(){ // 비밀번호 일치 확인 passChk=false; if(fn.tpwd.value==fn.tpwd2.value) passChk=true; console.log(passChk); });//e:$("#pwd2").on("keypress"); });//e:$().ready();
package com.JDBCList; import java.sql.*; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/JDBCList") public class JDBCList extends HttpServlet { private static final long serialVersionUID = 1L; public JDBCList() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String start = request.getParameter("start"); String len = request.getParameter("len"); try { Class.forName("com.mysql.jdbc.Driver"); // out.print("드라이브 로딩 성공<br>"); String url = "jdbc:mysql://localhost:3307/jdbc_test?severTimezone=UTC"; String user = "root"; // 연결 DB 사용자명 String passwd = "gwang_1"; // 연결 DB 비밀번호 Connection conn = DriverManager.getConnection(url, user, passwd); // out.print("MySQL 연결 성공<br>"); String sql = "select fidx, femail, fname, fpass, fhobby, faddr, fdate from tmember limit "+ start+", "+ len+ ";"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(sql); String prtTag = ""; String rsFidx,rsEmail, rsName, rsHobby, rsAddr,rsDate; prtTag="["; while(rs.next()) { // db 쿼리 실행 결과 출력을 위해 사용 rsFidx = rs.getString("fidx"); rsName = rs.getString("fname"); rsEmail = rs.getString("femail"); // 해당 컬럼의 값 출력 rsHobby = rs.getString("fhobby"); rsAddr = rs.getString("faddr"); rsDate = rs.getString("fdate"); prtTag += "{\"fidx\" : \""+rsFidx+"\", \"fname\" : \""+rsName+"\", \"fhobby\" : \""+rsHobby+"\", \"faddr\" : \""+rsAddr+"\", \"femail\" : \""+rsEmail+"\", \"fdate\" : \""+rsDate+"\"},"; } prtTag = prtTag.substring(0, prtTag.length()-1); // 마지막 , 제외 prtTag = prtTag+"]"; out.println(prtTag); System.out.println(prtTag); } catch (ClassNotFoundException e) { // 드라이버 로딩, Class.forName("com.mysql.jdbc.Driver"); 에 대한 에러 처리 // out.println("ClassNotFoundException:"+e.getMessage()); System.out.println("ClassNotFoundException:"+e.getMessage()); } catch (SQLException e) { // 서버 처리부, conn = DriverManager.getConnection(url, user, passwd); PreparedStatement pstmt = conn.prepareStatement(sql);에 대한 에러 처리 // out.println("SQLException:"+e.getMessage()); System.out.println("SQLException:"+e.getMessage()); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
package com.jdbcCtr; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // JDBC 필요 객체 import import java.sql.*; //import java.sql.Connection; //import java.sql.DriverManager; //import java.sql.PreparedStatement; //import java.sql.ResultSet; //import java.sql.SQLException; /** * Servlet implementation class JDBCCtr */ @WebServlet("/JDBCCtr") public class JDBCCtr extends HttpServlet { private static final long serialVersionUID = 1L; public JDBCCtr() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // String strEmail = request.getParameter("temail"); String strName = request.getParameter("tname"); String strPwd = request.getParameter("tpwd"); String[] arrHobby = request.getParameterValues("thobby"); String strHobby = String.join(",", arrHobby); // 배열값으로 가져오는 hobby 문자열로 변경 String strAddr = request.getParameter("taddr"); // String url = "jdbc:mysql://localhost:3307/jdbc_test?severTimezone=UTC"; // 해당DB정보/DB주소/DB TABLE명?severTimezone=UTC String user = "root"; // 연결 DB 사용자명 String passwd = "gwang_1"; // 연결 DB 비밀번호 try { Class.forName("com.mysql.jdbc.Driver"); // 자바에서 MySQL을 사용하기 위한 드라이버 설정, 드라이브 로딩 out.print("드라이버 로딩 성공"); Connection conn = null; conn = DriverManager.getConnection(url, user, passwd); String sql = "insert into tmember(femail,fname,fpass,fhobby,faddr,fdate) " + "values('"+strEmail+"','"+strName+"','"+strPwd+"','"+strHobby+"','"+strAddr+"',SYSDATE())"; System.out.println(sql); // String sql = "insert into tmember(femail,fname,fpass,fhobby,faddr,fdate) values('1','2','3','1,2','부산',SYSDATE());"; // String sql = "delete from tmember where idx = 1"; // String sql = "update tmember set femail='123@13', fname='홍길동', fpass='1234', fhobby='1,2,3,4,5', faddr='부산' where fidx=2;"; PreparedStatement pstmt = conn.prepareStatement(sql); // 데이터베이스 스테이트먼트 생성 int rowCnt = pstmt.executeUpdate(); // select문을 제외한 쿼리문 실행 System.out.println(rowCnt); } catch (ClassNotFoundException e) { // 드라이버 로딩, Class.forName("com.mysql.jdbc.Driver"); 에 대한 에러 처리 // out.println("ClassNotFoundException:"+e.getMessage()); System.out.println("ClassNotFoundException:"+e.getMessage()); } catch (SQLException e) { // 서버 처리부, conn = DriverManager.getConnection(url, user, passwd); PreparedStatement pstmt = conn.prepareStatement(sql);에 대한 에러 처리 // out.println("SQLException:"+e.getMessage()); System.out.println("SQLException:"+e.getMessage()); } // out.print(sql); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }