본문 바로가기

Java 웹 개발

21.10.08 - 웹 개발 입문 40일차

39일차 과제 - 추가 풀이

 

member 목록과 검색을 한 번에
1. 검색분류와 검색어가 없으면 목록을 조회하여 출력
2. 검색분류와 검색어가 있으면 검색을 수행하여 출력

package jdbc.test;

import java.util.List;

import jdbc.beans.MemberDao;
import jdbc.beans.MemberDto;

public class Test18_1 {
	public static void main(String[] args) throws Exception {

		String column = "member_id";
		String keyword = "test";

//		boolean isSearch = column이 있고 keyword가 있으면;
		boolean isSearch = (column != null && !column.equals("")) 
					&& (keyword != null && !keyword.equals(""));
		System.out.println("isSearch = " + isSearch);

		MemberDao memberDao = new MemberDao();
		List<MemberDto> list;
		if(isSearch) {
			list = memberDao.select(column, keyword);
		}
		else {
			list = memberDao.list();
		}

		for(MemberDto memberDto : list) {
			System.out.println(memberDto);
		}
	}
}

 

 

 

[8] 단일조회(R) 메소드
= 결과가 1개 또는 0개로 나오는 메소드
= 매개변수 : 시험지번호(exam_id, int)
= 반환형 : 시험지정보(ExamDto)
= select * from exam where exam_id = ?

public ExamDto select(int examId) throws Exception {
	Connection con = JdbcUtils.connect(USERNAME, PASSWORD);

	String sql = "select * from exam where exam_id = ?";
	PreparedStatement ps = con.prepareStatement(sql);
	ps.setInt(1, examId);
	ResultSet rs = ps.executeQuery();

	// copy
	// ExamDto examDto = 객체 or null;
	ExamDto examDto;
	if (rs.next()) {// 있으면
		examDto = new ExamDto();

		examDto.setExamId(rs.getInt("exam_id"));
		examDto.setStudent(rs.getString("student"));
		examDto.setSubject(rs.getString("subject"));
		examDto.setType(rs.getString("type"));
		examDto.setScore(rs.getInt("score"));
	} else {// 없으면
		examDto = null;
	}

	con.close();

	return examDto;
}

 

package jdbc.test;

import jdbc.beans.ExamDao;
import jdbc.beans.ExamDto;

public class Test19 {
	public static void main(String[] args) throws Exception {
		//exam 단일조회

		//입력 : 시험지번호
		int examId = 3;

		//처리
		ExamDao examDao = new ExamDao();
		ExamDto examDto = examDao.select(examId);

		//출력
		if(examDto == null) {
			System.out.println("해당 시험지는 존재하지 않습니다");
		}
		else{
			System.out.println(examDto);//examDao toString 설정
		}
	}
}

ExamDto [examId=3, student=피카츄, subject=네트워크프로그래밍구현, type=서술형, score=60]

 

 

 

모듈의 결합을 통한 서비스 구현

ex : 회원가입 - 회원 가입 시 아이디 중복 검사

package jdbc.test;

import java.util.Scanner;

import jdbc.beans.MemberDao;
import jdbc.beans.MemberDto;

public class Test22 {
	public static void main(String[] args) throws Exception {

		//-> 아이디를 먼저 입력받아서 사용이 가능한지 확인 후 나머지 정보를 입력받겠다
		MemberDao memberDao = new MemberDao();
		MemberDto memberDto = new MemberDto();

		Scanner sc = new Scanner(System.in);

		System.out.print("아이디 : ");
		String memberId = sc.nextLine();

		//아이디검사
		if(memberDao.get(memberId) != null) {//memberId의 단일조회 결과가 있으면(not null) = 아이디가 이미 존재한다면
			System.out.println("이미 사용중인 아이디입니다");
			System.exit(0);
		}

		memberDto.setMemberId(memberId);

		System.out.print("비밀번호 : ");
		memberDto.setMemberPw(sc.nextLine());

		System.out.print("닉네임 : ");
		memberDto.setMemberNick(sc.nextLine());

		System.out.print("생년월일 : ");
		memberDto.setMemberBirth(sc.nextLine());

		System.out.print("이메일 : ");
		memberDto.setMemberEmail(sc.nextLine());

		System.out.print("전화번호 : ");
		memberDto.setMemberPhone(sc.nextLine());

		sc.close();

		//가입
		memberDao.join(memberDto);
		System.out.println("가입이 완료되었습니다");

	}
}

아이디 : zxcvb
비밀번호 : asdqwe123
닉네임 : 호랑이
생년월일 : 1999-09-09
이메일 : asdqwe@asd.com
전화번호 : 010-0000-0000
가입이 완료되었습니다

 

 

 

 

웹 - 서버 설치

apache-tomcat-9.0.54 설치

Download -> Tomcat 9 -> 64-bit Windows zip 다운로드

 

 

 

 

Java EE (default)로 변경

 

 

Servers -> No server are available. Click this link to create a new server... 클릭

 

 

 

Apache -> Tomcat v9.0 Server 선택 후 Next

 

 

Apache tomcat v9.0 설치 경로 선택 후 Finish

 

완료

 

 

 

서버 실행해보기

 

 

Dynamic Web Project로 생성

 

 

버전 확인후 Next>

 

src\main\java 확인 후 Finish

web01 -> src -> webapp -> hello.txt File 생성 후 hello 쓰고 저장

Servers 칸에서 마우스 오른쪽 누르기 -> Add and Remove... 누르기

실행할 프로젝트 web01 만 Add를 눌러서 Configured: 로 보내고 Finish

Servers 칸에서 마우스 오른쪽 누르기 -> Start 누르기

started, synchronized - 시작되었으며 최신 상태
started, republish - 시작되었으나 갱신이 필요한 상태

 

 

크롬창에 http://localhost:8080/web01/hello.txt 입력 후

메시지 확인 완료

 

웹 프로젝트 구조 예시

웹 프로젝트 구조

웹 - 동적 컨텐츠 생성

서블릿(Servlet)
사용자가 주문할 수 있는 프로그래밍 코드를 보관한 클래스

(생성과정 예시)
1. 적합한 부모 클래스를 찾아서 상속받는다(HttpServlet). - 자격 획득
2. 주문 가능하도록 주소를 설정
3. 이 파일(페이지)을 주문하면 만들어질 내용을 코드로 작성
    - 부모 클래스의 service()를 재정의하여 작성한다!

 

Dynamic Web Project - web03 -> src/main/java -> web03 -> WelcomeServlet 생성

package web03;

import java.io.IOException;

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(urlPatterns = "/welcome.txt")//2 주소
public class WelcomeServlet extends HttpServlet {//1 권한 상속
	@Override//3
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//System.out.println("hello Servlet");//결과를 서버의 콘솔에 출력
		resp.getWriter().println("Hello Servlet");//결과를 사용자가 볼 화면에 출력
	}
}

 

코드를 수정 하거나 새로 만들면 서버를 Restart를 해줘야한다

 

주소는 @WebServlet(urlPatterns = "/welcome.txt") -> "/welcome.txt" 만 뒤에 써주면된다 ( "/" 를 꼭 붙인다 )

-> http://localhost:8080/web03/welcome.txt

 

Q. 화면에 1부터 10까지 출력되도록 서블릿을 구현

package web03;

import java.io.IOException;

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(urlPatterns = "/number.txt")
public class NumberServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		for(int i=1; i <= 10; i++) {
			resp.getWriter().println(i);
		}
	}
}

 

웹 - 서블릿 파라미터 처리

입력 - 스캐너 사용 금지
= 웹 페이지에서의 입력은 "주소"를 통해서 파라미터로 전달된다.
= 주소에 ?가 있다면 그 뒷부분을 파라미터라고 보면 된다.
= 사용자가 보낸 정보(요청정보)를 가진 객체인 req에서 파라미터를 추출하도록 지시
= req.getParameter("a") 는 파라미터 중 a와 연결된 데이터를 가져오라는 뜻(없으면 null)
= 모든 파라미터는 무조건 String으로만 읽힌다.
= 숫자로 바꾸고 싶다면 변환명령을 추가로 작성해야 한다.
= ex) 주소뒤에 "?a=10&b=20" 처럼 쓴다

= ex) http://localhost:8080/web03/plus.txt?a=10&b=20

package web03;

import java.io.IOException;

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(urlPatterns = "/plus.txt")
public class PlusServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		int a = Integer.parseInt(req.getParameter("a"));
		int b = Integer.parseInt(req.getParameter("b")); 
		
		// 계산
		int total = a + b;

		// 출력
		resp.getWriter().println("total = " + total);

	}
}

 

 

Q. 과제

## web04.servlet.SubwayServlet
접속주소 - http://localhost:8080/web04/subway.txt
사용자에게 `birth`라는 이름으로 출생년도 4자리를 파라미터로 전달받은 뒤
나이를 계산하여 나이에 맞는 지하철 요금을 화면에 출력
요금 기준은 과거에 풀었던 예제 혹은 인터넷 검색을 하여 진행

package servlet;

import java.io.IOException;

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(urlPatterns = "/subway.txt")
public class SubwayServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		int birth = Integer.parseInt(req.getParameter("birth"));

		// 처리
		int age = 2021 - birth + 1;

		resp.getWriter().println("age = " + age);

		if (age >= 20 && age < 65) {
			resp.getWriter().println("price = " + 1250);

		} else if (age >= 14 && age < 20) {
			resp.getWriter().println("price = " + 720);

		} else if (age >= 8 && age < 14) {
			resp.getWriter().println("price = " + 450);

		} else {
			resp.getWriter().println("price = " + 0);
		}

	}
}

## web04.setvlet.TotalServlet
접속주소 - http://localhost:8080/web04/total.txt
사용자에게 `begin`과 `end`라는 이름으로 각각 두개의 정수를 파라미터로 전달받은 뒤
해당하는 구간에 존재하는 모든 정수의 합계를 구하여 화면에 출력

package servlet;

import java.io.IOException;

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(urlPatterns = "/total.txt")
public class TotalServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		int begin = Integer.parseInt(req.getParameter("begin"));
		int end = Integer.parseInt(req.getParameter("end"));

		int total = 0;
		for (int i = begin; i <= end; i++) {
			total += i;
			
		}
		resp.getWriter().print(" total = " + total);
	}
}