'프로그래밍/자바 웹 프로그래밍'에 해당되는 글 11건

기존 JSP 스크립트 언어에서 조금 더 발전하여, 표현언어라는 새로운 기능이 추가되었다.

또한, 표현언어에도 개발자가 사용하기 편한 "내장객체"가 정의되어있어서 조금 더 간편하게 데이터를 조작할 수 있다.

 

표현언어 기본 형식 : ${표현식 또는 값}

 

표현식을 이용해 파라미터 출력하기

 

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<%
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String name = request.getParameter("name");
	String email = request.getParameter("email");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>

	   <tr align="center">
	       <td><%=id%></td>
	       <td><%=pwd%></td>
	       <td><%=name%></td>
	       <td><%=email%></td>
	   </tr>
	   
	   <!--  
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${param.id}</td>
	       <td>${param.pwd}</td>
	       <td>${param.name}</td>
	       <td>${param.email}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 표현언어를 사용하기 위해서는 반드시, 페이지 디렉티브에 isELIgnored="false" 을 선언해야 한다.
  • JSP스크립트만 이용하면 웹 파라미터를 받아와서 출력해야 하지만, 표현언어를 사용하면 param객체를 통해 자동으로 바인딩 되므로, 바로 출력할 수 있다.

 

form 파라미터 전송

 

화면에서는 같은 값이 출력되지만, 실제로는 표현식이 더 간편하다.

 

 

requestScope

내장객체를 통해, 리퀘스트 영역의 데이터를 바로 접근할 수 있다.

 

memberForm.html

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>회원 가입창</title>
<body>
<form method="post"  action="forward.jsp">
<h1  style="text-align:center">회원 가입창</h1>
<table  align="center">
      <tr>
         <td width="200"><p align="right">아이디</td>
         <td width="400"><input type="text" name="id"></td>
      </tr>
      <tr>
          <td width="200"><p align="right">비밀번호</td>
          <td width="400"><input type="password"  name="pwd"></td>
      </tr>
      <tr>
          <td width="200"><p align="right">이름</td>
          <td width="400"><p><input type="text"  name="name"></td>
      </tr>
      <tr>
          <td width="200"><p align="right">이메일</td>
          <td width="400"><p><input type="text"  name="email"></td>
      </tr>
      <tr>
          <td width="200"><p>&nbsp;</p></td>
          <td width="400">
			<input type="submit" value="가입하기">
			<input type="reset" value="다시입력">
		  </td>
      </tr>
</table>
</form>
</body>
</html>
  • 파라미터들을 forward.jsp 로 전송한다.

 

forward.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	request.setCharacterEncoding("UTF-8");
	request.setAttribute("address", "서울시 강남구");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포워딩</title>
</head>
<body>
	<jsp:forward page="member2.jsp"></jsp:forward>
</body>
</html>
  • forward 에서는 request 객체의 데이터를 추가해서 다시 member2.jsp 로 포워딩한다.

 

member2.jsp

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="11%" >주소</td>
	   </tr>

		<!--
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${param.id}</td>
	       <td>${param.pwd}</td>
	       <td>${param.name}</td>
	       <td>${param.email}</td>
	       <td>${requestScope.address}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 기존파라미터는 표현식을 통해 바인딩해서 출력하였고, 주소부분은 requestScope를 통해 리퀘스트영역에 바인딩 된 addresss 객체에 접근하여 출력하였다.

 

주소부분이 추가됨.

 

 

표현언어에서 객체 접근

표현언어를 통해서도 객체(빈)에 조금 더 수월하게 접근할 수 있다.

 

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>


	   <tr align="center">
	       <td><%=m.getId()%></td>
	       <td><%=m.getPwd() %></td>
	       <td><%=m.getName() %></td>
	       <td><%=m.getEmail() %></td>
	   </tr>	   

		<!--
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${m.id}</td>
	       <td>${m.pwd}</td>
	       <td>${m.name}</td>
	       <td>${m.email}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • jsp:useBean 을 사용하여, 객체 생성 후 setProperty로 데이터를 바인딩한다.
  • JSP 스크립트에서는 객체의 getter / setter 메서드를 통해 값을 출력하지만, 표현언어를 사용하면 조금 더 간편하게 데이터를 출력할 수 있다.

 

 

컬렉션 객체 접근

동일한 방법으로 표현언어에서 컬렉션 객체에 접근 방법을 알아보자.

 

ArrayList

 

member4.jsp

<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m1" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m1" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->
<jsp:useBean id="memberList" class="java.util.ArrayList" />

<%
	MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
	memberList.add(m1);
	memberList.add(m2);
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>


	   <tr align="center">
	       <td>${memberList[0].id}</td>
	       <td>${memberList[0].pwd}</td>
	       <td>${memberList[0].name}</td>
	       <td>${memberList[0].email}</td>
	   </tr>	   

		<!--
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${memberList[1].id}</td>
	       <td>${memberList[1].pwd}</td>
	       <td>${memberList[1].name}</td>
	       <td>${memberList[1].email}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 컬렉션 프레임워크의 "ArrayList" 는 객체를 배열하는 배열이기 때문에, 인덱스로 접근한다.
  • 보통의 사용법과 다르지 않다.
  • getter 메서드를 통해 값을 출력하지 않아도 되므로, 편리하다.

 

 

HashMap

 

<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m1" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m1" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->

<jsp:useBean id="membersList" class="java.util.ArrayList" />
<jsp:useBean id="membersMap" class="java.util.HashMap" />

<%
	membersMap.put("id", "park2");
	membersMap.put("pwd", "4321");
	membersMap.put("name", "박지성");
	membersMap.put("email", "park2@test.com");


	MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
	membersList.add(m1);
	membersList.add(m2);	
	membersMap.put("membersList", membersList);
	
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>


	   <tr align="center">
	       <td>${membersMap.id}</td>
	       <td>${membersMap.pwd}</td>
	       <td>${membersMap.name}</td>
	       <td>${membersMap.email}</td>
	   </tr>	   

	   <tr align="center">
	       <td>${membersMap.membersList[0].id}</td>
	       <td>${membersMap.membersList[0].pwd}</td>
	       <td>${membersMap.membersList[0].name}</td>
	       <td>${membersMap.membersList[0].email}</td>
	   </tr>
	   
	   <tr align="center">
	       <td>${membersMap.membersList[1].id}</td>
	       <td>${membersMap.membersList[1].pwd}</td>
	       <td>${membersMap.membersList[1].name}</td>
	       <td>${membersMap.membersList[1].email}</td>
	   </tr>	   	   	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 별 다를게 없다. Map 은 key, value 이므로 key에 접근해서 값을 출력해온다.
  • key 값이 List도 되어있을 경우도 마찬가지이다.

 

has-a 관계 데이터 가져오기.

has-a 관계란 한 객체안에서 다른 객체를 참조하고 있는 경우를 뜻 한다.

 

myMemberBean

private Address addr; // 사용자 객체변수
  • 객체의 프로퍼티에 Address 객체를 가진다.

 

Address

package sec01.ex02;

public class Address {
	private String city;
	private String zipcode;
	
	public Address() {
		
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}		
}

 

member6.jsp

<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m" class="sec01.ex02.MemberBean" />
<jsp:setProperty name="m" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->

<jsp:useBean id="addr" class="sec01.ex02.Address" />
<jsp:setProperty name="addr" property="city" value="서울" /> <!--  setProperty로 파라미터들을 담아옴 -->
<jsp:setProperty name="addr" property="zipcode" value="076054" /> <!--  setProperty로 파라미터들을 담아옴 -->

<%
	m.setAddr(addr);
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="11%" >도시</td>
	      <td width="11%" >우편번호</td>
	   </tr>

	   <tr align="center">
	       <td>${m.id}</td>
	       <td>${m.pwd}</td>
	       <td>${m.name}</td>
	       <td>${m.email}</td>
	       <td><%=m.getAddr().getCity()%></td>
	       <td><%=m.getAddr().getZipcode()%></td>
	       
	   </tr>	   

	   <tr align="center">
	       <td>${m.id}</td>
	       <td>${m.pwd}</td>
	       <td>${m.name}</td>
	       <td>${m.email}</td>
	       <td>${m.addr.city}</td>
	       <td>${m.addr.zipcode}</td>
	   </tr>
	   
	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • has-a 객체에 접근

 

 

 

스코프 우선순위

내장객체의 변수값이 모두 같은 이름일 때, 데이터 접근에 대한 우선순위를 가진다.

이럴경우 가장 가까운 영역의 데이터를 가져온다.

 

forward.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false" %>
    
<%
	request.setCharacterEncoding("UTF-8");
	request.setAttribute("address", "서울시 강남구");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포워딩</title>
</head>
<body>
	<jsp:forward page="member4.jsp"></jsp:forward>
</body>
</html>
  • 리퀘스트 객체의 address 데이터 세팅.

 

member4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
	session.setAttribute("address", "서울시 동작구");
%>   


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >주소</td>
	   </tr>


	   <tr align="center">
	       <td>${address}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 세션객체의 데이터 address 세팅

 

같은 이름으로 바인딩 되었지만 request 영역이 가장 가깝기에 "강남구" 가 출력된다.

 

내장객체 접근 우선순위는 page request → session → applicationContext 순이다.

 

출처: 자바 웹을 다루는 기술

 

 

블로그 이미지

파니동

,

인클루드 액션태그

페이지 안에서 다른 JSP파일을 포함할 수 있다.

 

 

duke_image.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	request.setCharacterEncoding("utf-8");
	response.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String imgName = request.getParameter("imgName");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> 듀크이미지 </title>
</head>
<body>
	<br><br>
	<h1>이름은 <%=name %> 입니다.</h1> <br><br>
	<img src="./image/<%=imgName %>" />
</body>
</html>

 

 

include1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.getParameter("utf-8");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	안녕하세요. 쇼핑몰 중심 JSP 시작입니다!!!
	<br>
	<jsp:include page="duke_image.jsp" flush="true">
		<jsp:param name="name" value="듀크" />
		<jsp:param name="imgName" value="duke.png" />
	</jsp:include>
	<br>
	안녕하세요. 쇼핑몰 중심 JSP 끝입니다!!
</body>
</html>
  • 하위 jsp에 파라미터와 값을 넘길 수 있다.

 

include1.jsp 호출

 

 

자바 빈

자바 빈은 객체를 의미한다. 보통 데이터베이스의 정보를 조회하거나 데이터를 전달할 때 bean객체에 담아서 전달하게 된다. 전통코드인 자바를 사용할 수 있지만, 자바코드를 사용하지 않고, jsp의 useBean 태그를 이용할 수 도 있다.

 

자바 빈을 이용한 데이터 송/수신

 

 

MemberBean

package sec01.ex01;

import java.util.Date;

public class MemberBean {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;
	
	public MemberBean() {
		
	}
	
	public MemberBean(String id, String pwd, String name, String email) {
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getJoinDate() {
		return joinDate;
	}

	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
		
}
  • 데이터를 송/수신할 객체, (DTO 또는 VO)

 

MemberDAO

package sec01.ex01;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemberDAO {
	private Connection con;
	private PreparedStatement pstmt;
	private DataSource dataFactory;

	public MemberDAO() {
		try {
			Context ctx = new InitialContext();
			Context envContext = (Context) ctx.lookup("java:/comp/env");
			dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public List listMembers() {
		List list = new ArrayList();
		try {
			con = dataFactory.getConnection();
			String query = "select * from t_member order by joinDate desc ";
			System.out.println("prepareStatememt: " + query);
			pstmt = con.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joinDate");
				MemberBean vo = new MemberBean();
				vo.setId(id);
				vo.setPwd(pwd);
				vo.setName(name);
				vo.setEmail(email);
				vo.setJoinDate(joinDate);
				list.add(vo);
			}
			rs.close();
			pstmt.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	public void addMember(MemberBean memberBean) {
		try {
			Connection con = dataFactory.getConnection();
			String id = memberBean.getId();
			String pwd = memberBean.getPwd();
			String name = memberBean.getName();
			String email = memberBean.getEmail();
			String query = "insert into t_member";
			query += " (id,pwd,name,email)";
			query += " values(?,?,?,?)";
			System.out.println("prepareStatememt: " + query);
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, id);
			pstmt.setString(2, pwd);
			pstmt.setString(3, name);
			pstmt.setString(4, email);
			pstmt.executeUpdate();
			pstmt.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • 리스트, 회원추가 메서드가 있다.

 

member.jsp

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<%
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String name = request.getParameter("name");
	String email = request.getParameter("email");
	
	MemberBean m = new MemberBean(id, pwd, name, email);
	MemberDAO memberDAO = new MemberDAO();
	memberDAO.addMember(m);
	
	List<MemberBean> membersList = memberDAO.listMembers();
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="5%" >가입일</td>
	   </tr>
	<%
		if(membersList.size() == 0) {		
	%>
	  <tr>
	      <td colspan="5">
	        <p align="center"><b><span style="font-size:9pt;">
	                      등록된 회원이  없습니다.</span></b></p>
	      </td>
	  </tr>
	<%
		} else {
		
			//for(int i=0; i < membersList.size(); i++) {
			  for(MemberBean bean : membersList) {
			//MemberBean bean = membersList.get(i);
	%>
	   <tr align="center">
	       <td><%=bean.getId() %></td>
	       <td><%=bean.getPwd() %></td>
	       <td><%=bean.getName() %></td>
	       <td><%=bean.getEmail() %></td>
	       <td><%=bean.getJoinDate() %></td>
	   </tr>
	<%
	      } // end for
	
	   } // end if
	%>
	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 자바 빈을 이용하여, 브라우저에서 넘어온 회원정보를 세팅하고, DB에 전달한다. 

 

회원가입

 

회원가입 후 입력된 회원목록을 가져온다.

 

 

useBean 사용하기.

 

member2.jsp

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m" class="sec01.ex01.MemberBean" scope="page" />

<%
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String name = request.getParameter("name");
	String email = request.getParameter("email");
	
	// MemberBean m = new MemberBean(id, pwd, name, email);
	m.setId(id);
	m.setPwd(pwd);
	m.setName(name);
	m.setEmail(email);
	
	MemberDAO memberDAO = new MemberDAO();
	memberDAO.addMember(m);
	
	List<MemberBean> membersList = memberDAO.listMembers();
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="5%" >가입일</td>
	   </tr>
	<%
		if(membersList.size() == 0) {		
	%>
	  <tr>
	      <td colspan="5">
	        <p align="center"><b><span style="font-size:9pt;">
	                      등록된 회원이  없습니다.</span></b></p>
	      </td>
	  </tr>
	<%
		} else {
		
			//for(int i=0; i < membersList.size(); i++) {
			  for(MemberBean bean : membersList) {
			//MemberBean bean = membersList.get(i);
	%>
	   <tr align="center">
	       <td><%=bean.getId() %></td>
	       <td><%=bean.getPwd() %></td>
	       <td><%=bean.getName() %></td>
	       <td><%=bean.getEmail() %></td>
	       <td><%=bean.getJoinDate() %></td>
	   </tr>
	<%
	      } // end for
	
	   } // end if
	%>
	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 자바 빈 생성자로 값을 셋팅하지 않고, useBean태그로 객체를 생성해 값을 설정하였다.
  • 자바코드를 사용하지 않고, 객체를 조작할 수 있는 방법에는 setProperty 와 getProperty 도 있다.

 

출처: 자바 웹을 다루는 기술

블로그 이미지

파니동

,

(서블릿 객체의) 스코프

앞서 서블릿 API의 setAttribute 와 getAttribute를 통해 데이터를 바인딩할 수 있었다. 이러한 서블릿 API들은 데이터를 바인딩할 수 있는 영역이 존재한다.

 

ServletContext: 어플리케이션 전체에서 접근 가능

HttpSession: 같은 브라우저 내에서만 접근가능

HttpServletRequest: 해당 메서드에서만 접근 가능

 

 

SetAttribute

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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("/set")
public class SetAttribute extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String ctxMesg = "context에 바인딩됩니다.";
		String sesMesg = "session에 바인딩됩니다.";
		String reqMesg = "request에 바인딩됩니다.";
		
		ServletContext ctx = getServletContext(); // 전역 스코프
		HttpSession session = request.getSession(); // 브라우저 스코프
		ctx.setAttribute("context", ctxMesg);
		session.setAttribute("session", sesMesg);
		request.setAttribute("request", reqMesg);
		out.print("바인딩을 수행합니다.  <br>" );		
	}
}
  • 각 서블릿 객체의 문자열을 바인딩한다.

 

GetAttribute

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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("/get")
public class GetAttribute extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		ServletContext ctx = getServletContext(); // 전역 스코프
		HttpSession sess = request.getSession(); // 브라우저 스코프

		String ctxMesg = (String)ctx.getAttribute("context");
		String sesMesg = (String)sess.getAttribute("session");
		String reqMesg = (String)request.getAttribute("request");
		
		out.println("context값: " + ctxMesg + "<br>");
		out.println("session값: " + sesMesg + "<br>");
		out.println("request값: " + reqMesg + "<br>");
		
		
	}
}
  • 각 객체에 바인딩된 속성들을 가져와서 출력한다.

 

데이터 바인딩

 

데이터 출력

 

다른브라우저에서 실행하면 request 객체에 바인딩된 데이터는 가져오지 못함.

 

 

 

서블릿 URL 패턴

살제로 브라우저 주소창에 의해 요청되는 URL 규칙을 의미한다.

(예제 생략)

 

 

필터

필터란 브라우저에서 서버로 요청할 때 전처리 작업 또는 서버에서 브라우저로 응답결과가 전달 되기 전의 처리되야 하는 작업들을 미리 구현할 수 있다.

 

한글인코딩 필터 적용하기

 

LoginTest 클래스

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
//		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
		out.println("아이디: " + user_id + "<br>");
		out.println("패스워드: " + user_pw + "<br>");
        
	}
  • 기존 로그인 테스트 예제해서 한글 인코딩 부분을 주석처리

 

아이디에 한글을 넣음

 

한글이 깨짐

 

 

필터구현

 

New - Filter

 

 

URL 패턴

 

서블릿 필터

package sec03.ex01;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

@WebFilter("/*")
public class EncoderFilter implements Filter {
	
	ServletContext context;

	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("utf-8 인코딩");
		context = fConfig.getServletContext();
	}

	// 실제 필터의 기능을 구현함.
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter 호출");
		request.setCharacterEncoding("utf-8");
		String context = ((HttpServletRequest)request).getContextPath();
		String pathInfo = ((HttpServletRequest)request).getRequestURI();
		String realPath = request.getRealPath(pathInfo);
		
		String mesg = " Context 정보: " + context + "\n URI 정보 : " + pathInfo + "\n 물리적 경로: " + realPath;
		System.out.println(mesg);
		chain.doFilter(request, response); // 다음필터로 넘김
	}

	public void destroy() {
		System.out.println("destory 호출");
	}
}
  • 모든 URL 패턴에 적용됨.
  • doFilter 메서드에서 실제 기능을 처리함.
  • chain.doFilter 메서드 기준으로 위쪽이 요청, 아래쪽이 응답 필터 기능을 처리한다.

 

정상적으로 한글 출력

 

 

출처: 자바 웹을 다루는 기술

블로그 이미지

파니동

,

브라우저는 http 프로토콜 통신규약으로 서버와 통신하게 되는데, 이때 페이지를 이동할 때마다 stateless 상태이다.

즉, 연결을 유지하는 것이 아니라, 클라이언트와 서버가 보내고 받고를 반복하는 것이라고 할 수있다.

먼저, 브라우저에서 서버로 정보를 보내는 방법을 알아보자.

 

- login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
  <form name="frmLogin" method="post" action="login" encType="UTF-8">
       아이디  :<input type="text" name="user_id"><br>
       비밀번호:<input type="password" name="user_pw"><br>
       <input type="submit" value="로그인">
       <input type="reset" value="다시입력">
       <input type="hidden" name="user_address" value="서울시 동작구" />
       <input type="hidden" name="user_email" value="dongpani@gmail.com" />
       <input type="hidden" name="user_hp" value="010-1234-1212" />
  </form>
</body>
</html>
  • input 태그의 hidden 속성을 사용하여 값을 서블릿에 전송한다.

 

- LoginServlet.java

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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("/login")
public class LoginServlet extends HttpServlet {

    public void init(ServletConfig config)  {
        System.out.println("init 메서드 호출");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        String user_address = request.getParameter("user_address");
        String user_email = request.getParameter("user_email");
        String user_hp = request.getParameter("user_hp");

        String data = "안녕하세요!<br> 로그인하셨습니다.<br><br>";
        data += "<html><body>";
        data += "아이디 : " + user_id;
        data += "<br>";
        data += "비밀번호 : " + user_pw;
        data += "<br>";
        data += "주소 : " + user_address;
        data += "<br>";
        data += "email : " + user_email;
        data += "<br>";
        data += "휴대 전화 : " + user_hp;
        data += "</html></body>";
        out.print(data);
    }

    @Override
    public void destroy() { // 객체가 소멸될 때 호출
        System.out.println("destroy 메서드 호출");
    }
}
  • 전송받은 파라미터를 출력한다.

 

브라우저의 값을 서블릿에 보냄.
브라우저에서 받은 정보를 출력



쿠키

쿠키란 사용자 정보를 클라이언트PC 에 저장하는 것을 의미하며, 이는 사용자가 쿠키정보를 허용할지 선택할 수 있다.
외부에 노출되는 값이므로 보안에 취약하다는 단점이 있다.

 

사용자 PC에 저장된 쿠키 확인하기 (크롬)

C:\Users\power\AppData\Local\Google\Chrome\User Data\Default\Cache

 

쿠키 API

- 서버에서 쿠키 생성하기.

package sec02.ex01;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/set")
public class SetCookieValue 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();
		Date d = new Date();
		Cookie c = new Cookie("cookieTest", URLEncoder.encode("JSP프로그래밍입니다.", "utf-8"));
		
		c.setMaxAge(24 * 60 * 60);
        // c.setMaxAge(-1); // 세션 쿠키 (브라우저(
		response.addCookie(c);
		out.println("현재시간:" + d);
		out.println("<br> 문자열을 Cookie에 저장합니다." );	
		
	}
}

 

 

- 쿠키 출력하기

package sec02.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/get")
public class GetCookieValue  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();

		Cookie[] allValues = request.getCookies();
		
		for(int i=0; i < allValues.length; i++) {
			if(allValues[i].getName().equals("cookieTest")) {
				out.println("<h2> Cookie 값 가져오기 : "+  URLDecoder.decode(allValues[i].getValue(), "utf-8") + " </h2>");
			}
		}		
	}
}

 

쿠기 생성

 

쿠키 출력

 

크롬 브라우저에서 쿠키정보 확인

 

 

하루동안 팝업창 보지 않기

 

- popupTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>자바스크립트에서 쿠키 사용</title>

<script>

	window.onload = pageLoad;
	
	function pageLoad() {
		noShowPop = getCookieValue();
		
		console.log('noShowPop: ', noShowPop);
		
		if(noShowPop != 'true') {
			window.open("popUp.html","pop","width=400,height=500,history=no,resizable=no,status=no,scrollbars=yes,menubar=no");
		}
	}
	
	// 쿠키 읽어오는 함수
	function getCookieValue() {
		var result = 'false';
		
		// 쿠키 여부 확인
		if(document.cookie != '') {
			cookie = document.cookie.split(';');
			for(var i=0; i < cookie.length; i++) {
				element = cookie[i].split('=');
				value = element[0];
				value=value.replace(/^\s*/,''); 
				if(value == 'noShowPop') {
					result = element[1];
				}
			}
		}
		return result;
	}
	
	function deleteCookie() {
		document.cookie = 'noShowPop=' + 'false' + ';path=/; expires=-1';
	}
	
</script>

</head>
<body>
	<form>
		<input type="button" value="쿠키삭제" onClick="deleteCookie()" /> 
	</form>	
</body>
</html>
  • 브라우저가 로드되자마자 쿠키를 읽어옴.
  • 쿠키 값에 따라 팝업 노출/미노출

 

- popUp.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<script>
function setPopUpStart(obj){
		
    if(obj.checked == true){
     var expireDate = new Date();
	 expireDate.setMonth(expireDate.getMonth() + 1);
	 document.cookie ="noShowPop=" +"true" + ";path=/; expires=" + expireDate.toGMTString();
     window.close();
    }
}
</script>

<title>Insert title here</title>
</head>
<body>
	알림 팝업창입니다.
	<br><br><br><br><br><br><br>
   <form>
    	<input type=checkbox  onClick="setPopUpStart(this)" >오늘 더 이상 팝업창 띄우지 않기   
   </form>	
</body>
</html>
  • "오늘 더 이상 팝업창 띄우지 않기" 탭을 누르면 쿠키 생성

 

체크박스를 클릭하면 쿠키에 저장됨.

 

 

 

세션

SESSION 은 쿠키와는 다르게 클라이언트정보가 사용자PC가 아닌, 서버에 저장된다. 그렇기에 쿠키보다는 보안성이 조금 더 높다는 장점이 있다.

 

세션생성과정

  1. (최초접속)브라우저가 서버에 들어왔다고 신호를 보낸다.
  2. 서버에서는 브라우저에게 세션키를 보내준다.
  3. 브라우저는 서버에게 받은 세션키를 자기자신의 "메모리"에 저장해둔다.
  4. 브라우저당 하나의 세션ID를 생성한다.

 

 

세션아이디로 로그인 바인딩

 

- login2.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
  <form name="frmLogin" method="post" action="login" encType="UTF-8">
      아이디  :<input type="text" name="user_id"><br>
      비밀번호:<input type="password" name="user_pw"><br>
      <input type="submit" value="로그인">
      <input type="reset" value="다시입력">
  </form>
</body>
</html>

 

- SessionTest4.java

package sec03.ex04;

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("/login")
public class SessionTest4 extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}	

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
		if(session.isNew()) { // 최초접속 시
			if(user_id != null) {
				session.setAttribute("user_id", user_id);
				out.println("<a href='login'>로그인 상태 확인</a>");
			}else {
				out.println("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}else {
			user_id = (String) session.getAttribute("user_id");
			if(user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!!!");
			} else {
				out.print("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}
		
	}
}

 

 

 

 

 

쿠키가 차단 되었을 때

 

브라우저에서 쿠키가 차단되었다면, 쿠키와 세션모두 사용할 수 없다. 그럴 때는 브라우저에서 세션ID를 받는 것이 아닌,반대로 서버에서 브라우저로 세션ID를 부여해야한다.

 

크롬브라우저에서 쿠키차단

 

 

- SessionTest

package sec04.ex01;

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("/login")
public class SessionTest5 extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}	

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
		if(session.isNew()) { // 최초접속 시
			if(user_id != null) {
				session.setAttribute("user_id", user_id);
				String url = response.encodeURL("login");
				out.println("<a href=" + url + ">로그인 상태 확인</a>");
			}else {
				out.println("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}else {
			user_id = (String) session.getAttribute("user_id");
			if(user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!!!");
			} else {
				out.print("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}		
	}
}
  • response 객체의 encodeURL 메서드로 브라우저로 jsessesionid을 보낸다.

 

 

 

세션을 이용한 로그인 (데이터베이스 연동)

 

데이터베이스에 저장된 회원정보를 조회에 로그인하는 기능을 만들어보자.

 

login3.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
  <form name="frmLogin" method="post" action="login" encType="UTF-8">
      아이디  :<input type="text" name="user_id"><br>
      비밀번호:<input type="password" name="user_pwd"><br>
      <input type="submit" value="로그인">
      <input type="reset" value="다시입력">
  </form>
</body>
</html>

 

LoginServlet

package sec05.ex01;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String user_id = request.getParameter("user_id");
		String user_pwd = request.getParameter("user_pwd");
		
		MemberVO memberVO = new MemberVO();
		memberVO.setId(user_id);
		memberVO.setPwd(user_pwd);
		MemberDAO dao = new MemberDAO();
		
		boolean result = dao.isExisted(memberVO);
		
		if(result) {
			HttpSession session = request.getSession();
			session.setAttribute("isLogon", true);
			session.setAttribute("login.id", user_id);
			session.setAttribute("login.pwd", user_pwd);

			out.print("<html><body>");
			out.print("안녕하세요 " + user_id + "님!!!<br>");
			out.print("<a href='show'>회원정보보기</a>");
			out.print("</body></html>");			
			
		}else {
			out.print("<html><body>회원 아이디가 틀립니다.");
			out.print("<a href='login3.html'> 다시 로그인하기</a>");
			out.print("</body></html>");			
		}
	}
}
  • 아이디와 패스워드를 입력하면 데이터베이스에서 회원정보를 조회해온다.
  • 회원정보가 있다면 세션을 저장한다.

 

ShowMember

package sec05.ex01;

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("/show")
public class ShowMember extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String id = "", pwd="";
		Boolean isLogon = false;
		
		HttpSession session = request.getSession(false);
		
		// 세션 체크
		if(session != null) {
			isLogon = (Boolean)session.getAttribute("isLogon");
			if(isLogon == true) {
				id = (String)session.getAttribute("login.id");
				pwd = (String)session.getAttribute("login.pwd");
	   	        out.print("<html><body>");
		        out.print("아이디: " + id+"<br>");
		        out.print("비밀번호: " + pwd+"<br>");
		        out.print("</body></html>");
			}else {
				response.sendRedirect("login3.html");
			}
		}else {
			response.sendRedirect("login3.html");
		}		
	}
}
  • 브라우저에 저장된 세션이 있다면 사용자 아이디와 패스워드를 출력하고 없다면 다시 로그인페이지로 이동시킨다.

 

 

출처: 자바 웹을 다루는 기술

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

JSP 액션태그와 Bean  (0) 2020.02.07
서블릿 스코프, URL패턴, 필터  (0) 2020.01.30
서블릿 리다이렉트 와 바인딩  (0) 2019.12.26
서블릿과 DB 연동  (2) 2019.12.19
서블릿 Response객체  (0) 2019.12.15
블로그 이미지

파니동

,

포워딩

포워딩이란 원래 요청이 들어온 URI에서 다른 곳으로 이동시켜주는 것을 말한다.
서블릿에서 포워딩 방법은 크게 4가지가 있다.

  1. response객체의 sendRedirect
  2. response객체의 addHeader
  3. 브라우저 자바스크립트 기능을 이용한 location
  4. 서버에서 바로 이동시키는 dispatch

위에 1~3번 까지는 모두 최초요청 시 브라우저로 다시 돌아와서 재요청을 하는 것이다.
그렇기에 URL 정보가 바뀌게 된다.

하지만 4번의 경우에는 서버에서 바로 이동하기 때문에 브라우저에서 URL이 바뀌지 않는다.

FirstServlet - location

package sec01.ex03;

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;

/**
 * 자바스크립트 location 리다이렉트
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<script>");
        out.println("location.href='second'");
        out.println("</script>");
    }

}
  • first라는 URI요청을 받아 다시 second 서블릿으로 재요청한다.

SecondServlet

package sec01.ex03;

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 FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("location을 이용한 redirect 실습입니다.");
        out.println("</body></html>");
    }

}

요청 결과

  • 브라우저에서 재요청한 것이기에 브라우저 주소가 바뀌는 것을 알 수 있다.

FirstServlet - dispatch

package sec03.ex01;

import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        RequestDispatcher dispatch = request.getRequestDispatcher("second?name=lee");
        dispatch.forward(request, response);

    }

}

SecondServlet

package sec03.ex01;

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;

/**
 * disaptch 리다이렉트
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");

        out.println("<html><body>");
        out.println("이름: " + name + "<br>");
        out.println("dispatch 을 이용한 redirect 실습입니다.");        
        out.println("</body></html>");
    }

}

  • 서버에서 브라우저로 오지 않고 바로 실행 되었기에 URL주소가 바뀌지 않았다.

바인딩

바인딩이란 데이터의 묶음을 의미한다. 하나 이상의 데이터들을 전달할 때 하나로 묶어서 전달하는 기법을 말한다.

바인딩 기법 - 브라우저

package sec04.ex01;

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 FirstServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        request.setAttribute("adress", "서울시 동작구");
        response.sendRedirect("second");
    }

}
  • 브라우저에 의한 서블릿 재요청
package sec04.ex01;

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 FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        String adress = (String)request.getAttribute("adress");
        System.out.println("adress=" + adress);

        out.println("<html><body>");
        out.println("주소:" + adress + "<br>");
        out.println("</body></html>");
    }

}

  • 데이터가 없다고 나옴.

바인딩 기법 - 서버

package sec04.ex02;

import java.io.IOException;
import java.io.PrintWriter;

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("/first")
public class FirstServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        request.setAttribute("adress", "서울시 동작구");        
        RequestDispatcher dispatch = request.getRequestDispatcher("second");
        dispatch.forward(request, response);


    }

}
  • dispatch로 서버에서 바로 전달.
package sec04.ex02;

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 FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        String adress = (String)request.getAttribute("adress");
        System.out.println("adress=" + adress);

        out.println("<html><body>");
        out.println("주소:" + adress + "<br>");
        out.println("</body></html>");
    }

}

  • 정상적으로 출력.
  • 서버에서만 데이터 바인딩이 가능하다.
  • 단순한 요청은 브라우저를 통해서 가능하지만, DB 정보를 조회하거나 보안에 관련된 사항들은 dispatch를 이용하는 것이 바람직하다.

회원정보 바인딩하기

앞서 서버에서 바로 데이터를 넘겨줄 때는 dispatch를 이용한다고 하였다. DB에 있는 정보를 조회해 화면으로 데이터를 바인딩 시켜보자.

MemberSerlvet

package sec04.ex03;

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

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("/member")
public class MemberServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request, response);
    }

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

    private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        MemberDAO dao = new MemberDAO();        
        List memberList = dao.listMembers();

        request.setAttribute("membersList", memberList);
        RequestDispatcher dispatch = request.getRequestDispatcher("viewMembers");
        dispatch.forward(request, response);

    }

}
  • 서블릿 요청이 들어오면 DAO 객체를 생성해 회원정보를 조회해 setAttribute 의 "membersList" 객체에 담아 dispatch를 활용해 viewMembers로 서블릿을 요청한다.

ViewServlet

package sec04.ex03;

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

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("/viewMembers")
public class ViewServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          request.setCharacterEncoding("utf-8");        
          response.setContentType("text/html;charset=utf-8");
          PrintWriter out = response.getWriter();    

          List membersList = (List) request.getAttribute("membersList");

          out.print("<html><body>");
          out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
          out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td >삭제</td></tr>");

          for(int i=0; i < membersList.size(); i++) {
              MemberVO memberVO = (MemberVO) membersList.get(i);
              String id = memberVO.getId();
              String pwd = memberVO.getPwd();
              String name = memberVO.getName();
              String email = memberVO.getEmail();
              Date joinDate = memberVO.getJoinDate();
              out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>"
                    + joinDate + "</td><td>" + "<a href='/pro07/member3?command=delMember&id=" + id
                    + "'>삭제 </a></td></tr>");              
          }

          out.print("</table></body></html>");
          out.print("<a href='/pro07/memberForm.html'>새 회원 등록하기</a");        
    }

}
  • MemberServlet에서 넘어온 리스트를 받아서 회원정보를 출력해준다.

ServletContext 와 ServeletConfig

ServletContext

  • 전역 객체
  • 톰캣 컨테이너 실행 시 하나의 컨텍스트가 생성되고 컨테이너 종료시 소멸.
  • 어플리케이션 전체 공동 자원

ServletContext 객체 사용하기

package sec05.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
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("/cset")
public class SetServletContext extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();        
        ServletContext context = getServletContext(); // 서블릿 컨테이너 생성.

        List member = new ArrayList();
        member.add("이순신");
        member.add(30);
        context.setAttribute("member", member);
        out.print("<html><body>");
        out.print("이순신과 30 설정");
        out.print("</body></html>");

    }
}
  • 컨텍스트 객체에 List 셋팅.

 

package sec05.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
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("/cget")
public class GetServletContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();        
        ServletContext context = getServletContext(); // 서블릿 컨테이너 생성.

        List member = (List) context.getAttribute("member");
        String name = (String)member.get(0); // 이순신
        int age = (Integer)member.get(1); // 30

        out.print("<html><body>");
        out.print(name + "<br>");
        out.print(age + "<br>");
        out.print("</body></html>");

    }
}
  • 컨텍스트에 저장된 데이터 불러오기.

 

테스트

web.xml 에서 파라미터 설정

<?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">

  <context-param>
      <param-name>menu_member</param-name>
      <param-value>회원등록 회원조회 회원수정</param-value>
  </context-param>

  <context-param>
      <param-name>menu_order</param-name>
      <param-value>주문조회 주문등록 주문수정 주문취소</param-value>
  </context-param>

  <context-param>
      <param-name>menu_goods</param-name>
      <param-value>상품조회 상품등록 상품수정 상품삭제</param-value>
  </context-param>    

  <display-name>pro08</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>
</web-app>
  • context-param 테그안에 컨텍스트 생성 시 초기화할 파라미터를 설정한다.

 

ContextParamServlet

package sec05.ex02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
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("/initMenu")
public class ContextParamServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        ServletContext context = getServletContext(); // web.xml 에 <context-param> 에 있는 변수를 가져옴.

        String menu_member = context.getInitParameter("menu_member");
        String menu_order = context.getInitParameter("menu_order");
        String menu_goods = context.getInitParameter("menu_goods");

        out.print("<html><body>");
        out.print("<table border=1 cellspacing=0><tr>메뉴 이름</tr>");
        out.print("<tr><td>" + menu_member + "</td></tr>");
        out.print("<tr><td>" + menu_order + "</td></tr>");
        out.print("<tr><td>" + menu_goods + "</td></tr>");
        out.print("</tr></table></body></html>");            

    }
}
  • web.xml 에서 서블릿 컨텍스트의 초기 파라미터를 설정하였으므로, 바로 컨텍스트에 접근하여 값을 가져올 수 있다.

외부파일을 파라미터로 사용하기

외부텍스트 파일에서 값을 읽어와 출력하기.

WEB-INF/bin/init.txt 추가

package sec05.ex03;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

import javax.servlet.ServletContext;
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("/cfile")
public class ContextFileServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=euc-kr");
		PrintWriter out = response.getWriter();
		
		ServletContext context = getServletContext();
		InputStream is = context.getResourceAsStream("/WEB-INF/bin/init.txt");
		BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
		
		String menu = null;
		String menu_member = null;
		String menu_order = null;
		String menu_goods = null;
		
		while((menu=buffer.readLine()) != null) {
			StringTokenizer tokens = new StringTokenizer(menu, ",");
			menu_member = tokens.nextToken();
			menu_order = tokens.nextToken();
			menu_goods = tokens.nextToken();			
		}
		
		out.print("<html><body>");
		out.print(menu_member + "<br>");
		out.print(menu_order + "<br>");
		out.print(menu_goods + "<br>");
		out.print("</body></html>");
		out.close();
		
		
	}
}

- 외부파일을 스트림으로 읽어와 html 로 출력하였음.

출력결과

 

출처: 자바 웹을 다루는 기술

블로그 이미지

파니동

,

회원정보 테이블 만들기.


회원테이블 스크립트

CREATE TABLE t_member (
    id varchar2(10) PRIMARY KEY,
    pwd varchar2(10),
    name varchar2(50),
    email varchar2(50),
    joinDate DATE DEFAULT sysdate
);

SELECT*
FROM t_member
;

INSERT INTO t_member values('hong', '1212', '홍길동', 'hong@gmail.com', sysdate);
INSERT INTO t_member values('lee', '1212', '이순신', 'lee@test.com', sysdate);
INSERT INTO t_member values('kim', '1212', '김유신', 'kim@jweb.com', sysdate);

COMMIT; -- 커밋을 해야함.

SELECT* FROM t_member;

ojdbc8라이브러리 추가


MemberVO

package sec01.ex01;

import java.sql.Date;

public class MemberVO {
    private String id;
    private String pwd;
    private String name;
    private String email;
    private Date joinDate;


    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public void setJoinDate(Date joinDate) {
        this.joinDate = joinDate;
    }
    public Date getJoinDate() {
        return joinDate;
    }        
}

MemberDAO

package sec01.ex01;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class MemberDAO {

    private static final String driver = "oracle.jdbc.driver.OracleDriver";
    private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
    private static final String user = "scott";
    private static final String pwd = "tiger";
    private Connection con;
    private Statement stmt;


    public List<MemberVO> listMembers() {
        List<MemberVO> list = new ArrayList<MemberVO>();

        try {
            connDB();
            String query = "select* from t_member";
            System.out.println(query);
            ResultSet rs = stmt.executeQuery(query);
            while(rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date joinDate = rs.getDate("joinDate");
                MemberVO  vo = new MemberVO();
                vo.setId(id);
                vo.setPwd(pwd);
                vo.setName(name);
                vo.setEmail(email);
                vo.setJoinDate(joinDate);
                list.add(vo);
            }
            rs.close();
            stmt.close();
            con.close();            
        }catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    private void connDB() {
        try {
            Class.forName(driver);
            System.out.println("Oracle 드라이버 로딩 성공");
            con = DriverManager.getConnection(url, user, pwd);
            System.out.println("Connection 생성 성공");
            stmt = con.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

MemberServlet

package sec01.ex01;

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

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("/member")
public class MemberServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        MemberDAO dao = new MemberDAO();
        List<MemberVO> list = dao.listMembers();

        out.print("<html><body>");
        out.print("<table  border=1><tr align='center' bgcolor='lightgreen'>");
        out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td></tr>");

        for (int i=0; i<list.size(); i++) {
            MemberVO memberVO = (MemberVO)list.get(i);
            String id = memberVO.getId();
            String name = memberVO.getName();
            String pwd = memberVO.getPwd();
            String email = memberVO.getEmail();
            Date joinDate = memberVO.getJoinDate();

            out.print("<tr><td>"+id+"</td><td>"+
                    pwd+"</td><td>"+
                    name+"</td><td>"+
                    email+"</td><td>"+
                    joinDate+"</td></tr>");                    
        }
        out.print("</table></body></html>");

    }

}

  • 데이터베이스에 연결하여 t_member 테이블의 데이터를 조회하였다.
  • 이렇게하면 회원을 조회할때마다 계속 새로운 객체를 생성하게 된다.

PrepareStatement

일반 Statement보다 sql 구문을 미리 컴파일해서 실행하므로, 속도가 조금더 빠르다.


MemberDAO

package sec01.ex02;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class MemberDAO {

    private static final String driver = "oracle.jdbc.driver.OracleDriver";
    private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
    private static final String user = "scott";
    private static final String pwd = "tiger";
    private Connection con;
    private PreparedStatement pstmt;


    public List<MemberVO> listMembers() {
        List<MemberVO> list = new ArrayList<MemberVO>();

        try {
            connDB();
            String query = "select* from t_member";
            System.out.println(query);
            pstmt = con.prepareStatement(query);
            ResultSet rs = pstmt.executeQuery(query);

            while(rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date joinDate = rs.getDate("joinDate");
                MemberVO  vo = new MemberVO();
                vo.setId(id);
                vo.setPwd(pwd);
                vo.setName(name);
                vo.setEmail(email);
                vo.setJoinDate(joinDate);
                list.add(vo);
            }
            rs.close();
            pstmt.close();
            con.close();            
        }catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    private void connDB() {
        try {
            Class.forName(driver);
            System.out.println("Oracle 드라이버 로딩 성공");
            con = DriverManager.getConnection(url, user, pwd);
            System.out.println("Connection 생성 성공");
            pstmt = (PreparedStatement) con.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }        
}

커넥션풀

클라이언트에서 요청이 들어올 때마다 새롭게 커넥션을 생성해서 정보를 조회해오는 방식은 바람직하지 않다. 그 이유는 요청이 올때마다 계속해서 커넥션 객체를 생성하게 되, 자원적인 낭비가 심하기 때문이다.

그렇기 때문에 어플리케이션이 실행 될 때 미리 DB연결을 해놓고, 요청이 올 때마다 해당 객체에 접근해서 정보를 조회하는 것이 바람직하다.

커넥션풀 기능은 톰켓컨테이너에서 지원한다.


톰켓컨테이너 - 커넥션풀 사용하기.


context.xml 파일 수정


MemberDAO 수정

package sec02.ex01;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;


public class MemberDAO {

//    private static final String driver = "oracle.jdbc.driver.OracleDriver";
//    private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
//    private static final String user = "scott";
//    private static final String pwd = "tiger";

    private Connection con;
    private PreparedStatement pstmt;
    private DataSource dataFactory;

    public MemberDAO() {
        try {
            Context ctx = new InitialContext();
            Context envContext = (Context) ctx.lookup("java:/comp/env");
            dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public List<MemberVO> listMembers() {
        List<MemberVO> list = new ArrayList<MemberVO>();

        try {
//            connDB();
            con = dataFactory.getConnection(); // 커넥션 풀
            String query = "select* from t_member";
            System.out.println(query);
            pstmt = con.prepareStatement(query);
            ResultSet rs = pstmt.executeQuery(query);

            while(rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date joinDate = rs.getDate("joinDate");
                MemberVO  vo = new MemberVO();
                vo.setId(id);
                vo.setPwd(pwd);
                vo.setName(name);
                vo.setEmail(email);
                vo.setJoinDate(joinDate);
                list.add(vo);
            }
            rs.close();
            pstmt.close();
            con.close();            
        }catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /*
    private void connDB() {
        try {
            Class.forName(driver);
            System.out.println("Oracle 드라이버 로딩 성공");
            con = DriverManager.getConnection(url, user, pwd);
            System.out.println("Connection 생성 성공");
            pstmt = (PreparedStatement) con.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    */


}
  • 톰켓 컨테이너에서 지정한 커넥션 리소스를 가지고 DAO 객체 생성 시 연결정보를 가져온다.

회원 가입하기


회원가입 폼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입창</title>
<script type="text/javascript">
    function fn_sendMember() {
        var frmMember = document.frmMember;
        var id = frmMember.id.value;
        var pwd = frmMember.pwd.value;
        var name = frmMember.name.value;
        var email = frmMember.email.value;

        if (id.length == 0 || id == "") {
            alert("아이디는 필수입니다.");
        } else if (pwd.length == 0 || pwd == "") {
            alert("비밀번호는 필수입니다.");
        } else if (name.length == 0 || name == "") {
            alert("이름은 필수입니다.");
        } else if (email.length == 0 || email == "") {
            alert("이메일은 필수입니다.");
        } else {
            frmMember.method = "post";
            frmMember.action = "member3";
            frmMember.submit();
        }
    }
</script>
</head>
<body>
    <form name="frmMember">
        <table>
            <th>회원 가입창</th>
            <tr>
                <td>아이디</td>
                <td><input type="text" name="id"></td>
            </tr>
            <tr>
                <td>비밀번호</td>
                <td><input type="password" name="pwd"></td>
            </tr>
            <tr>
                <td>이름</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr>
                <td>이메일</td>
                <td><input type="text" name="email"></td>
            </tr>
        </table>
        <input type="button" value="가입하기" onclick="fn_sendMember()"> <input
            type="reset" value="다시입력"> <input type="hidden"
            name="command" value="addMember" />
    </form>
</body>
</html>


가입 요청 처리 (Servlet)

package sec02.ex02;

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

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("/member3")
public class MemberServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request, response);
    }

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

    private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        MemberDAO dao = new MemberDAO();
        PrintWriter out = response.getWriter();
        String command = request.getParameter("command");


        if(command != null && command.equals("addMember")) { // 회원 입력
            String _id = request.getParameter("id");
            String _pwd = request.getParameter("pwd");
            String _name = request.getParameter("name");
            String _email = request.getParameter("email");

            MemberVO vo = new MemberVO();
            vo.setId(_id);
            vo.setPwd(_pwd);
            vo.setName(_name);
            vo.setEmail(_email);

            dao.addMember(vo);            
        }

       List list = dao.listMembers();

       out.print("<html><body>");
       out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
       out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td >삭제</td></tr>");

        for (int i=0; i<list.size(); i++) {
            MemberVO memberVO = (MemberVO)list.get(i);
            String id = memberVO.getId();
            String name = memberVO.getName();
            String pwd = memberVO.getPwd();
            String email = memberVO.getEmail();
            Date joinDate = memberVO.getJoinDate();

             out.print("<tr><td>"+id+"</td><td>"
                        +pwd+"</td><td>"
                        +name+"</td><td>"
                        +email+"</td><td>"
                        +joinDate+"</td><td>"
                        +"<a href='/member3?command=delMember&id="+id+"'>삭제 </a></td></tr>");            
        }        
         out.print("</table></body></html>");
        out.print("<a href='/memberForm.html'>새 회원 등록하기</a");

    }

}

MemberDAO

package sec02.ex02;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;


public class MemberDAO {

//    private static final String driver = "oracle.jdbc.driver.OracleDriver";
//    private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
//    private static final String user = "scott";
//    private static final String pwd = "tiger";

    private Connection con;
    private PreparedStatement pstmt;
    private DataSource dataFactory;

    public MemberDAO() {
        try {
            Context ctx = new InitialContext();
            Context envContext = (Context) ctx.lookup("java:/comp/env");
            dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public List<MemberVO> listMembers() {
        List<MemberVO> list = new ArrayList<MemberVO>();

        try {
//            connDB();
            con = dataFactory.getConnection(); // 커넥션 풀
            String query = "select* from t_member";
            System.out.println(query);
            pstmt = con.prepareStatement(query);
            ResultSet rs = pstmt.executeQuery(query);

            while(rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date joinDate = rs.getDate("joinDate");
                MemberVO  vo = new MemberVO();
                vo.setId(id);
                vo.setPwd(pwd);
                vo.setName(name);
                vo.setEmail(email);
                vo.setJoinDate(joinDate);
                list.add(vo);
            }
            rs.close();
            pstmt.close();
            con.close();            
        }catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }


    public void addMember(MemberVO memberVO) {
        try {
            Connection con = dataFactory.getConnection();
            String id = memberVO.getId();
            String pwd = memberVO.getPwd();
            String name = memberVO.getName();
            String email = memberVO.getEmail();
            String query = "insert into t_member";

            query += "(id, pwd, name, email)";
            query += " values(?, ?, ?, ?)";
            System.out.println("query=" + query);

            pstmt = con.prepareStatement(query);
            pstmt.setString(1, id);
            pstmt.setString(2, pwd);
            pstmt.setString(3, name);
            pstmt.setString(4, email);
            pstmt.executeUpdate();
            pstmt.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /*
    private void connDB() {
        try {
            Class.forName(driver);
            System.out.println("Oracle 드라이버 로딩 성공");
            con = DriverManager.getConnection(url, user, pwd);
            System.out.println("Connection 생성 성공");
            pstmt = (PreparedStatement) con.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    */        
}
  • addMember 메서드 추가.


회원정보 삭제


브라우저 삭제처리 요청.


MemberServlet

        if(command != null && command.equals("addMember")) { // 회원 입력
            String _id = request.getParameter("id");
            String _pwd = request.getParameter("pwd");
            String _name = request.getParameter("name");
            String _email = request.getParameter("email");

            MemberVO vo = new MemberVO();
            vo.setId(_id);
            vo.setPwd(_pwd);
            vo.setName(_name);
            vo.setEmail(_email);

            dao.addMember(vo);            
        }else if(command != null && command.equals("delMember")) {
            String id = request.getParameter("id");
            dao.delMember(id);
        }
  • 넘어온 파라미터요청에 따라 db에서 삭제처리를 수정한다.

MemberDAO

    public void delMember(String id) {
        try {
            con = dataFactory.getConnection();            
            String query = "delete from t_member" + " where id=?"; // 이렇게 나누는 이유는 ?
            System.out.println("prepareStatement=" + query);
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, id);
            pstmt.executeUpdate();
            pstmt.close();

        } catch (Exception e) {
            e.printStackTrace();
        }        
    }


이클립스 디버깅

이클립스 디버깅 기능을 활용하여, 소스 디버깅하기.


소스 중단점 찍기


디버그모드로 서버실행


새로운 회원 등록


perspective 전환


이클립스 메뉴에서 디버깅모드 전환

출처: 자바 웹을 다루는 기술

블로그 이미지

파니동

,

브라우저에서 요청에 대해 서블릿에서 로직 처리 후 다시 브라우저로 되돌리는 과정을 서블릿 response 객체에서 담당한다.

이때, 브라우저에 어떤 타입으로 리턴할 것인가를 지정하는데 이것을 MIME-TYPE 이라고 한다.

바로 전 예제와 같이 아이디와 패스워드를 받아 사용자가 입력한 정보를 출력해주는 서블릿을 작성해보자.


LoginServlet2

package sec02.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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 LoginServlet2
 */
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init 메서드 호출");
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        System.out.println("distory 메서드 호출");
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("요청 성공.");

        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 data = "<html>";
        data += "<body>";
        data += "아이디 : " + id;
        data += "<br>";
        data += "패스워드:" + pw;
        data += "</body>";
        data += "</html>";

        out.print(data);

    }

}

  • Response객체의 getWriter 메서드를 사용해 브라우저에 결과 값을 돌려준다.
  • 직접 html 코딩을 해서 굉장히 불편해보인다.

login2.html - 자바스크립트로 서블릿 요청

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>

<script>
    function fn_vaildate() {
        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 = 'login5';
            frmLogin.submit();
        }
    }

</script>

</head>
<body>
  <form name="frmLogin" method="get" action="login"  encType="UTF-8">
       아이디  :<input type="text" name="user_id"><br>
       비밀번호:<input type="password" name="user_pw" ><br>
       <input type="button" value="로그인" onClick="fn_vaildate()" />  
       <input type="reset" value="다시입력" />
       <input type="hidden" name="user_address" value="서울시 성북구" /> 
  </form>
</body>
</html>
  • html 태그의 form Submit이 아닌 자바스크립트로 유효성 체크 후 서버로 전송.

LoginServlet5

package sec03.ex03;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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 LoginServlet5
 */
@WebServlet("/login5")
public class LoginServlet5 extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        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 adress = request.getParameter("user_address");

        System.out.println("아이디:" + id);
        System.out.println("비밀번호:" + pw);

        String data = new String("");
        data += "<html>";
        data += "<body>";
        data += "아이디:" + id + "<br>";
        data += "패스워드:" + pw + "<br>";
        data += "주소:" + adress;
        data += "</body>";
        data += "</html>";

        out.print(data);

    }

}
  • html 태그 노가다

출처: 자바 웹을 다루는 기술

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

서블릿 리다이렉트 와 바인딩  (0) 2019.12.26
서블릿과 DB 연동  (2) 2019.12.19
서블릿 기초 실습  (0) 2019.12.14
서블릿  (0) 2019.12.14
웹 애플리케이션 구동하기  (0) 2019.12.11
블로그 이미지

파니동

,

LoginServlet 클래스

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
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 {

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init 메서드 호출");
    }    


    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("아이디:" + user_id);
        System.out.println("비밀번호:" + user_pw);
    }    


    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        System.out.println("destory 메서드 호출.");
    }

}
  • 웹 브라우저 요청을 doGet 메서드에서 파리미터를 받아 처리한다.

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
  <form name="frmLogin" method="get" action="login"  encType="UTF-8">
       아이디  :<input type="text" name="user_id"><br>
       비밀번호:<input type="password" name="user_pw" ><br>
    <input type="submit" value="로그인">  <input type="reset" value="다시입력">
  </form>
</body>
</html>
  • form태그의 action 속성의 값이 서블릿 맵핑 URI 이다.

서블릿에서 다중 파라미터 값 처리하기.

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
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 InputServlet
 */
@WebServlet("/input")
public class InputServlet extends HttpServlet {

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("아이디:" + user_id);
        System.out.println("비밀번호:" + user_pw);

        String[] subject = request.getParameterValues("subject");

        for(String sbj : subject) {
            System.out.println(sbj);
        }

    }

}

input.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>여러 가지 input 타입 표시창</title>
</head>
<body>
<form name="frmInput" method="get" action="input">
   아이디  :<input type="text" name="user_id"><br>
   비밀번호:<input type="password" name="user_pw"><br>
   <input type="checkbox" name="subject" value="java" checked >자바
   <input type="checkbox" name="subject" value="C언어">C언어
   <input type="checkbox" name="subject" value="JSP">JSP
   <input type="checkbox" name="subject" value="안드로이드">안드로이드 
   <br><br>
   <input type="submit" value="전송">   
   <input type="reset" value="초기화">
  </form>
</body>
</html>
  • 셀렉트박스의 파라미터는 하나의 name 에 여러개의 갑이 들어가므로, getParameterValues 메서드로 처리.

여러개의 파라미터 처리하기.

package sec01.ex01;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
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 InputServlet2
 */
@WebServlet("/input2")
public class InputServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        Enumeration enu = request.getParameterNames();

        while(enu.hasMoreElements()) {
            String name = (String) enu.nextElement();
            String[] values = request.getParameterValues(name);
            for(String value : values) {
                System.out.println("name=" + name + ", value=" + value);
            }
        }
    }

}
  • getParameter() 메서드로 input-name 값을 하나하나 처리하기 번거로우므로, getParameterNames메서드로 넘어온 파라미터들을 한꺼번에 처리한다.

출처: 자바 웹을 다루는 기술.

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

서블릿과 DB 연동  (2) 2019.12.19
서블릿 Response객체  (0) 2019.12.15
서블릿  (0) 2019.12.14
웹 애플리케이션 구동하기  (0) 2019.12.11
프로그래밍의 발전과정  (0) 2019.12.10
블로그 이미지

파니동

,

서블릿은 웹 브라우저의 요청을 처리하기 위한 java로 구현한 API 이다.

서블릿의 생명주기.

서블릿 클래스가 생성될 때 재정의한 메서드들의 생명주기.

init(): 해당클래스가 생성 될 때 최초 한번 실행 된다.

doGet(), doPost(): 웹 브라우저 요청시 수시로 실행된다.

destory(): 객체가 소멸될 때 실행된다.

Servlet 구현.

1. Servlet-api 설정하기.


2. Servlet API 구현.

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("init 메서드 호출");
    }        

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 메서드 호출");
    }

    @Override
    public void destroy() {
        System.out.println("destory 메서드 호출");
    }
}

3. 웹 브라우저 요청 시 서블릿 맵핑하기 - web.xml

<?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">
    <servlet>
        <servlet-name>aaa</servlet-name>
        <servlet-class>sec01.ex01.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>aaa</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
</web-app>
  • 브라우저에서 요청이 오면 해당 클래스로 맵핑.


4. 서블릿 추가하기.

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SecondServlet extends HttpServlet{

    @Override
    public void init() throws ServletException {
        System.out.println("init 메서드 호출");
    }        

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 메서드 호출");
    }

    @Override
    public void destroy() {
        System.out.println("destory 메서드 호출");
    }


}
  • 같은 기능의 두번 째 서블릿 클래스를 추가하였다.
<?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">
    <servlet>
        <servlet-name>aaa</servlet-name>
        <servlet-class>sec01.ex01.FirstServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>bbb</servlet-name>
        <servlet-class>sec01.ex01.SecondServlet</servlet-class>
    </servlet>    
    <servlet-mapping>
        <servlet-name>aaa</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>aaa</servlet-name>
        <url-pattern>/Second</url-pattern>
    </servlet-mapping>    
</web-app>
  • 새로운 클래스로 서블릿 맵핑 추가.


@어노테이션으로 서블릿 맵핑하기.

web.xml 에 서블릿을 맵핑하는 것은 가독성도 안좋고 불편하다.
톰캣 7이상부터는 어노테이션을 이용한 서블릿 맵핑을 지원한다. 거의 대부분 이렇게 사용한다.


새로운 서블릿 클래스 추가.


어노테이션이 적용된 서블릿 클래스가 생성됨.

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletConfig;
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 ThirdServlet
 */
@WebServlet("/Third")
public class ThirdServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ThirdServlet init 호출");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("ThirdServlet doGet");
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        System.out.println("ThirdServlet destory 호출");
    }

}

출처: 자바 웹을 다루는 기술.

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

서블릿과 DB 연동  (2) 2019.12.19
서블릿 Response객체  (0) 2019.12.15
서블릿 기초 실습  (0) 2019.12.14
웹 애플리케이션 구동하기  (0) 2019.12.11
프로그래밍의 발전과정  (0) 2019.12.10
블로그 이미지

파니동

,

웹 어플리케이션은 응용프로그램과는 다르게 반드시 웹 컨테이너를 거쳐야한다.
가장 많이 사용하는 웹 컨테이너 중에 하나인 톰캣으로 간단한 웹 애플리케이션을 구동해보자.

톰캣의 기본 구조.

톰캣 컨테이너가 정상적으로 구동되기 위해서는 아래와 같이 정해진 규칙에 의거한 폴더트리가 존재해야 한다.

webShop 폴더

  • WEB-INF 폴더는 외부에서 접근할 수 없는 폴더이다.
  • classes 에는 컴파일 된 class 파일들이 저장된다.
  • lib에는 어플리케이션에 사용되는 라이브러리 (.jar) 가 들어갈 수 있다.
  • web.xml 은 웹에 대한 설정에 대한 정보가 들어간다.

실행파일로 구동하기.

  • 톰캣이 설치된 디렉터리에 해당 파일을 이동

  • 브라우저에서 경로 호출.

컨텍스트에 등록하여 구동하기.

  • server.xml에 어플리케이션 컨텍스트 추가.

  • 브라우저에서 경로 호출.

이클립스로 톰캣 구동하기.

1. 새프로젝트 생성

2. html 파일 만들기

3. 톰캣 서버 등록하기.

  • 등록하고나면 톰캣 관련 파일들이 복사된다.

4. 컨텍스트 등록하기.

  • server.xml 을 보면 컨텍스트가 자동으로 추가 되었다.

  • 저장후 구동시 에러

5. 톰캣 구동에러

내 PC에 설치된 JDK는 8이고 톰캣은 9버전을 설치했다. 그래서 구동시에 계속 에러가 났었던 것. 결국엔 톰캣 7버전 zip 파일로 다운받아 실행시키니 정상구동 됐다.



프로젝트 war로 배포하기.

실제 실무환경에서는 유닉스나 리눅스 운영체제에 위에 톰캣 컨테이너에서 웹 어플리케이션이 구동된다. 그러므로 보통 윈도우 운영체제에 이클립스같은 통합 IDE에서 개발완료 후 war파일로 배포하게 된다.

  • 프로젝트 우클릭 -> Export -> War

  • 톰캣 설치경로 webapps 하위에 저장.

  • 서버 실행

  • 실행 후 압축이 풀린 것을 확인할 수 있다.

  • 정상적으로 웹 어플리케이션이 구동 됨.

출처: 자바 웹을 다루는 기술

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

서블릿과 DB 연동  (2) 2019.12.19
서블릿 Response객체  (0) 2019.12.15
서블릿 기초 실습  (0) 2019.12.14
서블릿  (0) 2019.12.14
프로그래밍의 발전과정  (0) 2019.12.10
블로그 이미지

파니동

,