파일 구조
WEB-INF.confing - action-mybatis.xml / action-service.xml / jdbc.properties
WEB-INF - action-servlet.xml / 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">
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 마이바티스 설정 파일 읽어들이기 -->
<param-value>
/WEB-INF/config/action-mybatis.xml
/WEB-INF/config/action-service.xml
</param-value>
</context-param>
</web-app>
뷰 관련 빈과 각각의 URL 요청명에 대해 호출할 메소드들을 설정한다
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- viewResolver : 컨트롤러의 처리 결과를 전달할 뷰 지정-->
<!-- InternalResourceViewResolver : 내부 자원을 이용해서 뷰를 생성하는 클래스 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/member/" />
<property name="suffix" value=".jsp"/>
</bean>
<!-- class : 개발자가 불러올 컨트롤러의 경로를 적어주면 된다 -->
<bean id="memberController"
class="com.spring.member.controller.MemberControllerImpl">
<property name="methodNameResolver">
<ref local="memberMethodResolver"/>
</property>
<property name="memberService" ref="memberService"/>
</bean>
<bean id="memberMethodResolver"
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver" >
<property name="mappings" >
<props>
<prop key="/member/listMembers.do" >listMembers</prop>
<prop key="/member/addMember.do" >addMember</prop>
<prop key="/member/removeMember.do">removeMember</prop>
<prop key="/member/memberForm.do" >form</prop>
</props>
</property>
</bean>
<bean id="memberUrlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/member/*.do">memberController</prop>
</props>
</property>
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans">
<!-- propertyPlaceholderConfigurer 클래스를 이용해서
데이터베이스 설정 관련 정보를 jdbc.properties 파일에서 읽어온다 -->
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>/WEB-INF/config/jdbc.properties</value>
</property>
</bean>
<!-- 마이바티스에서 제공하는 PooledDataSource 클래스를 이용해서
dataSource 빈을 생성한다 -->
<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- SqlSessionFactioryBean 클래스를 이용해서 dataSource 속성에 dataSource 빈을 설정 -->
<!-- java 처럼 표현하자면
SqlSessionTemplate sqlSession
= new SqlSessionTemplate(sqlSessionFactory) -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- ref : 사용할 다른 빈의 id가 들어간다 -->
<property name="dataSource" ref="dataSource" />
<!-- configLoation 속성에 modelConfig.xml을 설정한다 -->
<property name="configLocation" value="classpath:mybatis/model/modelConfig.xml" />
<!-- mapperLocations 속성에 mybatis/mappers 패키지의 모든 매퍼 파일을 읽어와 설정 -->
<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml" />
</bean>
<!-- SqlSessionTemplate 클래스를 이용해 sqlSession 빈을 생성한다 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
<bean id="memberDAO" class="com.spring.member.dao.MemberDAOImpl">
<!-- sqlSession 빈을 memberDAO 빈 속성에 주입 -->
<property name="sqlSession" ref="sqlSession"></property>
</bean>
</beans>
MemberDAO 빈을 사용할 memberService 빈을 설정
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="memberService" class="com.spring.member.service.MemberServiceImpl">
<!-- memberDAO 빈을 memberService 빈의 속성에 주입 -->
<property name="memberDAO" ref="memberDAO"/>
</bean>
</beans>
회원 관련 SQL 문이 있는 매퍼 파일. sql문의 작성은 아래 와 같다
<![CDATA[
여기에 sql문을 넣어주면 된다
예를 들어 이름에 '희'가 포함된 단어를 검색하겠다
select * from t_member where name like '%희%';
]]>
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="mapper.member">
<resultMap id="memResult" type="memberVO">
<result property="id" column="id" />
<result property="pwd" column="pwd" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="joinDate" column="joinDate" />
</resultMap>
<select id="selectAllMemberList" resultMap="memResult">
<![CDATA[
select * from t_member order by joinDate desc
]]>
</select>
<select id="selectName" resultType="String">
<![CDATA[
select name from t_member
where id = 'hong'
]]>
</select>
<select id="selectPwd" resultType="int" >
<![CDATA[
select pwd from t_member
where id = 'hong'
]]>
</select>
<select id="selectMemberById" resultType="memberVO" parameterType="String" >
<![CDATA[
select * from t_member
where
id=#{id}
]]>
</select>
<select id="selectMemberByPwd" resultMap="memResult" parameterType="int" >
<![CDATA[
select * from t_member
where
pwd = #{pwd}
]]>
</select>
<insert id="insertMember" parameterType="memberVO">
<![CDATA[
insert into t_member(id,pwd, name, email)
values(#{id}, #{pwd}, #{name}, #{email})
]]>
</insert>
<insert id="insertMember2" parameterType="java.util.HashMap">
<![CDATA[
insert into t_member(id,pwd, name, email)
values(#{id}, #{pwd}, #{name}, #{email})
]]>
</insert>
<update id="updateMember" parameterType="memberVO">
<![CDATA[
update t_member
set pwd=#{pwd}, name=#{name}, email=#{email}
where
id=#{id}
]]>
</update>
<delete id="deleteMember" parameterType="String">
<![CDATA[
delete from t_member
where
id=#{id}
]]>
</delete>
<!-- 동적 SQL문 -->
<select id="searchMember" parameterType="memberVO" resultMap="memResult">
<![CDATA[
select * from t_member
]]>
<where>
<if test=" name != '' and name != null">
name=#{name}
</if>
<if test="email != '' and email != null ">
and email = #{email}
</if>
</where>
order by joinDate desc
</select>
<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
<![CDATA[
select * from t_member
]]>
where name in
<foreach item="item" collection="list" open="(" separator="," close=")" >
#{item}
</foreach>
order by joinDate desc
</select>
<insert id="foreachInsert" parameterType="java.util.Map">
<foreach item="item" collection="list" open="INSERT ALL" separator=" " close="SELECT * FROM DUAL" >
INTO t_member(id, pwd, name, email)
VALUES (#{item.id},
#{item.pwd},
#{item.name},
#{item.email})
</foreach>
</insert>
<select id="selectLike" resultMap="memResult" parameterType="String" >
<![CDATA[
select * from t_member
where
name like '%' || #{name} || '%'
]]>
</select>
</mapper>
<typeAlias>
태그를 이용해 매퍼 파일에서 긴 이름의 클래스를 별칭으로 사용할 수 있게끔 설정한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- <typeAliases> 태그로 마이바티스에서 데이터 전달에 사용될 memberVO 빈을 설정한다 -->
<typeAliases>
<typeAlias type="com.spring.member.vo.MemberVO" alias="memberVO"/>
</typeAliases>
</configuration>
package com.spring.member.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
public interface MemberController {
public ModelAndView listMembers(HttpServletRequest request,
HttpServletResponse response) throws Exception;
public ModelAndView addMember(HttpServletRequest request,
HttpServletResponse response) throws Exception;
public ModelAndView removeMember(HttpServletRequest request,
HttpServletResponse response) throws Exception;
}
컨트롤러 역할을 하는 클래스.
memberService 속성에 빈을 주입하기 위해 setter를 구현한다
package com.spring.member.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import com.spring.member.service.MemberService;
import com.spring.member.vo.MemberVO;
public class MemberControllerImpl extends MultiActionController implements MemberController {
private MemberService memberService;
// memberService 빈을 주입하기 위해 setter 구현
public void setMemberService(MemberServiceImpl memberService) {
this.memberService = memberService;
}
@Override
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
String viewName = getViewName(request);
List membersList = memberService.listMembers();
ModelAndView mav = new ModelAndView(viewName);
// 조회한 회원 정보를 ModelAndView의 addObject() 메소드를 이용해 바인딩한다
mav.addObject("membersList", membersList);
return mav;
}
// 파일 이름 가져오기ㅣ
private String getViewName(HttpServletRequest request) throws Exception {
String contextPath = request.getContextPath();
String uri = (String) request.getAttribute("javax.servlet.include.request_uri");
if (uri == null || uri.trim().equals("")) {
uri = request.getRequestURI();
}
int begin = 0;
if (!((contextPath == null) || ("".equals(contextPath)))) {
begin = contextPath.length();
}
int end;
if (uri.indexOf(";") != -1) { end = uri.indexOf(";"); }
else if (uri.indexOf("?") != -1) { end = uri.indexOf("?"); }
else { end = uri.length(); }
String fileName = uri.substring(begin, end);
if (fileName.indexOf(".") != -1) {
fileName = fileName.substring(0, fileName.lastIndexOf("."));
}
if (fileName.lastIndexOf("/") != -1) {
fileName = fileName.substring(fileName.lastIndexOf("/"), fileName.length());
}
return fileName;
}
// 새로운 회원 삽입하기
@Override
public ModelAndView addMember(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
MemberVO memberVO = new MemberVO();
// 회원 가입창에서 전송된 회원 정보를 bind() 메소드를 이용해 memberVO 해당 속성에 자동으로 설정
bind(request, memberVO);
int result = 0;
result = memberService.addMember(memberVO);
// 회원정보 추가 후 ModelAndView 클ㄹ스의 redirect 속성을 이용
// /member/listMembers.do로 리다이렉트 한다
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
}
// 회원 삭제 코드
@Override
public ModelAndView removeMember(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
memberService.removeMember(id);
// 회원정보를 삭제하고 회원 목록 창으로 리다이렉트 하겠다
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
}
// 데이터베이스 연동 작업이 없는 입력창 요청시. 뷰 이름만 ModelAndView로 반환한다
public ModelAndView form(HttpServletRequest request, HttpServletResponse response) throws Exception {
String viewName = getViewName(request);
ModelAndView mav = new ModelAndView();
mav.setViewName(viewName);
return mav;
}
}
인터페이스
package com.spring.member.service;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.spring.member.vo.MemberVO;
public interface MemberService {
public List listMembers() throws DataAccessException;
public int addMember(MemberVO membeVO) throws DataAccessException;
public int removeMember(String id) throws DataAccessException;
}
memberDAO에 memberDAO 빈을 넣기 위해 setter 구현
package com.spring.member.service;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.spring.member.dao.MemberDAO;
import com.spring.member.vo.MemberVO;
public class MemberServiceImpl implements MemberService {
private MemberDAO memberDAO;
// 속성 memberDAO에 memberDAO 빈을 넣기 위해 setter 구현
public void setMemberDAO(MemberDAO memberDAO){
this.memberDAO = memberDAO;
}
// 데이터 베이스 안의 전체자료 보여주기
@Override
public List listMembers() throws DataAccessException {
List membersList = null;
membersList = memberDAO.selectAllMemberList();
return membersList;
}
// 새로운 회원 추가
@Override
public int addMember(MemberVO membeVO) throws DataAccessException {
return memberDAO.insertMember(memberVO);
}
// 회원 삭제
@Override
public int removeMember(String id) throws DataAccessException {
return memberDAO.deleteMember(id);
}
}
인터페이스
package com.spring.member.dao;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.spring.member.vo.MemberVO;
public interface MemberDAO {
public List selectAllMemberList() throws DataAccessException;
public int insertMember(MemberVO memberVO) throws DataAccessException ;
public int deleteMember(String id) throws DataAccessException;
}
package com.spring.member.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.dao.DataAccessException;
import com.spring.member.vo.MemberVO;
public class MemberDAOImpl implements MemberDAO {
private SqlSession sqlSession;
// setter
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List selectAllMemberList() throws DataAccessException {
List<MemberVO> membersList = null;
// 주입된 sqlSession 빈으로 selectList() 메소드를 호출
// Sql문에 id를 전달한다
membersList = sqlSession.selectList("mapper.member.selectAllMemberList");
return membersList;
}
@Override
public int insertMember(MemberVO memberVO) throws DataAccessException {
// 주입된 sqlSession 빈으로 insert() 메소드를 호출
// sql문에 id와 memberVO를 전달한다
int result = sqlSession.insert("mapper.member.insertMember", memberVO);
return result;
}
@Override
public int deleteMember(String id) throws DataAccessException {
// 주입된 sqlSession 빈으로 delete() 메소드를 호출
// sql문에 id와 회원 id를 전달
int result = sqlSession.delete("mapper.member.deleteMember", id);
return result;
}
}
기본 정보가 왔다갔다 하는 곳
package com.spring.member.vo;
import java.sql.Date;
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
public MemberVO(){}
public MemberVO(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;
}
}
회원 목록창에서 회원 정보를 표시하면서 삭제하기 링크 추가
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border="1" align="center" width="80%">
<tr align="center" bgcolor="lightgreen">
<td ><b>아이디</b></td>
<td><b>비밀번호</b></td>
<td><b>이름</b></td>
<td><b>이메일</b></td>
<td><b>가입일</b></td>
<td><b>삭제</b></td>
</tr>
<c:forEach var="member" items="${membersList}" >
<tr align="center">
<td>${member.id}</td>
<td>${member.pwd}</td>
<td>${member.name}</td>
<td>${member.email}</td>
<td>${member.joinDate}</td>
<!-- 삭제하기 선택시 /member/removeMember.do로 요청한다 -->
<td><a href="${contextPath}/member/removeMember.do?id=${member.id }">삭제하기</a></td>
</tr>
</c:forEach>
</table>
<!-- 회원가입 선택시 /member/memberForm.do로 요청 -->
<a href="${contextPath}/member/memberForm.do"><h1 style="text-align:center">회원가입</h1></a>
</body>
</html>
회원가입창에서 정보 입력하면 그 값을 /member/addMember.do로 전송
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입창</title>
<style>
.text_center {
text-align: center;
}
</style>
</head>
<body>
<form method="post" action="${contextPath}/member/addMember.do">
<h1 class="text_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> </p></td>
<td width="400"><input type="submit" value="가입하기"><input
type="reset" value="다시입력"></td>
</tr>
</table>
</form>
</body>
회원 정보 수정할거 입력하는 곳
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 정보 수정창</title>
<style>
.text_center {
text-align: center;
}
</style>
</head>
<body>
<form method="post" action="${contextPath}/member/modMember.do">
<h1 class="text_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> </p></td>
<td width="400"><input type="submit" value="수정하기"><input
type="reset" value="다시입력"></td>
</tr>
</table>
</form>
</body>
</html>
널포인트 에러. 추후에 다시 작성해봐야겠음
바보같이 jdbc.properties 이걸 작성안해놓고 실행돌리고 있었다. 오라클이랑 연결하는 부분을 안해놓고 왜 연결안되는거지 하고 있었으니ㅎㅎ
http://localhost:8700/pro24/member/listMembers.do
로 검색해서 실행하면 아래와 같이 전체 목록이 뜬다
만약 삭제하기 버튼을 누른다면 해당 컬럼이 아예 사라지며 (아래 사진은 'hong', '123', '김유신'....) 을 삭제한 사진
회원가입 버튼을 누르면 아래와 같이 작성 창으로 연결된다
작성 후
가입하기를 누르면 값이 들어간 것을 확인할 수 있다(형광펜 표시해놓은 곳)