BASHA TECH
ch08 본문
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
반응형
Comments