본문 바로가기
국비학원/수업기록

국비 지원 개발자 과정_Day56

by 루팽 2023. 2. 16.

<시험 풀이>

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>회원 가입 양식</title>
    <style>
      div{
        height: 185px;
        width: 370px;
        border: 1px solid black;
        padding-top: 20px;
        padding-left: 20px;
        margin-top:25px;
      }
      p{
        background-color: white;
        font: 14px black;
        position: absolute;
        top: 2px;
        left: 20px;
      }
      td{
        font-size: 14px;
      }
      .id{
        margin: 5px 0;
        margin-left: 10px;
      }
      .pw{
        margin: 5px 0;
        margin-left: 10px;
      }
      .pwRe{
        margin: 5px 0;
        margin-left: 10px;
      }
      .radio{
        margin: 5px 0px 5px 0px;
      }
      .rLable{
        margin: 5px 0px 5px 2px;
        margin-left: 12px;
      }
      .btn-chk{
        font-size: 12px;
      }
      .btn-reset{
        font-size: 12px;
        position: absolute;
        left: 177px;
        margin: 10px 0;
      }
      .btn-submit{
        font-size: 12px;
        position: absolute;
        left: 233px;
        margin: 10px 0;
      }
    </style>
  </head>
  <body>
    <div>
      <p >회원 가입 양식</p>
      <form id="f_test" action="test" method="get">
        <table>
          <tr>
          <td>아이디</td>
          <td>
            <input class="id" id="id" type="text" size="20px">
            <input class="btn-chk" id="btn-chk" type="button" value="중복확인">
            <!--
              button -> type: submit(화면전환)
              input[button] -> type:button
              a -> 타입대신 href(페이지이동 or 함수호출-화면전환x)
              location.href=hashchange

              아이디 중복확인은 버튼이 눌릴때마다 이벤트가 적용되야 하므로
              반드시 addEventListener로 처리해야한다(onclick으로하면 마지막 한번만 처리됨!)
            -->
          </td>
        </tr>
        <tr>
          <td>비밀번호</td>
          <td>
            <input class="pw" type="password" size="20px"></input>
          </td>
        </tr>
        <tr>
          <td>비밀번호확인</td>
          <td>
            <input class="pwRe" type="password" size="20px"></input>
          </td>
        </tr>
        <tr>
          <td class="loc">지역</td>
          <td>
            <label class="rLable" for="loc1">서울</label>
            <input name="radio" class="radio" type="radio" id="loc1" value="서울"></input>
            <label class="rLable" for="loc2">부산</label>
            <input name="radio" class="radio" type="radio" id="loc2" value="부산"></input>
            <label class="rLable" for="loc3">대구</label>
            <input name="radio" class="radio" type="radio" id="loc3" value="대구"></input>
          </td>
        </tr>
      </table>
      <input class="btn-reset" id="btn-reset" type="reset" value="초기화"></input>
      <input class="btn-submit" id="btn-submit" type="button" value="회원가입"></input>
    </form>
  </div>
  <script>
    // 중복확인 버튼을 눌렀을 때
    const check = document.querySelector('#btn-chk');
    check.addEventListener('click', ()=>{
      const regEx = /^[a-z][a-zA-z0-9!@#]{5,11}$/; // 영문소문자로 시작하고 영문,숫자,!@#만 들어가는 6~12자
      const user = document.querySelector('#id') // 아이디 입력하는 텍스트필드
      let str = user.value // 사용자가 텍스트필드에 입력한 아이디 읽기
      let isFlag = false; // 유효성테스트 결과 담기

      // 입력값이 null이 아니고 길이가 있다면 정규식 유효성테스트
      if(str.length !== null && str.length > 0){
        isFlag = regEx.test(str)
      }

      // 삼항연산자 - true면 녹색, false면 빨강
      isFlag ? user.style.backgroundColor = 'green' : user.style.backgroundColor ='red'
    }) // end of 중복확인
    
    
    // radio 선택값 가져오기
    const locs = document.querySelectorAll('.radio')
    let user = "";
    
    for(let i = 0; i<locs.length; i++){
      locs[i].addEventListener('click', ()=>{
        user = locs[i].value
      })
    }

    // 회원가입 버튼을 눌렀을 때
    const btnJoin = document.querySelector('#btn-submit')
    btnJoin.addEventListener('click', ()=>{
      if(user === "" || user.length === 0){
        window.alert("지역을 선택해주세요")
        return
      }
      console.log("after => " + user); // 지역을 선택하지 않으면 위의 return떄문에 출력x
    }) // end of 회원가입


    // 초기화 버튼 - 배경색, user배열 초기화
    document.getElementById('btn-reset').addEventListener('click', ()=>{
      document.getElementById('id').style.backgroundColor = 'white';
      user = "";
    }) // end of 초기화
  </script>
  </body>
</html>

 

<MyBatis, Servlet, JSP 프로젝트 - TestServlet>

package com.mvc.controller;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.mvc.dao.TestDao;

public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	Logger logger = Logger.getLogger(TestServlet.class);

	// 사용자정의메소드 doService
	public void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.fatal("doService 호출");
		logger.debug("doService 호출");
		logger.info("doService 호출"); // 주로 사용할것
		logger.warn("doService 호출");
		logger.error("doService 호출");
		TestDao tDao = new TestDao();
		List<Map<String,Object>> mList = tDao.getBookMember();
		/*
		 * 페이지 이동
		 * 	페이지 이동 getMemberList.jsp
		 * 
		 * 페이지의 물리적인 경로는 어디를 바라보고 있는가?
		 * 	web.xml -> servlet-mapping[/test/test.do] -> url-pattern
		 * 
		 * 경로명/요청을 처리하는 이름.do
		 * 	뒤에 온 확장자 .do는 의미없다
		 * 	왜? -> 해당 요청을 인터셉트해서 해당 업무를 담당하는 클래스에 연결(FrontController.java설계 - 각 업무별 XXXController 필요함)을 해야함
		 * 	페이지 처리는 JSP에게 맡김
		 * 	서블릿은 요청을 받아서 업무 담당자에게 연결(매핑, 매칭)
		 * 
		 * 이것을 어떻게 나눌 것인가?
		 * 	요청은 업무담당자나 사용자 선택에 따라 결정
		 * 	결정에 대응하는 클래스 FrontController 연결
		 * 	FrontController에서 실제 업무를 담당하는 XXXController에 전달할 때
		 * 	요청객체와 응답객체 또한 전달되어야 한다 -> doGet, doPost, doPut, doDelete로 주입받음(톰캣이, 요청이 일어나면 주입해준다)
		 * 
		 * 
		 * 요청객체(request)로 무엇을 누릴 수 있는가? - request의 타입은 HttpServletRequest
		 * 	1. 사용자가 입력한 값을 듣기 위해(요청할때) 필요(서버기준)
		 * 	request.getParameter("XXX"); -> mem_id, mem_name, mem_address 등이 될 수 있음
		 * 
		 * 	2. 세션을 생성할 때 사용함
		 * 	HttpSession session = request.getSession(); -> 세션객체생성
		 * 
		 * http 프로토콜이 비상태 프로토콜이므로 상태값을 관리하는 별도의 메카니즘이 필요함
		 * 쿠키와 세션(시간을 지배함) <- List, Map <- 객체배열[{}] <- 배열 <- 원시형타입 (완결편이 쿠키와 세션)
		 * 
		 * request.getParameter("") 리턴타입 String -> request가 소유
		 * session.getAttribute("") 리턴타입 Object -> 더 강력, session 소유
		 * 
		 * 
		 * 응답객체(response)로 무엇을 누릴 수 있는가? - response의 타입은 HttpServletresponse
		 * 	1. 마임타입을 결정한다
		 * 	response.setContentType();
		 * 	서블릿인데 json, html,xml이 될 수 있다
		 * 	response.setContentType("application/json")
		 * 	response.setContentType("text/html")
		 * 	response.setContentType("text/xml")
		 * 
		 * 	2. 페이지이동
		 * 	response.sendRedirect("페이지이름") -> 페이지이동이 일어남(주소창이 바뀜)
		 * 	-> 기존의 요청이 끊어지고 새로운 요청이 발생함 -> 계속 유지하고있는 것처럼 보여져야함
		 * 	-> 그러니 쿠키나 세션에 담아둔다(왜냐하면 비상태 프로토콜이니까)
		 * 
		 * 쿠키 - 문자열(객체 못받음), 로컬PC에 저장됨(노출될 수 있다, 보안취약)
		 * 세션 - 캐시메모리에 저장됨(객체 받음, 노출 어렵다)
		 */
		
		/*
		 * 아래 코드를 만나기 전까지는 http://localhost:9000/test/test.do를 보여주다가
		 * 아래의 코드를 만나면 http://localhost:9000/test/getMemberList.jsp를 요청함
		 * 
		 * 테스트 시나리오
		 * 방법1) TestServlet.java소스에서 오른쪽 버튼을 눌러 실행시킴
		 * 방법2) 브라우저 주소창에 http://localhost:9000/test/test.do 요청
		 */
		res.sendRedirect("./getMemberList.jsp");
//		String cTime = tDao.testDate();
//		logger.info("today: " + cTime);
	}

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		doService(req, res);
	}

	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		doService(req, res);
	}
}

 

<MyBatis, Servlet, JSP프로젝트 - web.xml에 TestServlet추가>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	id="WebApp_ID" version="4.0">
	<!-- 
		web.xml(배치서술자 Deployment Descriptor)은 톰캣에서 제공해준다 -> 위치는 WEB-INF 아래
		서버가 처음 로딩 시 web.xml 파일을 읽어들여 환경설정에 대해 어플리케이션을 배치하게 됨
	 -->
	<!-- context-param에 등록한 정보는 톰캣서버가 기동할 때 생성되서 서버가 죽을때까지 쭉 기억한다 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/classes/log4.properties</param-value>
	</context-param>
	<!--
	자바로 웹서비스X / 서블릿은 가능 -> URL을 적을 수 있어서 -> xml에 등록가능(URL사용위해 서블릿을 배치)
	서블릿과 서블릿매핑은 항상 같이있어야한다
	URL을 등록(url-pattern) - URL이 있어야 요청할 수 있음
	servlet보다 servlet-mapping을 먼저 읽는다
	 -->
	<servlet>
		<servlet-name>TestServlet</servlet-name>
		<servlet-class>com.mvc.controller.TestServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>TestServlet</servlet-name>
		<url-pattern>/test/test.do</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>HelloServlet</servlet-name>
		<servlet-class>com.day1.HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloServlet</servlet-name>
		<url-pattern>/day1/hello.kh</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>DeptServlet</servlet-name>
		<servlet-class>com.day1.DeptManager</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DeptServlet</servlet-name>
		<url-pattern>/jEasyUI/dept/insertAction.do</url-pattern>
	</servlet-mapping>
</web-app>

<!--
	Deployment Descriptor 배치서술자 spring maven방식 빌드 -> pom.xml파일에 등록
	web.xml문서를 수정하면 반드시 서버를 내렸다가 다시 기동할 것(주의!)
-->

 

<MyBatis, Servlet, JSP프로젝트 - test.xml>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.TestMapper">
	<!-- 현재날짜 가져오는 쿼리문 -->
	<select id="testDate" parameterType="java.util.HashMap"
		resultType="java.lang.String">
		SELECT to_char(sysdate, 'YYYY-MM-DD HH:MI:SS') FROM dual
	</select>
	
	<!-- 회원정보 가져오는 쿼리문 -->
	<select id="getBookMember" parameterType="java.util.HashMap"
		resultType="map">
		SELECT mem_no, mem_id, mem_pw, mem_name
		FROM book_member
		WHERE mem_id = #{mem_id}
		OR mem_pw = #{mem_pw}
	</select>
</mapper>

 

<MyBatis, Servlet, JSP프로젝트 - TestDao>

package com.mvc.dao;

import java.util.List;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
import com.util.MyBatisCommonFactory;

public class TestDao {
	Logger logger = Logger.getLogger(TestDao.class);
	MyBatisCommonFactory mcf = new MyBatisCommonFactory();

	/**
	 * 회원정보 가져오기
	 * 
	 * @return
	 */
	public List<Map<String, Object>> getBookMember() {
		List<Map<String, Object>> mList = null;
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession sqlSession = null;
		try {
			sqlSessionFactory = mcf.getSqlSessionFactory();
			sqlSession = sqlSessionFactory.openSession();
			Map<String, Object> pMap = new HashMap<>();
			pMap.put("mem_id", "tomato");
			pMap.put("mem_pw", "123");
//			파라미터로 pMap(tomato(String), 123(String)) 넘기기
			mList = sqlSession.selectList("getBookMember", pMap);
			logger.info(mList); // 3건 조회(조건으로 or 썼기에)
			/*
			 * [{MEM_ID=tomato, MEM_PW=123, MEM_NAME=토마토, MEM_NO=1}
			 * , {MEM_ID=kiwi, MEM_PW=123, MEM_NAME=키위, MEM_NO=2}
			 * , {MEM_ID=banana, MEM_PW=123, MEM_NAME=바나나, MEM_NO=3}]
			 */
		} catch (Exception e) {
			e.printStackTrace();
		}
		return mList;
	};

	/**
	 * 현재시간 가져오기
	 * 
	 * @return
	 */
	public String testDate() {
		String cTime = null;
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession sqlSession = null;
		try {
			sqlSessionFactory = mcf.getSqlSessionFactory();
			sqlSession = sqlSessionFactory.openSession();
			Map<String, Object> pMap = new HashMap<>();
			pMap.put("mem_id", "tomato");
			pMap.put("mem_pw", "123");
			cTime = sqlSession.selectOne("testDate", pMap);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cTime;
	}
}

 

<MyBatis, Servlet, JSP프로젝트 - MyBatisCommonFactory>

package com.util;

import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;

public class MyBatisCommonFactory {
	Logger logger = Logger.getLogger(MyBatisCommonFactory.class);
//	MyBatis는 자바와 오라클 서버 사이에 위치하면서 DB연계를 지원하는 매핑서비스이다.
//	물리적으로 떨어져있는 서버와의 통신을위해 드라이버 클래스 로딩, 연결 통로 확보 코드가 반복적으로 작성됨
//	이것을 전담하는 SqlSessionFactory를 지원하고있음(MyBatis가)
//	스프링에선 SqlSessionFactoryBean
	public SqlSessionFactory sqlSessionFactory = null;
	//SqlSessionFactory객체를 생성해 주는 메소드 입니다.
	public void init() {
		try {
//			xml문서에 드라이버 클래스명, URL주소, 계정정보 담음
//			더하여 쿼리문을 xml문서에 따로 등록해서 관리하므로
//			쿼리문을 담고있는 xml문서의 물리적인 위치를 설정문서에 등록함
			String resource = "com\\util\\MyBatisConfig.xml";
			System.out.println("resource");
			Reader reader = Resources.getResourceAsReader(resource);
			logger.info("before sqlSessionFactory : "+sqlSessionFactory);
//			싱글톤패턴에서 객체 생성하기
			if(sqlSessionFactory == null) {
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,"development");
			}
			logger.info("after sqlSessionFactory : "+sqlSessionFactory);
			System.out.println("after sqlSessionFactory : "+sqlSessionFactory);
		} catch (Exception e) {
			logger.info("[[ Exception ]] "+e.toString());
			System.out.println("[[ Exception ]] "+e.toString());
		}
	}// end of init
	public SqlSessionFactory getSqlSessionFactory() {
		System.out.println("11");
		init();
		return sqlSessionFactory;
	}
	public static void main(String[] args) {
		System.out.println("test");
		MyBatisCommonFactory mcf = new MyBatisCommonFactory();
		mcf.getSqlSessionFactory();
	}

}

 

<MyBatis, Servlet, JSP프로젝트 - MyBatisConfig에 text.xml 추가>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default="development">
		<environment id="development">
		<transactionManager type="JDBC"/>
		<dataSource type="POOLED">
			<property name="driver"
				value="oracle.jdbc.OracleDriver" />
			<property name="url"
				value="jdbc:oracle:thin:@localhost:1521:orcl11" />
			<property name="username" value="scott" />
			<property name="password" value="tiger" />
		</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/mybatis/mapper/test.xml" />
		<mapper resource="com/util/book.xml" />
		<mapper resource="com/util/member.xml" />
	</mappers>
</configuration>

 

<MyBatis, Servlet, JSP프로젝트 - webapp/test에 있는 getMemberList.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>
	<h3>회원목록</h3>
</body>
</html>

 

<마임타입 - MimePlainServlet>

package com.day1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * 서블릿은 java라도 브라우저에 출력할 수 있다 - 화면을 그리는데 서블릿을 사용함(마임타입때문에 가능!)
 */
@WebServlet("/plain.do") // 웹에서 접근 가능한 맵핑 주소 설정
public class MimePlainServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		res.setContentType("text/plain;charset=UTF-8");
		// 메소드를 통해서 객체 생성하는 코드
		PrintWriter out = res.getWriter();
		out.print("<h2>안녕하세요</h2>"); // 마임타입이 plain이면 태그 안먹음!
	}
}

 

<마임타입 - MimeHtmlServlet>

package com.day1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * 서블릿은 java라도 브라우저에 출력할 수 있다 - 화면을 그리는데 서블릿을 사용함(마임타입때문에 가능!)
 */
@WebServlet("/html.do") // 웹에서 접근 가능한 맵핑 주소 설정
public class MimeHtmlServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		res.setContentType("text/html;charset=UTF-8");
		// 메소드를 통해서 객체 생성하는 코드
		PrintWriter out = res.getWriter();
		out.print("<h2>안녕하세요</h2>"); // 마임타입 html 이면 태그잘됨!
	}
}

 

<마임타입 - MimeJSONServlet>

package com.day1;

import java.io.IOException;
import java.io.PrintWriter;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

/*
 * 서블릿은 java라도 브라우저에 출력할 수 있다 - 화면을 그리는데 서블릿을 사용함(마임타입때문에 가능!)
 */
@WebServlet("/json.do") // 웹에서 접근 가능한 맵핑 주소 설정
public class MimeJSONServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		res.setContentType("application/json;charset=UTF-8");
		// 메소드를 통해서 객체 생성하는 코드
		PrintWriter out = res.getWriter();
		List<Map<String, Object>> mList = new ArrayList<>();
		Map<String, Object> rMap = new HashMap<>();
		rMap.put("mem_id", "tomato");
		rMap.put("mem_pw", "111");
		rMap.put("mem_name", "토마토");
		mList.add(rMap);
		rMap = new HashMap<>();
		rMap.put("mem_id", "kiwi");
		rMap.put("mem_pw", "222");
		rMap.put("mem_name", "키위");
		mList.add(rMap);
		rMap = new HashMap<>();
		rMap.put("mem_id", "banana");
		rMap.put("mem_pw", "333");
		rMap.put("mem_name", "바나나");
		mList.add(rMap);
		// out.print(mList); -> 이렇게 그냥출력하면 json형식x(:이 아니라 =으로 출력됨!)
		Gson g = new Gson();
		String temp = g.toJson(mList);
		out.print(temp); // Gson사용해 Json형식으로 출력되게함
	}
}

 

<마임타입 - MimeXMLServlet>

package com.day1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * 서블릿은 java라도 브라우저에 출력할 수 있다 - 화면을 그리는데 서블릿을 사용함(마임타입때문에 가능!)
 */
@WebServlet("/xml.do") // 웹에서 접근 가능한 맵핑 주소 설정
public class MimeXMLServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		res.setContentType("text/xml;charset=UTF-8");
		// 메소드를 통해서 객체 생성하는 코드
		PrintWriter out = res.getWriter();
		StringBuilder sb = new StringBuilder();
		sb.append("<records>");
		sb.append("<record>");
		sb.append("<mem_id>tomato</mem_id>");
		sb.append("<mem_pw>111</mem_pw>");
		sb.append("<mem_name>토마토</mem_name>");
		sb.append("</record>");
		sb.append("<record>");
		sb.append("<mem_id>kiwi</mem_id>");
		sb.append("<mem_pw>222</mem_pw>");
		sb.append("<mem_name>키위</mem_name>");
		sb.append("</record>");
		sb.append("<record>");
		sb.append("<mem_id>banana</mem_id>");
		sb.append("<mem_pw>333</mem_pw>");
		sb.append("<mem_name>바나나</mem_name>");
		sb.append("</record>");
		sb.append("</records>");
		out.print(sb.toString());		
	}
}

 

<servlet, jsp 연결(세션 활용 값 넘기기) - MimeHtmlServlet2>

package com.day1;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

/*
 * 서블릿은 java라도 브라우저에 출력할 수 있다 - 화면을 그리는데 서블릿을 사용함(마임타입때문에 가능!)
 * 
 * <서블릿을 경유하여 응답페이지를 jsp로 가져가는 실습>
 * 	처음부터 mimeHtmlResult.jsp를 직접 호출하는 것이 아니라,
 * 	아래에있는 url, 즉 /day1/html2.do로 요청했을 때
 * 	아래의 코드 res.sendRedirect("./mimeHtmlResult.jsp");를 만나서
 * 	주소창이 변경되는 것을 관찰한 뒤 서블릿에서 세션에 담은 정보를
 * 	mimeHtmlResult.jsp 페이지에서 유지되는지 확인하는 실습이다
 */
@WebServlet("/day1/html2.do") // 웹에서 접근 가능한 맵핑 주소 설정
public class MimeHtmlServlet2 extends HttpServlet {
	Logger logger = Logger.getLogger(MimeHtmlServlet.class);
	
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("doGet 호출");
		
		// String
		String myName = new String("이순신");
		// int
		int age = 35;
		// Map
		Map<String, Object> rMap = new HashMap<>();
		rMap.put("mem_id", "tomato");
		rMap.put("mem_pw", "111");
		rMap.put("mem_name", "토마토");
		// List<Map>
		List<Map<String, Object>> mList = new ArrayList<>();
		if(rMap != null) {
			rMap.clear();
		}
		rMap = new HashMap<>();
		rMap.put("mem_id", "tomato");
		rMap.put("mem_pw", "111");
		rMap.put("mem_name", "토마토");
		mList.add(rMap);
		rMap = new HashMap<>();
		rMap.put("mem_id", "kiwi");
		rMap.put("mem_pw", "222");
		rMap.put("mem_name", "키위");
		mList.add(rMap);
		rMap = new HashMap<>();
		rMap.put("mem_id", "banana");
		rMap.put("mem_pw", "333");
		rMap.put("mem_name", "바나나");
		mList.add(rMap);
		
		// 세션을 이용해 이름값을 jsp로 넘겨줌
		HttpSession session = req.getSession();
		
		session.setAttribute("myName", myName);
		session.setAttribute("age", age);
		session.setAttribute("rMap", rMap);
		session.setAttribute("mList", mList);
		
		res.sendRedirect("./mimeHtmlResult.jsp");
	}
}

 

<servlet, jsp 연결(세션 활용해 값 넘기기) - mimeHtmlResult.jsp>

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@page import="java.util.Map"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MimeHtmlServlet2 응답페이지</title>
</head>
<body>
	<h2>MimeHtmlServlet2 응답페이지</h2>
	<%
	// 스크립틀릿 안에서 선언한 변수는 지역변수이다
	// a.jsp -> a_jsp.java로 변환됐을때 service메소드 안에 들어가니까
	String myName = null;
	myName = (String) session.getAttribute("myName");
	out.print(myName);
	out.print("<hr>");

	Integer age = null;
	age = (Integer) session.getAttribute("age");
	out.print(age);
	out.print("<hr>");

	Map<String, Object> rMap = (Map<String, Object>) session.getAttribute("rMap");
	// NullPointerException 방어코드
	if (rMap != null) {
		Object keys[] = rMap.keySet().toArray();
		for (int i = 0; i < keys.length; i++) {
			out.print(rMap.get(keys[i]));
			out.print("<br />");
		}
		out.print("<hr>");
	}

	// getAttribute의 리턴타입은 Object이다 <-> getParameter의 리턴타입은 String이다
	List<Map<String, Object>> mList = (List<Map<String, Object>>) session.getAttribute("mList");
	if (mList != null) {
		for (int i = 0; i < mList.size(); i++) {
			Map<String, Object> tempMap = mList.get(i);
			out.print(tempMap.get("mem_id") + ", " + tempMap.get("mem_pw") + ", " + tempMap.get("mem_name"));
			out.print("<br />");
		}
		out.print("<hr>");
	}
	%>
</body>
</html>

댓글