Learn/KH정보교육원

[KH정보교육원 당산] 34일차 (JSTL 실습, Servlet)

Dahoon06 2021. 4. 26. 12:24
728x90
반응형

 

forTokens

: 자바의 split() 메소드 같이 문자열을 분리시켜주는 태그

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>forTokens.jsp : 특정문자를 기준으로 분리</title>
</head>

<body>
	<c:forTokens var="city" items="서울.인천,대구.부산" delims=",">
		${city }<br />
	</c:forTokens>	
</body>
</html>

문자열을 저장받을 변수 city,

delims=>","   //    , 을 기준으로 문자열을 분리 할 것이다.

변수 호출 ${city }

 

 

 

 

JSP에서 다른 JSP IMPORT

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jstlUrl1.jsp : 다른 jsp import</title>
</head>

<body>
	<c:import url="http://localhost:9000/el_jstl/02_el.jsp"></c:import>
	<hr />
	<c:import url="http://localhost:9000/el_jstl/02_el.jsp" var="data"></c:import>
	${data }
</body>
</html>

 

 

1번째는 변수에 값을 넣어주지 않았기 때문에 출력값이 없다.

 

2번쨰는 import할 jsp파일을 data라는 변수에 값을 넣은 후 호출하여 갑을 출력 시켰다.

 

 

 

출력 화면

 

 

 

이미지 화면 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>이미지 령로 및 이미지 출력</title>
</head>

<body>
	WebContent / images / pic.jpg
	<hr />
	<img src="./images/pic.jpg" />
	
	<c:url value="./images/pic.jpg" var="data"></c:url>
	<img src="${data }" />
</body>
</html>

기존에 사용했던 방식 : <img src="이미지 경로">

 

태그를 사용한 방법 : <c:url value="이미지 경로" var="변수명" />

** 변수에 이미지 경로를 담아서 사용

 

 

 

sendRedirect()와 동일한 기능을 하는 태그 : redirect

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>response.sendRedirect()와 동일한 기능을 redirect 태그</title>
</head>

<body>
<h3>리다이렉트 전</h3>
<c:redirect url="jstlUrl2.jsp" ></c:redirect>
<h3>리다이렉트 후</h3>
</body>
</html>

 

 

변수 설정 및 제거, 예외처리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>변수 설정/제거 예외처리</title>
</head>

<body>
	<h4>변수 선언 및 값 설정 : </h4>
	<!-- page, request, session, application -->
	<c:set var="age" value="28" scope="page"></c:set>
	
	<h4>변수 값 출력</h4>
	나이 : <c:out value="${age }">10</c:out>
	
	<!-- scope가 설정되어있으면 scope까지 설정해주면 좀 더 빠르게 처리 -->
	<h4>불필요한 변수 제거</h4>
	<c:remove var="age" scope="page" />
	
	나이: <c:out value="${age }">10</c:out>
	
	<h3>예외처리</h3>
	<c:catch var="errMsg">
		예외발생 전<br />
		
		<%=1/0 %> <br />
		
		에외발생 후 <br />
	</c:catch>
    
    <c:out value="errMsg" ></c:out>
	
</body>
</html>

 

변수 값을 호출하는 것이기 때문에 변수 삭제 전 코드에서 10은 출력되지않는다.

 

또한 remove 태그를 통하여 변수를 삭제했기 때문에 10으로 출력

 

** scope의 범위 : page//request//session//application

 

예외처리 태그

catch라는 태그는 try~catch 속성을 모두 가지고 있는 태그이다

<c:catch>

예외가 발생할 코드 (태그 사이에 사용)

</c:catch>

 


JSTL : 출력형식

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>JSTL : 출력형식</title>
</head>

<body>
	<c:set var="now" value="<%= new java.util.Date() %>"></c:set>
	${now } <br />
	
	<fmt:formatDate value="${now }" /> <br />
	<fmt:formatDate value="${now }" type="date" /> <br />
	<fmt:formatDate value="${now }" type="time" /> <br />
	<fmt:formatDate value="${now }" type="both" />
	
	
	
</body>
</html>

 

formatDate 의 date

                   time

                   both(날짜와 시간 둘 다 출력)

 

	default : 
	<fmt:formatDate value="${now }" type="both" dateStyle="default" timeStyle="default" /><br />
	short : 
	<fmt:formatDate value="${now }" type="both" dateStyle="short" timeStyle="short" /><br />
	medium : 
	<fmt:formatDate value="${now }" type="both" dateStyle="medium" timeStyle="medium" /><br />
	long : 
	<fmt:formatDate value="${now }" type="both" dateStyle="long" timeStyle="long" /><br />
	full:
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /><br />

출력 화면

 

직접 출력 스타일을 정할 수 있다. : pattern 태그

pattern : 
<fmt:formatDate value="${now }" type="both" pattern="yyyy년 MM월 dd일 hh시 mm분 ss초" /><br />

=> 2021. 4. 26. 오전 11:14:54 (출력 값)

 

 

useBean 태그를 혼용 지역 시간 표시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jstlFormat2.jsp : useBean 태그를 혼용 지역 시간 표시</title>
</head>

<body>
	<jsp:useBean id="now" class="java.util.Date"></jsp:useBean>
	Korea KST : 
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /> <br />
	<fmt:timeZone value="GMT">
		Swiss GMT : 
		<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /> <br />
	</fmt:timeZone>
	<fmt:timeZone value="GMT-8">
		NewYork GMT-8 : 
		<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /> <br />
	</fmt:timeZone>
</body>
</html>

 

timeZone에 사용된 GMT는 정해진것이기 때문에 다른 걸로 변경 불가

 

** 다국어 시스템을 만들때 사용되는 태그

 

 


Function

 : <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>JSTL : Functions</title>
</head>

<body>
	<c:set var="greeting" value="Test String Functions" />
	
	${greeting } <br />
	${fn:toUpperCase(greeting) } <br />
	${fn:toLowerCase(greeting) } <br />
	${fn:indexOf(greeting,"String") } <br />
	${fn:length(greeting) }  <br />
</body>
</html>

 

 

 

   자바에서 사용되었던 메소드들과 같다.

 

 

 


Servlet

 

servlet에 대하여

 

[JSP] Servlet

Servelt => Sever Applet 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해서, 서블릿이란 자바를 사용하여 웹을 만들기 위

june-17.tistory.com

 

 

 

Java package => 패키지 설정

Class name => 서블릿 파일 이름

SuperClass => 부모 클래스

 

 

Description => 내용을 적는 부분 ( 생략가능)

Initialization Parameters => 필요한 파라미터명이 있으면 이 부분에 추가 해줄 수 있다.

URL mappings : 웹주소에서 해당 서블릿을 호출할 때 사용하는 이름(/호출할이름)

ex) @WebServlet("/hello") 예시 코드

 

** /HelloServelt -> /hello로 변경 해줬다.

 

 

 

 

Modifiers => 접근제한자 (public 기본)

Interfaces => 필요한 인터페이스 추가

Constructors from superclass => 부모 클래스를 호출 할 것인지

Inherited abstract methods => 추상클래스를 상속할 것인지

 

 

package unit01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;     // annotation => @
import javax.servlet.http.HttpServlet;		
import javax.servlet.http.HttpServletRequest;   //doGet() /doPost()의 첫번째 매개변수 타입
import javax.servlet.http.HttpServletResponse;  //doGet() /doPost()의 두번째 매개변수 타입


@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    // 수정불가!!!! 톰캣이 서블릿을 구볗하기 위해 자동으로 부여되는 값
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
        
		//response.getWriter() => PrintWriter 타입 객체를 반환
		//PrintWriter out = response.getWriter();
		//response.getWriter().append("Served at : ") => out.append("Served at : ");추가
        //                                            => out.append(request.getContextPath());추가
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 

출력 화면   =>   Served at: /sevlet_test

 

 


서블릿 예제1)

 

JSP파일에서 값을 servlet파일로 넘겨서 처리

 

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>
	<form action="test" method="get">
		
		
		성별 : <input type="radio" name="gender" checked="checked" value="남자"/>남자
			 <input type="radio" name="gender" value="여자"/>여자 <br />
		이메일 정보 수신 여부 :  <input type="radio" name="mail" checked="checked" value="수신"/>수신
						 <input type="radio" name="mail" value="거부"/>거부 <br />
		간단한 가입 인사를 적어주세요.
		<textarea rows="3" cols=30 name="content"></textarea> <br />
		<input type="submit" value="전송" />
		
	</form>

</body>
</html>

 

Servlet

package unit02;

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("/test")
public class Servlet_test extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String gender = request.getParameter("gender");
		String mail = request.getParameter("mail");
		String content = request.getParameter("content");
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html>");
		out.print("<head><title>서블릿</title></head>");
		out.print("<body>");
		out.print("<h4>당신이 입력한 정보입니다.</h4>");
		out.print("<hr/>");
		out.print("성별 : <b>" + gender+"</b><br/>");
		out.print("메일 정보 수신 여부 : <b>" + mail+"</b><br/>");
		out.print("가입 인사 :  <b>" + content+"</b><br/>");
		out.print("</body>");
		out.print("</html>");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}

}

 

 

인코딩을 하지 않아 한글이 깨졌다

 

get방식 : response.setContentType("text/html;charset=UTF-8");

: html으로 출력하는 것이기에 text/html;charset=UTF-8

post방식 : request.setCharacterEncoding("UTF-8");

: doGet메소드를 통하여 값을 요청받는 것

 

정상 출력화면

 

 

 

서블릿 예제2)

 

마찬가지로 서블릿으로 값을 넘겨준다.

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>
<form action="test2" method="post">
	<br />
	관심항목을 선택하세요.
	<br />
	<hr />
	<input type="checkbox" name="items" value="신발" />신발
	<input type="checkbox" name="items" value="가방" />가방
	<input type="checkbox" name="items" value="벨트" />벨트
	<br />
	<input type="checkbox" name="items" value="모자" />모자
	<input type="checkbox" name="items" value="시계" />시계
	<input type="checkbox" name="items" value="쥬얼리" />쥬얼리
	<br />
	<input type="submit" name="전송">
</form>
</body>
</html>

Servlet

package unit02;

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

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("/test2")
public class Servlet_test2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String[] items = request.getParameterValues("items");
		
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html>");
		out.print("<head><title>서블릿</title></head>");
		out.print("<body>");
		out.print("<h4>당신이 선택한 항목입니다..</h4><br />");
		out.print("<hr/>");
		out.print(Arrays.toString(items));
		out.print("</body>");
		out.print("</html>");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}

}

 

원하는 형태가 아니다....

 

이런 형태로 출력이 되야하는데

 

강사님 서블릿 코드

package unit02;

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("/checkbox_servlet")
public class CheckboxServlet 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.println("<!DOCTYPE html>");
		out.println("<html><head><title></title></head>");
		out.println("<body>");
		String items[] = request.getParameterValues("item");
		
		if (items == null) {
			out.print("선택한 항목이 없습니다.");
		} else {
			out.println("당신이 선택한 항목입니다.<hr>");
			for (String item : items) {
				out.print(item + " ");
			}
		}
		out.print("</body></html>");
		out.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

 

if문과 for문을 사용하셨다

 

 

 

내일은 이 부분들을 JSP -> Servlet -> JSP의 형태로 3분할

 

 


728x90
반응형