실행버튼
maven)
ojdbc6
오류가 나면, 아래 화면처럼
파일탐색기에서 해당 주소를 입력했을 때 아래 화면같이 뜨지 않으면 폴더 삭제 후, 이클립스 재실행.
계속 오류가 나면, 아래 화면에서 프로젝트 업데이트 후 대기.
maven ribraries가 생성되어야 정상.
mybatis
pom.xml)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.smhrd</groupId>
<artifactId>MessageSystem1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
</project>
View의 jsp 파일(샘플)을 webapp에 복사붙여넣기)
jsp파일들은 보안을 유지하기 위해 WEB-INF 폴더에 view 폴더를 생성 후 복사붙여넣기)
join_success.jsp와 main.jsp의 인코딩 변경)
ctrl+F
main.jsp에서 form태그의 action과 input태그들의 name 설정해주기
Controller_gomain
package kr.smhrd.controller;
import java.io.IOException;
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("/goMain")
public class GoMainController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 데이터 수집(여기선 사용X)
// 2. 기능 구현(여기선 사용X)
// 3. View 선택 => View로 이동
// Redirect ?? => 다시 요청 : Controller => Controller
// Forward => WEB-INF 파일을 접근 가능 : Controller => JSP
// http://localhost:8081/MessageSystem/ => webapp
String nextView = "WEB-INF/views/main.jsp";
RequestDispatcher rd = request.getRequestDispatcher(nextView);
rd.forward(request, response);
}
}
Controller_gosuccess
package kr.smhrd.controller;
import java.io.IOException;
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("/goSuccess")
public class GoSuccessController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String newtView = "WEB-INF/views/join_success.jsp";
RequestDispatcher rd = request.getRequestDispatcher(newtView);
rd.forward(request, response);
}
}
db.properties
# 1. DB connection profile
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:XE
username=service
password=12345
entity(DTO)_sql
-- 회원 정보 테이블 만들기
create table Member
(
email varchar2(100),
pw varchar2(100) not null,
tel varchar2(100),
address varchar2(100),
constraint member_email_pk primary key(email)
);
entity(oracle과 연결)_member
package kr.smhrd.entity;
public class Member {
// 계층간(WEB <--> DB, Back <--> Front)
// 데이터 전달을 위한 객체
// DTO, VO
// 1. Table에 있는 컬럼을 반드시 포함
// DB의 데이터 타입과 맞아야함
// 컬럼의 이름 == 변수 이름(MyBatis)
private String email;
private String pw;
private String tel;
private String address;
// 2. 기본생성자를 반드시 포함
public Member() {
}
// 3. Getter / Setter 반드시 있어야 함
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
DAO_memberDAO
package kr.smhrd.dao;
public class MemberDAO {
// 1. DB와 연결
private SqlSessionFactory factory
}
MyBatis와 연결
https://mybatis.org/mybatis-3/getting-started.html#getting-started
config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="kr/smhrd/dao/db.properties"></properties>
<!-- 위 properties는 db.properties와 연결되어 있다. -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--
(전)JDBC => 매번 실행할때마다 Connection 생성
(후)Connection Pool -> Connection 미리 여러 개 만들어서 필요할 때 빌려만 주자.
Connection Pool을 만들기 위해 필요한 4가지 정보를 입력해라.
-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 우리 sql문은 어디에 있는가? -->
<mappers>
<mapper resource="kr/smhrd/dao/MemberMapper.xml"/>
</mappers>
</configuration>
MemberMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.smhrd.dao.MemberDAO">
<!-- namespace : 짝궁(DAO)가 누구??? -->
</mapper>
JoinController
package kr.smhrd.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/join")
public class JoinController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 데이터 수집
request.setCharacterEncoding("UTF-8");
String email = request.getParameter("email");
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
String address = request.getParameter("address");
// 2. 기능 구현 : DB에 회원정보를 저장(DAO)
// 3. View 선택
String url = "";
}
}
SqlSessionManager
package kr.smhrd.dao;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionManager {
// Connection Pool 생성하고 관리 => 우리 프로젝트(서버)가 실행되자마자
// 초기화 블럭 --> 특정 시점에 자동으로 코드 실행
// (생성자가 사용이 됐을 때 자동으로 실행)
// new SqlSessionManager();
// static : 우리 프로젝트가 실행되자마자 메모리에 할당
// static 초기화 블럭 => static 변수들이 할당되자마자(=프로젝트가 시작)
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// ctrl+shift+o => 자동완성
String resource = "kr/smhrd/dao/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// Connection Pool
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace(); // console창에 빨간글씨로 에러 출력
}
}
// private(잠금선언)로 선언했기에 꺼내쓸 수 있는 getters로 메소드 선언
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
MemberDAO
package kr.smhrd.dao;
import org.apache.ibatis.session.SqlSessionFactory;
public class MemberDAO {
// 1. DB와 연결
private SqlSessionFactory factory =
SqlSessionManager.getSqlSessionFactory();
}
MemberMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.smhrd.dao.MemberDAO">
<!-- namespace : 짝궁(DAO)가 누구??? -->
<!-- 회원가입 -->
<!--
#{변수명} : 변수에 데이터 타입에 자동맞춤
ex) values(#{email})
=> values('email@eamil.com')
${변수명} : 단순히 집어넣는 타입
ex) values(#{email})
=> values(email@email.com)
=> ERROR!
parameterType : 데이터들을 어디에 담아서 줄거냐
SQL문에 바인드변수가 2개 이상인 경우 필수
-->
<insert id="join" parameterType="kr.smhrd.entity.Member">
insert into MEMBER
values(#{email},
#{pw},
#{tel},
#{address}
)
</insert>
</mapper>
MemberDAO
package kr.smhrd.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import kr.smhrd.entity.Member;
public class MemberDAO {
// DAO : SQL문을 실행하고, 실행 결과를 리턴
// 1. DB와 연결
private SqlSessionFactory factory =
SqlSessionManager.getSqlSessionFactory();
// Mybatis : java(DAO) <=mapping=> sql(xml)
// 2. 회원정보를 Member 테이블에 저장하는 기능
public int join(Member dto) {
// 1단계) SqlSession 빌려오기
// true --> auto commit
SqlSession session = factory.openSession(true);
// 2단계) sql문 실행
// insert, delete, update : 키워드랑 같은 메소드
// select : selectOne (한 개만 가져올 때)
// : selectList (여러 개 가져올 때)
// insert("id", 넣어줄 데이터)
// parameterType == 메소드의 매개변수
// insert, delete, update는 resultType이 int로만 고정
int row = session.insert("join", dto);
// 3단계) 빌려온 SqlSession 반환
session.close();
// 4단계) SQL문 실행한 결과를 리턴
// resultType == return type
return row;
}
}
JoinController
package kr.smhrd.controller;
import java.io.IOException;
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;
import kr.smhrd.dao.MemberDAO;
import kr.smhrd.entity.Member;
@WebServlet("/join")
public class JoinController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 데이터 수집
request.setCharacterEncoding("UTF-8");
String email = request.getParameter("email");
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
String address = request.getParameter("address");
// 데이터가 2개 이상이라면, DTO로 묶어놓기
Member dto = new Member();
dto.setEmail(email);
dto.setPw(pw);
dto.setTel(tel);
dto.setAddress(address);
// 2. 기능 구현 : DB에 회원정보를 저장(DAO)
// 2-1) DAO를 생성
MemberDAO dao = new MemberDAO();
int row = dao.join(dto);
// 3. View 선택
String nextView = "";
if(row>0) {
// 성공 => 회원가입 성공 페이지
nextView = "goSuccess";
}else {
// 실패 => 메인페이지
nextView = "goMain";
}
// 페이지 이동
// forward vs redirect
// c->v c->c
// 기능의 중복 실행을 방지하기 위해서 url을 초기화하려고 redirect를 사용하는 것
response.sendRedirect(nextView);
}
}
'Web > JSP_Servlet' 카테고리의 다른 글
MVC_개인정보수정 (0) | 2023.04.26 |
---|---|
MVC_로그인/로그아웃 시스템 (0) | 2023.04.25 |
Session (1) | 2023.04.19 |
객체실습_html에서 값 입력 후 jsp에서 출력 (1) | 2023.04.19 |
쿠키 (0) | 2023.04.18 |
댓글