한글코드

  • ASCII 코드 체계
    • 한글문자를 제외한 나머지 
      • 영문대소문
      • 숫자 (0~9)
      • 특수문자
        • 눈에 보이는 ( $...)
        • 눈에 보이지 않는 (공백, 엔터, 특별한 기능을 가지는..)
      • 0x00~ 0x7f
  • 역사
    • 1970~1980 중반 - ASCII 각 제조사마다 한글 코드 (비표준화)
    • 1987 - 완성형 한글 표준 코드 발표 (정부)
      • KSC5601 ( EUC-KR, CP949 ) - windows
      • 영문 - 1byte (ASCII)
      • 한글 - 2byte
    • 1990 - 지구상에 있는 각 나라의 언어들의 코드 값을 단일화 (통일)
      • Unicode
        • UTF-16 : 모든 문자들을 2byte로 (java채택)
          • 운영체제에 맞춰서 변환해서 읽고, 내보낼 때 변환해서 내보냄
          • 포함되지 않는 언어들이 많음
        • UTF-8 : 모든 문자를 표현 ( 1byte ~ 4byte )
          • 한글은 3byte
          • 리눅스 - 운영체제가 UTF-8
          • setcharacterencoding 해줘야 함

 


  • for문 같은 긴거는 표현식태그보단, 수행문 태그로!


  • 자바스크립트는 브라우저에서 실행되고, 자바코드는 서버에서 수행됨
    • <!-- 
      	2022.01.03(월)
      	+ script : 자바 스크립트 코드
      	+ jsp 실행 결과는 javascript에 영향을 줄 수 있다. 
      	+ java코드는 서버에서
      	+ script는 브라우저에서 실행 됨	
       -->
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>요청 방식에 따른 처리</title>
      <style>
      	input {
      		margin : 3px;
      	}
      </style>
      </head>
      <body>
      	<% if (request.getMethod().equals("GET")) { %>
      		<h2>원하는 칼라와 날짜를 선택하세요</h2>
      		<form method="post" action="/edu/jspsrc/exam7.jsp">
      			칼라 : <input type="color"  name="fcolor" ><br>
      			날짜 : <input type="date"  name="fdate"><br>
      			<input type="submit" value="전송">
      		</form>
      	<% } else { %>	
      			<script>
      				document.body.style.backgroundColor =
      					         '<%= request.getParameter("fcolor") %>';
      			</script>
      			<h2>선택 날짜는 <%= request.getParameter("fdate") %> 이네요..</h2>
      	<% } %>
      </body>
      </html>
    • <%= request.getParameter("fcolor") %> : 서버에서 수행
      • 수행된 결과가 옴
      • jsp코드는 어디든 상관 없음
    • <script> : 브라우저에서 수행
      • html 수행 이후에 실행되는 부분

  • errorPage
    • <!-- 
      	2022.01.03(월)
      	+ length() : nullpointException오류남 ( 500에러 )
      	+ errpage : 수행 오류가 나면 jsp를 대신 응답해라 
       -->
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"   errorPage="errorPage.jsp"  %> 
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      <h2>errorPage 속성 테스트</h2>
      <hr>
      <%
           String name = request.getParameter("guestName"); //	guestName 대소문자 구분함
      %>
      
      	<h3>당신의 이름은 <%= name %> 이고 이름의 길이는
                 <%= name.length() %> 입니다.</h3>
      </body>
      </html>
      • 어떤 exception이 발생하던, errorPage 응답해라
      • 실행 오류가 발생했을 때, 
      • servlet으로 에러났을 때 에러난거는 안 됨
    • <!-- 
      	2022.01.03(월)
      	+ exam8.jsp에 사용됨
       -->
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8" %>
      <%@ page isErrorPage="true" %>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>errorPage</title>
      </head>
      <body style="text-align:center">
      	<h2>오류 발생했어욤ㅠㅠ</h2>
      	<h3>빠른시일내에 복구하겠습니다...</h3>
      	<img src="error.jpg">
      	<%	
      	    String msg = "오류 원인 : " + exception;	
      		System.out.println("----------------------------------------");
      		System.out.println(msg);
      		System.out.println("----------------------------------------");	
      		exception.printStackTrace();
      	%>
      </body>
      </html>
      • exception : 아무 jsp에서 사용할 수 없음
        • 내장 객체
        • <%@ page isErrorPage="true" %> 줘야만 사용 가능
        • 기본값은 false임 -> excpetion 내장 객체 사용 할 수 없음

  • import
    1. <%@ page import="java.util.Date, java.text.SimpleDateFormat"%>
    2. 따로
      • <%@ page import="java.util.Date" %>
      • <%@ pageimport="java.text.SimpleDateFormat"%>
  • data 30분 뒤
    • plusMinutes
    • calender의 add메소드
	Calendar cal = Calendar.getInstance();	//	자동으로 현재 시점으로
	cal.setTime(nowDate);	// setTime 안 해줘도 됨
	cal.add(Calendar.MINUTE, 30);

 


  • include
    • 서블릿으로 변환하기 전에 일어남
    • 같이 서블릿으로 바뀜
    • 소스를 효율적으로 관리할 수 있게 하는 태그의 기능을 함
    • .jspf로 사용할 것을 권장함
      • jsp파일이여도 상관 없음
    • 주의 사항

 

  • forward
    • <jsp:forward page="admin_new.jsp">
        	<jsp:param name="message" value="Hi! Administrator" />
       </jsp:forward>
      • message전달
      • 받은 jsp는 <%=request.getParameter("message")%>로 받음
        1. forward될 때 전달되는 namevalue값 쓸 때 사용함
        2. 클라이언트한테 전달 받을 때 사용
      • param은 종료 태그 없이 사용
        • /> 닫을 때 '/'줘야함
      • 종료태그 필요 없는 얘들 (hr, br,
        • <hr/>, <br/> 사용 가능 - xml은 엄격하게 이렇게 사용해야함
    • jsp의 액션 태그의 구문은 XML기반으로 함
      • 대소문자 구분
      • 종료태그가 없는 경우에는 시작태그명 뒤에 />를 붙인다.
      • 속성에 값을 할당할 때 인용부호(",")를 반드시 사용한다.
  • include
    <!-- 
    	2022.01.03(월)
    	+ include 액션 태그
     -->
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>JSP 예제</title>
    </head>
    <body>
    	<h2>include 지시자와 액션태그 비교</h2>
    	<%-- 
    	<hr>
    	<%@ include file="date.jsp" %>
    	<hr>
    	<%@ include file="date.jsp" %>  
    	--%>
    	<hr>
    	<jsp:include page="date.jsp" />
    	<hr>
    	<jsp:include page="date.jsp" />
    	
    </body>
    </html>
    • include 지시자
      • 소스 포함
      • 서블릿 소스 하나 만들어짐
      • 변수 선언 주의
    • include 액션 태그
      • 실행을 별개로 시키고, 결과만 포함
      • ex) a 실행하다가 중지시켜서 b 실행시켜서 결과를 포함시킴 
      • 서블릿 두 개 생김
      • 서블릿 변환할 때 자바코드로 바뀜. 
        • date별개로 실행시키고 가지고 가는 
      • 버퍼에 차곡차곡 넣었다가 브라우저에게 한번에 줌
    • 에러가 있으면 새로운 얘로 컴파일해서 안 만들어 줌
      • 예전꺼 없으면, 컴파일 에러 생겼다가 classNotFoundException 나옴
    • 변수 두번 선언해서 에러남

<!-- 
	2022.01.03(월)
	+ 내장객체
 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP의 내장 객체들</title>
</head>
<body>
	<h2>JSP의 내장 객체들 점검</h2>

	<h3>[ request ]</h3>
	getMethod() : <%=request.getMethod()%><br> 	
	getRequestURI() : <%=request.getRequestURI()%><br>
	getHeader("user-agent") : <%=request.getHeader("user-agent")%><br>
	
    
	<h3>[ out ]</h3>
	<%
	out.print("<h4>out내장 객체로 출력!!</h4>");
	%>
	
    
	<h3>[ session ]</h3>
	getId() : <%=session.getId()%><br> 
	getCreationTime() : <%=new Date(session.getCreationTime())%><br>
	
    
	<h3>[ response ]</h3>
	getStatus() :<%=response.getStatus()%><br> 
	getBufferSize() : <%=response.getBufferSize()%><br> 
	getContentType() :<%=response.getContentType()%>
	<%
	response.addCookie(new Cookie("myCookie", "myValue")); //	쿠키정보를 같이 응답하고 싶을 때
	%>

	
	<h3>[ application ]</h3>
	getContextPath() : <%=application.getContextPath()%><br> 
	getServerInfo() : <%=application.getServerInfo()%><br> 
	getMajorVersion() : <%=application.getMajorVersion()%><br>
	
	
	<H4>Web Application(/edu) 디렉토리의 파일 리스트</H4>
	<%
	java.util.Set<String> list = application.getResourcePaths("/");
	if (list != null) {
		Object obj[] = list.toArray();
		for (int i = 0; i < obj.length; i++) {
			out.print(obj[i] + ", ");
		}
	}
	%>
</body>
</html>​

 

  • redict 사용하고 싶을 때 response사용해서 
  • request.getHeader("user-agent")
    • 클라이언트가 어떤 종류의 브라우저인지
    • 모바일버전인지, PC버전인지
  • out문 사용할 때 수행문 태그 사용해야한다. 
  • jsp는 세션 객체 생성이 기본
    • 세션 객체 생성 코드는 servlet이 바뀔 때 들어간다. 
  • 버퍼 사이즈가 8kbyte가 넘으면 클라이언트에게 보내고 다시 채워짐
    • 한번에 보내는 최대 사이즈가 8kbyte
  • response.addCookie(new Cookie("myCookie", "myValue"))
  • tomcat은 web-project라는 것을 모른다. 
    • edu를 하나의 서블릿 Context라고 생각함
    • web-project라는 것을 이클립스에서 정의한 것
  • application.getServerInfo() : WAS의 이름, 버전

  • jsp가 새로 만들어졌거나, 최초 요청시 servlet으로 바뀜
  • 선언문 태그 : servlet의 멤버 변수
  • 수행문 태그 : 지역변수 
  • 표현식 태그
    • out.print 메서드 호출 문장으로 바뀜
    • 안의 내용이 아규먼트로 넘어감
  • 그냥 html <h2>이러면 out.write 아규먼트로 들어감

 

 

  • 이런 코드를 보고싶으면
  • E:\work_sapce\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\edu\org\apache\jsp\jspsrc
<%
		int local_v = 0;
		member_v += 10;
		local_v += 10;
	%>
	<h1>JSP의 멤버 변수와 지역 변수</h1>
	<hr>
	<ul>
		<li>멤버 변수 : <%= member_v %></li>
	int local_v = 0;
		member_v += 10;
		local_v += 10;
	
      out.write("\r\n");
      out.write("	<h1>JSP의 멤버 변수와 지역 변수</h1>\r\n");
      out.write("	<hr>\r\n");
      out.write("	<ul>\r\n");
      out.write("		<li>멤버 변수 : ");
      out.print( member_v );

 

'study > JAVA 전문가' 카테고리의 다른 글

[ServletJSP] 시험 준비  (0) 2022.01.04
[JSP] java bean, 스코프, MVC모델  (0) 2022.01.04
[fileIUpload,jsp] 서블릿 구현  (0) 2021.12.30
[servlet]요청 재지정  (0) 2021.12.29
[servlet] 상태정보 유지 기술  (0) 2021.12.29

form태그 속성

  1. action
  2. method
  3. enc : 서버로 보내지는 데이터의 형식 지정
    1.  application/x-www-form-urlencoded : 디폴트값
      • 서버로 전송되기 전에 url-encode된다. 
    2. multipart/form-data
      1. 그대로 이미지나, 파일 서버로 전송될 때

 

enc

  • 여러개의 파티션으로 나눠서 전송됨 (멀티파트)
    • 첨부파일
    • 본문 내용
    • 제목
  • post 타입이여야한다. 
  • 파일 업로드 시 사용함
  • @MultipartConfig
    • 여러개 파트로 구성되어있는 내용을 WAS가 파트별로 읽어서 파트별로 객체를 생성해줌
      • 입력한 내용이든, 업로든 된 파트 내용이든...
      • 사용자가 직접 입력한 거 : 입력 쿼리
      • 업로드된 파일 내용
    • 파트에 대한 추출과 보관을 WAS가 대신해준다. 
    • getport메소드만 호출해주면 된다. 
    • httprequest
    • collection 객체로 return 됨
    • part.getSubmittedFileName() : 업로드 된 파일 이름 추출
      • null이면 업로드 된 파일이 없음 
    • @MultipartConfig ( location = "저장될 위치")
      • write(filename)

 

<label>첨부 파일 :  <input type="file" name="myfile" multiple/></label><br>
  • multiple속성 : 여러개 선택 가능
    • 여러개 업로드 가능하게
    • multiple없으면 이전꺼 없어짐
  • 업로드 된 파일 개수만큼 파트가 생김
    • 10개 선택하면 정보를 담고있는 파트는 10개가 된다. 

 

 


@MultipartConfig(location = "c:/Temp/uploadtest")
part.write(System.currentTimeMillis()+"_"+fileName);
  • 파일이름 시간 정보 저장함

 

File isDir = new File(path);
		if (!isDir.isDirectory()) {
			isDir.mkdirs();
		}
  • 파일 없으면 생성
  • 아무것도 안 넣어도, 파트는 감
    • null 문자열 : 객체가 있는 것
    • null

jsp

  • wAS = web server + application server
  • application server
    • servlet container + jsp converter (servlet 변환)
  • jsp는 (만들어지거나 수정시에 )최조요청일 때 한번만 servlet으로 바뀜
  • 알고 있어야 하는 내용
    • servlet 프로그래밍에서 학습한 모든 내용
    • 스크립트 태그
    • 액션 태그
    • 내장 객체
  • 간단하게 그 때 그때 실행 결과가 표현되어야하는 건 표현식과 함께 자바식을 작성
  • doGet, 막 그런거 안 해도 됨, java파일 없어도 됨
    • 응답용으로 설계해서 get, post나누지 않음
    • servlet으로 바뀔 때, 서비스 메서드로만 감 (요청방식에 무관하게)
    • 서비스를 오버라이딩한 servlet
  • contentType도 지시자로 먼저 지시함 <%@ page language="java" contentType="text/html; charset=UTF-8"
  • html기반으로 원하는 곳에 적기
  • servlet은 오류를 랜더링 해야 알 수 있었지만, jsp는 종료 태그를 자동으로 해줌 (편안)
  • session 객체 자동으로 추출 됨
    • jsp에서 servlet으로 변환할 때 생성됨
    • 사용 안 할 꺼면, 페이지 지시자에 지시해주면 됨
  • jsp 태그 
    • 스크립팅 태그 - 간단간단하게 자바코드 
      • 지시자 태그 <%@
      • 스크립트릿(수행문) 태그 <%
        • 자유롭게 정의
        • service 메소드로 가서 실행 될 때마다 정의 됨
      • 선언문( member 변수 선언, 메스드 정의 ) 태그 <%!
        • servelt으로 변환될 때, servlet의 멤버 변수로
      • 표현식 <%=
        • 표현하고자하는 자바 올 수 있음 
        • ';' 오면 안 됨
        • out.print 호출식으로 바뀜
          • 출력하고 있는 태그 내장
        • r-value만 작성할 수 있음
    • 액션 태그

		<li><%= new Date(session.getCreationTime()) %>
		<li><%= application.getServerInfo()%></li>
		<li><%= application.getContextPath()%></li>
  • application.getServerInfo( ) : 서버 정보
  • application.getContextPath( ) : 지금 현재 path

 

<body>
	<h1>Query 문자열 추출(GET&amp;POST)</h1>
	<hr>
	<%
		if(request.getMethod().equals("POST")){
			request.setCharacterEncoding("utf-8");
		}
	%>
	<h2>당신의 &lt;이름은<%= request.getParameter("name") %>이군요!</h2>
	<a href = "<%= request.getHeader("referer")%>">입력화면으로</a>
</body>
  • 특수문자 엔티티
    • 특수문자 오류 인식때문에
  • <%= request.getHeader("referer")%> 
    • 요청한 얘는 누구냐!

 



  1. jsp를 servlet으로 변환하는 건 : 자스퍼
  2. l-value(변수) = r-value (변수, 리터럴, 상수, 연산식, 리턴값이 있는 함수 호출식)

'study > JAVA 전문가' 카테고리의 다른 글

[JSP] java bean, 스코프, MVC모델  (0) 2022.01.04
[jsp] 액션태그  (0) 2022.01.03
[servlet]요청 재지정  (0) 2021.12.29
[servlet] 상태정보 유지 기술  (0) 2021.12.29
[Servlet] Get방식  (0) 2021.12.28
  • Forward
    • 클라잉언트가 서버1한테 요청했는데 클라이언트 모르게 서버2한테 넘겨줌 
    • 요청 넘기는 것
    • 클라이언트는 모른다. 
    • MVC패턴이 forward기반
      • 요청받는 얘랑 응답하는 얘가 따로
        • 응답 : jsp
        • 요청 : servlet
      • servlet이 받아서 jsp가 응답하도록 해야하는 것
    • 같은 웹프로젝트 안에 있는 얘만 forward대상이 될 수가 있다.
      • 다른 프로젝트에 있는 얘는 forward할 수가 없다. 
    •  
  • Redirect
    • 클라이언트가 서버1를 요청했는데 서버2의 결과를 보게 됨
    • 서버1이 응답을 하긴 함.
      • 응답상태 코드 200 (성공)이 아니라 302이란 응답코드와 함께 url(서버2에 대한)을 클라이언트한테 준다. 
      • 클라이언트가 300받으면 다시 받은 url받아서 그 url 가지고 다시 요청하게 된다.
    • 클라이언트가 그 사실을 안다
    • ex) 몇 초 뒤에 사이트가 이동하는 것
    • 갔다 왔다, 갔다 왔다함

package base;

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("/forward")
public class ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("FowardServlet 수행 시작");		

		RequestDispatcher rd = request.getRequestDispatcher("/htmlexam/first.html");	// 컨텍스트패스 이후 부분을 줘야
		//RequestDispatcher rd = request.getRequestDispatcher("http://www.naver.com/");	// 컨텍스트패스 이후 부분을 줘야	
		
		rd.forward(request, response);	
		System.out.println("FowardServlet 수행 종료");		
	}
}
  • forward대상에 대한 path 정보 전달
  • /htmlexam/first.html에 /edu붙이면 안됨
    • 동일한 자원안에서 요청할 수 있다고
    • 다른 프로젝트는 forward대상으로 붙일 수 없다.
  • forward해도 밑에 있는 내용은 내용대로 수행함

redirect

 


  • 다른 사이트면 redirect, 
  • 동일 프로젝트면 forward사용해라
    • forward사용할 때, 상대 패스 주면 안 나옴
    • 절대 url써라
    •  

'study > JAVA 전문가' 카테고리의 다른 글

[jsp] 액션태그  (0) 2022.01.03
[fileIUpload,jsp] 서블릿 구현  (0) 2021.12.30
[servlet] 상태정보 유지 기술  (0) 2021.12.29
[Servlet] Get방식  (0) 2021.12.28
[HTML] 연습  (0) 2021.12.28

코드 리뷰

  • required :  선택 안 하면 요청할 수가 없음
  • response.setContentType("text/html; charset=UTF-8");
    • 응답 시 형식이 뭔지 알리는 것
    • 브라우저마다 문자코드 해석하는 default가 다르기 때문,
  • request.setCharacterEncoding("UTF-8");
    • post 방식으로 보내는 값이 한글 안 깨지게
      • GET 방식은 톰캣이 기본적으로 자동으로 한글처리해주기 때문에 한글이 안 깨짐
    • 쿼리 문자 추출 시, 한글이 추출 잘 되게
  • LocalDate.parse() (LocalDate, LocalDateTime 스터디할 필요!
 

LocalDate parse() method in Java with Examples - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

  • LocalDate date = LocalDate.parse(request.getParameter("date"));
    out.printf("<li>예약 날짜 : %1$tY년 %1$tm월 %1$td일</ul>", date);
    • 1$ : 첫번째 아규먼트를 여기에 반영하겠다. 
    • %ty : java.util.Date를 입력받으면서 년도 제공

 


  • post
    • form 태그있어야함
    • 요청 바디안에 담겨서 전달함
    • 전달되는 name-value쌍 외부에 안 보임
  • get
    • 하이퍼링크, 이미지, form 태그 메소드 속성 생략될 때,,
    • 길이의 제한있음
    • 외부에 공개됨
    • 요청 header만 있음

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}
  • doGet호출
    • 직접 호출 할 수 있다. 

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		String method = request.getMethod();
		if(method.equals("POST"))
			request.setCharacterEncoding("utf-8");
		out.print("<h2>요청 방식 : "+method+"</h2>");
		out.print("<h2>Query 문자열 : "+
		                  request.getParameter("name")+"</h2>");
		out.close();
		System.out.println(method+" 방식 수행");
	}
  • service에 넣어줘도 된다. 

 


  • '/'시작하면 절대 uri
    • 젤 첫번째에 프로젝트 명이 나와야한다. 
    • 최상위 폴더 wepapp까지 자동으로 찾아감 (webapp부터 시작)
  • 상대 uri : 현재 디렉토리 기준으로
    • '..'부터 주던지
    • 폴더명부터 줘야함 
  • getHeader("referer")
    • 요청한 대상 (html)에 대한 주소 추출

상태정보 유지 기술

package base;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet({ "/getHTML", "/getXML", "/getJSON", "/getImage" })
public class ResponseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String uri = request.getRequestURI();
		System.out.println(uri);
		String filename = "";
		String contentType = "";
		if (uri.endsWith("getHTML")) {
			filename = "c:/Temp/sample.html";	
			contentType = "text/html; charset=utf-8";
		} else if (uri.endsWith("getXML")) {
			filename = "c:/Temp/sample.xml";	
			contentType = "application/xml; charset=utf-8";
		} else if (uri.endsWith("getJSON")) {
			filename = "c:/Temp/sample.json";	
			contentType = "text/json; charset=utf-8";
		} else {
			filename = "c:/Temp/trans_duke.png";	
			contentType = "image/png";
		}
		File f = new File(filename);
		FileInputStream fis = new FileInputStream(f);
		response.setContentType(contentType);
		if(contentType.startsWith("image")) {
			byte[] content = new byte[(int)f.length()];
			ServletOutputStream sos = response.getOutputStream();
			fis.read(content);
			sos.write(content);			
			sos.close();
		} else {
			InputStreamReader isr = new InputStreamReader(fis, "utf-8");
			BufferedReader br = new BufferedReader(isr);
			PrintWriter out = response.getWriter();
			String line = null; 
			while((line = br.readLine()) != null) 
				out.println(line);
			out.close();
			br.close();
			isr.close();			
		}		
		fis.close();
	}
}
  • @WebServlet({ "/getHTML", "/getXML", "/getJSON", "/getImage" })
    • 맵핑 명 여러개
  • file io : 운영체제 알맞는 패스 정보
    • 드라이버 경로 넣어야함
  • 읽어서 클라이언트한테 write
  • io는 운영체제에 무관하게 만드는게 쉬운일이 아님
    • 운영체제에 무관하게 만들려고 : Stream객체를 써서 
      • 한 쪽 방향으로만 흐른다. (내보내든, 읽어오든)
      • txt파일 읽어온다 : textreader
      • 출력 : outputStream,,,
  • getOutputStream () : 이미지파일을 읽어와야해서, 통채로 읽어서 통채로 내보냄
  • FileInputStream : 바이너리 스트림을 이용해서 읽어오겠다. 
  • InputStreamReader isr = new InputStreamReader(fis, "utf-8");
    • 읽기모드로 동작하는 바이트 스트림을 문자 스트림으로 변환해주는 

 


  • servlet 
    • 객체 생성되면, 서버 죽을 때까지 아니면 리로드될때까지 살아있다.
    • 생성된 객체 계속 재활용함
    • 여러클라이언트  하나의 서비스 요청하면
      • 요청한 수만큼 스레드 만들어서
      • 하나의 서블릿객체 공유해서 사용함
      • 처리 효율 높일 수 있음
    • 맴버 변수로 하느냐, 지역변수로 하느냐 크게 달라져서 신경써야함
      package base;
      
      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;
      
      @WebServlet("/memberlocal")
      public class MemberLocalServlet extends HttpServlet {
      	private static final long serialVersionUID = 1L;
      	int member_v=0;
      	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		int local_v=0;		
      		response.setContentType("text/html; charset=utf-8");
      		PrintWriter out = response.getWriter();
      		member_v += 10;
      		local_v += 10;
      		out.print("<ul>");
      		out.print("<li>멤버변수 : "+ member_v +"</li>");
      		out.print("<li>지역변수 : "+ local_v +"</li>");
      		out.print("</ul>");
      		out.close();		
      	}
      }​
      • 구동시키면
        • 멤버 10, 지역 10됨
      • 새로고침하면 
        • 멤버 20, 지역 10됨
    • 멤버 변수 : 객체 생성시에 메모리 할당 됨 (최초 요청 했을 때)
    • 지역 변수 : 호출 될 때마다 할당 됨
      • 개별 할당은 가능함
      • 메소드 수행이 끝나면 사라짐
      • 어떤 클라이언트가 요청하든, 재활용 된다. 
      • 모든 클라이언트가 공유함 (리로드, 서버 죽을 때까지)
    • 계좌번호, 개인정보는 멤버 변수에 넣으면 안됨.
      • 웬만하면 지역변수 
      • 다른 클라이언트가 멤버 변수가 바뀔 수가 있음
    • 개별할당하면서 다음 요청시에도 그대로 쓸 수 있게 하려면(ex 쇼핑카트)
      • 세션객체 (httpsession)

HttpSession

  • 클라이언트 별로 개별적으로 만들어짐
    • (클라이언트별로 하나씩만들어짐) - 두개를 안 만들어줌 
    • 이름을 부여해서 name-value쌍으로 
    • 원하는 시간까지 유지
    • 갯수 제한 없음
    • WAS가 알아서 관리해줌 - 안 만들어져 있으면 새로 만들어줌
    • 일정 시간동안 요청을 안 하면
      • 세션객체는 자동 삭제된다 - WAS가
      • 일정 시간 = 기본 값 : 30분 (api로 바꿀 수 있다)
        • Inactive Interval
      • 직접 삭제도 가능
  • 클라이언트 별로 객체로 만들어서 넣어주면 됨 (기본형은 못 넣음)
    • setAttribute
  • 유지할 필요가 없으면 지우면 된다. 
    • removeAttribute
  • 꺼내는 것 
    • getAttribute

  1. 상태 정보 유지
    • 목적의 데이터들 (로그인 했다, 로그인을 성공했다. 어떤 상품을 몇 개 구매하고 싶다라는 장바구니)
    • 현재 어떤 상태다 (이 클라이언트는)
    • 클라이언트별로 유지하는 기술
  2. 어떤 클라이언트것인지 구별하는 것
    • 회원가입 안 해도 장바구니에 상품 담을 수 있다. 
    • 세션 id가 하나씩 부여됨
      • id는 고유 식별자 (짧지 않음)
      1. cookie를 이용한 방법
        • 클라이언트 별로 상태 정보를 각각 들고 있음 
      2. HttpSession객체 이용 
        • 서버에 클라이언트 별 상태 정보가 저장되어 있음
        • 방문했던 적이 있는 클라이언트 안에 보관되어있는 데이터
        • name-value쌍의 데이터
        • 서블릿, 자바스크립트로 구현 가능 (서블릿만의 구현 기술이 아님)
        • 서버가 클라이언트한테 응답 헤더에 set-cookie해서 줌
          1. 주기전에 id에 해당하는 session객체가 있는지 본다.
            • 있으면 그대로 주고, 없으면 만듦 
          2. 응답 헤더에 전달된 쿠키 정보를 저장
          3. 브라우저가 보관함
          4. 다시 요청할 때 요청 헤더에 저장된거 담아서 줌
        • 브라우저 유효 서버가 누구인지 다 앎
          • 다른 서버한테 갈 일은 없음
        • 앞으로 24시간 팝업창 띄우지 않기, 로그인 시 계정 보관
          • 없어지더래도 크게 문제가 되지 않는 것
        • 중요한 상태 정보는 서버에 저장
        • 세션객체의 아이디만 클라이언트에 저장
        • API
          • getSession( true or false)
            • HttpSession 리턴함 
            • 기본 값 true
              • 이미만들어져있는 얘 찾아서 리턴
              • 안 만들어져 있으면 새로 만들어서 리턴함
            • false
              • 안 만들어져 있으면 null리턴
          • setAttribute(이름, 객체)
            • 똑같은 이름의 객체 여러개 등록 X
            • 마지막에 등록된 얘가 저장되어 있음
            • 강제 형변환 필수 - 리턴 값이 object라서 
            • 필요없으면 removeAttribute( )
          • invalidate( )
            • 생성되어있는 세션 객체 강제로 삭제

 

package base;

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;
import javax.servlet.http.HttpSession;

@WebServlet("/sessiontest1")
public class SessionTestServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	int member_v=0;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int local_v=0;		
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		if(session.getAttribute("cnt") == null)
			session.setAttribute("cnt", new int[1]); // 데이터를 저장할 방을 등록
		int[] session_v = (int[])session.getAttribute("cnt");
		session_v[0] += 10;
		member_v += 10;
		local_v += 10;
		out.print("<ul>");
		out.print("<li>멤버변수 : "+ member_v +"</li>");
		out.print("<li>지역변수 : "+ local_v +"</li>");
		out.print("<li>세션객체에저장된배열원소 : "+ session_v[0] +"</li>");
		out.print("</ul>");
		out.close();		
	}
}
    1. - int[] session_v = (int[])session.getAttribute("cnt");
      1. - cnt로 저장되어 있는 객체 꺼내오기
        - session객체 id가 전달 됨
      2. - 유호 path : /edu

      3. - 새로 고침하면, 요청 해더에는 id없음.
      4. - 응답 헤더에 id가 있다. 
      5. - 계속 서버에 id 보냄

      6. - 엣지로 열면 개별적으로 증가함
      7. - 크롬용, 엣지용 개별적으로 만들어져 있음
      8. - 크롬을 여러개 열어도 자원을 공유함 : 두개 만들어지진 않음
      9. - 다른 브라우저만, 크롬을 띄울 때 시크리티 모드면 별개의 객체 만들어짐 
      10.  

      11. - 유효 도메인 판단된 경우에만 세션 id가 보내진다.
      12. - 브라우저 죽을 때 까지 유효함

 


package base;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

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;
@WebServlet("/sessiontest2")
public class SessionTestServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
		HttpSession session = request.getSession();
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();	
		out.print("생성된 세션객체의 ID : "+session.getId());
		out.print("<br>세션 객체가 생성된 시간 : "
				      + new Date(session.getCreationTime()));
		out.print("<br>현재 시간 : " + new Date());
		out.close();
	}
}
  • 유효 시간 안 주면 브라우저가 죽기 전까지 있음

 

    • 현재 시간은 바뀌어도 세션 객체 만들어지는 시간은 안 바뀜
      • getCreationTime() 세션 객체 만들어진 시간
  • 클라이언트 별로 개별적으로 만들어진다. 

 


package base;
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;
import javax.servlet.http.HttpSession;
@WebServlet("/sessiontest3")
public class SessionTestServlet3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();	
	    String action = request.getParameter("action");
	    HttpSession session = null;
	    String msg = "action=create 또는 action=destroy를 전달하시오."; 
	    if(action != null && action.equals("create")) {
	    	session = request.getSession();// getSession(true)와 동일
	    	if(session.isNew())
	    		msg = "세션 객체가 생성됨";
	    	else 
	    		msg = "세션 객체는 이미 생성되어 있었음";    	
	    } else if (action != null && action.equals("destroy")) {
	    	session = request.getSession(false);
	    	if(session != null) {
	    		session.invalidate();
	    		msg = "세션 객체가 삭제됨";
	    	} else 
	    		msg = "삭제할 세션 객체가 없음";    	
	    }
		 
		out.print("<h2>"+msg+"</h2>");
		out.close();
	}
}
  • session = request.getSession(false);
    • 없으면 다시 만들진 않고 null리턴

 


 

'study > JAVA 전문가' 카테고리의 다른 글

[fileIUpload,jsp] 서블릿 구현  (0) 2021.12.30
[servlet]요청 재지정  (0) 2021.12.29
[Servlet] Get방식  (0) 2021.12.28
[HTML] 연습  (0) 2021.12.28
[Servlet & JSP] 1  (0) 2021.12.27
  • 서버상에서 실행되는 프로그램
  • RAM 상주 프로그램이였는데 servlet 컨테이너가 커버해준다. 
  • 수행 속도가 빠르고, 구현도 쉬웠다. 

 

등록과 매핑해줘야한다. 

  • xml
  • annotaion
  • 애플릿때문에 생김
    • 클라이언트가 html, js, image인지 웹 서버가 뭘 보고 판단 ? 
      • 요청된 파일의 확장자보고 판단함
  • servlet확장자 .class
    • 애플릿이라는 얘가 web에서 널리 사용하고 있었음
      • .class이면 다 애플릿으로 인식함
      • 애플릿 브라우저에서 실행돼서 java실행 환경을 다 들고있었슴
    • servlet은 확장자로는 판단하지 못했음 
      • 매핑이 만들어짐 

 

  1. 서블릿마다 태그 넣어주는지 (xml)
  2. 앞에 @쓰는 것 (annotation)

요청 및 응답 객체 생성

  • 톰캣안에 코요태 : web서버
    • 매핑보고, 확장자보고 서버에서 실행되는지, 클라이언트에게 줘야하는지 판단
      • 서버에서 실행시키고, 결과를 줘야할 때는 카탈리나에게 넘김(서블릿 컨테이너) 
      • 이미지읽고, 간단한건 코요테 안에서 해결함
    • 카탈리나 (서블릿 컨테이너)
      1. servlet class 메모리에 로딩
      2. response, request 객체를 만듬
      3. client가 요청한 servlet이 객체 생성되어있는지 확인 -> 서비스 호출 (클라이언트 요청할 때마다 )
        • 자기가 만든 http reponse, http request(요청정보)를 매개변수로 서비스에게 전달
          • 서비스는 get인지 host인지 확인
          • get방식이면
            • doGet 오버라이딩, 호출 안 되어있으면 부모의 do get이 호출 됨
          • Post 방식이면
            • doPost 오버라이딩
      4. 객체 생성 안 되어 있으면
        • 젤 먼저 호출 init (최초의 한번만 )-> 서비스 
        • 서비스의 결과가 항상 
      5. 서블릿 객체가 메모리에 사라지는 시점에 destroy 호출

 

 

  • 정해진 메소드만 수행해야함. 
    • 구현해야하는 메소드 사양도 정해져있음 


  • 객체생성을 WAS(Web application Server)가 한다. 
    • 클라이언트가 보낸 쿼리문자열을 담아서 전달하면, 그걸 우린 쓴다 HttpRequest
  • response.getWriter();
    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out = response.getWriter();​
    • response 
      • 클라이언트 응답과 관련된 일
    • io
      • readWriter
        • 문자 스트링(텍스트)
      • input/output
        • 바이너리 (이미지)

 


에러

500 : 실행하다 오류

  • getParameterValues
    • 리턴값이 문자열 배열
    • 하나의 value에 여러개
  • getParameter
    • 리턴값이 string
    • 하나의 value에 하나 올 때

 

 


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>입력폼 학습</h1>
	<hr>
	
	<!--
		method 생략하면 get 
		localhost니깐, 서버주수랑 포트번호 생략
	-->
	
	<form method="get" action = "/edu/query">
		이름 <input type="text" name="p1" required>
		<br> 나이 <input type="number" name="p2"><br>
		
		
		<!-- HTML5 -->
		좋아하는 음식 
		<br> 햄버거 <input type="checkbox" name="p3" value="햄버거">
		비지찌게 <input type="checkbox" name="p3" value="비지찌게"> 
		회덮밥 <input type="checkbox" name="p3" value="회덮밥"> 
		돈까스 <input	type="checkbox" name="p3" value="돈까스"><br>
		
		<input type="submit" value="전송하기"> 
		<input type="reset" value="초기상태로">
	</form>
</body>
</html>
package base;

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;

@WebServlet("/query")
public class QueryServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		String p1 = request.getParameter("p1");
		int p2 = Integer.parseInt(request.getParameter("p2"));
		String p3[] = request.getParameterValues("p3");
		out.print("<ul>");
		out.print("<li>p1 : "+ p1 +"</li>");
		out.print("<li>p2 : "+ p2 +"</li>");
		for(int i=0; i < p3.length; i++)
			out.print("<li>p3["+i+"] : "+ p3[i] +"</li>");
		out.print("</ul>");
		out.close();		
	}
}

  • String p3[] = request.getParameterValues("p3");
    • 아무것도 전달 안 되면 비어있는 배열 리턴함
  • <form method="get" action = "/edu/query"> 
    • action에 url 다 주는 것 -> 절대 url 
    • /edu/query
      • 자동으로 html요청했던 서버 정보로 확장시킴
      • 서버를 여러 개에서 받으면 절대주소 줘야함
    • host방식으로 하면 405에러남

      • doGet 오버라이딩해서 
      • 부모의 있는 httpServlet에 있는 doPost 호출된 것
    • 메소드 속성이 아예 없으면 디폴트 get방식

 


out.print("<a href = '/edu/htmlexam/queryservlettest.html'>입력화면으로</a>");
  • 하이퍼링크 작성함 (.java)

querytest.html

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	    <form method="GET" 
	    action="http://localhost:8080/edu/querytest">
		이름 : <input name="stname" value="luster1031" required><br>
		암호 : <input type="password" name="pwd"><br>
		나이 : <input type="number" name="age"><br>
		성별 : <input type="radio" name="gender" value="남자">남자
		<input type="radio" name="gender" value="여자">여자
		<br>
		
		취미 : 
		피아노 <input type="checkbox" name="hobby" value="피아노">
		수영 <input type="checkbox" name="hobby" value="수영">
		독서 <input type="checkbox" name="hobby" value="독서">
		게임 <input type="checkbox" name="hobby" value="게임">
		<br>
	
		좋아하는 색 : 
		<select name="color">
		    <option value=""></option>
			<option value="빨강색">RED</option>
			<option value="파랑색">BLUE</option>
			<option value="노랑색">YELLOW</option>
		</select>
		<br>
		
		좋아하는 음식 :
		<br> 
		<select name="food" size="4" multiple>
			<!-- multipe : 원하는 만큼 선택 -->
			<option value="라면">라면</option>
			<option value="냉면">냉면</option>
			<option value="짜장면">짜장면</option>
			<option value="햄버거">햄버거</option>
			<option value="닭강정">닭강정</option>
			<option value="육회">육회</option>
		</select>
		<br>
		
		의견 : 
		<br>
		<textarea name="op" rows="10" cols="50"></textarea><br>
		
		<input type="hidden" name="h_1" value="hidden으로 보낸 첫 번째 내용">
		<input type="hidden" name="h_2" value="hidden으로 보낸 두 번째 내용"> 
		
		<input type="submit" value="보내기">
		<input type="reset" value="다시작성하기">
	</form>
</body>
</html>

QueryTestServlet.java

더보기

QueryTestServlet.java

package base;

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;

@WebServlet("/querytest")
public class QueryTestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String name = request.getParameter("stname");
		String pwd = request.getParameter("pwd");
		int age = Integer.parseInt(request.getParameter("age"));
		
		String gender = request.getParameter("gender");
		
		String[] hobby = request.getParameterValues("hobby");
		String[] food = request.getParameterValues("food");
		
		String color = request.getParameter("color");
		String op = request.getParameter("op");
		
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.print("<h2> 전달된 내용 </h2>"); out.print("<hr>");
		
		
		out.print("<ul>");
		out.print("<li> 이름 : " +name+ "</li>");
		out.print("<li> 암호 : " +pwd+ "</li>");
		out.print("<li> 나이 : " +age+ "</li>");
		
		out.print("<li> 성별 : ");
			if (gender == null) {
				out.print("선택 제대로 하세요 -ㅅ-");	
			}
			else {
				out.print(gender);
			}
		out.print("</li>");
		
		out.print("<li> 취미 : ");
			if (hobby == null) {
				out.print("선택 제대로 하세요 -ㅅ-");	
			}
			else {
				for (int i=0 ; i<hobby.length ; ++i) {
					if (i == hobby.length -1) {
						out.print(hobby[i]);
						break;
					}
					out.print(hobby[i] +",");
				}
			}
		out.print("</li>");
		
		out.print("<li> 좋아하는 색 :" +(color == ""?"없음":color) +"</li>");
		out.print("<li> 좋아하는 음식 : ");
		if (food == null) {
			out.print("선택 제대로 하세요 -ㅅ-");	
		}
		else {
			for (int i = 0; i < food.length; ++i) {
				if (i == food.length - 1) {
					out.print(food[i]);
					break;
				}
				out.print(food[i] +",");
			}
		}
		out.print("</li>");
		
		
		out.print("<li> 의견 : " + op + "</li>");
		out.print("<li> 비밀1 : " + request.getParameter("h_1") + "</li>");
		out.print("<li> 비밀2 : " + request.getParameter("h_2") + "</li>");
		
		
		out.print("</ul>"); out.print("<hr>");
		out.print("<a href='/edu/htmlexam/querytest.html'>"
				+ "입력화면으로</a>");
		
		out.close();
	}

}
  • hidden 태그
    • 사용자에 관계없이 자동으로 전달하는 name, value로 작성할 수 있는 tag
    • hidden은 화면에 아무것도 안 나타남
  • 이름 : <input name="stname" value="luster1031" required><br> 
    • 디폴트로 이름이 적혀져 있음
    • type은 text

http://localhost:8080/edu/querytest?
	stname=luster1031&
    pwd=12341&
    age=111&
    gender=%EB%82%A8%EC%9E%90&
    hobby=%ED%94%BC%EC%95%84%EB%85%B8&
    hobby=%EB%8F%85%EC%84%9C&
    hobby=%EA%B2%8C%EC%9E%84&
    color=%ED%8C%8C%EB%9E%91%EC%83%89&
    food=%EB%9D%BC%EB%A9%B4&
    food=%EB%83%89%EB%A9%B4&
    food=%EC%A7%9C%EC%9E%A5%EB%A9%B4&
    food=%ED%96%84%EB%B2%84%EA%B1%B0&
    food=%EB%8B%AD%EA%B0%95%EC%A0%95&
    food=%EC%9C%A1%ED%9A%8C&
    op=2021.12.28+%EC%98%A4%EB%8A%98%EC%9D%80+%EC%88%98%EC%9A%94%EC%9D%BC&
    h_1=hidden%EC%9C%BC%EB%A1%9C+%EB%B3%B4%EB%82%B8+%EC%B2%AB+%EB%B2%88%EC%A7%B8+%EB%82%B4%EC%9A%A9&
    h_2=hidden%EC%9C%BC%EB%A1%9C+%EB%B3%B4%EB%82%B8+%EB%91%90+%EB%B2%88%EC%A7%B8+%EB%82%B4%EC%9A%A9
  • '%'기호와 함께 16진수 코드 값으로 
  • 공백은 '+'문자로 간다. 

getpost.html

더보기

getpost.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>서블릿을 요청하는 다양한 방법</h1>
	<hr>
	<a href="/edu/getpost?name=듀크">하이퍼링크로 요청</a>
	<hr>
	<form method="get" action="/edu/getpost">
		<input type="text" placeholder="이름을입력하세요" name="name"> <input
			type="submit" value="GET방식요청">
	</form>
	<hr>
	<form method="post" action="/edu/getpost">
		<input type="text" placeholder="이름을입력하세요" name="name"> <input
			type="submit" value="POST방식요청">
	</form>
</body>
</html>
  • a 태그로 요청할 수 있는 대상은 제한이 없다.  
    • get 방식
      • form 작성 안 해도, 물음표 뒤에 추가로 전달 가능 
        • 사용자가 직접 이름을 요청할 기회가 없음
      • form 사용시
        • 사용자가 직접 이름 넣기 가능
      • 전달되는 쿼리의 길이의 제한이 있다. (서버마다 다름)
      • 보안이 안 좋음
    • post
      • 전달되는 필드가 주소 필드에 표시가 안 남
      • form 태그를 써야만, 가능
      • 나머지는 get 방식
      • 쿼리가 외부로 안 보임
      • 쿼리 문자열의 길이 제한이 없음
        • 파일 업로드

GetPostServlet.java

더보기

GetPostServlet.java

package base;

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;

@WebServlet("/getpost")
public class GetPostServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<h2>요청 방식 : " + request.getMethod() + "</h2>");
		out.print("<h2>Query 문자열 : " + request.getParameter("name") + "</h2>");
		out.close();
		System.out.println("GET 방식 수행");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		// request.setCharacterEncoding("UTF-8");
		out.print("<h2>요청 방식 : " + request.getMethod() + "</h2>");
		out.print("<h2>Query 문자열 : " + request.getParameter("name") + "</h2>");
		out.close();
		System.out.println("POST 방식 수행");
	}
}
  • servlet 컨테이너가 get이든 post이든 요청하는 api는 똑같다. 
  • get방식

 

  • host 방식

  • 요청 바디에 입력 값 파라미터 담아서 전달
    • 주소창에 입력 값 안 보임
  • 한글 깨짐
    • 전달되는 방법의 차이
    • 요청하기 전에 request.setCharacterEncoding해줘야 함

 


  • 사용자 편의성을 얼만큼 제공하는 사이트인가?

 

 

'study > JAVA 전문가' 카테고리의 다른 글

[servlet]요청 재지정  (0) 2021.12.29
[servlet] 상태정보 유지 기술  (0) 2021.12.29
[HTML] 연습  (0) 2021.12.28
[Servlet & JSP] 1  (0) 2021.12.27
[tomcat] 실습 - html, servelt  (0) 2021.12.27
<tr><th colspan="3">이름,지역,나이</th></tr>

 

  • colspan : 세개의 열 하나로 묶음

 

<tr><td rowspan="2">luster1031</td><td>사랑시고백구행복동</td><td>50</td></tr>
<tr><td>핵복동</td><td>90</td></tr>
  • rowspan : 행 묶음
  • th, td는 그냥 굵게 

 

form 태그

http://localhost:8080/edu/htmlexam/exam2.html?
stname=luster1031&
stpwd=1234&
stage=11111&
stcolor=%23064110&
stfood=f1&stfood=f3&stfood=f4&
gender=female
  • 전송하기 누르면 이렇게 나옴
  • 웹 서버에게 뭔가를 요청하면서 함께 전달하는 name = value형식의 문자열
    • Query String (GET)
    • Request Parameter (POST) 라고 함

 

https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=Java
  • naver.com에 java라고 입력시 나타나는 주소
  • GET방식
    • query 정보 외부에 공개
    • 간단함

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>입력폼 학습</h1>
	<hr>
	<form>
		이름 <input type="text" name="stname" required>
		<br> 암호 <input type="password" name="stpwd">
		<br> 나이 <input type="number" name="stage"><br>
		
		<!-- HTML5 -->
		좋아하는 칼라 <input type="color" name="stcolor"><br>
		
		<!-- HTML5 -->
		좋아하는 음식 
		<br> 햄버거 <input type="checkbox" name="stfood" value="f1">
		비지찌게 <input type="checkbox" name="stfood" value="f2"> 
		회덮밥 <input type="checkbox" name="stfood" value="f3"> 
		돈까스 <input	type="checkbox" name="stfood" value="f4">
		
		<br> 성별 <br>
		남성 <input type="radio" name="gender" value="male"> 
		여성 <input type="radio" name="gender" value="female"><br> 
		
		<input type="submit" value="전송하기"> 
		<input type="reset" value="초기상태로">
	</form>
</body>
</html>
  • name속성이 없으면, server한테 전달 X
    • name value쌍으로 전달하기 때문
  • name속성은 유니크 해야한다. 
  • checkbox는 이름이 다 똑같아야 한다. 
    • value속성을 써서, name value가 전달하도록해야한다. 
    • value안 쓰면 뭔가 선택된지 모른다. 
  • submit (기본 내장 핸들러가 내장되어 있음)
    • 모든 내용을 쿼리문자로 바꿔서 서버에 전달
    • value : 버튼의 라벨
    • 꼭 있어야 함
  • reset 
    • 처음 랜더링 한 상태로 바꿔줌

 

 

 

  • placeholder : 희미하게 보여줌
    • 힌트 문자열 표현해줌
    • 입력하면 자동으로 사라짐

 

<li><label for=phone>연락처</label> 
	<input id=phone name=phone type=tel 
		placeholder="00*-000*-0000" pattern="[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}"></li>
  • pattern, placholder사용

 

<li>
	<label for=date_of_birth>생일</label> 
	<input id=date_of_birth name=date_of_birth type=date min="1950-01-01" max="2000-01-01">
</li>
  • max : 2000.01.01 이후에는 안 나옴
  • min : 1950.01.01

 

<li>
	<label for=gender>성별</label> 
	<input id=gender name=gender type=text list=gender_list> 
	<datalist id=gender_list>
		<option value=male label=남>
		<option value=female label=여>
	</datalist></li>

  • 입력상자인데
    • 많이입력되는 항목 먼저 리스트에 보여줌

 

  • testarea 
    • 큰 입력상자 사용자에게 제공
    • 여러 행 입력할 수 있게 해줌

 

  • select
    • mutipul : 체크박스와 비슷 (여러개 선택 가능)

 

  1. file

 

  • 개행
    • 개행 여러개 줘도 블랭크 하나로 인식하게 된다. 
    • html에서 개행을 br 태그로 함
      • 싱글 사이드 태그 : 닫는게 없음
    • <p> 
      • 하나의 단락으로 묶을 수 있음
      • 중간에 빈 행도 적당하게 들어감 (조금 줄 간의 간격 뛰어줌)

'study > JAVA 전문가' 카테고리의 다른 글

[servlet] 상태정보 유지 기술  (0) 2021.12.29
[Servlet] Get방식  (0) 2021.12.28
[Servlet & JSP] 1  (0) 2021.12.27
[tomcat] 실습 - html, servelt  (0) 2021.12.27
[Web programming]  (0) 2021.12.27
  1. 웹 프로그래밍 기초
    • 서버는 서버대로, 클라이언트는 클라이언트대로 있어야 한다. 

http 

  1. 웹의 표준프로토콜 
    1. 요청
      • client가 요청함 
    2. 처리
      • web서버가 요청 받음
    3. 응답
      • html 문서 응답함
    4. 하나하나 읽어서 document로 랜더링함
      • 태그에 알맞게 보여줌 : 랜더링

 

  1. connection oriented
    • 접속이 되어야지 통신함 
    • 신뢰성있는 통신함 
    • 반드시 접속해야함
    • tcp 프로토콜 사용함
    • 접속상태 유지하면, 다른 client 유저가 server에 접속할 수 있는 기회 없어짐
      • 그 부분 염려하여 stateless만듦
  2. stateless
    • 접속상태 계속 유지하지는 않음
    • 클라이언트 요청오고 응답하면 끊어버림
    • 처리 호율 높임

 

  • 요청방식
    • GET
    • POST
      • 로그인 (정보 중요한 것)
      • 파일 업로드

 

Servlet jsp

  • servlet으로 구현할 수 있는건 jsp로 구현 가능
    • java가 주인공인 것
    • 출력형식을 html으로
    • 요청과 관련된 것
  • jsp로 구현할 수 있는 건 servlet으로 구현 가능
    • html이 주인공
    • 필요한 부분에 java 코드 끼워 넣는 것
    • 응답에 관련된 것

 

mvc모델

  • 각 분리해서 개발하는 모델

 

맵핑 모델

  • xml
    • web.xml에 넣는 것
  • annotaion
    • @Webservlet("/hello")
    • 두개 이상 등록도 가능함

 

  • WAS : Web Application Server
    • Web Server + Application Server
      • Application Server : Servlet Container + JSP Converter
      • Servlet Container에 main클래스 있음
    • 무조건 객체 생성 X
      • 생성 되어 있으면 생성 안 함
      • 생성 안되어 있으면 생성 함
      • servlet는 객체 하나만 있음
        • 하나로 모든 클라이언트와 공유함
      • in호출 
      • service 호출
        • doGet, doPost호출

'study > JAVA 전문가' 카테고리의 다른 글

[Servlet] Get방식  (0) 2021.12.28
[HTML] 연습  (0) 2021.12.28
[tomcat] 실습 - html, servelt  (0) 2021.12.27
[Web programming]  (0) 2021.12.27
[mongoDB] 날짜 데이터  (0) 2021.12.24
  • http://localhost:8080/edu/htmlexam/first.html (http url string)
  • url : uniform resource locator  
    1. protocol (http통신 기반)
    2. serveraddress
      • localhost == 127.0.0.1
    3. port number (8080)
    4. URI
      • uniform resource identity
      • 서버에 가는 것 (요청하는 것)
      • /edu/htmlexam/first.html
        1. /edu : context path 
          • 역할 : 어떠한 웹 프로젝의 자원을 요청할 것인가?
          • edu 폴더에 가서 자원을 찾는다. 
          • 한 덩어리의 context로 본다. 
        2. /htmlexam/first.html 등록된 얘가 있나 확인
          • 없으면 web app 폴더 찾아감
            • document root라고 보면 됨
            • 최상위 폴더 

  • status : 200 -> 성공적으로 받아왔다. 

 

  • get방식으로 들고옴
    • default 방식임

servlet 실습

  • 클래스 명이 아닌, mapping명과 연결
    • 특정 servlet 요청할 때, 전체 경로 대신 간단하게 경로 표현해주는 것
    • 맵핑 방법 
      • xml
      • annotaion
  • 클래스명과 mapping명 다르게 하는게 보안적으로 좋음

'/' 빼먹으면 안 된다.


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;

@WebServlet("/first")
public class FirstServelt extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<h1>First Servlet 수행 완료 <h1>");
		out.close();
		System.out.println("서블릿에서의 표준 출력은 어디로 나가나?");
	}

}
  1. /first 로 매핑
    • 톰캣 재 기동 걸어줘야함
    • 새로 추가한 파일은 인식해도 소스 내용은 인식 못 함
      • 자동으로 인식하지 못함 -> 자동으로 인식하면 서버성능 떨어뜨림
  2. 반 정도 프레임워크 기술
  3. 누구한테 내보낼 것인가 명시해줘야한다. 
  4. 개행문자를 개행문자로 인식 X
    • 여러 개 블랭크 하나로 인식함 -> println쓰는게 소용 없

 


MIME 타입

response.setContentType("text/plain; charset=UTF-8");​
  • 이렇게 하면 일반 텍스트로 
  • html으로 하면 랜더링 할 준비를 함
    • html에 알맞게
  • 절대로 오타 입력하면 안 된다.
  • 한글 깨질 가능성 있다.

 


PrintWriter out = response.getWriter();
		out.print("<h1>First Servlet 수행 완료 </h1>");
		out.close();
  • 출력객체 받아와서 출력해야한다. 

 


out.print("<h2>반가워요...: " + request.getParameter("name") + "님!!</h2>");

이렇게해서 주소창에 

http://localhost:8080/edu/first?name=myname

myname부분에 요청하면 된다. 

 


 

'study > JAVA 전문가' 카테고리의 다른 글

[HTML] 연습  (0) 2021.12.28
[Servlet & JSP] 1  (0) 2021.12.27
[Web programming]  (0) 2021.12.27
[mongoDB] 날짜 데이터  (0) 2021.12.24
[mongoDB] 2  (0) 2021.12.23

+ Recent posts