HTML을 중심으로 자바와 같이 연동하여 사용하는 웹 언어이다.
HTML 코드 안에 JAVA코드를 작성할 수 있는 언어이다.
사용자의 요청에 맞는 서비스를 제공해주는 것
요청(request)
클라이언트 -------------> 서버
응답(response)
서버------------------>클라이언트
페이지 요청과 응답이 일어나는 장소
인터넷에 연결된 컴퓨터들을 통해 사람들이 정보를 공유할 수 있는 정보 공간.
사용자의 요청이 정적 데이터인지 동적 데이터인지 판단한다.
정적 데이터일 경우 이미 준비된 HTML문서를 그대로 응답해주며,
동적 데이터라면 웹 컨테이너에 요청을 보낸다.
동적 데이터일 경우 JSP, 서블릿으로 연산 및 제어, DB에 접근해서 정제된 데이터(정적 데이터)가 완성되면 이를 응답해준다.
동적 데이터를 처리할 서블릿을 메모리에 할당하며, web.xml을 참조하여 해당 서블릿에 대한 Thread를 생성한다. 서블릿 요청과 서블릿 응답 객체 생성 후 서블릿에 전달하면 연산 종료 후 메모리에서 해제시킨다.
Java 코드 안에 HTML 코드를 작성할 수 있는 Java프로그램이다.
Thread에 의해 서블릿에 있는 service() 메소드가 호출된다.
전송방식 요청에 맞게 doGet() 또는 doPost()메소드를 호출한다.
WAS는 Response 객체를 HttpResponse형태(정적 데이터)로 바꾸어서 웹 서버에 전달하고, 생성된 Thread를 종료시킨다. 그리고 HttpServletRequest와 HttpServletResponse 객체를 제거한다.
계산기 만들기 실습
1. calc.jsp , Oper.java(서블릿) , Calc.java(클래스) 생성
2. calc.jsp 에서 input태그로 수식 통째로를 입력받고 action은 Oper 서블릿으로 설정해준다.
3. Calc.java 클래스에 사칙연산 메소드를 정의하고 모두 두 정수를 전달받은 후 int로 리턴해준다.
4. 나눗셈 메소드에서는 분모가 0일 경우를 처리하지 않고 Oper.java서블릿에서 나눗셈 메소드 사용 시 예외를 처리한다.
5. Oper.java 서블릿에서 전달받은 수식을 분석한 후 사칙연산 연산자에 맞게 Calc.java의 메소드를 호출하여 결과를 응답한다.
calc.jsp 생성
<%@ 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>
<h1>JSP로 만든 페이지</h1>
<form action="Oper" method="post">
<p>수식을 입력하세요(두 정수의 사칙연산)</p>
<input type="text" name="input">
<button>확인</button>
</form>
</body>
</html>
Calc.java 클래스 생성
package com.online.servlet;
public class Calc {
int num1;
int num2;
public Calc() {;}
public Calc(int num1, int num2) {
super();
this.num1 = num1;
this.num2 = num2;
}
//덧셈
public int add() {return num1 + num2;}
//뺄셈
public int sub() {return num1 - num2;}
//곱셈
public int mul() {return num1 * num2;}
//나눗셈
public int div() {return num1 / num2;}
Oper.java 생성
package com.online.servlet;
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 Oper
*/
@WebServlet("/Oper")
public class Oper extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Oper() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
String input = request.getParameter("input");
String[] arTemp = null;
String opers = "+-*/";
Calc c = null;
int temp = 0, result = 0, count = 0;
PrintWriter out = response.getWriter();
input = input.replaceAll(" ", "");
for (int i = 0; i < opers.length(); i++) {
for (int j = 0; j < input.length(); j++) {
if(opers.charAt(i) == input.charAt(j)) {
temp = i;
count++;
}
}
}
out.print("<p>");
if(count == 1) {
//0 : 첫번째 정수
//1 : 두번째 정수
arTemp = input.split("\\" + opers.charAt(temp));
try {
c = new Calc(Integer.parseInt(arTemp[0]), Integer.parseInt(arTemp[1]));
switch(temp) {
case 0://덧셈
result = c.add();
break;
case 1://뺄셈
result = c.sub();
break;
case 2://곱셈
result = c.mul();
break;
case 3://나눗셈
result = c.div();
break;
}
out.print("결과 : " + result);
} catch (NumberFormatException e) {
out.print("정수만 입력하세요");
} catch (ArithmeticException e) {
out.print("0으로 나눌 수 없습니다");
}
}else if(count == 0) {
//연산자를 찾을 수 없습니다.
out.print("연산자를 찾을 수 없습니다.");
}else {
//두 정수의 연산만 가능합니다.
out.print("두 정수의 연산만 가능합니다.");
}
out.print("</p>");
out.print("<a href='calc'>JSP 페이지로 이동</a>");
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
web.xml 에서 calc로 이동이 가능하도록 서블릿 설정
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>day06</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>calc</servlet-name>
<jsp-file>/calc.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>calc</servlet-name>
<url-pattern>/calc</url-pattern>
</servlet-mapping>
</web-app>
<%@ page%>
현재 페이지에 대한 정보를 설정하는 태그이다.
되도록 페이지 최상단에 선언한다.
- language(java)
: 현재 JSP 페이지가 사용할 프로그래밍 언어
- contentType(text/html)
: 현재 JSP 페이지가 생성할 문서의 콘텐츠 유형
- pageEncoding(ISO-8859-1)
: 현재 JSP 페이지의 문자 인코딩 설정
- import
: 현재 JSP 페이지에서 사용할 자바 패키지 및 클래스 설정
- session(true)
: 현재 JSP 페이지에서 세션 사용 여부 설정
- info
: 현재 JSP 페이지에 대한 설명을 설정
- errorPage
: 현재 JSP 페이지에 오류가 발생했을 때 보여줄 오류 페이지 설정
- isErrorPage(false)
: 현재 JSP 페이지가 오류 페이지인지 여부 설정
HTML 코드에 자바 코드를 넣어서 프로그램이 수행하는 기능을 구현할 수 있다.
- 선언문(declaration) <%! %>
: 자바 변수나 메소드를 정의하는 데 사용
- 스크립틀릿(scriptlet) <% %>
: 자바 변수 및 자바 로직 코드를 작성하는데 사용
- 표현문(expression) <%= =%>
: 변수, 계산식, 리턴이 있는 메소드 호출 결과를 문자열 형태로 출력한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Scripting Tag2</title>
</head>
<body>
<%!
int count = 3;
String makeItBeLower(String data){
return data.toLowerCase();
}
%>
<%
for(int i=0; i<count; i++){
out.println("Java Server Pages" + (i + 1) + ".<br>");
}
%>
<%=makeItBeLower("Hello World")%>
</body>
</html>
<% include file=""%>
현재 JSP 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그이다.
보통 header와 footer는 대부분의 페이지에서 동일한 내용으로 작성되기 때문에 유지보수 및 편의를 위하여 외부 파일로 만든 후 include해서 사용한다. 이러한 것을 모듈화라고 한다. (모듈 : 부품)
서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그이다.
페이지와 페이지 사이를 제어하거나 다른 페이지의 실행 결과 내용을 현재 페이지에 포함시킬 때 사용한다. 또한 자바빈즈와 같은 다양한 기능을 제공하며, 액션 태그는 XML형식의 <jsp: />를 사용한다.
(자바빈즈 : 자바에서 개발해놓은 객체들 불러다 사용할 때 쓰는 태그)
- forward(<jsp:forward />)
: 다른 페이지로의 이동, 페이지 흐름을 제어한다.
- include(<jsp:include page=""/>)
: 외부 페이지의 내용을 포함하거나 페이지 모듈화.
- param(<jsp:param />
: 현재 페이지에서 다른 페이지에 정보를 전달한다.
아래 form 태그는 안에서 사용자가 선택 혹은 입력한 값을 해당 jsp 또는 해당 경로에 있는 파일로 전송해주는 역할을 한다.
controller.jsp 는 현재 경로
select 박스를 사용해서 site(key값)라는 파라미터의 이름으로
(name은 키값을 담는다)
네이버, 다음, 구글과 같은 값이 한 쌍으로 날아간다.
그럼 네이버, 다음, 구글이 value값이 되는 것.
이 중에 하나만 선택가능하니 site를 찾아왔을 땐 3개 중 하나의 값만 가져올 수 있겠다.
input 타입을 button이 아닌 submit을 쓰는 이유는 뭘까?
버튼은 form태그를 전송시킬 수 없다. 자바스크립트 함수 onclick을 이용해 이벤트를 발생시켜야 한다. 그래서 submit을 사용.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>액션 태그 forward 테스트</title>
</head>
<body>
<form action="controller.jsp">
보고싶은 페이지 선택 :
<select name="site">
<option value="naver">네이버</option>
<option value="daum">다음</option>
<option value="google">구글</option>
</select>
<input type="submit" value="전송">
</form>
</body>
</html>
controller.jsp로 가보자.
request라는 내장객체. 사용자가 요청한 것에 대한 정보를 받고 있는 객체.
String site = request.getParameter("site");
거기에 getParameter라는 메소드를 써서 site(키 값)를 전달하면 통째로가 바로 해당 키에 저장된 밸류 값이된다. 따라서 구글 다음 네이버 중 하나의 값이 사이트에 담길 것이고, switch문을 통해 알맞는 경로로 들어가게 한 뒤 forward로 이동을 시키게 하는 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<%
String site = request.getParameter("site");
String url = null;
switch(site){
case "naver":
url = "forward_naver.jsp";
break;
case "daum":
url = "forward_daum.jsp";
break;
case "google":
url = "forward_google.jsp";
break;
}
%>
<jsp:forward page="<%=url%>"/>
</body>
</html>
이렇게 해서 forward 테스트 완료
param은 forward 태그 안에 사용하는데, request객체에 적당한 파라미터를 담아주고 보낸다.
login.jsp 생성. id와 pw키 아래에 각각의 value값을 가지고 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<jsp:forward page="loginP.jsp">
<jsp:param value="hds1234" name="id"/>
<jsp:param value="1234" name="pw"/>
</jsp:forward>
</body>
</html>
loginP.jsp로 이동 request.getParameter를 통해 value값을 비교
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 결과</title>
</head>
<body>
<%if(request.getParameter("id").equals("hds1234")){
if(request.getParameter("pw").equals("1234")){%>
<h3>로그인 성공!</h3>
<%}else{%>
<h1>비밀번호 오류</h1>
<%}%>
<%}else{%>
<h1>잘못된 아이디</h1>
<%}%>
</body>
</html>