BASHA TECH

ch08 본문

Computer/JSP

ch08

Basha 2022. 8. 30. 17:04
728x90

Calculator

jwbook/src/main/java/ch08

> CalcController.java class 

package ch08;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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("/calcController")
public class CalcController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public CalcController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
//		 입력값 추출
		 int n1 = Integer.parseInt(request.getParameter("n1"));
		 int n2 = Integer.parseInt(request.getParameter("n2"));
		 String op = request.getParameter("op");
		 
//		 처리 => 연산
		 Calculator calc = new Calculator(n1, n2, op);
		 long result = calc.calc();
		 
//		 화면 단으로 보낸다
		 request.setAttribute("result", result);
		 RequestDispatcher disp = request.getRequestDispatcher("/ch08/calcResult.jsp");
		 disp.forward(request, response);
	}

}

> Calculator.java class 

 

package ch08;

public class Calculator {
	private int n1;
	private int n2;
	private String op;
	
	public Calculator(int n1, int n2, String op) { //생성자 생성
		this.n1 = n1; //초기화 
		this.n2 = n2;
		this.op = op;
	}
	
	public long calc() {
		long result = 0; // 결과 저장 변수
		
		switch(op) { 
		case "+" : result = n1 + n2; break;
		case "-" : result = n1 - n2; break;
		case "*" : result = n1 * n2; break;
		case "/" : result = n1 / n2; break;
		}
//		System.out.println("n1 : " + n1 + "n2" + n2 + "op : " + op);
//		System.out.println("result : " + result);
		return result;
	}
}

 

jwbook/src/main/wepapp/ch08

> calcForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>계산기-컨트롤러</h2>
	<hr>
	<form method="post" action="/jwbook/calcController">
		<input type = "text" name="n1" size="10">
		<select name="op">
			<option>+</option>
			<option>-</option>
			<option>*</option>
			<option>/</option>
		</select>
		<input type = "text" name="n2" size="10">
		<input type = "submit" value="실행">
	</form>
</body>
</html>

jwbook/src/main/wepapp/ch08

> calcResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기-컨트롤러</title>
</head>
<body>
	<h2>계산 결과-컨트롤러</h2>
	<hr>
	결과 : ${result}
</body>
</html>

Product

jwbook/src/main/java/ch08

> ProductController.java class

package ch08;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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("/pcontrol")
public class ProductController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	ProductService services;
	
//	Servlet Container object 생성 => new 하지 않고 생성함. => 싱글톤 패턴
//	따라서 생성자 호출이 안된다. 
//    public ProductController() { //생성자가 바뀌어야 함. 왜?=>was의 servlet container가 싱글톤 패턴으로 움직인다 = > 
//    singleton pattern은 new를 못함. 따라서 WAS에서 생성자가 호출되지 않는다.  => data생성 안됨
//    life cycle: 객체 생성, 소멸... 싱글톤 패턴으로 생성될때 init 호출 => 서비스 생성
//    	services = new ProductService(); // 여기서 ProductService를 생성이 안됨.
//    }
    
    @Override
    public void init(ServletConfig config) throws ServletException { //Http Servlet에 있는 메소드
    	super.init(config);
    	services = new ProductService(); //따라서 여기서 ProductService를 생성해야한다.
    } 

    //overriding 하고 http를 지원해야함. 첫번째것을 오버라이딩 해야함. 왜?=> 요청을 받을 수 있어야하니까
    // parameter가 http request service해야함
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
    		throws ServletException, IOException {
//  QueryString: ?action x => 상품 목록(액션이 없으면(null) 리스트로 넘어가게함), ?action=list => 상품 목록, ?action=info => 상품 상세
    	String action = req.getParameter("action");//  파라미터를 선택한 후, if를 써서 목록 데이터로 넘어갈것인지 상세데이터로 들어갈 것인지 선택해줘야함
    	String view = ""; //jsp가 선택하게끔 하는 것
    	RequestDispatcher disp;
    	// ?action X => list (상품 목록)
    	if(action == null) {
    		disp = req.getRequestDispatcher("/pcontrol?action=list");
    		disp.forward(req, resp);
    	} else {
    		switch(action) {
    		case "list" : view = list(req, resp); break;
    		case "info" : view = info(req, resp); break;
    		}
    		disp = req.getRequestDispatcher("/ch08/" + view); //view에서 jsp 파일을 return한다.
    		disp.forward(req, resp);
    	}
    }
    
    private String list(HttpServletRequest req, HttpServletResponse resp) { //사실 여기선 res 안해도 됨. 왜? => 아직 forwarding 안해서...
    	req.setAttribute("products", services.findAll());
    	return "productList.jsp";
    	
    }
    
    private String info(HttpServletRequest req, HttpServletResponse resp) {
    	req.setAttribute("product", services.find(req.getParameter("id")));
    	return "productInfo.jsp";
    }
}

jwbook/src/main/java/ch08

> ProductDto.java class

package ch08;

public class ProductDto {
	// 컬럼 명과 동일한 이름의 변수명으로 설정하기
	private String id;
	private String name;
	private String maker;
	private int price;
	private String date;
	
//	alt+s, a : 생성자 단축키 / source => Generate Constructor using Field 
	public ProductDto(String id, String name, String maker, int price, String date) {
//		super(); //super는 있어도 그만 없어도 그만.. 생략해두 됨
		this.id = id;
		this.name = name;
		this.maker = maker;
		this.price = price;
		this.date = date;
	}

//	alt+s, r : getter setter 단축키 / source => Generate Getter and Setter
	public String getId() {
		return id;
	}


	public void setId(String id) {
		this.id = id;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public String getMaker() {
		return maker;
	}


	public void setMaker(String maker) {
		this.maker = maker;
	}

	public int getPrice() {
		return price;
	}


	public void setPrice(int price) {
		this.price = price;
	}


	public String getDate() {
		return date;
	}


	public void setDate(String date) {
		this.date = date;
	}

//	alt+s, r : getter setter 단축키 / source => Generate toString()
	@Override
	public String toString() {
		return "ProductDto [id=" + id + ", name=" + name + ", maker=" + maker + ", price=" + price + ", date=" + date
				+ "]";
	}

}

jwbook/src/main/java/ch08

> ProductService.java class

package ch08;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

// 상품 목록, 상품 상세를 생성하는 역할 클래스
public class ProductService {
	//메소드가 원래 2개를 가져야함. 근데 본 예제에서 생성자에서 모든 것을 해결함.
//	전체 상품 목록 저장하는 해쉬맵을 생성한다. ctrl+shift+o: 자동 생성자를 만들어주는 단축키
	Map<String, ProductDto> products = new HashMap<>(); //제네릭을 건다. 
	
//	생성자로 상품을 목록(해쉬맵의 products)에 등록 => 원래는 DB 연동 처리
	public ProductService() { //db에 없는 상품 생성자로 임의로 생성하는 것임
		ProductDto p = new ProductDto("101", "애플사과폰 12", "애플", 1200000, "2020.12.12");
		products.put("101", p);
		
		p = new ProductDto("102", "삼전우주폰 21", "삼전전자", 1300000, "2021.2.2");
		products.put("102", p);
		
		p = new ProductDto("103", "엘스듀얼폰", "엘스전자", 1500000, "2021.3.2");
		products.put("103", p);
	}

//	전체 상품 목록 (ArrayList) 리턴
	public ArrayList<ProductDto> findAll(){
		return new ArrayList<>(products.values());
	}
	
//	상품 상세 정보 (ProductDto)를 리턴
	public ProductDto find(String id) {
		return products.get(id);
	}
}

jwbook/src/main/java/ch08

> ProductTest.java class

package ch08;

public class ProductTest {

	public static void main(String[] args) {
		ProductService ps = new ProductService();
		for(ProductDto p : ps.findAll()) {
			System.out.println(p);
		}
		System.out.println(ps.find("101"));
	}

}

jwbook/src/main/wepapp/ch08

> productList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%-- uri는 ctrl+space 해서 경로 치는 것이 좋다. 오타도 안 나고 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 목록</title>
</head>
<body>
	<h2>상품 목록</h2>
	<hr>
	<table border="1">
		<tr>
			<th>상품번호</th>
			<th>상품명</th>
			<th>가격</th>
		</tr>
		<c:forEach items="${products }" var="product" varStatus="i">
			<tr>
				<td>${product.id}</td>	<%--원래는 getid로 호출하는데 이엘을 이용함 --%>		
				<td>${product.name}</td>			
				<td>${product.price}</td>			
			</tr>
		</c:forEach> 
		 
	</table>
	
</body>
</html>

jwbook/src/main/wepapp/ch08

> productInfo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 상세 정보</title>
</head>
<body>
	<h2>상품 상세 정보</h2>
	<hr>
	<ul>	
		<li>상품코드: ${product.id}</li>
		<li>상품명: ${product.name}</li>
		<li>제조사: ${product.maker}</li>
		<li>가격: ${product.price}</li>
		<li>등록일: ${product.date}</li>
	</ul>
	<a href="/jwbook/pcontrol?action=list">상품 목록</a>
</body>
</html>
728x90
반응형

'Computer > JSP' 카테고리의 다른 글

ch09  (0) 2022.08.31
JSP 목차  (0) 2022.08.30
ch07  (0) 2022.08.29
ch05-06  (0) 2022.08.25
Ch05. 서블릿의 이해  (0) 2022.08.24
Comments