<c:forEach items="${ test.numbers }" var="num">

	<c:forEach items="${ num.vec }" var="vec">

	<td>${ vec }</td>

	</c:forEach>

</c:forEach>

스프링 Controller에서 Model에 배열 데이터를 담아서 View로 전달한다면

View에서는 jstl forEach 구문을 이용해서 접근할 수 있다.

 

<c:forEach items="${ test.numbers }" var="num">

	<td>${ num }</td>



</c:forEach>

 

물론 이중구문을 이용해 배열안의 배열까지 접근이 가능하다.

 

 

forEach 구문을 사용안하고 배열 중 한 요소만을 출력하고자 한다면 다음과 같이 작성하면된다.

	<c:out value="${ test.num[1] }" />

num배열에서 2번째 요소가 출력된다.

 

배열 사이즈를 알고 싶을때는 다음과 같이 작성한다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

	<c:out value="${fn:length(test.num)}" />

Criteria.java

package com.peta.domain;

public class Criteria {
	private int page;
	private int perPageNum;
	private int groupnum;
	
	
	
	public int getGroupnum() {
		return groupnum;
	}

	public void setGroupnum(int groupnum) {
		this.groupnum = groupnum;
	}

	public Criteria() {
		this.page =1;
		this.perPageNum =10;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		
		if(page <= 0) {
			this.page = 1;
			return;
		}
		this.page = page;
	}

	public int getPerPageNum() {
		return this.perPageNum;
	}

	public void setPerPageNum(int perPageNum) {
		
		if(perPageNum <=0 || perPageNum >100) {
			this.perPageNum = 10;
		}
		this.perPageNum = perPageNum;
	}

	public int getPageStart() {
		return (this.page - 1) * perPageNum;
	}

	@Override
	public String toString() {
		return "Criteria [page=" + page + ", perPageNum=" + perPageNum + "]";
	}
	

	 
	
	
}

 

SearchCriteria.java

package com.peta.domain;

public class SearchCriteria extends Criteria{
	private String searchType;
	private String keyword;

	
	
	

	public String getSearchType() {
		return searchType;
	}
	public void setSearchType(String searchType) {
		this.searchType = searchType;
	}
	public String getKeyword() {
		return keyword;
	}
	public void setKeyword(String keyword) {
		this.keyword = keyword;
	}
	@Override
	public String toString() {
		return "SearchCriteria [searchType=" + searchType + ", keyword=" + keyword + "]";
	}


	
	
}

 

PageMaker.java

package com.peta.domain;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

public class PageMaker {
	private int totalCount;
	private int startPage;
	private int endPage;
	private boolean prev;
	private boolean next;
	
	
	//한화면에 보이는 페이지 갯수
	private int displayPageNum =10;
	
	private Criteria cri;

	public void setCri(Criteria cri) {
		this.cri =cri;
	}
	
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
		
		calcData();
	}
	
	private void calcData() {
		endPage = (int) (Math.ceil(cri.getPage() / (double) displayPageNum) * displayPageNum);
		
		startPage = (endPage-displayPageNum) + 1;
		
		int tempEndPage = (int) (Math.ceil(totalCount / (double) cri.getPerPageNum()));
		
		if (endPage > tempEndPage) {
			endPage = tempEndPage;
		}
		
		prev = startPage == 1? false:true;
		
		next = endPage * cri.getPerPageNum() >= totalCount ? false :true;
	}
	


	public int getStartPage() {
		return startPage;
	}

	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}

	public int getEndPage() {
		return endPage;
	}

	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}

	public boolean isPrev() {
		return prev;
	}

	public void setPrev(boolean prev) {
		this.prev = prev;
	}

	public boolean isNext() {
		return next;
	}

	public void setNext(boolean next) {
		this.next = next;
	}

	public int getDisplayPageNum() {
		return displayPageNum;
	}

	public void setDisplayPageNum(int displayPageNum) {
		this.displayPageNum = displayPageNum;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public Criteria getCri() {
		return cri;
	}

	@Override
	public String toString() {
		return "PageMaker [totalCount=" + totalCount + ", startPage=" + startPage + ", endPage=" + endPage + ", prev="
				+ prev + ", next=" + next + ", displayPageNum=" + displayPageNum + ", cri=" + cri + "]";
	}
	
	public String makeQuery(int page) {
		UriComponents uriComponents =
				UriComponentsBuilder.newInstance()
				.queryParam("page", page)
				.queryParam("perPageNum", cri.getPerPageNum())
				.build();
		
		return uriComponents.toUriString();
	}
	
	public String makeSearch(int page) {
		UriComponents uriComponents =
				UriComponentsBuilder.newInstance()
				.queryParam("page", page)
				.queryParam("perPageNum", cri.getPerPageNum())
				.queryParam("groupnum", cri.getGroupnum())
				.queryParam("searchType", ((SearchCriteria) cri).getSearchType())
				.queryParam("keyword", encoding(((SearchCriteria) cri).getKeyword())).build();
		
		return uriComponents.toUriString();
	}
	
	private String encoding(String keyword) {
		if(keyword ==null || keyword.trim().length() ==0) {
			return "";
		}
		
		try {
			return URLEncoder.encode(keyword,"UTF-8");
		}catch(UnsupportedEncodingException e) {
		return "";
		}
	}
	
	
}

 


 

Mapper.xml

 

특이사항 : if 문의 입력을 and 로 시작시키기위해 favnum >0 을 미리 조건을 준다. CDATA 사용

 <select id="listCriteria" resultType="com.peta.domain.UrlVO">
<![CDATA[
 select favnum,url,memo,userid,groupnum,nowdate from fav_list where favnum > 0
 ]]>
 <if test="groupnum != 0">
 and groupnum = #{groupnum}
 </if>
  
 <if test="searchType != null">
 	<if test="searchType == 'u'.toString()">
 		and url like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'm'.toString()">
 		and memo like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'um'.toString()">
 		and (url like CONCAT('%', #{keyword}, '%') OR memo like CONCAT('%', #{keyword}, '%')) 
 	</if>
 </if>
 order by favnum desc 
 limit #{pageStart},#{perPageNum}
 </select>
 

 
 <select id="countPaging" resultType="int">
 <![CDATA[
 select count(favnum) from fav_list where favnum > 0 
 ]]>
 <if test="groupnum != 0">
 AND groupnum = #{groupnum}
 </if>
  <if test="searchType != null">
 	<if test="searchType == 'u'.toString()">
 		and url like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'm'.toString()">
 		and memo like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'um'.toString()">
 		and (url like CONCAT('%', #{keyword}, '%') OR memo like CONCAT('%', #{keyword}, '%')) 
 	</if>
 </if>
 </select>

DAO

public List<CodeVO> listCriteria(Criteria cri) throws Exception;
public int countPaging(Criteria cri) throws Exception;

 

DAOImpl

	@Override
	public List<CodeVO> listCriteria(Criteria cri) throws Exception{
		return session.selectList(namespace+".listCriteria",cri);
	}
	@Override
	public int countPaging(Criteria cri) throws Exception{
		return session.selectOne(namespace+".countPaging",cri);
	}

 

Service

public List<CodeVO> listCriteria(Criteria cri) throws Exception;
public int countPaging(Criteria cri) throws Exception;

ServiceImpl

	@Override
	public List<CodeVO> listCriteria(Criteria cri) throws Exception{
		return dao.listCriteria(cri);
	}
	@Override
	public int countPaging(Criteria cri) throws Exception{
		return dao.countPaging(cri);
	}

 

jsp page

	<div class="container">
		<ul class="pagination justify-content-center">
			<c:if test="${pageMaker.prev}">
				<li class="page-item"><a class="page-link" href="list${pageMaker.makeSearch(pageMaker.startPage -1)}">Previous</a></li>
			</c:if>
			
			<c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="idx">
				<li class="page-item <c:out value="${pageMaker.cri.page == idx?'class = active':''}"/>" >
				<a class="page-link" href="list${pageMaker.makeSearch(idx)}">${idx}</a>
				</li>
			</c:forEach>
				<c:if test="${pageMaker.next && pageMaker.endPage > 0}">
					<li><a class="page-link" href="list${pageMaker.makeSearch(pageMaker.endPage +1)}">Next</a></li>
				</c:if>
		</ul>
	</div>

 

 

Controller

    @RequestMapping(value="/code", method= {RequestMethod.GET,RequestMethod.POST})
    public String codeGroupList(Model model,CodeVO vo,SearchCriteria cri) throws Exception {
    	logger.info("Code Group list start................");
    	String codeType = "code";
		int groupnum = vo.getGroupnum();
		
		model.addAttribute("nowgroupnum",groupnum);
    	model.addAttribute("codeGroup",service.codeGroupList());
    	model.addAttribute("codeType",codeType);
    	model.addAttribute("list",service.listCriteria(cri));
    	model.addAttribute("groupcount",service.groupCount(groupnum));
    	model.addAttribute("nowgroupname",service.groupName(groupnum));
		PageMaker pageMaker = new PageMaker();
		pageMaker.setCri(cri);
		model.addAttribute("cri",cri);
		pageMaker.setTotalCount(service.countPaging(cri));
		model.addAttribute("pageMaker",pageMaker);
        return "codeboard/codeList.page";
    }
    

 

Tiles Framework란?


Tiles는 웹페이지의 상단메뉴나 좌측메뉴, 공통 파일 include 등의 반복적인 부분을 한 곳에서 깔끔하게 관리할 수 있게 도와주는 템플릿 프레임워크 입니다.

 

https://tiles.apache.org/

위 URL은 Tiles Framework의 공식 사이트입니다.

Tutorial과 API문서가 상세하게 잘 나와있지만 영어라 그런지 보기가 쉽지 않습니다.

공식 사이트를 보고 따라하기 어려운 분만 아래 내용을 참고해주시면 되겠습니다.

 

 

Step 0. 최소 요구사항 확인


※ 현재 최종 버전인 3.08 버전 기준입니다.

※ Spring STS 플러그인의 Spring MVC Project 예제에 Tiles를 연동하는 방법을 기술 한 것입니다. 프로젝트 구성 별로 설정파일명이 다를 수 있습니다.

 

- JSTL 필요

* STS를 사용하고 있다면 기본적으로 탑재되어 있고, 그렇지 않다면 JSTL Dependency를 Maven에 추가해줘야 함.

* JSTL이 없으면 아래와 같은 에러 발생

HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

- JDK 1.7 이상

- Servlet 2.5 이상(2.4도 가능은 함)

- JSP 2.1 이상(2.0도 가능은 함)

- Spring 3.2 이상

* 현재 Spring 3.x의 최종 버전인 3.2.18과 4.x의 최종 버전인 4.3.18에서만 테스트 진행 하였습니다.

 

 

 

Step 1. Maven Dependency 추가


        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-extras</artifactId>
            <version>3.0.8</version>
          </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-servlet</artifactId>
            <version>3.0.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-jsp</artifactId>
            <version>3.0.8</version>
        </dependency>

 

Step 2. servlet-context.xml 파일에 Tiles 설정 추가


<?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 http://www.springframework.org/schema/mvc/spring-mvc.xsd
        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">
 
    <!-- 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:property name="order" value="2" />
    </beans:bean>    
    
    <context:component-scan base-package="com.my.test" />
    
    <!-- Tiles -->
    <beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
        <beans:property name="definitions">
            <beans:list>
                <beans:value>/WEB-INF/tiles/tiles.xml</beans:value>
            </beans:list>
        </beans:property>
    </beans:bean>        
    <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>    
 
</beans:beans>

 

Step 3. tiles.xml 설정 파일 생성


<!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="base" template="/WEB-INF/tiles/template.jsp">
        <put-attribute name="left"   value="/WEB-INF/tiles/left.jsp" />
        <put-attribute name="header" value="/WEB-INF/tiles/header.jsp" />
        <put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp" />
    </definition>
 
    <definition name="*.page" extends="base">
        <put-attribute name="body" value="/WEB-INF/views/{1}.jsp" />
    </definition>
 
     <definition name="*/*.page" extends="base">
         <put-attribute name="body" value="/WEB-INF/views/{1}/{2}.jsp" />
     </definition>
    
    <definition name="*/*/*.page" extends="base">
        <put-attribute name="body" value="/WEB-INF/views/{1}/{2}/{3}.jsp" />
    </definition>
    
      
    
</tiles-definitions>
 

 

Step 4. Template 파일 생성


/WEB-INF/tiles/template.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>제목</title>
    <style>
        #header{            
            width:100%;
            height:50px;
            text-align: center;
            background-color: aqua;
        }
        #left{
            float:left;
             width:15%;
            background-color: gray;
        }
        #main{
            float:left;
             width:85%;
            background-color: lime;
        }
        #footer{
            width: 100%;
            height: 50px;            
            text-align: center;
            background-color: orange;
            clear:both;
        }
         #left, #main{ 
               min-height: 600px;
         } 
    </style>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
    <div style="width:100%; height:100%;">
    <div id="header"><tiles:insertAttribute name="header" /></div>
    <div id="left"><tiles:insertAttribute name="left" /></div>
    <div id="main"><tiles:insertAttribute name="body" /></div>    
    <div id="footer"><tiles:insertAttribute name="footer" /></div>
    </div>
 
    <script type="text/javascript">
        $(function() {
 
        });    
    </script>    
</body>
</html>
 

 

 

/WEB-INF/tiles/header.jsp

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

/WEB-INF/tiles/left.jsp

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

/WEB-INF/tiles/footer.jsp

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

 

여기까지 하셨으면 Spring에 Tiles를 연동시키는 작업이 모두 끝난 것입니다.

이제 Tiles가 잘 연동되었는지 어떤 식으로 활용하면 되는지 살펴보도록 하겠습니다.

 

 

 

Test를 위해 test.jsp 파일을 아래와 같이 생성하고, 

HomeController.java 파일은 아래와 같이 수정합니다.

 

/WEB-INF/views/test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h1>테스트 Main</h1>

 

package com.my.test;
 
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
    
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    
    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        
        String formattedDate = dateFormat.format(date);
        
        model.addAttribute("serverTime", formattedDate );
        
        return "home";
    }
    

    /**
     * Tiles를 사용(header, left, footer 포함)
     */        
    @RequestMapping("/testPage.do")
    public String testPage() {
        return "test.page";
    }
    
    
    
}
 

 

porm.xml

 

		<!-- 여기서부터 추가 -->
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>
		
		<!-- maridb setting -->
		
		<dependency>
		    <groupId>org.mariadb.jdbc</groupId>
		    <artifactId>mariadb-java-client</artifactId>
		    <version>2.3.0</version>
		</dependency>
		

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.4.6</version>
		</dependency>
		
		
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.3.2</version>
		</dependency>
		
		<dependency>
		    <groupId>org.bgee.log4jdbc-log4j2</groupId>
		    <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
		    <version>1.16</version>
		</dependency>
        
        		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>    
	

 

java version 수정

 

	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>4.3.8.RELEASE</org.springframework-version>
		<org.aspectj-version>1.8.9</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>

 

src/main/resources

 

mappers 생성 -> SQL xml 파일 위치

 

파일 추가

log4jdbc.log4j2.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/base.xml"></include>
	
	<!-- log4jdbc-log4j2 -->
	<logger name="jdbc.sqlonly" 		level="DEBUG"></logger>
	<logger name="jdbc.sqltiming" 		level="DEBUG"></logger>
	<logger name="jdbc.audit" 			level="DEBUG"></logger>
	<logger name="jdbc.resultset" 		level="DEBUG"></logger>
	<logger name="jdbc.resultsettable" 	level="DEBUG"></logger>
	<logger name="jdbc.connection" 		level="DEBUG"></logger>
</configuration>

 

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>
		<package name="com.peta.domain"/>
	</typeAliases>
</configuration>

 

package 는 맞는 이름으로 설정.

 

 

src/main/resources

mappers xml 파일 생성

boardMapper.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.peta.mapper.BoardMapper">
  
  	<insert id="create">
  	insert into tb1_board (title,content,writer) value (#{title},#{content},#{writer})
  	</insert>
  
  	<select id="read" resultType="com.peta.domain.BoardVO">
  	select bno,title,content,writer,regdate,viewcnt from tb1_board where bno=#{bno}
  	</select>
  	
  	<update id="update">
  	update tb1_board set title=#{title}, content =#{content} where bno=#{bno}
  	</update>
  
  	<delete id="delete">
  	delete from tb1_board where bno=#{bno}
  	</delete>
  
  	<select id="listAll" resultType="com.peta.domain.BoardVO">
  	<![CDATA[
  	select bno,title,content,writer,regdate,viewcnt from tb1_board where bno > 0 order by bno desc, regdate desc
  	]]>
  	</select>
  	
  	<select id="listPage" resultType="BoardVO">
  	<![CDATA[
  	select bno, title, content, writer, regdate, viewcnt from tb1_board where bno > 0 
  	order by bno desc, regdate desc limit #{page},10
  	]]>
  	</select>
  	
  	<select id="listCriteria" resultType="BoardVO">
  		<![CDATA[
  		select bno, title, content, writer, regdate, viewcnt from tb1_board where bno > 0 
  		order by bno desc, regdate desc limit #{pageStart}, #{perPageNum}
  		]]>
  	</select>
  	
  	<select id="countPaging" resultType="int">
  		<![CDATA[
  		select count(bno) from tb1_board where bno > 0
  		]]>
  	</select>
	<sql id="search">
  		<if test ="searchType !=null">
  			<if test="searchType = 't'.toString()">
  				and title like CONCAT('%',#{keyword},'%')
  			</if>
  			<if test="searchType = 'c'.toString()">
  				and content like CONCAT('%',#{keyword},'%')
  			</if>
  			<if test="searchType = 'w'.toString()">
  				and writer like CONCAT('%',#{keyword},'%')
  			</if>
  			<if test="searchType = 'tc'.toString()">
  				and (title like CONCAT('%',#{keyword},'%') OR content like CONCAT('%',#{keyword},'%'))
  			</if>
  			<if test="searchType = 'cw'.toString()">
  				and (content like CONCAT('%',#{keyword},'%') OR writer like CONCAT('%',#{keyword},'%'))
  			</if>
  			<if test="searchType = 'tcw'.toString()">
  				and (title like CONCAT('%',#{keyword},'%') OR content like CONCAT('%',#{keyword},'%')
  				OR writer like CONCAT('%',#{keyword},'%'))
  			</if>
  		</if>
	</sql>
  		
  	<select id="listSearch" resultType="BoardVO">
  		<![CDATA[
  		select * from tb1_board where bno > 0 
  		]]>
		<include refid="search"></include>
  		<![CDATA[
  		order by bno desc limit #{pageStart}, #{perPageNum}
  		]]>
  		
  	</select>
  	
  	<select id="listSearchCount" resultType="int">
  	<![CDATA[
  	select count(bno) from tb1_board where bno > 0
  	]]>
  	<include refid="search"></include>
  	</select>
 </mapper>

 

src/main/webapp/WEB-INF/spring/appServlet/servlet-content.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>
	
	<context:component-scan base-package="com.peta.controller" />
	
	
	
</beans:beans>

 

src/main/webapp/WEB-INF/views/web.xml

 

	<filter>
		<filter-name>encoding</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>
	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

encoding 추가

 

src/main/webapp/WEB-INF/spring/root-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:context="http://www.springframework.org/schema/context"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="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">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
		
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   		<!-- <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property> -->
        <property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
        <property name="url" value="jdbc:mariadb://127.0.0.1:3306/book_ex?useSSL=false"></property>
        <property name="username" value="id"></property>
        <property name="password" value="password"></property>
    </bean>
    
   	<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:/mybatis-config.xml"/>
		<property name="mapperLocations" value="classpath:/mappers/*Mapper.xml" />
	</bean>
	
	
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"

		destroy-method="clearCache">

		<constructor-arg name="sqlSessionFactory" ref="SqlSessionFactory" />

	</bean> 
	<context:component-scan base-package="com.peta.persistence"></context:component-scan>
	<context:component-scan base-package="com.peta.service"></context:component-scan>
</beans>

 

JAVA 버전 변경

 

 

JUNIT 테스트시 추가.

 

 

test 

Mapper.xml 파일 모두 주석처리후.

 

src/test/java/DataTest.java

package com.peta.home;

import java.sql.Connection;

import javax.inject.Inject;
import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class DataTest {
	@Inject
	private DataSource ds;
	
	@Test
	public void testConection()throws Exception{
		try(Connection con = ds.getConnection()){
			System.out.println("디비연결성공");
			System.out.println(con);
		}catch(Exception e) {
			System.out.println("디비연결실패");
			e.printStackTrace();
		}
		
	}
	
}

디비 연결 완료

 

jsp 양식 추가

<!DOCTYPE html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
	<head>
		<meta charset="utf-8">
		<title>Welcome</title>
	</head> 
	<body>

	</body>
</html>

애노테이션 설명 사용
@Controller 스프링 MVC의 컨트롤러 객체임을 명시하는 애노테이션 클래스
@RequestMapping 특정 URI에 매칭되는 클래스나 메소드임을 명시하는 애노테이션 클래스,매소드
@RequestParam 요청(request)에서 특정한 파라미터의 값을 찾아낼때 사용 파라미터
@RequestHeader 요청(request)에서 특정 HTTP 헤더 정보를 추출할떄 사용 파라미터
@PathVariable 현재의 URI에서 원하는 정보를 추출할때 사용 파라미터
@CookieValue 현재 사용자의 쿠키가 존재하는 경우 쿠키의 이름을 이용해서 쿠키의 값을 추출 파라미터
@ModelAttribute 자동으로 해당 객체를 뷰까지 전달하도록 만드는 애노테이션 메소드,파라미터
@SessionAttribute 세션상에서 모델의 정보를 유지하고 싶은 경우에 사용 클래스
@InitBinder 파라미터를 수집해서 객체로 만들 경우에 커스터마이징 메소드
@RespnseBody 리턴 타임이 HTTP의 응답 메세지로 전송 메소드,리턴타입
@RequestBody 요청(request) 문자열이 그대로 파라미터로 전달 파라미터
@Repository DAO 객체 클래스
@Service 서비스 객체 클래스
 

깃 허브 또는 SVN에서 프로젝트를 커밋할시

제외해야 할 파일,폴더 들이 몇 가지가 있다.


대표적으로 target 폴더인데 먼저 target 폴더에 대해 알아보면,

Maven으로 빌드를 하면 생기는 jar 파일을

저장하는 것이 주요 일이다.


개발을 할때는 이클립스 안에서 모든것이 이루어 지기 때문에 중요하지

않지만 나중에 프로젝트 결과물인 jar또는 war를 실서버에 반영할 때에는

target폴더 밑에 있는 jar나 war를 배포하게 된다.


target 폴더를 모르고 삭제했다면 Maven Build를 하여 다시 만들수 있다.

이러한 이유 들로 target폴더는 커밋의 대상이 아니다. 


target 폴더 이외에 .project .classpath .settings 등도

커밋의 대상이 아니다. 먼저 이 파일들을 커밋하지 않게

ignored 시키는 방법에 대해 알아보자.


이클립스든 전자정부프레임워크든 방법은 똑같다.

아래 이미지 순서대로 실행하자.
















위의 순서대로 약4가지 정도의 파일을 ignored 시키자.


출처 : http://rwd337.tistory.com/179



Bootstrap 4 


<head>

  <title>Bootstrap Example</title>

  <meta charset="utf-8">

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>

  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>

</head>


Bootstrap 3 


<head>

  <title>Bootstrap Example</title>

  <meta charset="utf-8">

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <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>

1



이클립스에서 깃버튼을 활성화 시킨다.







이후 Clone a Git Repository and add the clone to this view 를 누른다 




URI 와 HOST Repository path 를 모를경우 깃에 가면 아래와 같이 복사하는 버튼이 있다 해당버튼을 누르면 자동으로 채워진다.






여기까지 하면 깃허브 연결이 완료!!


여기 이후부터는 SVN 등 과 방법이 똑같다. Commit , Update 등 은 모두 같고 한가지 다른점은. 



Commit 할때 Commit and Push 를 눌러주어야만 파일이 업로드된다. 이후








공유된 깃 주소에 들어가면



다음과같이 공유된 프로젝트를 볼수있다. 


porm.xml 에 추가 (아래에있음)

http://mvnrepository.com/

MongoDB Java Driver

Spring Data MongoDB Core



프로젝트 새로 생성시

Maven-> update project 해주어야함.





jsp 파일 생성시 자동추가되도록 설정 

<!DOCTYPE html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
<head>
<meta charset="utf-8">
<title>Welcome</title>
</head> 
<body>

</body>
</html>




몽고디비 설정


> use myperson
switched to db myperson
> db.createCollection("dto")
{ "ok" : 1 }
> show collections
dto
person
> show dbs
admin     0.000GB
config    0.000GB
local     0.000GB
myperson  0.000GB

>data={ "_id" : 1, "name" : "김연아", "hp" : "0102-222-3333", "address" : "서울시 강남구", "age" : 26 }
> db.dto.find()
> db.dto.insert(data)
WriteResult({ "nInserted" : 1 })
> db.dto.find()
{ "_id" : 1, "name" : "김연아", "hp" : "0102-222-3333", "address" : "서울시 강남구", "age" : 26 }
>







porm.xml


Spring 버전 변경


<!-- Spring -->

<spring-framework.version>4.0.9.RELEASE</spring-framework.version>



#몽고DB Core

<dependency>

    <groupId>org.springframework.data</groupId>

    <artifactId>spring-data-mongodb</artifactId>

    <version>1.6.1.RELEASE</version>

</dependency>



#몽고DBJAVA드라이버

<dependency>

    <groupId>org.mongodb</groupId>

    <artifactId>mongo-java-driver</artifactId>

    <version>2.11.4</version>

</dependency>



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>

  <filter-mapping>

    <filter-name>encodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

    



제일아래쪽 servlet

    <servlet-mapping>

        <servlet-name>dispatcherServlet</servlet-name>

        <url-pattern>*.do</url-pattern>

    </servlet-mapping>



src/main/java 

test.mongodb 패키지 생성




mvc-config

    <context:annotation-config></context:annotation-config>

    <context:component-scan base-package="test.*"></context:component-scan>





application-config

**namespace 에서 mongo 추가


<!--  mongo db server setting -->

<mongo:mongo id="mongo" host="127.0.0.1" port="27017">

<mongo:options

threads-allowed-to-block-for-connection-multiplier="4"

connect-timeout="1000" 

max-wait-time="1500"

auto-connect-retry="true"

socket-keep-alive="true"

socket-timeout="1500"

write-number="1"

write-timeout="0"

write-fsync="true"

/>

</mongo:mongo>



<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="databaseName" value="myperson"/>
<constructor-arg name="mongo" ref="mongo"/>
<!-- 보안설정 -->
<constructor-arg name="userCredentials">
<bean class="org.springframework.data.authentication.UserCredentials">
<constructor-arg name="username" value="admin"/>
<constructor-arg name="password" value=""/>
</bean>
</constructor-arg>
<property name="writeConcern" value="SAFE"/>
</bean>
<!-- test.* 으로해도됨 -->
<mongo:repositories base-package="test.mongodb"/>





src/main/java
test.mongodb 밑에
UserDto.java 생성

import org.springframework.data.annotation.Id;       <- @Id 추가시 해당 패키지




@Document(collection="dto")
public class UserDto

@Id
private String id;
private String name;
private String hp;
private String address;
private int age;

후 setter getter 해서 자동생성



최종 UserDto.java 파일 

package test.mongodb;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="dto")
public class UserDto {
@Id
private String id;
private String name;
private String hp;
private String address;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHp() {
return hp;
}
public void setHp(String hp) {
this.hp = hp;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}






src/main/java
test.mongodb 패키지 밑에 생성
ListController.java                  -> 리스트 출력
UpdateController.java                -> 정보수정
Userdao.java                         -> 쿼리문수행
WriteController.java                 -> 새글 추가
DeleteController.java                -> 삭제 
 
webapp/WEB-INF/view 에 jsp 생성
boardlist.jsp                        ->게시글 리스트
showMessage.jsp                      ->
updateform.jsp                       -> 수정버튼시 불러오는 폼
writeform.jsp                        -> 새글추가시 불러오는 폼







index.jsp body부분 에 삽입 (메인페이지 접속시 list.do 로 연결되도록함)

<c:redirect url="mongo/list.do"/>






test.mongodb/ListController.java


@Controller

public class ListController {

@RequestMapping("/mongo/list.do")

public ModelAndView list()

{

ModelAndView model=new ModelAndView();

model.setViewName("boardlist");

return model;

}

}







초기 셋팅








src/main/java/test.mongodb/Userdao.java


import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.mongodb.core.MongoTemplate;

import org.springframework.data.mongodb.core.query.Criteria;

import org.springframework.data.mongodb.core.query.Query;

import org.springframework.stereotype.Repository;



@Repository

public class Userdao {

@Autowired

private MongoTemplate mongoTemp;

public void dropCollection()

{

mongoTemp.dropCollection(UserDao.class);

}

public List<UserDto> findList()

{

//방법 1 : 전체 데이타를 목록으로 얻고자 할 경우

List<UserDto> list=mongoTemp.findAll(UserDto.class,"dto");

//방법 2 - 조건에 의한 목록을 얻고자 할경우

/* Query query=new Query(Criteria.where("_id").in("a1","a2","a3"));

List<UserDto> list=mongoTemp.find(query, UserDto.class);*/

return list;

}

}





ListController


@Autowired

private Userdao dao;


List<UserDto> list=dao.findList();

model.addObject("list",list);

model.addObject("count",list.size());



추가






boardlist 

부트스트랩 추가 head 에


<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>





body 부분에 추가

<body>
<c:if test="${count==0}">
<b>저장된 데이타가 없습니다</b>
</c:if>
<c:if test="${count>0}">
<b>총 <span style="color: red;">${count}</span>개의 데이타가 있습니다.</b>
</c:if>
</body>





디자인부분 추가



<input type="button" class="btn btn-sm btn-success" value="멤버등록" onclick="location.href='writeform.do'" style="magin-left:50px;">

<table style="margin:0 auto;" class="table table-striped">

<caption><b>MongoDB Test</b></caption>

<tr bgcolor="#ffffcc">

<th style="text-align: center;">순번</th>

<th style="text-align: center;">이름</th>

<th style="text-align: center;">핸드폰</th>

<th style="text-align: center;">주소</th>

<th style="text-align: center;">나이</th>

<th style="text-align: center;">편집</th>

</tr>

<c:forEach var="dto" items="${list}" varStatus="i">

<tr>

<td align="center">${i.count}</td>

<td align="center">${dto.name}</td>

<td align="center">${dto.hp}</td>

<td align="center">${dto.address}</td>

<td align="center">${dto.age}</td>

<td align="center">

<!-- info 파란색 버튼 danger 빨간색 버튼 -->

<input type="button" value="수정" class="btn btn-cs btn-info" 

onclick="location.href='updateform.do?name=${dto.name}'">

<input type="button" value="삭제" class="btn btn-cs btn-danger" 

onclick="location.href='delete.do?name=${dto.name}'">

</td>

</tr>

</c:forEach>

</table>

</body>




webapp/index.jsp


body 내용을 수정 list.do 로 표출되도록 




<c:redirect url="mongo/list.do"></c:redirect>






여기까지 진행하였을경우 프로젝트 실행시 정상적으로 입력된 게시글들이 출력되어야함. 







WriteController.java


@Controller

public class WriteController {

@Autowired

private UserDao dao;

@RequestMapping("/mongo/writeform.do")

public String form()

{

return "writeform";

}

}






Writeform.jps


<head>
<meta charset="utf-8">
<title>Welcome</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head> 
<body>
<form action="write.do" method="post">
<table class="table table-bordered" style="width:300px; margin: 0 auto;">
<caption><b>맴버 등록하기</b></caption>
<tr>
<th style="width:100px;">이름</th>
<td>
<input type="text" name="name" autofocus="autofocus" required="required">
</td>
</tr>
<tr>
<th style="width:100px;">핸드폰</th>
<td>
<input type="text" name="hp" required="required">
</td>
</tr>
<tr>
<th style="width:100px;">주소</th>
<td>
<input type="text" name="address" required="required">
</td>
</tr>
<tr>
<th style="width:100px;">나이</th>
<td>
<input type="text" name="age" required="required">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="mongodb저장" class="btn btn-sm btn-warning">
<input type="button" value="멤버목록" class="btn btn-sm btn-success" onclick="location.href='list.do'">
</td>
</tr>
</table>
</form>
</body>






UserDao.java   추가



//dto 한개 저장시

public void insert(UserDto dto)

{

mongoTemp.insert(dto);

}

//dto 여러개를 List 에 담아 저장시 

public void insertList(List<UserDto> list)

{

mongoTemp.insert(list,UserDto.class);

}








WriteController



@RequestMapping("/mongo/write.do")

public String readData(@ModelAttribute UserDto dto)

{

dao.insert(dto);

return "redirect:list.do";

}



여기까지 진행하면 맴버등록이 됨.











boardlist.jsp

네임클릭시 반응하게 네임부분 수정 



<td align="center">

<a href="content.do?name=${dto.name}">${dto.name}</a>

</td>






/WEB-INF/view/content.jsp 생성




UserDao.java 추가 

public UserDto getSearchName(String name)

{

Query query=new Query(Criteria.where("name").is(name));

return mongoTemp.findOne(query, UserDto.class);

}





ListController.java 추가

@RequestMapping("/mongo/content.do")

public ModelAndView content(@RequestParam String name)

{

ModelAndView model=new ModelAndView();

UserDto dto=dao.getSearchName(name);

model.addObject("dto",dto);

model.setViewName("content");

return model;

}




Content.jsp -> writeform 에 있는거 그대로 복사해서 수정


form 삭제후


<body>


<table class="table table-bordered" style="width:300px; margin: 0 auto;">

<caption><b>맴버 확인</b></caption>

<tr>

<th style="width:100px;">이름</th>

<td>

${dto.name}

</td>

</tr>

<tr>

<th style="width:100px;">핸드폰</th>

<td>

${dto.hp}

</td>

</tr>

<tr>

<th style="width:100px;">주소</th>

<td>

${dto.address}

</td>

</tr>

<tr>

<th style="width:100px;">나이</th>

<td>

${dto.age}세

</td>

</tr>

<tr>

<td colspan="2" align="center">


<input type="button" value="멤버목록" class="btn btn-sm btn-success" onclick="location.href='list.do'">

</td>

</tr>

</table>


</body>




여기까지 이상없이 진행시 

---이름 수정 누르면 데이터 출력--






삭제기능추가


UserDao.java


public void deletedata(String name)

{

Query query=new Query(Criteria.where("name").is(name));

mongoTemp.remove(query,UserDto.class);

}




deleteController.java


@Controller

public class DeleteController {


@Autowired

private UserDao dao;

@RequestMapping("mongo/delete.do")

public String delete(@RequestParam String name)

{

dao.deletedata(name);

return "redirect:list.do";

}

}





여기까지 진행시 삭제버튼누르면 해당 이름 삭제됨.



수정기능


writeform.jsp 내용을 updateform.jsp 로 복사


updateform.jsp


<body>

<form action="update.do" method="post">

<table class="table table-bordered" style="width:300px; margin: 0 auto;">

<caption><b>맴버 정보수정하기</b></caption>

<tr>

<th style="width:100px;">이름</th>

<td>

${dto.name }

<input type="hidden" name="name" value="${dto.name}">

</td>

</tr>

<tr>

<th style="width:100px;">핸드폰</th>

<td>

<input type="text" name="hp" required="required" value="${dto.hp}">

</td>

</tr>

<tr>

<th style="width:100px;">주소</th>

<td>

<input type="text" name="address" required="required" value="${dto.address}">

</td>

</tr>

<tr>

<th style="width:100px;">나이</th>

<td>

<input type="text" name="age" required="required" value="${dto.age}">

</td>

</tr>

<tr>

<td colspan="2" align="center">

<input type="submit" value="mongodb수정" class="btn btn-sm btn-warning">

<input type="button" value="멤버목록" class="btn btn-sm btn-success" onclick="location.href='list.do'">

</td>

</tr>

</table>

</form>

</body>




updateController.java



@Controller

public class UpdateController {


@Autowired

private UserDao dao;

@RequestMapping("/mongo/updateform.do")

public ModelAndView updateform(@RequestParam String name)

{

ModelAndView model=new ModelAndView();

UserDto dto=dao.getSearchName(name);

model.addObject("dto",dto);

model.setViewName("updateform");

return model;

}

}



-----------------------여기까지 했을때 수정폼 나오면 정상



Userdao.java


public void updateData(UserDto dto)

{

Query query=new Query(Criteria.where("name").is(dto.getName()));

mongoTemp.updateFirst(query, Update.update("hp", dto.getHp()), UserDto.class);

mongoTemp.updateFirst(query, Update.update("address", dto.getAddress()), UserDto.class);

mongoTemp.updateFirst(query, Update.update("age", dto.getAge()), UserDto.class);

}




updateController.java


@RequestMapping("/mongo/update.do")

public String update(@ModelAttribute UserDto dto)

{

dao.updateData(dto);

return "redirect:list.do";

}




변수   바꿀대상 url 의 값


package test.crawling;


import java.io.IOException;


import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;


public class Ex3test {


public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

String url="https://www.melon.com/chart/index.htm";

                             //크롤링하고싶은 대상 url 을 적는다 

Document doc=Jsoup.connect(url).get();

Elements titles=doc.select("div.ellipsis>span>a");

                                             //하단의 그림참조하여 적는다

for(Element e:titles)

{

String song=e.text();

System.out.println("제목:"+song);

}

System.out.println("============");


}


}

1






대상의 가장 가까이에있는 id 나 class 의 값을 찾아서 해당 루트까지 표기해주도록한다.

div.ellipsis>span>a





package test.crawling;


import java.io.IOException;


import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;


public class Ex6Test {


public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub


String urls="http://media.daum.net";

Document daum_news=Jsoup.connect(urls).get();

Elements news_url=daum_news.select("div.box_headline>ul>li>strong>a");

for(Element element:news_url)

{

String url=element.attr("href");

System.out.println(url);

if(url.contains("media.daum.net"))

{

Document doc=Jsoup.connect(url).get();

Elements body=doc.select("div#harmonyContainer");

Elements title=doc.select("h3.tit_view");

String content=body.text();

String newstitle=title.text();

System.out.println("제목:"+newstitle);

System.out.println("내용:"+content);

}


}

}


}


1

     

콘솔창 출력 결과



Tomcat 이클립스 서버 설치 & 구동하기




먼저 Tomcat 을 다운받습니다. 


https://tomcat.apache.org/download-80.cgi



본인의 버전에 맞는것을 다운받습니다.





이후 이클립스를 구동하여 Tomcat 을 설치합니다.












혹시 실행하였는데 포트관련 오류가 뜬다면






JAVA 다운로드


http://www.oracle.com/technetwork/java/javase/downloads/index.html


JDK 다운로드 클릭



Windows 버전에 맞는것을 다운로드한다.




기타 설치방법은 Next 만 누르면 크게 어려운부분이 없으므로 생략. 설치를 진행한다.


설치이후 2가지를 설정해주어야 한다.






환경변수를 수정해야한다. (제어판 -> 시스템 -> 고급 시스템 설정 -> 환경변수)





새로만들기 클릭 하여 아래와같이 환경변수를 추가해준다.



환경변수에서 Path 를 클릭하여 %JAVA_HOME%\bin 을 추가하여준다.





----------------JAVA 설정 완료----------------


정상적으로 설치되었는지 확인하기위하여 


실행 (윈도우키 + R ) cmd (명령프롬프트) 하여 하기와같이 입력하여본다.


java -version



이렇게 출력되었다면 정상적으로 설치된것이다.








이클립스 다운로드(64비트기준)


https://www.eclipse.org/downloads/download.php?file=/oomph/epp/oxygen/R2/eclipse-inst-win64.exe




이클립스의 경우 설치시 JPA , JSF 등의 기능을 추가히기위해선 처음설치할때


Eclipse IDE for Java EE Developers 로 선택한다



따로 설정할것은 없다 모두 기본값으로 설정하면 된다.


이클립스의 워크스페이스 선택경로가 나오는데 이것은 가능한 자료가 손상되지않는 루트에 저장하는것이 안전하다.






이것으로 JAVA 와 이클립스의 모든 설치가 완료되었습니다.



설치가 완료되면 다음과같은 이클립스의 화면이 나타나게됩니다.








+ Recent posts