Full-Stack 개발자가 되려는 작은 개발자의 블로그
JSP 기초 실습1 본문
Servlet
- 자바를 기반으로하는 웹 애플리케애션 프로그래밍 기술
- 자바 클래스형태로 웹 애플리케이션 작성 > Servlet Class
[ 작성 규칙 ]
javax.servlet 패키지의 Servlet 인터페이스를 구현 |
doGet/doPost 메소드를 작성하여 웹페이지에서의 요청을 처리 |
HTML문서에서 전송된 내용은 doGet/doPost 메소드의 첫번째 파라미터로 들어오고, HTML 문서로의 전송은 두번째 파라키터를 이용 |
[ 웹 애플리케이션 ]
- Front-end로부터 사용자의 요청(request)를 받아서 Back-end에서 처리하여 Front-end로 응답(response)하는 프로그램
[ 한글처리 ]
입력값(request) 문자셋 지정 | request.setCharacterEncoding("utf-8") |
출력값(response) 문자셋 지정 | respoonse.setCharacterEncoding("utf-8") |
response.setContentType("text/html; charset=utf-8;"); | |
문자셋의 지정은 메소드(doGet/doHost) 맨 처음에 수행 이 후 값을 꺼내오거나 출력하도록 수행 |
- 인터넷을 통해서 다른 컴퓨터에 접속하려면 주소를 사용하여 접속
- IP 주소(IPv4) : 192.168.0.XXX
- IP 주소로 기억하기 어려워 Domain을 사용 : naver.com, duam.net...
[ 1. web.xml 파일에 서블릿을 등록하여 연결 ]
[ 2. @WebServlet 애노테이션을 사용한 연결 ]
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>개인 정보 입력</title>
<style>
span{
display: inline-block;
width: 150px;
}
</style>
</head>
<body>
<h2>개인 정보 입력</h2>
<form action="./input" method="post">
<fieldset>
<span>이름</span><input type="text" name="pName" id=""><br>
<span>아이디</span><input type="text" name="pId" id=""><br>
<span>비밀번호 </span><input type="password" name="pPass" id=""><br>
<span>성별 </span> 남<input type="radio" name="gender" id="" value="male"> 여<input type="radio" name="gender" id="" value="female"><br>
<span>메일 수신 여부</span>
공지메일<input type="checkbox" name="inot" id="">
광고메일<input type="checkbox" name="cnot" id="">
배송확인메일<input type="checkbox" name="dnot" id=""><br>
<span>직업</span>
<select name="job" id="">
<option value="회사원">회사원</option>
<option value="학생">학생</option>
<option value="기타">기타</option>
</select><br>
<input type="submit" value="전송" name="" id="">
<input type="reset" value="취소" name="" id="">
</fieldset>
</form>
</body>
</html>
package com;
import java.io.IOException;
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("/input")
public class InputServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//한글깨짐 방지용
req.setCharacterEncoding("utf-8");
String pName=req.getParameter("pName");
String pId=req.getParameter("pId");
String pPass=req.getParameter("pPass");
String gender=req.getParameter("gender");
if(gender.equals("male")) {
gender="남";
}else {
gender="여";
}
String inot=req.getParameter("inot");
String cnot=req.getParameter("cnot");
String dnot=req.getParameter("dnot");
String job=req.getParameter("job");
System.out.println("name : "+pName);
System.out.println("id : "+pId);
System.out.println("password : "+pPass);
System.out.println("성별 : "+gender);
System.out.println("직업 : "+job);
System.out.println("공지메일동의 : "+notice(inot));
System.out.println("광고메일동의 : "+notice(cnot));
System.out.println("배송확인메일동의 : "+notice(dnot));
}
private String notice(String not) {
if(not==null) {
return "받지 않음";
}else {
return "받음";
}
}
}
- Java Server Page의 약자
- HTML 문서 사이에 java코드가 삽입되는 형태.
[ 문자셋 지정 위치 ]
contentType 내부 charset | contentType은 서버에서 페이지를 처리할 때 지정하는 내용 |
pageEncoding | 자바 컴파일러에게 알려주는 문자셋(자바 코드의 문자셋) |
meta 태그의 charset | HTML 코드의 문자셋. 브라우저에서 처리될 때 활용 |
[ JSP 문법 ]
1. '<%' 로 시작하여 '%>' 로 끝나는 형태
2. '${' 로 시작하여 '}' 로 끝나는 형태의 표현 언어(Expression Language,EL)
3. '<jsp:forward>'나 '<c:if>'와 같은 XML 태그 형태(태그 라이브러리,JSP Tag Library,JSTL)
[ JSP 페이지 구성요소 ]
1. 지시자(DIrective, 디렉티브)
2. 스크립트 - 스크립트릿(Scriptlet), 표현식(Expression), 선언부(Declaration)
3. 기본 객체(Implicit Object)
4. 표준 액션 태그(Action Tag)
<%-- jsp용 주석 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--
선언부(Declaration) 영역
'<%!로 시작항여 %>'로 끝나는 영역.
자바 메소드 작성 영역
--%>
<%!
public int add(int a,int b){
return a+b;
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
/*
여기는 자바 언어의 영역 스크리트릿(Scriptlet)
자바 코드를 프로그래밍하는 영역
*/
int sum=add(1,8);
%>
<!-- 표현식(Expression) -->
sum = <%=sum %>
</body>
</html>
[ JSP 지시자 ]
- '<%' 로 시작하여 '%>' 로 끝나는 영역.
- 웹 서버가 JSP 페이지를 서블릿 클래스로 변환할 때 필요한 정보(또는 지시사항)을 기술하는 영역.
지시자의 종류
1. page 지시자
2. include 지시자
3. taglib 지시자
[ page 지시자자의 주요 속성 ]
contentType* | jsp가 생성할 문서의 MIME 타입과 문자인코딩 방식을 지정 |
import* | 자바 라이브러리(또는 사용자 작성 클래스)를 포함시키는 지시자. |
buffer | 출력 버퍼의 크기 지정. |
autoFlush | 출력 버퍼가 모두 찼을 때의 동작 지정 |
isThreadSafe | JSP 페이지가 싱글-스레드 모드로 작동하도록 지정. |
session* | JSP 페이지의 세션 참여 여부 지정. |
errorPage* | 에러 처리 JSP 페이지의 URL 지정. |
isErrorPage* | 현재 페이지가 에러 처리용 페이지임을 지정. |
※ MIME(Multipurpose Internet Mail Extension)
- 클라이언트(사용자의 컴퓨터 프로그램)에 전송된 문서의 다양성을 알려주기위한 메커니즘
- 브라우저에서 처리할 기본 동작을 지정.
종류
▶ text : 인간이 읽을 수 있어야한다.
▶ image : 이미지를 나타낸다.
▶ autio : 음악, 음성
▶ video - 동영상
▶ Application - 모든 종류의 2진 데이터.
[ include 지시자 ]
- 다른 jsp/html 페이지를 불러와서 현재의 페이지에 포함시키는 지시자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>1~100까지의 합</title>
</head>
<body>
<%
int total=0;
for(int cnt=1;cnt<=100;cnt++){
total+=cnt;
}
%>
1~100까지의 합계 : <%=total %><br>
<table border="1">
<%
for(int i=0;i<10;i++){
%>
<tr>
<td><%=i %>열 1칸</td>
<td>${ i }열 2칸</td>
</tr>
<%
}
%>
</table>
</body>
</html>
기본 객체(Implicit Object, Implicit Variable 내장 변수)
- JSP 페이지 안에서 선언(인스턴스 생성)하지 않아도 사용 가능한 객체/변수
[ 주요 객체 ]
request | 요청 관련 처리를 위한 내장 객체 servlet의 doGet/doHost의 첫번째 파라미터와 동일 |
response | 응답 관련 처리를 위한 내장 객체 servlet의 doGet/doHost의 두번재 파라미터와 동일 |
out | PrintWriter 내장 객체 |
Application | JSP 페이지가 속한 프로젝트(웹 프로그램)관련 처리를 위한 내장 객체 |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.GregorianCalendar" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>현재 날짜와 시간</title>
</head>
<body>
<%
GregorianCalendar now=new GregorianCalendar();
System.out.println(now);//브라우저에 출력 안됨.
String date=String.format("%TF",now);
String time=String.format("%TT",now);
%>
오늘의 날짜 : <%=date %><br>
현재 시간 : <%=time %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>오늘의 메뉴</h3>
- 돈까스<br>
- 육개장<br>
- 만두전골<br>
- 샐러드<br>
- 차돌된장찌개<br>
<p>
<%@ include file="DateTime.jsp" %>
</body>
</html>
[ request 객체 ]
- 웹 브라우저를통한 요청 관련 객체
주요 기능
▶ 클라이언트와 서버 관련 처리
▶ 클라이언트가 전송한 요청 파라미터(form태그로 전송) 처리
▶ 클라이언트가 전송한 요청 헤더 처리
▶ 클라이언트가 전송한 쿠키 처리
▶ 속성(Attribute) 처리(태그나 CSS의 속성과는 다름)
[ response 객체 ]
- 응답 처리와 관련된 기능을 제공하는 객체
주요 기능
▶ 다른 페이지로 이동(sendRedirect)
[ application 객체 ]
- 컨텍스트 경로, 실제 파일 경로등의 정보를 처리할 때 활용하는 객체
- 컨텍스트 경로 = 프로젝트 이름
▶ '컨텍스트 경로' + '식별자'로 해당 사이트의 모든 자원에 접근 가능
- 개발 컴퓨터와 실제 사이트가 실행되는 서버의 물리적인 경로가 다르기때문에 파일 업로드/다운로드시 실제 경로( 절대경로)를 사용해야함
※ 참고사항
- UR(Uniform Resource)이란 동일한 자원을 나타내는 말로, 자원이란 웹 페이지의 문자, 이미지, 음향, 동영상등을 모 두 자원(Resource)라고 함
- URL(Uniform Resource Locator)
▶ 자원의 위치를 나타내는 용어.
- URI(Uniform Resource Identifier)
▶ 자원을 식별하기 위한 값을 나타내는 용어
▶ 대체로 파일명을 나타내거나 서블릿의 @sebServlet에 등록하는 키워드를 나타냄.
예) http://localhost/First_JSP/inputResult.jsp
- URL : http://localhost/First_JSP/inputResult.jsp
- URI : First_JSP/inputResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>application 객체</title>
</head>
<body>
<%
String appPath=application.getContextPath();
String filePath=application.getRealPath("index.jsp");
%>
URL 경로명 : <%=appPath %><br>
index.jsp 파일의 위치 : <%=filePath%>
</body>
</html>
※ 참고 사항
- 파일을 저장하거나 DB에 입력하는 처리를 할 경우 결과 페이지가 새로고침될 경우 똑같은 내용이 중복으로 처리될 수 있기때문에 처리페이지와 결과페이지를 분리하여 작성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
span {
display: inline-block;
width: 150px;
}
input {
ㅍ
}
</style>
</head>
<body>
<h2>개인 정보 입력</h2>
<form action="inputResult.jsp" method="post">
<fieldset>
<span>이름</span><input type="text" name="pName" id=""><br>
<span>아이디</span><input type="text" name="pId" id=""><br>
<span>비밀번호 </span><input type="password" name="pPass" id=""><br>
<span>성별 </span> 남<input type="radio" name="gender" id=""
value="male"> 여<input type="radio" name="gender" id=""
value="female"><br> <span>메일 수신 여부</span> 공지메일<input
type="checkbox" name="inot" id=""> 광고메일<input
type="checkbox" name="cnot" id=""> 배송확인메일<input
type="checkbox" name="dnot" id=""><br> <span>직업</span>
<select name="job" id="">
<option value="회사원">회사원</option>
<option value="학생">학생</option>
<option value="기타">기타</option>
</select><br> <input type="submit" value="전송" name="" id=""> <input
type="reset" value="취소" name="" id="">
</fieldset>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>입력 결과</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
안녕하세요, <%=request.getParameter("pName") %>님<br>
아이디 : <%=request.getParameter("pId") %><br>
비밀번호 : <%=request.getParameter("pPass") %><br>
직업 : <%=request.getParameter("job") %><br></p>
클라이언트 IP : <%=request.getRemoteAddr() %><br>
요청정보 길이 : <%=request.getContentLength()%><br>
요청정보 인코딩 : <%=request.getCharacterEncoding() %><br>
요청정보 컨텐츠타입 : <%=request.getContentType() %><br>
요청정보 프로토콜 : <%=request.getProtocol() %><br>
요청정보 전송방식 : <%=request.getMethod() %><br>
요청 URL : <%=request.getRequestURL() %><br>
컨텍스트 정보 : <%=request.getContextPath() %><br>
서버 이름 : <%=request.getServerName() %><br>
서버 포트 : <%=request.getServerPort()%><br>
</body>
</html>