본문 바로가기

JSP

jsp day10 (MVC1 전체적인 컴포넌트 설계를 이용한 홈페이지 작업(로그인부터), 연결 풀,EL(Expression Language))

728x90

로그인페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp"%>
<section>
<div align="center">
<h3>MVC1 로그인연습</h3>
<form action="login_ok.jsp" method="post">
<input type="text" name="id" placeholder="아이디" required><br>
<input type="password" name="pw" placeholder="비밀번호" required><br>

<input type="submit" value="로그인" class="btn btn-default">
<input type="button" value="취소" class="btn btn-danger" onclick="location.href='join.jsp'">
</form>
</div>
</section>
<%@include file="../include/footer.jsp"%>

=============

로그인 처리페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
/*
1. 로그인 페이지에서 넘어오는 id, pw를 받습니다.
2. 반환유형UserVO login메서드에 (id, pw)를 매개변수로 넘깁니다.
   id, pw기반으로 로그인검증 해서 결과가 있다면, UserVO에 select결과를 저장합니다.
   없다면 null을 반환합니다.
3. login_ok에서는 UserVO가 null이 아니면(로그인 성공) UserVO를 세션에 저장후에
   mypage.jsp로 리다이렉트
4. null이라면 실패를 의미하므로, script로 "아이디 비밀번호를 확인하세요"를 출력한 후에
   다시 로그인 페이지로 이동
*/

request.setCharacterEncoding("utf-8");

String id  = request.getParameter("id");
String pw  = request.getParameter("pw");

UsersDAO dao = UsersDAO.getInstance();
UsersVO vo = dao.login(id, pw);

if(vo == null) { //성공
%>
<script>
alert("아이디 비밀번호를 확인하세요");
history.go(-1);//뒤로가기
</script>
<%
}else {
session.setAttribute("userVO", vo); //세선에 저장
response.sendRedirect("mypage.jsp");
}
%>

===============

로그아웃페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
//세션삭제
session.invalidate();
response.sendRedirect(request.getContextPath() + "/index.jsp"); //절대경로
%>

===================

내정보페이지

<%@page import="com.myweb.user.model.UsersVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ include file="../include/header.jsp"%>
 <%
  //세션이 없는경우
  if(session.getAttribute("userVO") == null) {
  response.sendRedirect("login.jsp");
  }
 
  UsersVO vo = (UsersVO)session.getAttribute("userVO");
 
 %>
 
 <section>
  <div align="center">
  <h3><%=vo.getId() %>(<%=vo.getName() %>)님의 정보관리</h3>
 
  <a href="update.jsp">[정보수정]</a>
  <a href="delete.jsp">[회원탈퇴]</a>
  </div>
  </section>
 
 <%@ include file="../include/footer.jsp"%>

=========================

정보수정페이지

<%@ include file="../include/header.jsp"%>
<%
//회원정보는 세션에 있습니다
//이 페이지에 진입했을때, 비밀번호를 제외한 회원정보를 input태그에 미리 보이도록 처리
UsersVO vo = (UsersVO)session.getAttribute("userVO");
%>
<section>
<div align="center">
<h3>MVC1 정보수정</h3>
<hr>

<form action="update_ok.jsp" method="post">
<table border="1">
<tr>
<td>아이디</td>   
<td><input type="text" name="id" value="<%=vo.getId() %>" placeholder="4글자이상"  readonly></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="pw"  placeholder="4글자이상" required pattern="\\w{4, }"></td>
</tr>
<tr>
<td>이름</td>
<td><input type="text" name="name" value="<%=vo.getName() %>" placeholder="이름은 필수입니다" required></td>
</tr>
<tr>
<td>이메일</td>
<td><input type="email" name="email" value="<%=vo.getEmail() %>"></td>
</tr>
<tr>
<td>주소</td>
<td><input type="text" name="address" value="<%=vo.getAddress() %>"></td>
</tr>

</table>

<input type="submit" value="정보수정" class="btn btn-default">
<input type="button" value="마이페이지" class="btn btn-primary" onclick="location.href='mypage.jsp'">

</div>
</section>


 <%@ include file="../include/footer.jsp"%>

===================

정보수정 처리페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
//1.
request.setCharacterEncoding("utf-8");

String id = request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
String email = request.getParameter("email");
String address = request.getParameter("address");

//2.DAO에 update()메서드를 생성하고, 업데이트 구문을 수행합니다
//성공실패 여부를 1 or 0으로 리턴

//3.수정성공시 script태그 이용해서 "회원정보가 수정되었습니다" 출력후에 마이페이지로 이동
//수정실패시에는 "회원정보 수정에 실패했습니다" 출력후에 마이페이지로 이동

UsersDAO dao = UsersDAO.getInstance();
UsersVO vo = new UsersVO(id, pw, name, email, address, null);
int result = dao.update(vo);

if(result == 1){ 
session.setAttribute("userVO", vo);//성공시 세션정보수정

%>
<script>
alert("회원정보가 수정되었습니다");
location.href = "mypage.jsp";
</script>
<%
}else{
%>
<script>
alert("회원정보 수정에 실패했습니다");
location.href = "mypage.jsp";
</script>
<%
}
%>

==========================

회원탈퇴 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp"%>

<section>
<div align="center">
<h3>기본 비밀번호를 입력하세요</h3>
<form action="delete_ok.jsp" method="post">
<input type="password" name="pw" required><br>
<input type="submit" value="탈퇴하기" >
</form>
</div>
</section>

<%@include file="../include/footer.jsp"%>

==========================

회원탈퇴 처리페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
//앞에서 비밀번호를 받았기 때문에, 비밀번호 검증후 삭제를 진행합니다.
/*
   1. 사용자가 입력한 pw값과 id를 기반으로 login() 메서드를 실행시켜서
      비밀번호가 맞는지 검증합니다.
      
   2. login() 가 null을 반환하면 "현재 비밀번호를 확인하세요" 출력 뒤로가기
      login() 가 값을 가진다면 delete()메서드를 호출해서 삭제를 진행하면 됩니다.   
   
   3. 삭제 성공시에는 세션을 전부 지우고 index페이지로 리다이렉트
      삭제 실패시에는 마이페이지로 리다이렉트
   */
   
   request.setCharacterEncoding("utf-8");
   
UsersVO vo = (UsersVO)session.getAttribute("userVO");
String id = vo.getId();
String pw = request.getParameter("pw");

//id,pw값 확인
UsersDAO dao = UsersDAO.getInstance();
UsersVO result = dao.login(id, pw); //id,pw가 일치하면

if(result == null){
%>
<script>
alert("현재 비밀번호를 확인하세요");
history.go(-1);
</script>
<%

}else {
//탈퇴
int result2 = dao.delete(id);
if(result2 == 1){ //성공
session.invalidate();
response.sendRedirect( request.getContextPath());
}else {//실패
%>
<script>
alert("탈퇴에 실패했습니다. 관리자에게 문의하세요");
history.go(-1);
</script>
<%
}
}

%>

==============================

UsersDAO(MVC1방식)클래스파일에 입력된 로그인,정보수정,탈퇴

//로그인
public UsersVO login(String id, String pw) {
UsersVO vo = null;

String sql = "select * from users where id = ? and pw = ?";

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
conn = DriverManager.getConnection(url, uid, upw);

pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pw);

rs = pstmt.executeQuery();

if(rs.next()) {
String ids = rs.getString("id");
String name = rs.getString("name"); //name컬럼을 꺼낸다
String email = rs.getString("email");
String address = rs.getString("address");
//Timestamp regdate = rs.getTimestamp("regdate");
 
vo = new UsersVO(ids, null, name, email, address, null);
}

} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, pstmt, rs);
}

return vo;
}

//정보수정
public int update(UsersVO vo) {
int result = 0;

String sql = "update users set pw = ?, name = ?, email = ?, address = ? where id = ?";

Connection conn = null;
PreparedStatement pstmt = null;

try {
conn = DriverManager.getConnection(url, uid, upw);

pstmt = conn.prepareStatement(sql);
pstmt.setString(1, vo.getPw());
pstmt.setString(2, vo.getName());
pstmt.setString(3, vo.getEmail());
pstmt.setString(4, vo.getAddress());
pstmt.setString(5, vo.getId());

result = pstmt.executeUpdate();


} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, pstmt, null);
}

return result;
}

//회원탈퇴
public int delete(String id) {

Connection conn = null;
PreparedStatement pstmt = null;

int result = 0;

String sql = "delete from users where id = ?";


try {

conn = DriverManager.getConnection(url, uid, upw);

pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);

result = pstmt.executeUpdate();



} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, pstmt, null);
}
return result;
}
}

=================================

* 연결 풀(Connection Pool)

- 데이터베이스 연결 풀은 데이터에 대한 요청이 발생하면 재사용되는 것으로, 데이터베이스 의 수행 능력을 향상시키기 위해 사용됩니다.

- 연결 풀에서 하나의 연결이 생성되어 풀에 배치되면 새로운 연결이 만들어지지 않도록 재사 용하지만, 만약 모든 연결이 사용 중에 있으면 새로운 연결이 만들어져 풀에 추가됩니다.

- 연결 풀을 통해 사용자는 데이터베이스 연결을 위해 기다리는 시간축소시켜줍니다.

 

- JSP의 연결풀 설정

- 커넥션 풀 설정은 Eclipse-> Servers폴더에 -> context.xml을 수정합니다

 

커넥션풀

- 커넥션 풀링은 미리 정해진 개수만큼 DB커넥션을 풀에 준비해두고, 어플리케이션이 요청할 때마다 Pool에서 꺼내서 할당하며, 다시 돌려 받아서 Pool에 넣는 기법

 

DateSource

- DB에 이용되는 URL, id, pw, DriverClass 를 미리 정의해 놓고 사용 하는 객체

 

* 커넥션 풀 코드 -

<Resource
      auth="Container"
      driverClassName = "oracle.jdbc.driver.OracleDriver"
      url = "jdbc:oracle:thin:@localhost:1521/XEPDB1"
      username = "jsp"
      password = "jsp"
      name = "jdbc/oracle"
      type = "javax.sql.DataSource"
      maxActive = "300"
      maxWait = "1000" 
   />

 

JSP의 연결풀 설정

- 커넥션 풀 설정은 Eclipse-> Servers폴더에 -> context.xml을 수정합니다.

=================================

* EL(Expression Language)

-EL이란 JSP에서 저장객체를 출력할때 스크립팅을 전혀 쓰지 않을 수 있는 기술입니다.

-EL은 일종의 스크립트 언어로 자료 타입, 수치 연산자, 논리 연산자, 비교 연산자 등을 제공하며 표현식을 대체할 수 있 습니다. 

%{sessionScope.userVO.id} 이런식으로 사용

=======

el의 사용예시

<body>

<h3>EL태그는 표현식을 대체합니다</h3>

<%=1 + 2 %><br>
${1 + 2 }<br>
${1 > 2}<br>
${1 == 2}<br>
${1 == 2 ? '같음' : '다름' }<br>
${1 < 2 && 1 > 2 }<br>
${ 1< 2 || 1 > 2 }<br>

${'홍길동' == '홍길동' }<br>

<h3>el태그에서 지원하는 문법</h3>
${1 == 2 or 1 > 2 }<br>
${1 == 2 and 1 > 2 }<br>
${'홍길동' eq '홍길동' }<br> <!--equarls의 줄임표현  -->
${not false }<br>
</body>
</html>

결과값

EL태그는 표현식을 대체합니다

3
3
false
false
다름
false
true
true

el태그에서 지원하는 문법

false
false
true
true

 

 

 

==================================

param객체.

param객체 사용법

입력페이지

<body>

<form action="el_form_ok.jsp" method="post">
이름:<input type="text" name="name"><br>
아이디:<input type="text" name="id"><br>
비밀번호:<input type="password" name="pw"><br>
<input type="submit" value="EL확인"><br>

</form>

</body>

========

출력페이지

<body>
<h3>form으로 넘어오는 값은 param이름으로 받을 수 있습니다</h3>
${param.name }<br>
${param.id }<br>
${param.pw }<br>
</body>

 

결과값

form으로 넘어오는 값은 param이름으로 받을 수 있습니다

asd
asd
123