국비 지원 개발자 과정_Day66
순제어
A클래스가 B, C를 인스턴스화(A클래스 내부에서 이루어짐)
java → 어노테이션
xml → beans(빈의 다른 말은 클래스)
라이프사이클 → init() - service() - destroy()
→우리가 작성하는 service()에 들어감(스크립틀릿 <%%> 안의 코드는 모두 지역변수이다)
어노테이션 기반 코드설정 → 자바에 작성하고, 자바는 컴파일하기에 버전관리 불편
xml → 버전관리 상관없음. 서버에 등록해 놓으면 기억 계속 유지가능
id는 인스턴스 변수
class이름은 풀네임으로
ref는 참조하는 레퍼런스 주소번지
스프링부터는 어노테이션 기반 설정으로함
<스프링 log4설정 - log4j.xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] [%p] (%13F:%L) %3x - %m%n" />
</layout>
</appender>
<!-- Application Loggers -->
<logger name="com.example.demo">
<level value="info" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<root>
<priority value="debug" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
MultiActionController
deprecated, 어노테이션(@Controller)때문에 차후 쓰지 않음(어노테이션은 상속받지 않기 때문에!)
요청에 대한 컨트롤러의 메소드마다 요청, 응답객체 받을 수 있음(pojo에선 할 수 없음)
<스프링4 - BoardController.java>
package com.example.demo.controller;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import com.example.demo.logic.BoardLogic;
public class BoardController extends MultiActionController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
private BoardLogic boardLogic = null;
// setter 객체 주입법 - 자바코드에서 객체주입을 처리할때 사용함
public void setBoardLogic(BoardLogic boardLogic) {
this.boardLogic = boardLogic;
}
/*
원래 톰캣주입 -> void doGet(req, res)
pojo step1 -> ActionForward execute(req, res)
pojo step2 -> String execute(req, res) 스프링에 가깝게
pojo step3 -> String XXXX(req, res) 최대한 스프링같이
*/
public ModelAndView boardList (HttpServletRequest req, HttpServletResponse res) {
logger.info("boardList 호출");
List<Map<String, Object>> bList = null;
bList = boardLogic.boardList();
ModelAndView mav = new ModelAndView();
mav.setViewName("board/boardList");
mav.addObject("bList", bList);
return mav;
}
}
<스프링4 - BoardLogic.java>
package com.example.demo.logic;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.example.demo.dao.BoardDao;
public class BoardLogic {
private static final Logger logger = LoggerFactory.getLogger(BoardLogic.class);
// @Autowired
// 아래 코드는 자바코드(내부)에서 직접 인스턴스화하지 않는다 - 제어역전이 아니다
private BoardDao boardDao = null;
// 직접 인스턴스화하는 것 대신에 해야할 일이 있다 - 생성자객체주입법과 setter객체주입법이 있다
// 생성자 객체주입은 xml에서 하고 setter객체주입은 자바에서함
// 양이 줄어드는 건 아니지만 대신에 객체 라이프사이클 관리받는다 - 제어역전 IoC
public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}
public List<Map<String, Object>> boardList() {
logger.info("boardList");
List<Map<String, Object>> bList = new ArrayList<>();
bList = boardDao.boardList();
return bList;
}
}
<스프링4 - BoardDao.java>
package com.example.demo.dao;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.example.demo.logic.BoardLogic;
public class BoardDao {
private static final Logger logger = LoggerFactory.getLogger(BoardDao.class);
private SqlSessionTemplate sqlSessionTemplate = null;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public List<Map<String, Object>> boardList() {
logger.info("boardList 호출");
List<Map<String, Object>> bList = null;
bList = sqlSessionTemplate.selectList("boardList", null);
logger.info(bList.toString());
return bList;
}
}
<스프링4 - boardList.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.List, java.util.Map"%>
<%
List<Map<String, Object>> bList = (List) request.getAttribute("bList");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 구현</title>
</head>
<body>
<h3>게시글 목록</h3>
<table border="1" width="300px">
<tr>
<th>글번호</th>
<th>글제목</th>
<th>작성자</th>
</tr>
<%
for(int i = 0; i < bList.size(); i++){
Map<String, Object> rMap = bList.get(i);
%>
<tr>
<th><%=rMap.get("BM_NO") %></th>
<th><%=rMap.get("BM_TITLE") %></th>
<th><%=rMap.get("BM_WRITER") %></th>
</tr>
<%
} // end of for
%>
</table>
</body>
</html>
<스프링4 - board.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="com.mybatis.mapper.BoardMapper">
<!-- 게시글목록 가져오는 쿼리문 -->
<select id="boardList" parameterType="java.util.HashMap"
resultType="map">
SELECT bm.bm_no,
bm.bm_title,
bm.bm_writer,
bs.bs_file,
bm.bm_hit,
bm.bm_pos,
bm.bm_step
FROM board_master_t bm, board_sub_t bs
WHERE bm.bm_no =
bs.bm_no(+)
<!-- 글번호로 검색 -->
<if test= 'bm_no > 0' >
AND bm_no = #{bm_no}
</if>
<!-- 글제목으로 검색 -->
<if test= 'cb_search!=null and cb_search.equals("bm_title")' >
AND bm_title LIKE '%'||#{keyword}||'%'
</if>
<!-- 글내용으로 검색 -->
<if test= 'cb_search!=null and cb_search.equals("bm_content")' >
AND bm_content LIKE '%'||#{keyword}||'%'
</if>
<!-- 작성자로 검색 -->
<if test= 'cb_search!=null and cb_search.equals("bm_writer")' >
AND bm_writer LIKE '%'||#{keyword}||'%'
</if>
ORDER BY bm.bm_group DESC, bm.bm_step ASC
</select>
<!-- board Master에 인서트 -->
<!-- pos와 step은 원글이면 0, 댓글이면 read.jsp에서 가진 값에 1을 더한 값으로 결정됨
조회수는 0(새글이니까), 날짜는 시스템 날짜정보로 등록 -->
<insert id="boardMInsert" parameterType="map">
INSERT INTO
board_master_t(bm_no, bm_title, bm_writer, bm_reg, bm_hit,
bm_group, bm_pos, bm_step)
VALUES(seq_board_no.nextval, #{bm_title}, #{bm_writer},
to_char(sysdate, 'YYYY-MM-DD'), 0, #{bm_group},
#{bm_pos}, #{bm_step})
</insert>
<!-- board Sub에 인서트 -->
<!-- 첨부파일을 추가하는 경우에만 실행됨, 없으면 해당없음
글번호는 새글쓰기에서 결정된 값이 대입되어야함, 새로채번하면 안됨! -->
<insert id="boardSInsert" parameterType="map">
INSERT INTO
board_sub_t(bm_no, bs_seq, bs_file, bs_size)
VALUES(#{bm_no}, 1, #{bs_file}, #{bs_size})
</insert>
<!-- board Master에 Step 업데이트 -->
<!-- 내가 쓰는 댓글 뒤에 댓글이 존재하는 경우만 실행됨
조건절에 들어오는 그룹번호와 step은 상세보기 화면에서 가져온 값이 대입됨 -->
<update id="bmStepUpdate" parameterType="map">
UPDATE board_master_t
SET bm_step = bm_step + 1
WHERE bm_group = #{bm_group}
AND bm_step > #{bm_step}
</update>
</mapper>
servlet-context.xml에 base-package를 com.example.demo로 설정했기에 무조건 그 패키지 밑에 작성해야 함!
SimpleUrlHandlerMapping → url패턴과 아이디(bean, 클래스 식별 아이디, 인스턴스변수)
<스프링4 - 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 />
<beans:bean id="url-mapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<beans:property name="mappings">
<beans:props>
<beans:prop key="/board/boardList.sp">board-controller</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="board-controller" class="com.example.demo.controller.BoardController">
<beans:property name="boardLogic" ref="board-logic" />
</beans:bean>
<!-- 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>
<context:component-scan base-package="com.example.demo" />
</beans:beans>
<스프링4 - spring-service.xml>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
>
<bean id="message-source" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages_ko_KR"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="ko">
</property></bean>
<bean id="board-logic" class="com.example.demo.logic.BoardLogic">
<property name="boardDao" ref="board-dao" />
</bean>
</beans>
<스프링4 - spring-data.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="data-source-target" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl11</value>
</property>
<property name="username">
<value>scott</value>
</property>
<property name="password">
<value>tiger</value>
</property>
</bean>
<!-- Transaction manager for a single JDBC DataSource -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="data-source-target"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="WEB-INF/mybatis-config.xml"/>
<property name="dataSource" ref="data-source-target"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="board-dao" class="com.example.demo.dao.BoardDao">
<property name="sqlSessionTemplate" ref="sqlSessionTemplate" />
</bean>
</beans>
<스프링4 - 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>
<typeAliases>
<typeAlias alias="BMVO" type="com.example.demo.vo.BoardMasterVO"/>
</typeAliases>
<mappers>
<mapper resource="com/mybatis/mapper/board.xml" />
</mappers>
</configuration>
<스프링4 - web.xml>
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/spring-service.xml,
/WEB-INF/spring/spring-data.xml
</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>*.sp</url-pattern>
</servlet-mapping>
</web-app>
pom.xml에 mybatis-spring만 넣어주니 못 찾아서 mybatis 추가하고 톰캣 서버에 mybatis-spring 1.3.3 jar파일을 넣어줌
<스프링4 -pom.xml>
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<name>dev_spring4</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>11</java-version>
<org.springframework-version>4.3.30.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.30.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.3</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
pojo step3
1) ActionSupport ← 요청이 .sp3으로 끝나면 DispatcherServlet이 받음
HttpServlet(표준서블릿)상속받음(pojo1은 FrontMVC1과 Action Servlet)
2) HandlerMapping
메소드 이름(req, res) → 스프링 4.3.30 방식
3) BoardController
servlet-context.xml에 등록
bean태그 안에 우리가 사용할 클래스들을 선언해 둠(id필요, 인스턴스변수)
4) BoardLogic
spring-service.xml에 등록
5) BoardDao
spring-data.xml에 등록
~여기까진 자바~
~여기부턴 MyBatis~
6) SqlSessionFactoryBean / SqlSessionTemplate
myBatis-config.xml → 오라클 드라이버 클래스, 서버 아이피주소, 포트번호, SID, 계정아이디, 계정비밀번호 들어있음
오라클서버와 연결통로 확보
스프링 컨테이너가 읽어야 함 → bean으로 등록
SqlSessionFactoryBean이 있어야 SqlSessionTemplate을 메모리에 올림 → DML(insert, update, delete, selectList, selectMap, selectOne)
7) 오라클 DB
다시 6 → 5 → 4 가다가 3번 BoardController에서
8) ModelAndView
9) XXX.jsp
응답페이지
<pojo step3 - HandlerMapping.java>
package com.pojo.step3;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class HandlerMapping {
static Logger logger = Logger.getLogger(HandlerMapping.class);
/***************************************
* @param upmu[](upmu[0]=업무명,폴더명 | upmu[1]=메소드명, 기능명, 페이지이름)
* @param request -> 1-1, 1-2와는 다르게 인터페이스를 implements하지 않는다
* @param response -> HttpServlet
* Q. 어디서 받아오는가?
* @return Object
***************************************/
public static Object getController(String[] upmu, HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
logger.info(upmu[0]+", "+upmu[1]);
Controller3 controller = null;
String path = null;
ModelAndView mav = null;
return null;
}
}
<pojo step3 - Controller3.java>
package com.pojo.step3;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Controller3 {
public Object boardList(HttpServletRequest req, HttpServletResponse res);
public Object boardDetail(HttpServletRequest req, HttpServletResponse res);
public Object boardInsert(HttpServletRequest req, HttpServletResponse res);
public Object boardUpdate(HttpServletRequest req, HttpServletResponse res);
public Object boardDelete(HttpServletRequest req, HttpServletResponse res);
}
<pojo step3 - Board3Controller.java>
package com.pojo.step3;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class Board3Controller implements Controller3 {
Logger logger = Logger.getLogger(Board3Controller.class);
Board3Logic boardLogic = new Board3Logic();
@Override
public ModelAndView boardList(HttpServletRequest req, HttpServletResponse res) {
logger.info("boardList 호출");
List<Map<String, Object>> bList = null;
bList = boardLogic.boardList();
return null;
}
@Override
public Object boardDetail(HttpServletRequest req, HttpServletResponse res) {
logger.info("boardDetail 호출");
return null;
}
@Override
public Object boardInsert(HttpServletRequest req, HttpServletResponse res) {
logger.info("boardInsert 호출");
return null;
}
@Override
public Object boardUpdate(HttpServletRequest req, HttpServletResponse res) {
logger.info("boardUpdate 호출");
return null;
}
@Override
public Object boardDelete(HttpServletRequest req, HttpServletResponse res) {
logger.info("boardDelete 호출");
return null;
}
}
<pojo step3 - ModelAndView.java>
package com.pojo.step3;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
/*
* spring4에서 제공되던 ModelAndView 흉내내기
* ModelAndView
* 1) scope가 request이다
* 2) 화면 이름을 정해준다
*/
public class ModelAndView {
Logger logger = Logger.getLogger(ModelAndView.class);
HttpServletRequest req = null;
// 캡슐화 코드는 반드시 getter/setter가 필요하다 -> 스프링부트는 Lombok대체
private String viewName = null;
List<Map<String, Object>> reqList = new ArrayList<>();
public ModelAndView() {
}
public ModelAndView(HttpServletRequest req) {
this.req = req;
}
public void addObject(String name, String obj) {
req.setAttribute(name, obj);
Map<String, Object> pMap = new HashMap<>();
pMap.put(name, obj);
reqList.add(pMap);
}
public String getViewName() {
return viewName;
}
public void setViewName(String viewName) {
this.viewName = viewName;
}
}
<pojo step3 - Board3Logic.java>
package com.pojo.step3;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
public class Board3Logic {
Logger logger = Logger.getLogger(Board3Logic.class);
Board3Dao boardDao = new Board3Dao();
public List<Map<String, Object>> boardList() {
logger.info("boardList 호출");
List<Map<String, Object>> bList = null;
bList = boardDao.boardList();
return bList;
}
}
<pojo step3 - Board3Dao.java>
package com.pojo.step3;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
public class Board3Dao {
Logger logger = Logger.getLogger(Board3Dao.class);
public List<Map<String, Object>> boardList() {
logger.info("boardList 호출");
return null;
}
}
<pojo step3 - ActionSupport.java>
package com.pojo.step3;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.pojo.step2.Board2Controller;
public class ActionSupport extends HttpServlet {
Logger logger = Logger.getLogger(ActionSupport.class);
protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
logger.info("doService 호출");
String uri = req.getRequestURI();
logger.info(uri); // /board/boardList.st2가 찍힘
String context = req.getContextPath();
logger.info(context); // "/" -> server.xml에 들어있음
String command = uri.substring(context.length() + 1);
System.out.println(command); // board/boardList.st2
int end = command.lastIndexOf(".");
System.out.println(end); // 15(board의 경우)
command = command.substring(0, end);
System.out.println(command); // board/boardList
String upmu[] = null; // upmu[0]=업무명(폴더명), upmu[1]=요청기능이름(메소드명)
upmu = command.split("/"); // /기준으로 문자열 잘라서 upmu 배열에 담기
logger.info(upmu[0] + ", " + upmu[1]);
// upmu req에 담기
req.setAttribute("upmu", upmu);
Object obj = ""; // null이 맞지만 String이 들어온다는 전제로 ""
try {
obj = HandlerMapping.getController(upmu, req, res);
} catch (Exception e) {
logger.info("Exception: " + e.toString());
}
// 페이지 이동처리 공통코드
// obj 형식 예시 -> redirect:XXX.jsp or forward:XXX.jsp
if (obj != null) {
String pageMove[] = null;
ModelAndView mav = null;
// obj가 String인 경우
if (obj instanceof String) {
// obj에 :이 포함된 경우
if (((String) obj).contains(":")) {
logger.info(": 포함되어 있음");
pageMove = obj.toString().split(":");
}
// obj에 :이 포함되지 않은 경우
else {
logger.info(": 포함되어 있지 않음");
pageMove = obj.toString().split("/");
}
logger.info("페이지이동 => " + pageMove[0] + ", " + pageMove[1]);
}
// obj가 ModelAndView인 경우
else if (obj instanceof ModelAndView) {
mav = (ModelAndView) obj;
pageMove = new String[2];
pageMove[0] = "forward";
pageMove[1] = mav.getViewName();
}
// pageMove가 null이 아닐 경우 각 방식으로 페이지 이동처리
if (pageMove != null) {
// pageMove[0] = redirect or forward
// pageMove[1] = XXX.jsp
String path = pageMove[1];
// pageMove[0]이 redirect
if ("redirect".equals(pageMove[0])) {
res.sendRedirect(path);
}
// pageMove[0]이 forward
else if ("forward".equals(pageMove[0])) {
RequestDispatcher view = req.getRequestDispatcher("/" + path + ".jsp");
view.forward(req, res);
}
// 그외 forward 처리
else {
path = pageMove[0] + "/" + pageMove[1];
RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/view" + path + ".jsp");
view.forward(req, res);
}
}
} // end of 페이지 이동처리 공통코드
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
logger.info("doGet호출");
doService(req, res);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
logger.info("doPost호출");
doService(req, res);
}
}
<pojo step3 - web.xml>
<servlet>
<servlet-name>FrontController3</servlet-name>
<servlet-class>com.pojo.step3.ActionSupport</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FrontController3</servlet-name>
<url-pattern>*.st3</url-pattern>
</servlet-mapping>