본문 바로가기
학원수업/2월

02/16 54회차 수업 JSP

by 코딩마스터^^ 2023. 2. 17.

MyBatis란?

 

객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거 합니다. Mybatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있습니다.

 

 

서블릿을 사용하기위해서는 상속을 반드시 받아야 한다.!!!

웹서비스를 위해서는 request와 response를 주입 받아야한다.

제어역행이다.

사용을 잘못하면 NullPointException이 일어날수있다.

 

서버는 WAS 이다. 우리는 톰캣쓴다.

 

web.xml에 URL쓸때마다 추가해줘야한다.

 

브라우저가 XML에대한 오타를 점검해준다.

쿠키(Cookie)와 세션(Session)

모두 웹 서버와 클라이언트 간의 상태를 유지하는 방법입니다. 이들은 보통 웹 어플리케이션에서 사용자 인증, 사용자 설정, 쇼핑 카트 등과 같은 사용자 상태 정보를 유지하기 위해 사용됩니다.

쿠키는 클라이언트 측에서 상태 정보를 저장합니다.

서버는 쿠키를 클라이언트에게 전송하고, 클라이언트는 브라우저를 통해 쿠키를 저장합니다. 이후, 같은 서버를 방문할 때마다 클라이언트는 서버에 저장된 쿠키를 전송하게 됩니다. 쿠키는 클라이언트 측에서 저장되기 때문에, 보안 문제가 있을 수 있습니다.

쿠키는 스트링에 담을수있다.

로컬 피씨에 저장된다. 그래서 노출될 수 있다. 보안에 취약하다.

 

반면에 세션은 서버 측에서 상태 정보를 유지합니다.

서버는 클라이언트에게 고유한 세션 식별자를 전송하고, 클라이언트는 이를 쿠키에 저장합니다. 클라이언트가 다시 서버로 요청을 보낼 때, 서버는 쿠키에 저장된 세션 식별자를 사용하여 클라이언트와의 세션을 찾습니다. 세션은 서버 측에서 저장되기 때문에, 보안성이 더 좋습니다.

쿠키와 세션은 각각의 장단점이 있으며, 어떤 방법을 사용할지는 상황과 요구사항에 따라 결정됩니다. 예를 들어, 쇼핑 카트와 같은 간단한 상태 정보를 저장할 때는 쿠키를 사용하고, 사용자 로그인 정보와 같은 보안이 중요한 정보를 저장할 때는 세션을 사용하는 것이 좋습니다.

램이아니라 캐쉬메모리에 저장된다.

노출이 어렵다.

 

 
request는 세션을 만들때 사용한다.
getSession
 
response를 통해서
mime타입을 결정 할 수 있다.
 
sendRedirect
-페이지 이동 할 때 쓴다.
 

JSP에서 자바와 html js css같이 쓴다.

<% %> 스크립틀릿으로

 

package com.mvc.controller;

import java.io.IOException;

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);


//내가 하나 메소드 만든다. 사용자 정의 메소드. 오버라이딩 아니다.
public void doService(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
logger.info("doService 호출");
logger.fatal("doService 호출");
logger.debug("doService 호출");
logger.warn("doService 호출");
logger.error("doService 호출");
TestDao tDao=new TestDao();
tDao.getBookMember();
// 페이지 이동
//페이지 이름 getMembetList.jsp
//페이지의 물리적인 경로는 어디를 바라보고 있는가?->web.xml->servlet-mapping[test/test.do]->url->pattern 
//경로명/요청을 처리하는 이름.do[뒤에 온 확장자는 의미 없다-why? 해당 요청을 인터셉트해서 해당 업무를 담당하는 
//클래스에 연결을 해야함
//클래스(FrontController.java설계-각 업무별 XXXController필요함)을 해야함
//페이지 처리는 JSP에게 맞김
//서블릿 요청을 받아서 업무 담당자에게 연결(매핑, 매칭)
//이것을 어떻게 나눌 것인가?
//요청은 업무담당자나 사용자 선택에 따라 결정
//결정에 대응하는 클래스를 FrontController연결
//FrontController에서 실제 업무를 담당하는 XXX에 전달할때 
//요청객체와 응답객체 전달되어야 한다.
//요청객체는 무엇을 누릴 수 있나?
//사용자가 입력한 값을 듣기 위해 필요하다
//getParameter(""):String
//session.getAttribute(""):Object
//request.getParameter("XXX"); mem_id, mem_name,meme_address
//HttpSession session=request.getSession();세션객체생성
//http프로토콜이 비상태 프로토콜이므로 상태값을 관리하는 별도의 매카니즘필요
//쿠키와 세션(시간을 지배한다)<-List,Map<-객체배열[{}]<-배열<-원시형 타입(변수)
//response.setContentType();마임타입을 결정한다.
//서블릿인데 JSON일수도있고 서블릿인데 html이 될수도 있고 xml이될수도있다.
//res.sentContentType(application"")
//res.sentContentType("text/html")
//res.sentContentType("tent/xml")
//res.sentContentType(application"")
//res.sentContentType(application"")
/*response.sendRedirect("페이지이름")->페이지 이동
 *주소창이 바뀐다-> 기존에 요청이 끊어지고 새로운 요청이 발생함->그러니까 쿠키나 세션에 담아둔다.-> 왜냐면 비상태 프로토콜
 *쿠키-문자열-객체는 못받음
 *세션-캐시메모리-객체-very good
 *사용자가 입력한 값을 
 * */
//아래 코드를 만나기 전까지는 http://localhost:9000/test/getMemberList.jsp
//를 보여주다가 아래 문자를 만나면 그때 http://localhost:9000/test/getMemberList.jsp를 요청함
//테스트 시나리오
//방법1:TestSerlet.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);
}

}

 

mime type

//서블릿은 자바인데 브라우저에 출력할 수 있다.-화면의 역할을 한다. 화면을 그리는데 서블릿을 사용한다.
//mime타입 덕분에 가능하다.

JSON(JavaScript Object Notation)

 

경량 데이터 교환 형식입니다. 이는 JavaScript에서 객체를 만드는 문법과 유사한 형태로 데이터를 저장하고 전송하는 형식이며, 텍스트 기반으로 가독성이 좋습니다. JSON은 서버와 클라이언트 간의 데이터 교환에 주로 사용되며, RESTful API와 같은 웹 서비스에서 많이 사용됩니다. JSON 데이터는 대부분의 프로그래밍 언어에서 쉽게 다룰 수 있으며, 파싱하고 생성하는 라이브러리가 많이 존재합니다.

 

MIME(Multipurpose Internet Mail Extensions) type

 

인터넷에서 데이터를 전송할 때 데이터의 형식을 명시하는 방법입니다. 이는 데이터가 어떤 유형인지를 지정하여 브라우저나 서버가 적절한 액션을 취하도록 돕습니다. MIME type은 HTTP 헤더에서 Content-Type 속성으로 지정됩니다. 예를 들어, 텍스트 파일은 MIME type이 "text/plain"이며, HTML 파일은 "text/html"입니다. 이미지 파일은 "image/jpeg" 또는 "image/png"와 같이 MIME type이 지정됩니다. MIME type은 또한 웹 서버가 정적 파일을 제공할 때 올바른 형식을 전송하도록 돕는데 사용됩니다.

 

JSON은 MIME type으로 "application/json"을 사용합니다.

이는 JSON 데이터가 포함되어 있는 HTTP 응답에서 Content-Type으로 지정됩니다.

이를 통해 브라우저는 서버로부터 전송된 데이터가 JSON 형식임을 인식하고, 이를 적절하게 처리할 수 있게 됩니다.

 

서블릿에서 만든 객체를 jsp에서 사용하고싶다.

세션을 통해서 servlet에 있는 애를 JSP에서 쓸 수 있다.

세션에 넣어준다.

package com.day1;

import java.io.IOException;
import java.util.HashMap;
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;
//서블릿은 자바인데 브라우저에 출력할 수 있다.-화면의 역할을 한다. 화면을 그리는데 서블릿을 사용한다.
//mime타입 덕분에 가능하다.

//서블릿을 경유하여 응답 페이지를 jsp로 가져가는 실습이다.
/*
 * 최초 mimeHtmlResult.jsp를 직접 호출하는것이 아니라
 * 25번에 있는 url 즉, /day1/html2/do로 요청했을때 아래 코드 42번을 만나서 mimeHtmlResult.jsp
 * 주소창이 변경되는것을 관찰한뒤 서블릿에서 세션에 담은 정보를 mimeHtmlResult.jsp페이지에서
 * 유지되는지 확인하는실습이다.
 * */
@WebServlet("/day1/html2.do") // 웹에서 접근 가능한 맵핑 주소 설정
public class MimeHtmlServlet2 extends HttpServlet {
	Logger logger=Logger.getLogger(MimeHtmlServlet2.class);
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException
	{
		logger.info("doGet호출");
		HttpSession session=req.getSession();
		String myName =new String("도도희");
		int age=18;
		Map<String,Object> rmap=new HashMap<>();
		rmap.put("mem_id","tomato");
		rmap.put("mem_pw","123");
		rmap.put("mem_name","토토");
		session.setAttribute("myName", myName);
		session.setAttribute("age",age);
		session.setAttribute("rmap", rmap);
		res.sendRedirect("./mimeHtmlResult.jsp");
		//메소드를 통해서 객체 생성하는 코드-고급
	}
}

JSP이다...

<%@ 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>
	<%
	String myName=null;
	Integer age=null;
	myName=(String)session.getAttribute("myName");
	age=(Integer)session.getAttribute("age");
	out.print(myName);
	out.print("<hr>");
	out.print(age);
	out.print("<br>");
	Map<String,Object> rmap=(Map<String, Object>)session.getAttribute("rmap");
	Object keys[]=rmap.keySet().toArray();
	for(int i=0;i<keys.length;i++){
		out.print(rmap.get(keys[i]));//자바코드
		out.print("<br/>");//html태그
	}
	//스크립틀릿 안에 선언하면 지역변수이다. 서비스안에 들어오니까 지변이다.
	//왜냐면???-a.jsp는 a_jsp.java로 바뀐다. 이때 service메소드 안에 들어간다.
	//지역변수는 초기화를 생략 할 수 없다.
	
	%>
</body>
</html>

 

세션이라서 

 

 

getAttribute 의 리턴타입은 Object이다.(getParameter 의 리턴타입은 String이다.)

꼭기억하기!!

 

package com.day1;

import java.io.IOException;
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;
//서블릿은 자바인데 브라우저에 출력할 수 있다.-화면의 역할을 한다. 화면을 그리는데 서블릿을 사용한다.
//mime타입 덕분에 가능하다.

//서블릿을 경유하여 응답 페이지를 jsp로 가져가는 실습이다.
/*
 * 최초 mimeHtmlResult.jsp를 직접 호출하는것이 아니라
 * 25번에 있는 url 즉, /day1/html2/do로 요청했을때 아래 코드 42번을 만나서 mimeHtmlResult.jsp
 * 주소창이 변경되는것을 관찰한뒤 서블릿에서 세션에 담은 정보를 mimeHtmlResult.jsp페이지에서
 * 유지되는지 확인하는실습이다.
 * */
@WebServlet("/day1/html2.do") // 웹에서 접근 가능한 맵핑 주소 설정
public class MimeHtmlServlet2 extends HttpServlet {
	Logger logger=Logger.getLogger(MimeHtmlServlet2.class);
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException
	{
		logger.info("doGet호출");
		HttpSession session=req.getSession();
		String myName =new String("도도희");
		int age=18;
		Map<String,Object> rmap=new HashMap<>();
		rmap.put("mem_id","tomato");
		rmap.put("mem_pw","123");
		rmap.put("mem_name","토토");
		
		if(rmap!=null) {
			rmap.clear();//휴지통 비우기
			}
		
		List<Map<String,Object>> mList= new ArrayList<>();
		rmap= new HashMap<>();
		rmap.put("mem_id","tomato");
		rmap.put("mem_pw","123");
		rmap.put("mem_name","토토");
		mList.add(rmap);
		rmap= new HashMap<>();
		rmap.put("mem_id","kiwi");s
		rmap.put("mem_pw","123");
		rmap.put("mem_name","위위");
		mList.add(rmap);
		rmap= new HashMap<>();
		rmap.put("mem_id","banana");
		rmap.put("mem_pw","123");
		rmap.put("mem_name","나나");
		mList.add(rmap);
		
		session.setAttribute("myName", myName);
		session.setAttribute("age",age);
		session.setAttribute("rmap", rmap);
		session.setAttribute("mList", mList);
		res.sendRedirect("./mimeHtmlResult.jsp");
		//메소드를 통해서 객체 생성하는 코드-고급
	}
}

 

 

서블릿

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인데 브라우저에 출력할 수 있다 - 화면의 역할 ~ 화면을 그리는데에 서블릿 사용 - 가능해? ㅇㅇ Mime타입 때문에
@WebServlet("/xml2.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>123</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>123</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>123</mem_pw>");
		sb.append("<mem_name>나나</mem_name>");
		sb.append("</record>");
		sb.append("</records>");
		out.print(sb.toString());//스트링 빌더를 출력하려면 스트링으로 뽑는다. toString은 스트링으로 가져오는 애다.
	}
			
}

 

다이나믹 프로젝트 만들면 자동으로 webapp폴더가 생성되는데 거기에 jsp를 넣는다.

jsp파일이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.Map,java.util.List"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MimeHtmlServlet2 응답페이지</title>
</head>
<body>
	<h2>MimeHtmlServlet2 응답페이지</h2>
	<%
	String myName=null;
	Integer age=null;
	myName=(String)session.getAttribute("myName");
	age=(Integer)session.getAttribute("age");
	out.print(myName);
	out.print("<hr>");
	out.print(age);
		out.print("<hr>");
	out.print("<br>");
	Map<String,Object> rmap=(Map<String, Object>)session.getAttribute("rmap");
	if(rmap!=null){//nullPointerException 방어 코드
	Object keys[]=rmap.keySet().toArray();
	for(int i=0;i<keys.length;i++){
		out.print(rmap.get(keys[i]));//자바코드
		out.print("<br/>");//html태그		
	}//end of for
	}
	
	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> rMap =mList.get(i);
			out.print(rMap.get("mem_id")+","+rMap.get("mem_pw")+","+rMap.get("mem_name"));
		}
	}
			//스크립틀릿 안에 선언하면 지역변수이다. 서비스안에 들어오니까 지변이다.
	//왜냐면???-a.jsp는 a_jsp.java로 바뀐다. 이때 service메소드 안에 들어간다.
	//지역변수는 초기화를 생략 할 수 없다.
	
	%>
</body>
</html>

댓글