본문 바로가기

카테고리 없음

MVC 실습.

참고로 webapp에 jsp를 놔도 된다.

우선 잡힘..


Context Path 설정 변경하기.

1.어플리케이션 자체에서 변경하기.

프로젝트 우클릭하여 Properties를 선택한뒤 Web Project Settings에서 변경가능


2. 서버에서 변경하기.

서버를 열면 Modules에서 Path경로를 변경해준다.



로그인 정보를 받아올때.

HomeController.java에서 아래와같이 추가해준다.

@RequestMapping("/login") // 변수명만 넣어줘도 된다. public String login( String mem_id, String mem_pw, Model model // 화면에 뿌려질 데이터(직접 생성x 파라미터로 받아올것.) // HttpServletRequest request // JSP방식으로 할때는 리퀘스트로 불러와야하기때문에 잡아준다. ) { // ID, PW // String mem_id = request.getParameter("mem_id"); // String mem_pw = request.getParameter("mem_pw");

// 1.기존 JSP 방식 // request.setAttribute("mem_id", mem_id); // request.setAttribute("mem_pw", mem_pw);

// 2. model방식 model.addAttribute("mem_id", mem_id); model.addAttribute("mem_pw", mem_pw); // view 이름 return "login"; }


이후 webapp/WEB-INF/views/login.jsp를 생성해준후 화면에 뿌려질 정보를 이엘표기법으로 작성한다.

<body> 아이디 : ${mem_id} <br> 패스워드 : ${mem_pw} </body>

http://localhost:8080/springmvc/login?mem_id=san&mem_pw=1234

주소로 입력값을 넣어준다.


그럼 결과가 아래처럼 뿌려진다

아이디 : san
패스워드 : 1234


이후 list정보를 받아오려한다. HomeController.java에서 list를 추가해준다.

아래 내용처럼 mav.setViewName("list"); 를 줘도 되지만 ModelAndView를 생성할때 파라미터값으로 줘도 된다.

@RequestMapping("/list") public ModelAndView list() { ModelAndView mav = new ModelAndView("list"); List<String> memberList = new ArrayList<String>(); memberList.add("제니"); memberList.add("로제"); memberList.add("리사"); memberList.add("지수"); mav.addObject("memberList", memberList); // mav.setViewName("list"); 위에 new ModelAndView("list"); 파라미터에 담아줘도 된다. return mav; }


이후 webapp/WEB-INF/views/list.jsp를 생성해준후 화면에 뿌려질 정보를 이엘표기법으로 작성한다.

<body> <h4>회원목록</h4> <c:forEach items="${memberList}" var="member"> ${member}<br> </c:forEach> </body>

그럼 아래와같이 실행된다.

회원목록

제니
로제
리사
지수



인코딩을 자동으로 변경해주게끔 설정을 web.xml내에 추가해준다.

<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filtermapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filtermapping>

필터는 공기청정기 필터와 같은느낌으로 request를 받을때 필터를 걸쳐서 인코딩 설정후 Controller에 들어온다.

반대로 나갈때도필터를 걸쳐서 response한다.


지금까지는 예제.....ㅠㅠ


kr.or.nextit.login

kr.or.nextit.board

kr.or.nextit.member.vo.Member.java

kr.or.nextit.member.controller.MemberController.java

kr.or.nextit.member.mapper.MemberMapper(인터페이스)

kr.or.nextit.member.service.MemberService.java(인터페이스)

kr.or.nextit.member.service.MemberServiceImpl.java

패키지와 클래스, 인터페이스를 생성한다.


vo.Member에 db정보를 담아줘야하긴떄문에 db에서 테이블을 생성해준다.

create table tb_member( mem_id varchar2(20) primary key , mem_name varchar2(50) not null , mem_pw varchar2(20) not null , mem_phone varchar2(20) not null , mem_email varchar2(100) not null , mem_birth varchar2(8) not null , mem_zipcode varchar2(6) null , mem_addr_master varchar2(200) null , mem_addr_detail varchar2(100) null -- 모든테이블에 웬만하면 넣어준다. , reg_date date not null , reg_user_id varchar2(20) not null , upd_date date not null , upd_user_id varchar2(200) not null );


vo.Member에 테이블 내용을 담아주고 getter, setter를 만들어준다.

private String mem_id; private String mem_name; private String mem_pw; private String mem_phone; private String mem_email; private String mem_birth; private String mem_zipcode; private String mem_addr_master; private String mem_addr_detail; private String reg_date; private String reg_user_id; private String upd_date; private String upd_user_id;

mapper.MemberMapper는 아래 내용을 추가해줬다.

// 맵퍼를 가장 먼저 만든다.
public interface MemberMapper {
	
public List<Member> selectMemberList() throws Exception;
	
	public Member selectMember(String mem_id) throws Exception;
	
	// 몇개가 인설트 됐는지....
	public int insertMember(Member member) throws Exception;
	
	public int updateMember(Member member) throws Exception;
	
	public int deleteMember(String mem_id) throws Exception;
	

}

service.MemberService는 아래 내용을 추가해줬다.

public interface MemberService { public List<Member> getMemberList() throws Exception; public Member getMember(String mem_id) throws Exception; // 몇개가 인설트 됐는지.... public int insertMember(Member member) throws Exception; public int updateMember(Member member) throws Exception; public int deleteMember(String mem_id) throws Exception; }

이후 

service.MemberServiceImpl에서


public class MemberServiceImpl implements MemberService 상속이후 MemberServiceImpl을 

F2누르면 Add unimplemented methods 를 눌러주면 내용들이 오버라이드 된다.



controller.MemberController는 아래 내용을 추가해줬다.

package kr.or.nextit.member.controller; public class MemberController { public String memberList() { return ""; } public String memberView() { return ""; } public String memberForm() { return ""; } public String memberEdit() { return ""; } public String memberInsert() { return ""; } public String memberUpdate() { return ""; } public String memberDelete() { return ""; } }



<e





<e




<e







pom.xml에 

repositories로 Driver를 잡아주고

Oracle JDBC를 추가, mybatis추가, mybatis와 spring의 연동을 위한 mybatis-spring추가, Pool을 사용하기위해 DBCP추가

<repositories> <!-- oracle driver repository --> <repository> <id>oracle</id> <url>http://maven.jahia.org/maven2</url> </repository> </repositories>


<dependencies>

<!-- Oracle JDBC Driver --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>12.1.0.2</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> <!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- DBCP(Pool) --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency>


</dependencies>

java resource/src/main/resource에 mybatis-config.xml 를 넣어준다.(내용)

<?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>     <settings><!-- 2개는 항상 넣어주는게 좋다. -->         <setting name="jdbcTypeForNull" value="NULL"/><!-- 널이 들어갈수있게 널값세팅 -->         <setting name="callSettersOnNulls" value="true"/>

<!-- DB에서 넘어올때 null이면 데이터 할당을 안해줌 특히 VO는 상관없는데 Map일경우 문제가 발생. --> <setting name="mapUnderscoreToCamelCase" value="false"/>

<!-- 기본값이 false bean을(VO) camelCase로 사용할때 true를 준다.-->     </settings>     <typeAliases><!-- 순서가 밑에있으면 configuration이 에러생긴다. -->     <typeAlias type="kr.or.nextit.member.vo.Member" alias="Member"/><!-- 별명으로 사용하기 위해 별명설정. -->     </typeAliases> </configuration>


java resource/src/main/resource에 db.properties(내용)을 넣어준다.

driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:1521:XE username=java password=oracle


springmvc/src/main/resources/mappers/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.or.nextit.member.mapper.MemberMapper"><!-- mapper 인터페이스이름과 동일해야한다. --> <!-- mapper의 갯수와 같아야하고 아이디도 같아야한다. 쿼리가 정확한지 DB에서 돌려본다 --> <select id="selectMemberList" resultType="Member">

<!-- mybatis-config에서 alias 해줘서 풀네임을 안줘도된다. --> SELECT mem_id , mem_name , mem_pw , mem_phone , mem_email , mem_birth , mem_zipcode , mem_addr_master , mem_addr_detail , reg_date , reg_user_id , upd_date , upd_user_id FROM tb_member ORDER BY reg_date DESC </select> <select id="selectMember" parameterType="string" resultType="Member"> SELECT mem_id , mem_name , mem_pw , mem_phone , mem_email , mem_birth , mem_zipcode , mem_addr_master , mem_addr_detail , reg_date , reg_user_id , upd_date , upd_user_id FROM tb_member WHERE mem_id = #{mem_id} </select> <insert id="insertMember" parameterType="Member"> INSERT INTO tb_member( mem_id , mem_name , mem_pw , mem_phone , mem_email , mem_birth , mem_zipcode , mem_addr_master , mem_addr_detail , reg_date , reg_user_id , upd_date , upd_user_id ) VALUES ( #{mem_id} , #{mem_name} , #{mem_pw} , #{mem_phone} , #{mem_email} , #{mem_birth} , #{mem_zipcode} , #{mem_addr_master} , #{mem_addr_detail} , SYSDATE , #{reg_user_id} , SYSDATE , #{upd_user_id} ) </insert> <update id="updateMember" parameterType="Member"> UPDATE tb_mamer SET mem_name = #{mem_name} , mem_pw = #{mem_pw} , mem_phone = #{mem_phone} , mem_email = #{mem_email} , mem_birth = #{mem_birth} , mem_zipcode = #{mem_zipcode} , mem_addr_master = #{mem_addr_master} , mem_addr_detail = #{mem_addr_detail} , upd_date = SYSDATE , upd_user_id = #{upd_user_id} WHERE mem_id = #{mem_id} </update> <delete id="deleteMember" parameterType="string"> DELETE FROM tb_member WHERE mem_id = #{mem_id} </delete> </mapper>


application-context.xml

<?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:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.3.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <!-- 프로퍼티 파일 읽어들임. --> <context:property-placeholder location="classpath:db.properties"/> <context:component-scan base-package="kr.or.nextit"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- datasource --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <!-- Pool 관련 설정 --> <property name="defaultAutoCommit" value="false"/> <!-- 커넥션 실제 갯수 --> <property name="maxTotal" value="5"/> <!-- 최소 갯수 --> <property name="minIdle" value="3"/> <property name="maxIdle" value="5"/> <property name="validationQuery" value="select 1 from dual"/> </bean> <!-- Mybatis 관련 설정 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:/mappers/*"></property> <property name="transactionFactory"> <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/> </property> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory"></constructor-arg> </bean> <!-- Mapper를 스캔하기위함. Spring이 스캔하는것이 아니기때문에 별도 스캔해준다. --> <mybatis-spring:scan base-package="kr.or.nextit.*.mapper"/> </beans>

네임스페이스에서 아래와같이 설정해준다.



서비스, 컨트롤러, 매퍼에 어노테이션을 달아주고.


servlet-context.xml설정을 아래와같이 해준다.

<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <!-- Enables the Spring MVC @Controller programming model --> <annotation-driven /> <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> <!-- 빈등록하고 DI하기위해 쓰임. --> <context:component-scan base-package="kr.or.nextit" > <!-- 컨트롤러만 가져와라.. exclude는 그것만 빼고.... --> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans:beans>





<e




<e




<e




<e