6월 20일 내용정리
1.파일 업로드
(1)multipart/form-data
form은 입력 양식 전체를 감싸는 태그이다.
multipart/form-data 속성은 form태그 중 enctype의 속성을 지정할때 사용하는데,
여기서 enctype은 '폼데이터가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시한다.'
인코딩 여러 방식중
multipart/form-data는 모든 문자를 인코딩하지 않음을 명시한다. 이방식을
요소가 파일이나 이미지를 서버로 전송할 때 주로 사용한다.
package study_0620;
@WebServlet("/upload4")
public class upload4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request,response);
}
protected void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); //form태그의 POST방식으로 보낼때 '한글'일 경우 깨지지 않게 전달하기 위함,
//get방식으로 보낼때는 톰캣에서 처리해주어 상관없음
response.setContentType("text/html; charset=UTF-8"); //응답을 해석할때 UTF-8로 해석해줘 라는 말
PrintWriter out =response.getWriter();
String savePath="upload"; // 'upload'폴더에 업로드 해죠
int uploadFileSizeLimit=5*1024*1024; //파일사이즈 5MB
String enctype="UTF-8"; //속성은 UTF-8로 지정
ServletContext context=getServletContext(); //페이지에 대한 서블릿 실행 환경 정보를 담고 있는
//application 내장 객체를 리턴한다
String uploadFilePath = context.getRealPath(savePath); //페이지에 대한 정보중 절대경로는 구하는 메서드로
//위에 savePath에 저장된 경로가 업로드파일경로로 지정됨
System.out.print("서버상 실제 디렉토리:");
System.out.println(uploadFilePath);
//MultipartRequest 파일 업로드를 직접적으로 담당하는 클래스이며,객체생성
//파일업로드를 담당하는 생성자 및 여러 메소드를 포함하고 있다.
MultipartRequest multi = new MultipartRequest(
request,
uploadFilePath,
uploadFileSizeLimit,
enctype,
new DefaultFileRenamePolicy());//파일네임중복을 담당하는 메서드
String fileName=multi.getFilesystemName("uploadfile"); //업로드하는파일 이름받아오는 메서드
if(fileName==null) {
System.out.println("파일 업로드 되지 않았슴");
}else {
out.println("글쓴이 : "+multi.getParameter("name"));
out.println("제목 : "+multi.getParameter("title"));
out.println("글쓴이 : "+fileName);
}
}
}
2.데이터베이스 작동하기
(1)서블릿의 비지니스 로직 처리방법
-서블릿이 클라이언트로부터 요청을 받으면 그 요청에 대해 작업을 수행 하는 것
-웹 프로그램에서 대부분의 비즈니스처리 작업은 데이터베이스 연동 관련 작업이지만 그 외에 다른서버와 연동해서 데이터를 얻는 작업도 수행
-서블릿의 가장 핵심기능
(2)데이터베이스 연동과정

-클라이언트로 부터 요청을 받습니다.
-데이터베이스 연동과 같은 비즈니스로직을 서블릿으로 전달하고 memberDAO와 memberVO 클래스로 요청하고
-DB로 연결이 되고 서로 주고받고
-요청해왔던 순서를 백으로 응답을 가지고 돌아감.

<%@page import="java.sql.*" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
//전역변수 선언
Connection conn=null; //DB연결 커넥션변수 선언
Statement stmt=null; //명령문 변수 선언
ResultSet rs=null; //응답변수 선언
String url="jdbc:oracle:thin:@localhost:1521:xe"; //jdbc의 연결주소
String uid="scott";
String pw="tiger";
String sql="select*from member"; //sql명령문
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 출력폼 작성 -->
<table width="800" border="1">
<tr>
<td>이름</td>
<td>아이디</td>
<td>암호</td>
<td>이메일</td>
<td>전화번화</td>
<td>권한(1:관리자, 2:일반회원)</td>
</tr>
<%
try{
Class.forName("oracle.jdbc.driver.OracleDriver"); //드라이버 로딩
conn=DriverManager.getConnection(url,uid,pw); //로딩된 드라이버로 연결하기
stmt=conn.createStatement();//연결된 드라이버를 통해 명령문생성
rs=stmt.executeQuery(sql); //생성된 명령문에 sql쿼리문을 넣어 응답타입 변수에 넣기
while(rs.next()){ //다음이 있다면 꺼내죠
out.println("<tr>");
out.println("<td>"+rs.getString("name")+"</td>"); //응답변수에 name을 가져와서 넣어죵
out.println("<td>"+rs.getString("userid")+"</td>");//응답변수에 userid을 가져와서 넣어죵
out.println("<td>"+rs.getString("pwd")+"</td>");//응답변수에 pwd을 가져와서 넣어죵
out.println("<td>"+rs.getString("email")+"</td>");//응답변수에 email을 가져와서 넣어죵
out.println("<td>"+rs.getString("phone")+"</td>");//응답변수에 phone을 가져와서 넣어죵
out.println("<td>"+rs.getInt("admin")+"</td>");//응답변수에 admin을 가져와서 넣어죵
out.println("</tr>");
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(rs!=null) //rs가 비어있지 않다면
rs.close();
if(stmt!=null)//stmt가 비어있지 않다면
rs.close();
if(conn!=null)//conn가 비어있지 않다면
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
%>
</table>
</body>
</html>