Servlet상품2: 상품등록

AdminGoodsFrontController.java의 doProcess()의 주소비교 후 처리부분에 코드 추가

  • 컨트롤러(.ag) -> 뷰페이지(.jsp)로 이동 : forward 사용
  • .ag -> 디비(Action_DAO_DB) -> .jsp로 이동 : Action사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
System.out.println("--------------@ 주소 비교후 처리 @-------------");
Action action = null;
ActionForward forward = null;
// 주소에 따른 처리 구분 (주소 매핑후 이동)
if(command.equals("/GoodsAdd.ag")){
System.out.println("C: /GoodsAdd.ag 호출");
//.ag -> .jsp로 이동
//컨트롤러 -> 뷰페이지 이동
forward = new ActionForward();
forward.setPath("./admingoods/admin_goods_write.jsp");
forward.setRedirect(false);
}else if(command.equals("/GoodsAddAction.ag")){
System.out.println("C: /GoodsAddAction.ag 호출");
// .ag -> Action_DAO_DB -> .jsp
action = new GoodsAddAction();
try { forward = action.execute(request, response);
} catch (Exception e) { e.printStackTrace(); }
}




GoodsAddAction.java 생성

  1. 파일 업로드 준비 : multipart객체생성
    1. ./upload폴더생성 for 가상경로
    2. 파일이 저장되는 실제위치 : request.getRealPath는 deprecated이므로 context.getRealPath()사용 할 것
  2. 크기 : 10MB (크기가 클수록 서버에는 부담)
  3. multipart객체생성
  4. 상품정보를 저장(파라미터)
  5. GoodsDTO 객체 생성
  6. AdminGoodsDAO 객체생성 -> insertGoods()메서드 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class GoodsAddAction implements Action {

@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("M : GoodsAddAction의 execute() 호출");

//1. 파일 업로드 준비 : multipart객체생성과
//1-1. `./upload`폴더생성 for 가상경로
//1-2. 파일이 저장되는 실제위치 : request.getRealPath는 deprecated이므로 context.getRealPath()사용 할 것
ServletContext context = request.getServletContext();
String realpath = context.getRealPath("/upload");
System.out.println("realpath: "+realpath);
//2. 크기 : 10MB (크기가 클수록 서버에는 부담)
int maxSize = 10 * 1024 * 1024;

//3. multipart객체생성
MultipartRequest multi = new MultipartRequest(
request, realpath, maxSize, "UTF-8", new DefaultFileRenamePolicy()
);
System.out.println("M : 파일업로드완료"+multi);

//4. 상품정보를 저장(파라미터) = GoodsDTO 객체 생성, DBMS에 테이블 생성
GoodsDTO gdto = new GoodsDTO();
gdto.setCategory(multi.getParameter("category"));
gdto.setName(multi.getParameter("name"));
gdto.setPrice(Integer.parseInt(multi.getParameter("price")));
gdto.setColor(multi.getParameter("color"));
gdto.setAmount(Integer.parseInt(multi.getParameter("amount")));
gdto.setSize(multi.getParameter("size"));
gdto.setContent(multi.getParameter("content"));
gdto.setBest(0); //0인경우:일반상품, 1인경우:인기상품
//4-1. 이미지정보처리
String img = multi.getFilesystemName("file1")+","
+ multi.getFilesystemName("file2")+","
+ multi.getFilesystemName("file3")+","
+ multi.getFilesystemName("file4");
System.out.println("img 4개합: "+img);
gdto.setImage(img);

//5. AdminGoodsDAO 객체생성 -> insertGoods()메서드 생성
AdminGoodsDAO agdao = new AdminGoodsDAO();
agdao.insertGoods(gdto);

//6. 페이지 이동
ActionForward forward = new ActionForward();
forward.setPath("./AdminGoodsList.ag");
forward.setRedirect(true);
return forward;
}
}




admin_goods_write.jsp 생성

  • 반드시 post방식을 써야하는 이유 : file업로드를 할 것이기때문에 필수이다.
    • input태그 속성으로 file을 사용했다면 폼태그 속성으로 method="post" enctype="multipart/form-data" 필수!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<%
//관리자만 페이지 볼 수 있게 추가
String id = (String) session.getAttribute("id");
if(id == null || !id.equals("admin")){
response.sendRedirect("./Main.me");
}
%>
<fieldset>
<legend>상품등록</legend>
<form action="" method="post" name="fr">
<table border="1">
<tr>
<td>카테고리</td>
<td>
<select name="category">
<option value="outwear">아우터</option>
<option value="fulldress">정장</option>
<option value="Tshirts">티셔츠</option>
<option value="shirts">셔츠</option>
<option value="pants">바지</option>
<option value="shoes">신발</option>
</select>
</td>
</tr>
<tr>
<td>상품이름</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>판매가격</td>
<td><input type="text" name="price"></td>
</tr>
<tr>
<td>색상</td>
<td><input type="text" name="color"></td>
</tr>
<tr>
<td>수량</td>
<td><input type="text" name="amount"></td>
</tr>
<tr>
<td>사이즈</td>
<td><input type="text" name="size"></td>
</tr>
<tr>
<td>제품정보</td>
<td><input type="text" name="content"></td>
</tr>
<tr>
<td>메인이미지</td>
<td><input type="file" name="file1"></td>
</tr>
<tr>
<td>제품이미지1</td>
<td><input type="file" name="file2"></td>
</tr>
<tr>
<td>제품이미지2</td>
<td><input type="file" name="file3"></td>
</tr>
<tr>
<td>제품이미지3</td>
<td><input type="file" name="file4"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="상품등록">
<input type="reset" value="상품등록취소">
</tr>
</table>
</form>
</fieldset>




GoodsDTO.java 생성 후 코드 추가

  • adminDTO가 아닌 GoodsDTO를 생성 하는 이유는?
    • 관리자가 등록하는 상품과 구매자가 보는 상품이 같기때문에, 관리자상품과 사용자상품으로 나눠서 중복으로 DTO를 생성할 필요가 없다.
  • DBMS에 테이블 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class GoodsDTO {
//1번규칙만족 : 클래스는 public
//2번규칙만족 : 멤버변수선언 private
private int gno;
private String category;
private String name;
private int price;
private String color;
private int amount;
private String size;
private String content;
private String image;
private int best;
private Date date;

//4번규칙만족 : 기본생성자존재하지만 생략됨

//3번규칙만족 : 멤버변수마다 별도의 get/set메소드가 존재해야한다.

public int getGno() {
return gno;
}
public void setGno(int gno) {
this.gno = gno;
}

중략

@Override
public String toString() {
return "GoodsDTO [gno=" + gno + ", category=" + category + ", name=" + name + ", price=" + price + ", color="
+ color + ", amount=" + amount + ", size=" + size + ", content=" + content + ", image=" + image
+ ", best=" + best + ", date=" + date + "]";
}




AdminGoodsDAO.java 생성 후 insertGoods()메서드 코드 추가

  • DB연결 메서드인 getCon()구현
  • 자원해제 메서드인 closeDB()구현
  • insertGoods()구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//상품등록
public void insertGoods(GoodsDTO gdto) {
int num = 0;
try{
getCon();
//1. 상품등록번호계산
sql = "select max(gno) from itwill_goods";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()){
num = rs.getInt(1)+1; //인덱스 사용 호출
//rs.getInt("max(bno)"); // 컬럼명 사용 호출
}
System.out.println("DAO : 상품번호 "+num);

//2. 상품등록
sql = "insert into itwill_goods values(?,?,?,?,?,"
+ "?,?,?,?,?,"
+ "now())";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.setString(2, gdto.getCategory());
pstmt.setString(3, gdto.getName());
pstmt.setInt(4, gdto.getPrice());
pstmt.setString(5, gdto.getColor());
pstmt.setInt(6, gdto.getAmount());
pstmt.setString(7, gdto.getSize());
pstmt.setString(8, gdto.getContent());
pstmt.setString(9, gdto.getImage());
pstmt.setInt(10, gdto.getBest());
pstmt.executeUpdate();
System.out.println("상품등록완료");
}catch(Exception e){
e.printStackTrace();
}finally{
closeDB();
}
}//end of insertGoods()