MyBatis 실습

brave_chicken·2024년 5월 12일

잇(IT)생 챌린지

목록 보기
45/90

실습

설정

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.multi</groupId>
	<artifactId>erp</artifactId>
	<name>erp</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.2.7.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>
				
		<!-- 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>javax.servlet-api</artifactId>
			<version>4.0.1</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.13.2</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>5.2.7.RELEASE</version>
			<scope>test</scope>
		</dependency>
		
		<!-- spring jdbc -->      
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>5.2.7.RELEASE</version>
		</dependency>
		 <!-- 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> 
		<!-- HikariCP (커넥션풀을 위한라이브러리)-->
		<dependency>
		    <groupId>com.zaxxer</groupId>
		    <artifactId>HikariCP</artifactId>
		    <version>3.4.5</version>
		</dependency>
		<!-- tiles라이브러리 -->
		<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-jsp -->
		<dependency>
		    <groupId>org.apache.tiles</groupId>
		    <artifactId>tiles-jsp</artifactId>
		    <version>3.0.8</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-servlet -->
		<dependency>
		    <groupId>org.apache.tiles</groupId>
		    <artifactId>tiles-servlet</artifactId>
		    <version>3.0.8</version>
		</dependency>  
		<!-- dto를 편하게 사용하기 위한 라이브러리(롬복) -->
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
		    <version>1.18.24</version>
		    <scope>provided</scope>
		</dependency>
		<!-- mybatis 사용을 위한 라이브러리 -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.5.7</version>
		</dependency>
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>2.0.6</version>
		</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.8</source>
                    <target>1.8</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>

spring-config.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 -->
	<!-- 이미지파일,css,js등 리소스 경로 -->
	<resources mapping="/resources/**" location="/resources/" />
	<resources mapping="/images/**" location="/WEB-INF/static/images/" />
	<resources mapping="/common/css/**" location="/WEB-INF/static/common/css/" />
	<resources mapping="/common/js/**" location="/WEB-INF/static/common/js/" />


	<!-- 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/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="2"/>
	</beans:bean>
	
	<!-- annotation을 사용하기 위해서 스프링 IoC컨테이너가 스캔할 패키지 등록 -->
	<context:component-scan base-package="com.multi.erp" />
	<context:component-scan base-package="main"/>
	<context:component-scan base-package="test"/>
	
	<!-- =====================스프링jdbc연동을 위해서 필요한 라이브러리===================== -->
	<!-- jdbc에서 DriverManager방식으로 커넥션을 생성해서 관리(요청이 들어오면 커넥션을 만들어서 넘겨주는 방식) -->
	<!-- <beans:bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<beans:property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
		<beans:property name="username" value="erp"/>
		<beans:property name="password" value="erp"/>
	</beans:bean> -->
	<!-- 커넥션풀을 위한 설정정보 -->
	<beans:bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<beans:property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
		<beans:property name="username" value="erp"/>
		<beans:property name="password" value="erp"/>
		<beans:property name="maximumPoolSize" value="15"/>
	</beans:bean>
	<beans:bean id="ds" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
		<beans:constructor-arg ref="hikariConfig"/>
	</beans:bean>
	<!-- sql을 실행할 수 있는 기능을 제공하는 클래스 -->
	<beans:bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
		<beans:constructor-arg ref="ds"/>
	</beans:bean>
	
	<!-- ==========tiles를 기반으로 뷰정보를 만들수있도록 ViewResolver등록========== -->
	<!-- 1. tiles설정파일을 스프링 내부에서 인식할 수 있도록 등록 -->
	<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
		<beans:property name="definitions">
			<beans:list>
				<beans:value>/WEB-INF/**/*-tiles.xml</beans:value>
			</beans:list>
		</beans:property>
	</beans:bean>
	<!-- 2. tiles기반으로 뷰를 만들수있도록 ViewResolver등록 -->
	<beans:bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
		<beans:property name="order" value="1"/>
	</beans:bean>
	
	<!--===============================MyBatis사용을 위해서 필요한 라이브러리==============================  -->
	<beans:bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<beans:property name="dataSource" ref="ds"/>
		<beans:property name="configLocation" value="/WEB-INF/config/mybatis-config.xml"/>
	</beans:bean>
	<!-- MyBatis의 핵심클래스(sql을 실행하기 위한 기능을 제공) -->
	<beans:bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<beans:constructor-arg ref="sessionFactory"/>
	</beans:bean>
</beans:beans>

config-tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
	<definition name="indexTemplate" template="/WEB-INF/layout/index.jsp">
		<put-attribute name="top" value="/WEB-INF/include/top.jsp"/>
		<put-attribute name="content" value="/WEB-INF/include/mainContent.jsp"/>
	</definition>
	<definition name="mainTemplate" template="/WEB-INF/layout/mainLayout.jsp">
		<put-attribute name="top" value="/WEB-INF/include/top.jsp"/>
		<put-attribute name="menu" value="/WEB-INF/menu/pub_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/emp/login.jsp"/>
	</definition>
	<definition name="index" extends="indexTemplate"></definition>
</tiles-definitions>

mybatis-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>
	<!-- MyBatis내부에서 사용할 DTO와 Mapper를 등록 -->
	<typeAliases>
		<typeAlias type="com.multi.erp.board.BoardDTO" alias="board"/>
		<typeAlias type="com.multi.erp.member.MemberDTO" alias="member"/>
	</typeAliases>
	<mappers>
		<mapper resource="mapper/board.xml"/>
		<mapper resource="mapper/member.xml"/>
	</mappers>
</configuration>

boardlist 게시판 with MyBatis, jstl

http://localhost:8089/erp/board/list?category=all

board.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.multi.erp.board">
	<select id="selectall" resultType="board">
		select * from tbboard
	</select>
	<select id="categorySelect" parameterType="String" resultType="board">
		select * from tbboard where category=#{category}
	</select>
	<!-- #{}로 변수를 연결하면 PreparedStatement의 ?와 연결 -->
	<select id="insert" parameterType="board">
		insert into tbboard
		values(tbboard_seq.nextval, #{id}, #{title}, #{content}, sysdate, #{category})
	</select>
	
	<select id="search" parameterType="String" resultType="board">
		select * from tbboard where title like '%' || #{title} || '%'
	</select>
	
	<select id="read" parameterType="String" resultType="board">
		select * from tbboard where board_no = #{board_no}		
	</select>
	<select id="delete" parameterType="String">
		delete from tbboard where board_no = #{board_no}		
	</select>
	<select id="update" parameterType="board">
		update tbboard 
		set category = #{category}, title = #{title}, content = #{content}
		where board_no = #{board_no}		
	</select>
	<!-- where절을 태그로 표현할 수 있다. 조건이 있는 경우는 where를 생성하고
			조건이 없는 경우는 where태그가 추가되지 않도록 처리 -->
	<select id="dynamicSearch" parameterType="Map" resultType="board">
		select * from tbboard 
		<where>
			<if test="tag=='title' and data!=''">
				title like '%' || #{data} || '%'
			</if>
			<if test="tag=='id' and data!=''">
				id like '%' || #{data} || '%'
			</if>
			<if test="tag=='content' and data!=''">
				content like '%' || #{data} || '%'
			</if>
			<if test="tag=='write_date' and data!=''">
				<!-- trunc(write_date) &lt;= #{data} -->
				<![CDATA[
					trunc(write_date) <= #{data}
				]]>
			</if>
		</where>	
	</select>
</mapper>

board-tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
	<definition name="board/list" extends="mainTemplate">
		<put-attribute name="menu" value="/WEB-INF/menu/board_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/board/boardlist.jsp"/>
	</definition>
	<definition name="board/writepage" extends="mainTemplate">
		<put-attribute name="menu" value="/WEB-INF/menu/board_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/board/board_write.jsp"/>
	</definition>
	<definition name="board/read" extends="mainTemplate">
	<put-attribute name="menu" value="/WEB-INF/menu/board_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/board/board_read.jsp"/>
	</definition>
	<definition name="board/update" extends="mainTemplate">
		<put-attribute name="menu" value="/WEB-INF/menu/board_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/board/board_update.jsp"/>
	</definition>
</tiles-definitions>

BoardController

@Controller
@RequestMapping("/board")
public class BoardController {
	private BoardService service;
	@Autowired
	public BoardController(BoardService service) {
		super();
		this.service = service;
	}
	@GetMapping("/list")
	public ModelAndView list(String category) {
		System.out.println(category+"========");
		ModelAndView mav = new ModelAndView("board/list");
		System.out.println("컨트롤러");
		//서비스메소드를 호출
		List<BoardDTO> boardlist = service.findByCategory(category);
		System.out.println(boardlist);
		//데이터공유
		mav.addObject("boardlist", boardlist);
		mav.addObject("category", category);
		return mav;
	}
	@GetMapping("/write")
	public String write() {
		return "board/writepage";//뷰이름
	}
	
	@PostMapping("/write")
	public String insert(BoardDTO board) {
		service.insert(board);
		return "redirect:/board/list?category=all";
	}
	
	//동적쿼리를 테스트
	//사용자가 select에서 어떤 option을 선택하냐에 따라 다른 쿼리가 실행되ㅓㅇ야한다.
	@PostMapping("/search")
	public ModelAndView search(String tag, String search) {
		ModelAndView mav = new ModelAndView("board/list");
		System.out.println("컨트롤러");
		//서비스메소드를 호출
		List<BoardDTO> boardlist = service.search(tag,search);
		System.out.println(boardlist);
		//데이터공유
		mav.addObject("boardlist", boardlist);
		return mav;
	}
	
	//Model타입의 변수를 매개변수에 정의하면 스프링내부에서 데이터를 담을 수 있는 모델객체를 만들어서 넘겨준다.
	@GetMapping("/read")
	public String read(String board_no, String action, Model model) {
		BoardDTO board = service.getBoardInfo(board_no);
		String view = "";
		if(action.equals("READ")) {
			view = "board/read";
		}else {
			view = "board/update";
		}
		System.out.println(board);
		//스프링이 만들어준 모델객체에 공유할 데이터를 공유한다.
		model.addAttribute("board", board);
		//모델객체에 데이터를 공유했으므로 뷰정보만 리턴
		//=>리턴되면서 DispatcherServlet에 ModelAndView객체로 만들어져서 리턴된다.
		return view;
	}
	@GetMapping("/delete")
	public String delete(String board_no) {
		service.delete(board_no);
		return "redirect:/board/list?category=all";
	}
	@PostMapping("/update")
	public String update(BoardDTO board) {
		service.update(board);
		return "redirect:/board/list?category=all";
	}
}

BoardDAOImpl

@Repository
public class BoardDAOImpl implements BoardDAO {
	//MyBatis의 핵심클래스로 이 클래스가 지원하는 기능을 이용해서 sql을 실행
	SqlSession sqlSessionTemplate;
	
	@Autowired
	public BoardDAOImpl(SqlSession sqlSessionTemplate) {
		super();
		this.sqlSessionTemplate = sqlSessionTemplate;
	}

	@Override
	public int insert(BoardDTO board) {
		return sqlSessionTemplate.insert("com.multi.erp.board.insert",board);
	}

	@Override
	public List<BoardDTO> boardList() {
		System.out.println("boardDAO");
		//SqlSession의 selectList는 여러개의 레코드를 반환하는 sql명령문을 실행하기 위해 제공되는 메소드
		//이므로 List<DTO>를 반환한다.
		//selectList등의 SqlSession에서 제공되는 sql문을 실행하기 위한 메소드는 statement를 매개변수로 정의
		//statement가 매퍼에 정의한 sql문을 구분하는 id명
		//네임스페이스명.id명
		//외부에서 입력하는 값이 있는 경우 값을 매개변수로 전달
		return sqlSessionTemplate.selectList("com.multi.erp.board.selectall");
	}

	@Override
	public BoardDTO read(String board_no) {
		return sqlSessionTemplate.selectOne("com.multi.erp.board.read", board_no);
	}

	@Override
	public int update(BoardDTO board) {
		return sqlSessionTemplate.update("com.multi.erp.board.update", board);
	}

	@Override
	public int delete(String board_no) {
		return sqlSessionTemplate.delete("com.multi.erp.board.delete", board_no);
	}

	@Override
	public List<BoardDTO> search(String data) {
		return sqlSessionTemplate.selectList("com.multi.erp.board.search", data);
	}

	//동적 sql처리
	//dto에 담기지 않는 매개변수 2개를 마이바티스로 넘기기
	@Override
	public List<BoardDTO> search(String tag, String data) {
		List<BoardDTO> list = null;
		Map<String,String> map = new HashMap<>();
		map.put("tag", tag);
		map.put("data", data);
		list = sqlSessionTemplate.selectList("com.multi.erp.board.dynamicSearch", map);
		return list;
	}

	@Override
	public List<BoardDTO> findByCategory(String category) {
		return sqlSessionTemplate.selectList("com.multi.erp.board.categorySelect", category);
	}

}

BoardServiceImpl

//BoardDAO의 메소드 호출
//컨트롤러에서 받은 데이터를 가공해서 DAO로 넘기거나 DAO에서 받은 데이터를 가공해서 컨트롤러로 넘기는 작업
//비지니스로직
//트랜잭션처리

@Service
public class BoardServiceImpl implements BoardService {
	private BoardDAO dao;
	@Autowired
	public BoardServiceImpl(BoardDAO dao) {
		super();
		this.dao = dao;
	}

	@Override
	public int insert(BoardDTO board) {
		return dao.insert(board);
	}

	@Override
	public List<BoardDTO> boardList() {
		System.out.println("boardService");
		List<BoardDTO> boardlist = dao.boardList();
		return boardlist;
	}

	@Override
	public BoardDTO getBoardInfo(String board_no) {
		BoardDTO dto = dao.read(board_no);
		return dto;
	}

	@Override
	public int update(BoardDTO board) {
		return dao.update(board);
	}

	@Override
	public int delete(String board_no) {
		return dao.delete(board_no);
	}

	@Override
	public List<BoardDTO> search(String data) {
		return dao.search(data);
	}

	@Override
	public List<BoardDTO> search(String tag, String data) {
		return dao.search(tag,data);
	}

	@Override
	public List<BoardDTO> findByCategory(String category) {
		//조건을 판단해서 dao의 적절한 메소드를 호출하기 - 비즈니스로직
		List<BoardDTO> list = null;
		if(category!=null) {
			if(category.equals("all")) {
				list = dao.boardList();
			}else {
				list = dao.findByCategory(category);
			}
		}
		return list;
	}

}

top.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="/erp/common/css/main.css" />
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<style>
	/* Remove the navbar's default margin-bottom and rounded borders */
	.navbar {
		margin-bottom: 0;
		border-radius: 0;	
	}
	/*  #toparea{
		padding: 30px;
	}  */
	/* body{
		background-color: #edeef1
	} */
</style>
<title>Insert title here</title>
</head>
<body>

	<div style="height:90px" style="padding:10px">
		<div id="toparea"  class="navbar navbar-inverse">
			<a href="#" style="position:absolute;top:30px;font-size: 18pt; font-weight: bolder;text-decoration: none;padding-left: 10px">KimSaemERP</a>
			<ul class="nav navbar-nav navbar-right" 
			 style="position:relative ;top:20px" >
				<c:choose>
					<c:when test="${user==null }">
						<li style="margin-right: 20px;height: 70px">
						<a href="/erp/emp/login.do"><span class="glyphicon glyphicon-log-in">
								</span>Login</a></li>
						</ul>
					</c:when>
					<c:otherwise>
							<li><a href="/erp/schedule/list"><span class="glyphicon glyphicon-log-out"></span>
									나의스케쥴</a></li>
							<li><a href="/erp/member/logout"><span class="glyphicon glyphicon-log-out"></span>
									Logout</a></li>
						</ul>
						
						<span  class="navbar-form pull-right" >	
							<img  class="img-circle" style="width: 60px;height: 70px"
										src="/erp/images/${user.profile_photo }"  />
						</span> 
					</c:otherwise> 
				</c:choose>
			<form class="navbar-form pull-right" style="position:relative ;top:20px">
				<input class="form-control mr-sm-2" type="search"
					placeholder="Search" aria-label="Search">
				<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
				
			</form>
			
		</div>
		
	</div>
	<nav>
	<div class="container-fluid">
			<div class="collapse navbar-collapse" id="myNavbar">
				<ul class="nav navbar-nav">
					<li class="active"><a href="#">Home</a></li>
					<li><a href="/erp/menu/insa.do">업무관리</a></li>
					<li><a href="#">자원관리</a></li>
					<li><a href="/erp/board/list?category=all">커뮤니티</a></li>
					<li><a href="#">일정관리</a></li>
					<li><a href="#">휴가관리</a></li>
					<li><a href="#">결재</a></li>
				</ul>

			</div>
		</div>
	</nav>
</body>
</html>

boardlist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap Example</title>
<meta charset="UTF-8">
<link rel="stylesheet"
	href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
	src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript">
	//JQuery를 이용해서 select에서 선택을 하면 컨트롤러가 요청되도록 처리
	let category = "${category}";//컨트롤러를 요청하고 response될때 공유해준 값을 가져와서 EL로 셋팅
	$(document).ready(function () {
		//alert("컨트롤러가 공유한 데이터=>"+category);
		//console.log("컨트롤러가 공유한 데이터=>"+category);
		//선택된거에 셀렉티드속성을 주는..느낌?
		//select에서 선택된 option에 selected속성을 추가
		$("#category").val(category).attr("selected","selected")
		$("#category").change(function() {
			//select가 변경되는 change이벤트가 발생하면 컨트롤러를 호출
			//alert($(this).val())
			location.href="/erp/board/list?category="+$(this).val()
		})
	});
	
</script>
</head>
<body>
	<div style="padding-top: 30px">
		<div class="col-md-3" style="padding-bottom: 10px">
		    구분:
			<form action="">
				<select name="category"  id="category">
					<option value="all">전체게시물</option>
					<option value="경조사">경조사</option>
					<option value="사내소식">사내소식</option>
					<option value="게시판">게시판</option>
				</select>
			</form>
		</div>
		<table class="table">
			<thead>
				<tr>
					<th>번호</th>
					<th>제목</th>
					<th>작성자</th>
					<th>등록일</th>
					<th>삭제</th>
				</tr>
			</thead>
			<tbody>
				<c:forEach var="board" items="${boardlist }">
					<tr>
						<td>${board.board_no }</td>
						<td><a href="/erp/board/read?board_no=${board.board_no }&action=READ">${board.title }</a></td>
						<td>${board.id }</td>
						<td>${board.write_date }</td>
						<td><a href="/erp/board/delete?board_no=${board.board_no }">삭제</a></td>
					</tr>
					
				</c:forEach>
			</tbody>
		</table>
	</div>
	<form action="/erp/board/search" method="post">
		<select name="tag">
			<option value="id">작성자</option>
			<option value="title">제목</option>
			<option value="content">본문</option>
			<option value="write_date">작성일</option>
		</select> <input type="text" name="search" /> <input type="submit" value="검색">
		<ul class="nav navbar-nav navbar-right">
			<li><a href="/erp/board/write" style="text-align: right;">글쓰기</a></li>
		</ul>
	</form>

</body>
</html>

board_write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link href="/springmvc/common/css/font-awesome.css" rel="stylesheet" />
<!-- Custom styles for this template -->

<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
	<h4>
		<i class="fa fa-angle-right"></i> 게시글 작성하기
	</h4>
	<hr>
	<div class="row mt">
		<div class="col-lg-12">
			<div class="form-panel">
			
				<form class="form-horizontal style-form" 
					action="/erp/board/write" method="post">
					<div class="form-group" style="border: 1px solid #eff2f7;">
						
						<label class="col-sm-2 col-sm-2 control-label">작성자</label>
						<div class="col-sm-10">
							<input type="hidden" name="id" value="lee">
							<p class="form-control-static">김서연</p>
						</div>
						<div class="form-group">
							<label class="col-sm-2 col-sm-2 control-label">게시글 유형</label>

							<div class="col-sm-5">
								<select name="category" class="form-control">
									<option value="경조사">경조사</option>
									<option value="사내소식">사내소식</option>
									<option value="게시판">게시판</option>
								</select>
							</div>
						</div>
						<div class="form-group">
							<label class="col-sm-2 col-sm-2 control-label">제목</label>
							<div class="col-sm-8">
								<input type="text" class="form-control"
										 name="title">
								<span class="help-block">게시글 유형에 맞는 내용으로 작성 부탁드립니다. </span>
							</div>
						</div>
						<div class="form-group">
							<label class="col-sm-2 col-sm-2 control-label">내용</label>
							<div class="col-sm-8">
								<textarea id="content"
									style="width: 100%; border: 1; overflow: visible; text-overflow: ellipsis;"
									rows=15 name="content">글작성</textarea>

							</div>
						</div>
						<div class="form-group">
							<div class="col-lg-4 text-center"></div>
							<div class="col-lg-2 text-center">
								<button type="submit" class="btn btn-success"
									style="width: 100px; background-color: #0ea006">등록</button>
							</div>
							<div class="col-lg-2 text-center">
								<button type="reset" class="btn btn-default"
									style="width: 100px; background-color: #9a9a9a">취소</button>
							</div>
						
						</div>
					</div>
				</form>
			</div>
		</div>
	</div>
</body>
</html>

board_read.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" session="true"%>

<!DOCTYPE>
<html>
<head>
<title>인사관리시스템</title>
<link rel="stylesheet"
	href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
	src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript">
	$(document).ready(function () {
		let category = "${board.category}";
		$("#category").val(category).attr("selected","selected")
	});
	

</script>
</head>
<body>

	<form class="form-horizontal" 
		action="" 
		method="post" >

		
		<div class="form-group">
			<div class="col-md-2 text-right">
				<label for="id" class="control-label">번호</label>
			</div>
			<div class="col-md-8">${board.board_no }</div>
		</div>
		<div class="form-group">
			<div class="col-md-2 text-right">
				<label for="id" class="control-label">게시글종류</label>
			</div>
			<div class="col-md-3">
				<select name="category" class="form-control" 
							id="category">
					<option value="경조사" >경조사</option>
					<option value="사내소식">사내소식</option>
					<option value="게시판">게시판(익명)</option>
				</select>
			</div>
		</div>
		<div class="form-group">
			<div class="col-md-2 text-right">
				<label for="id" class="control-label">작성자</label>
			</div>
			<div class="col-md-8">${board.id }</div>
		</div>
		<div class="form-group">
			<div class="col-md-2 text-right">
				<label for="title" class="control-label">제목</label>
			</div>
			<div class="col-md-8">${board.title }</div>
		</div>
		<div class="form-group">
			<div class="col-md-2 text-right">
				<label for="title" class="control-label">작성날짜</label>
			</div>
			<div class="col-md-8">${board.write_date }</div>
		</div>
		<div class="form-group">
			<div class="col-md-2 text-right">
				<label for="text" class="control-label">내용</label>
			</div>
			<div class="col-md-8"
				style="width: 500px; height: 400px; border: solid 1px;">
				${board.content }
				</div>
		</div>

		<div class="form-group">
			<div class="col-md-10 text-center">
				<input type="button" class="btn btn-lg btn-primary" 
				value="수정"
				onclick="location.href='/erp/board/read?board_no=${board.board_no }&action=UPDATE'">

				<button type="button" class="btn btn-danger btn-lg"
					onclick="location.href='/erp/board/list?category=all'">
					<i class="fa fa-fw fa-close"></i> 목록
				</button>
				<button type="button" class="btn btn-danger btn-lg"
					id="deletebtn"
					onclick="location.href='/erp/board/delete?board_no=${board.board_no }'">
					<i class="fa fa-fw fa-close"></i> 삭제
				</button>
			</div>
		</div>
	</form>

</body>
</html>

board-update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link href="/springmvc/common/css/font-awesome.css" rel="stylesheet" />
<!-- Custom styles for this template -->

<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<script type="text/javascript">
	$(document).ready(function(){
		data = "${board.category}"
		$("#category").val(data).attr("selected","selected");
	});

</script>
<body>
	
	<h4>
		<i class="fa fa-angle-right"></i> 게시글 수정하기
	</h4>
	<hr>
	<div class="row mt">
		<div class="col-lg-12">
			<div class="form-panel">

				<form class="form-horizontal style-form"
				 action="/erp/board/update"  method="post">
					<div class="form-group">
						<div class="col-md-2 text-right">
							<label for="id" class="control-label">번호</label>
						</div>
						<div class="col-md-8">${board.board_no }</div>
					</div>
					<input type="hidden" name="board_no" value="${board.board_no }">
					<div class="form-group">
						<div class="col-md-2 text-right">
							<label for="id" class="control-label">게시글종류</label>
						</div>
						<div class="col-md-3">
							<select name="category" class="form-control" id="category">
								<option value="경조사">경조사</option>
								<option value="사내소식">사내소식</option>
								<option value="게시판">게시판</option>
							</select>
						</div>
					</div>
					<div class="form-group" style="border: 1px solid #eff2f7;">
						<label class="col-sm-2 col-sm-2 control-label">작성자</label>
						<div class="col-sm-10">

							<p class="form-control-static">
								${board.id}
							</p>
						</div>
					
						<div class="form-group">
							<label class="col-sm-2 col-sm-2 control-label">제목</label>
							<div class="col-sm-8">
								<input type="text" class="form-control" name="title" value="${board.title }"> <span
									class="help-block">게시글 유형에 맞는 내용으로 작성 부탁드립니다. </span>
							</div>
						</div>
						<div class="form-group">
							<label class="col-sm-2 col-sm-2 control-label">내용</label>
							<div class="col-sm-8">
								<textarea id="content"
									style="width: 100%; border: 1; overflow: visible; text-overflow: ellipsis;"
									rows=15 name="content">${board.content }</textarea>

							</div>
						</div>
						<div class="form-group">
							<div class="col-lg-4 text-center"></div>
							<div class="col-lg-2 text-center">
								<button type="submit" class="btn btn-success"
									style="width: 100px; background-color: #0ea006">수정</button>
							</div>
							<div class="col-lg-2 text-center">
								<button type="reset" class="btn btn-default"
									style="width: 100px; background-color: #9a9a9a">취소</button>
							</div>

						</div>
					</div>
				</form>
			</div>
		</div>
	</div>
</body>
</html>

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

0개의 댓글