환율 계산기 만들기 html 파일 없이 Servlet만 이용
package kr.gov.httpservlet2;
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("/Calc")
public class CalcServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static float USD_RATE = 1100.91F; //달러
private static float JPY_RATE = 10.62F; //엔화
private static float CNY_RATE = 168.59F; //위안
private static float GBP_RATE = 1493.58F; //파운드
private static float EUR_RATE = 1343.59F; //유로
public CalcServlet() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.println("<html><title>환율 계산기</title>");
writer.println("<font size=5>환율 계산기</font><br/> ");
writer.println("<form name='frmCalc' method='get' action='Calc' >");
writer.println("원화 : <input type='text' name='won' size=10 />");
writer.println("<select name='operator' >");
writer.println("<option value='doller' >달러</option>");
writer.println("<option value='en' >엔화</option>");
writer.println("<option value='wian' >위안</option>");
writer.println("<option value='pound' >파운드</option>");
writer.println("<option value='euro' >유로</option>");
writer.println("</select>");
writer.println("<input type='hidden' name='command' value='calculate'>");
writer.println("<input type='submit' value='변환' />");
writer.println("</form></html>");
String command = request.getParameter("command");
String won = request.getParameter("won");
String operator = request.getParameter("operator");
//환율 계산결과 출력
if(command != null && command.equals("calculate")){
String result = calculate(Float.parseFloat(won), operator);
writer.println("<html><font size=10>변환 결과</font></br>");
writer.println("<font size=10>" +result+ "</font></br>");
writer.println("<a href='Calc'>환율 계산기</a>");
return;
}
writer.close();
}
//환율 계산하는 메서드
private static String calculate(float won, String operator) {
String result = null;
if(operator.equals("doller")) {
result = String.format("%.6f", won / USD_RATE);
}
else if(operator.equals("en")) {
result = String.format("%.6f", won / JPY_RATE);
}
else if(operator.equals("wian")) {
result = String.format("%.6f", won / CNY_RATE);
}
else if(operator.equals("pound")) {
result = String.format("%.6f", won / GBP_RATE);
}
else if(operator.equals("euro")) {
result = String.format("%.6f", won / EUR_RATE);
}
return result;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Float.parseFloat => 값을 실수 값으로 파싱
디버깅 코드 더블클릭 후 F11키 디버깅
구구단 출력
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>구구단</title>
</head>
<body>
<h1>출력할 구구단의 수 입력해 주세요.</h1>
<form action="gugu" method="get">
출력할 구구단 : <input type="text" name="number" /><br/>
<input type="submit" value="구구단 출력">
</form>
</body>
</html>
package kr.gov.httpservlet3;
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;
/**
* Servlet implementation class GuguServlet
*/
@WebServlet("/gugu")
public class GuguServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public GuguServlet() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() 호출");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
int number = Integer.parseInt(request.getParameter("number"));
//예외를 처리하는 코드 추가
if(number < 1 || number > 9) {
writer.print("<html><head></head><body>");
writer.print("<h1>구구단은 2~9단 사이입니다.</h1>");
writer.print("</body></html>");
return;
}
writer.print("<table border=1 width=800 align=center>");
writer.print("<tr align=center bgcolor='#ffff66'>");
writer.print("<td colspan=4>"+number+ "단 출력 </td>" );
for (int i = 1; i < 10; i++) {
//홀수하고 짝수에 따라서 배경색을 바꿔준다.
if(i % 2 == 0) {
writer.print("<tr align=center bgcolor='#ACFAS8'>");
}else {
writer.print("<tr align=center bgcolor='#81BEF7'>");
}
writer.print("<td width=200>" +number+ "</td>");
writer.print("<td width=200>" +i+ "</td>");
writer.print("<td width=200>" +number+ "*" +i+ "</td>");
writer.print("<td width=200>" +number * i+ "</td>");
writer.print("</tr>");
}
writer.print("</table>");
writer.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
예외처리 화면
자바스크립트로 서블릿에 요청하기
로그인 예외처리 자바스크립트
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 화면</title>
</head>
<body>
<form name="frmLogin" action="login" method="post" enctype="UTF-8">
아이디 : <input type="text" name="user_id" /><br/>
비밀번호 : <input type="password" name="user_pw" /><br/>
<input type="button" onclick="func_validate()" value="로그인" />
<input type="reset" value="재입력" />
<!-- hidden 속성 : 클라이언트에게 숨겨진 내용으로 서버에 전송하고자 할 때 사용함.(로그인 시간, IP 등등) -->
<input type="hidden" name="user_address" value="구미시 원평동" />
</form>
<script type="text/javascript">
function func_validate() {
/* frmLogin 변수 : documnet(웹페이지 화면)객체에 아래에 있는
frmLogin 테그 이름을 대입함.*/
var frmLogin = document.frmLogin;
var user_id = frmLogin.user_id.value;
var user_pw = frmLogin.user_pw.value;
if( (user_id.length == 0) || (user_id == "") ||
(user_pw.length == 0) || (user_pw == "") ){
alert("아이디와 비밀번호는 필수 사항입니다.");
}
else {
frmLogin.method = "post";
frmLogin.action = "login";
frmLogin.submit();
}
};
</script>
</body>
</html>
package kr.gov.httpservlet;
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;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost()호출");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String id = request.getParameter("user_id");
String pw = request.getParameter("user_pw");
String address = request.getParameter("user_address");
System.out.println("아이디 : " + id);
System.out.println("비밀번호 : " + pw);
System.out.println("주소 : " + address);
String data = "<html><body>";
data += "아이디 : " +id+ "<br/>";
data += "비밀번호 : " +pw+ "<br/>";
data += "주소 : " +address+ "<br/>";
data += "</html></body>";
out.print(data);
}
}
서블릿 초기화 파라미터 ServletConfig
web.xml
톰켓 서버자체에 특정 파라미터 설정한 것을 사용함. => 우선순위가 높음 둘 다 있을 경우.
특정 서블릿에서만 매개변수를 사용하는 용도로 web.xml에 추가
<?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_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Chap04_Servlet-3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 첫번째 방법 -->
<servlet>
<!-- 특정 서블릿을 지정하는 코드 -->
<servlet-name>initParam</servlet-name>
<servlet-class>kr.gov.httpservlet2.InitParam</servlet-class>
<!-- 특정서블릿(kr.gov.httpservlet2.InitParam)에만 적용된는 부분이다.
초기화 파라미터를 init-param테그를 이용하여 지정한다. -->
<init-param>
<param-name>id</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>pw</param-name>
<param-value>0217</param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>C:\\workspace-jsp</param-value>
</init-param>
</servlet>
<!-- 서블릿 매핑코드 -->
<servlet-mapping>
<servlet-name>initParam</servlet-name>
<url-pattern>/InitP</url-pattern>
</servlet-mapping>
</web-app>
package kr.gov.httpservlet2;
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;
/**
* Servlet implementation class InitParam
*/
//@WebServlet("/InitParam")
public class InitParam extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InitParam() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet 호출");
String id = this.getInitParameter("id");
String pw = this.getInitParameter("pw");
String path = this.getInitParameter("path");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>");
out.println("아이디 : " +id+ "<br/>");
out.println("비밀번호 : " +pw+ "<br/>");
out.println("경로 : " +path+ "<br/>");
out.println("</body></html>");
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
서블릿 초기화 파라미터 ServletConfig 다른 방법
어노테이션 이용 (관리자 계정에 사용)
package kr.gov.httpservlet2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 아래와 같이 어노테이션을 적용하기 위해서는 web.xml에 기술되어 있는 부분
* 일단 주석처리함.
* 주석처리를 해야 아래코드가 적용됨.
* 어노테이션을 이용해서 직접 초기화 파라미터 값을 지정
*/
/*
* 소결론 : 초기화 파라미터를 사용하는 곳은, 보통 관리자 계정을 많이 사용하고,
* 보통은 web.xml파일에 기술하는것이 바람직함.
*/
//두번째 방법
@WebServlet(urlPatterns = {"/InitP"},
initParams = {
@WebInitParam(name = "id", value = "scott"),
@WebInitParam(name = "pw", value = "tiger"),
@WebInitParam(name = "path", value = "C:\\workspace-jsp")
}
)
public class InitParam extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InitParam() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet 호출");
String id = this.getInitParameter("id");
String pw = this.getInitParameter("pw");
String path = this.getInitParameter("path");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>");
out.println("아이디 : " +id+ "<br/>");
out.println("비밀번호 : " +pw+ "<br/>");
out.println("경로 : " +path+ "<br/>");
out.println("</body></html>");
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
데이터 공유 Servlet Context
하나의 프로젝트 안에 여러 서블릿 파일에서 함께 공유하면서 사용할 수 있도록
context-param태그를 이용해서 파라미터 값을 설정한다.
특정 서블릿 매핑하는 코드가 없는 것을 알 수 있다.
<?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_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Chap04_Servlet-3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 첫번째 방법 -->
<!-- <servlet>
특정 서블릿을 지정하는 코드
<servlet-name>initParam</servlet-name>
<servlet-class>kr.gov.httpservlet2.InitParam</servlet-class>
특정서블릿(kr.gov.httpservlet2.InitParam)에만 적용된는 부분이다.
초기화 파라미터를 init-param테그를 이용하여 지정한다.
<init-param>
<param-name>id</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>pw</param-name>
<param-value>0217</param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>C:\\workspace-jsp</param-value>
</init-param>
</servlet>
서블릿 매핑코드
<servlet-mapping>
<servlet-name>initParam</servlet-name>
<url-pattern>/InitP</url-pattern>
</servlet-mapping> -->
<!-- 하나의 프로젝트 안에 여러 서블릿파일에서 함깨 공유하면서 사용할수 있도록
context-param테그를 이용해서 파라미터 값을 설정함.
특정 서블릿 매핑하는 코드가 없는 것을 알수 있다, -->
<context-param>
<param-name>id</param-name>
<param-value>scott55</param-value>
</context-param>
<context-param>
<param-name>pw</param-name>
<param-value>tiger55</param-value>
</context-param>
<context-param>
<param-name>path</param-name>
<param-value>C:\\workspace-jsp</param-value>
</context-param>
</web-app>
this.getServletContext(). getInitParameter() 사용
package kr.gov.httpservlet3;
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;
/**
* Servlet implementation class ContextInitParam
*/
@WebServlet("/ContextIP")
public class ContextInitParam extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ContextInitParam() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() 호출");
String id = this.getServletContext().getInitParameter("id");
String pw = this.getServletContext().getInitParameter("pw");
String path = this.getServletContext().getInitParameter("path");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>");
out.println("아이디 : " +id+ "<br/>");
out.println("비밀번호 : " +pw+ "<br/>");
out.println("경로 : " +path+ "<br/>");
out.println("</body></html>");
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
같은 패키지에 공유가 되는지 확인
package kr.gov.httpservlet3;
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;
/**
* Servlet implementation class AnotherContextInitParamUse
*/
@WebServlet("/Another")
public class AnotherContextInitParamUse extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AnotherContextInitParamUse() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = this.getServletContext().getInitParameter("id");
String pw = this.getServletContext().getInitParameter("pw");
String path = this.getServletContext().getInitParameter("path");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>");
out.println("아이디 : " +id+ "<br/>");
out.println("비밀번호 : " +pw+ "<br/>");
out.println("경로 : " +path+ "<br/>");
out.println("</body></html>");
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
공유가 되는 것을 확인할 수 있다.
웹 어플리케이션 감시 ServletContextListener