SPRING CONTROLLER 스프링 컨트롤러

스프링 컨트럴러는 자동으로 스프링 객체로 등록되요.

그런데 자동으로 등록하게 해주라고 선언을 해줘야 해요.

servlet-context.xml 파일안에 이렇게 선언해요.

<context:component-scan base-package="com.sms2019.controller" />

controller 안에 있는 것을 등록해줘요. 

@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";
	}

@controller 어노테이션을 선언해주면 컨트롤러로 등록이되요. 

@REQUESTMAPPING  은 경로를 선언해주는거에요. 

@REQUESTMAPPING는 GETMAPPING 과 POSTMAPPING 로 구분해서 사용할수 있어요. 

@PostMapping("/create") 

@GetMapping("/videos/{name}")

등과 같이요. 

	@ResponseBody
	@RequestMapping(value = "/appsLogin_ok", method = RequestMethod.GET)
	public CommonData appsLogin_ok(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) throws Exception
	{
@ResponseBody
	@RequestMapping(value = "/appsLogin_make", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
	public CommonData appsLogin_make(HttpServletRequest request, HttpServletResponse response, @RequestBody CommonData dto, HttpSession session, Model model) throws Exception
	{

REQUESTMAPPING로 GET과 POST를 구분할수 있어요.

데이터를 리턴할땐 Model 을사용하면되요. 

넘어온 데이터를 넘길때 하나하나 모델에 담을수도 있지만 강제로 담아서 넘기는 방법도 있어요. 

@RequestMapping(value = "/aogs/aogs001", method = RequestMethod.GET)
	public String aogs001(HttpServletRequest request, HttpSession session, Model model) throws Exception
	{
    Map<String, String[]> paramMap = request.getParameterMap();
		Iterator keyData = paramMap.keySet().iterator();
		CommonData dto = new CommonData();
		while (keyData.hasNext())
		{
			String key = ((String) keyData.next());
			String[] value = paramMap.get(key);
			dto.put(key, value[0].toString());
			model.addAttribute(key, value[0].toString());
			smsp.print_String("key : " + key + ", value : " + value[0].toString());
		}
        

하나하나 넘길땐 REMap<String, String[]> paramMap = request.getParameterMap();

에 넘겨받아서. model.addAttribute(key, value[0].toString()); 이렇게 하나하나 넣어줄수 있어요. 

@RequestMapping(value = "/TEST", method = RequestMethod.GET)
  public void loginGET(@ModelAttribute("test") commondto dto) {
	return "test"
  }

리턴타입 

void

void일경우 해당 url 경로를 그대로 jsp파일의 이름으로 사용.

String 

string일경우 리턴타입의 이름에 따라서 jsp파일의 이름을 사용. 

json인경우 .

  @RequestMapping(value = "/select_getmember_list_join", method = RequestMethod.POST, consumes="application/json")
  public @ResponseBody CommonData select_getmember_list_join(@RequestBody CommonData dto) throws Exception {

pox.xml에 추가해줘야해요. 메이븐 라이브러리 

	<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.5.4</version>
		</dependency>

ResponseEntity

RequestMapping(value = "/get_member_image", method = RequestMethod.GET)
	public ResponseEntity<byte[]> get_member_image(HttpServletRequest request, Model model) throws Exception
	{

헤더정보나 데이터를 전달할때 사용. 

 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

스프링 게시판 만들기 2

저장을 해야 해요. 스크립트를 만들어요. 

function  save_note()
{
	if(check_save())
	{
		return true;
	}
	$("#a_save_btn").prop("disabled", true);
	var url;
	var sql_state_value;
	if($("#i_idx").val()=='')
	{
		url = '/board/save';
		sql_state_value = 'insert';
	}
	else
	{
		url = '/board/save';
		sql_state_value = 'update';
	}	
	
	var postData = {};
    postData["sql_state"] = sql_state_value;
    postData["idx"] = $("#i_idx").val()
    postData["title"] = $("#title").val()
	postData["mdate"] = $("#mdate").val()
	postData["mt_content"] = $('#summernote').summernote('code')
	postData["uuid"] =  $("#i_uuid").val()
	postData["division"] = $("#division").val()
	postData["mt_input_id"] =  $('#login_idx').val()
	postData["mt_update_id"] =  $('#login_idx').val()
	
	if($('#always').is(':checked'))
	{
		postData['always']='Y';
	}
	else
	{
		postData['always']='N';
	}
	var data = JSON.stringify(postData);
	getPostData(url,data,callback_save,false);
}

체크내용스크립트는 별 내용이 없어요. 

function check_save()
{		
	console.log($('#summernote').summernote('code'));
	if($('#summernote').summernote('code')=='<p><br></p>')
	{
		showmessage("알림","내용을 확인해 주세요.",2000,'');
		$("#title").focus();
		return true;
	}
	if($('#summernote').summernote('code')=='')
	{
		showmessage("알림","내용을 확인해 주세요.",2000,'');
		$("#title").focus();
		return true;
	}
	if($("#mdate").val()=='')
	{
		showmessage("알림","작성일 확인해 주세요.",2000,'');
		$("#mdate").focus();
		return true;
	}
	if($("#title").val()=='')
	{
		showmessage("알림","제목을 확인해 주세요.",2000,'');
		$("#title").focus();
		return true;
	}
	if($("#division").val()=='')
	{
		showmessage("알림","커뮤니티 종류 확인해 주세요.",2000,'');
		$("#division").focus();
		return true;
	}
	return false;
}

 

응답후에요. 

var callback_save = function (result)
{
	$('#a_save_btn').removeAttr("disabled");
	if(result['result']=='INSERT_OK')
	{
		showmessage("알림","새글이 등록되었습니다.",5000,'');
		$("#i_idx").val(result['idx']);
		self.location = "/board/board?idx="+$("#i_idx").val();
	}
	else if(result['result']=='UPDATE_OK')
	{	
		showmessage("알림","수정이 되었습니다.",5000,'');
		self.location = "/board/board?idx="+$("#i_idx").val();
	}
	else
	{
		showmessage("알림",result['message'],20000,'');
	}
	
}

/board/save 컨트롤러를 만들어 볼께요. 

@RequestMapping(value = "/save", method = RequestMethod.POST)
	@ResponseBody
	public Map<String, String> regedit(@RequestBody CommonData dto) throws Exception{
		Map<String, String> paramMap = new HashMap<>();
		smsp.print_CommonData(dto);
		String sql_state = dto.get("sql_state");
		String idx = dto.get("idx");
		String uuid = dto.get("uuid");
		if(sql_state.equals("insert"))
		{
			//새글
			service.insert(dto, "Board_Mapper.new_save");
			paramMap.put("result", "INSERT_OK");
			idx = service.selectstr(dto, "Board_Mapper.new_save_idx");
			paramMap.put("idx", idx);
		}
		else if(sql_state.equals("update"))
		{
			//내용수정
			service.update(dto, "Board_Mapper.update");
			paramMap.put("result", "UPDATE_OK");
		}		
		return paramMap;
	}

컨트롤러 부분이었어요.  이제 쿼리부분이에요.

Board_Mapper.xml 파일을 만들어 쿼리는 이렇게 작성했어요. 

<insert id="new_save">		
		insert into tb_board(
					mdate
				  , title
				  , muuid
				  , content
				  , always
				  , division
				  , mt_input_wdate
				  , mt_input_id
				  , mt_update_wdate
				  , mt_update_id
				  )
		   values(  #{mdate}
				  , #{title}
				  , #{uuid}
				  , #{mt_content}
				  , #{always}
				  , #{division}
				  , now()
				  , #{mt_input_id}
				  , now()
				  , #{mt_update_id}
		          )
	</insert>
	<!-- 내용수정 -->
	<update id="update" >
  		update tb_board 
  		   set title = #{title}
  		     , content = #{mt_content} 
  		     , always = #{always}
  		     , mt_update_wdate =  now()
  		     , mt_update_id = #{mt_update_id}
  		 where idx = #{idx}
  	</update>
  	<!-- 새글번호 -->
  	<select id="new_save_idx" resultType="String"> 
		SELECT idx 
		 from tb_board
		where muuid = #{uuid}
	</select>

그리고 글을 저장하고 나면 수정폼이 아닌 일반 페이지에서 보여지면 좋겠어요. 

그래서 일반 페이지도 작성해요. 

<div class="card-body register-card-body">
			      <p class="login-box-msg">글내용</p>
				      <table class="table table-write" id="add_mt">
						<colgroup>			
						<col style="width:120px" />
						<col style="width:*" />						
						</colgroup>
						<tr>						
							<th>작성일</th>
							<td>
								${mdate}
							</td>
						</tr>
						<tr>						
							<th>제목</th>
							<td>${title}</td>
						</tr>
						<tr>
							<th>내용</th>
							<td>
								<div id="summernote">${content}</div>
							</td>
						</tr>
					</table>			      
				<!-- 게시판 구분 -->
			      <input type="hidden" id="division" name="division" value="test1" />
			    <!-- 글번호 --> 
			      <input type="hidden" class="form-control" id="i_idx" value="${idx}">
			    <!-- UUID 부여 -->
			      <input type="hidden" class="form-control" id="i_uuid" value="${uuid}">
			      
			    </div>

일반페이지는 board.jsp로 했어요. 적은 내용이 보여요. 

그리고 글을 적었으면 목록을 봐야겠죠?

목록이에요.

    <div class="card-body register-card-body">
			      <p class="login-box-msg">목록</p>
				      <div style="text-align: right;">
						<c:if test="${issave == 'yes'}">
						<button title="수정" type="button" id="a_edit_btn" class="btn btn-outline-primary" onclick="edit_note();">새글</button>
						</c:if>
  					  </div>
			      	
		      	  <table class="table table-bordered" id="board_list">
		      	  </table>
				<!-- 게시판 구분 -->
			      <input type="hidden" id="division" name="division" value="test1" />
			    </div>
			    <div class="footer_area">
					<div class="text-center">
						<ul class="pagination pagination-sm m-0 float-right" id="item_list_page">
						</ul>
					</div>
				</div>
			      
			    
			    <div style="text-align: right;">
					<c:if test="${issave == 'yes'}">
					<button title="수정" type="button" id="a_edit_btn" class="btn btn-outline-primary" onclick="edit_note();">새글</button>
					</c:if>
				</div>

 페이지를 로드한다음 jquery로 글을 읽어올꺼에요. 

var item_count;
var pageMaker;
$(document).ready(function(){
	item_count=0;
	list_page(1);
});
function list_page(in_data)
{
	var url;
	var sql_state_value = 'select';
	url = "/board/list_get";
	
	var postData = {};
    postData["sql_state"] = sql_state_value;
    if(!ISNULL(pageMaker))
    {
    	postData["page"] = in_data
		postData["perPageNum"] = pageMaker.cri.perPageNum
    }
	postData["title"] = $("#i_title").val()
	postData["division"] = $("#division").val()
	
    var data = JSON.stringify(postData);
    
	getPostData(url,data,callback_list);		
}

이렇게 호출을 해요. 

pageMaker가 선언이 안되어 있으면 페이지 정보는 없이 데이터를 요청해요. 

@RequestMapping(value = "/list_get", method = RequestMethod.POST, consumes="application/json")
	  public @ResponseBody CommonData list_get(@RequestBody CommonData dto) throws Exception {		  
		  CommonData R_data = new CommonData();
		  Iterator keyData = dto.keySet().iterator();
	      while (keyData.hasNext()) {
	          String key = ((String)keyData.next());
	          String value = dto.get(key);
	      }     
	      SearchCriteria cri = new SearchCriteria();     
	      if(dto.get("page")!=null)
	      {
	      	 cri.setPage(Integer.valueOf(dto.get("page"))); 
	      	 dto.put("perPageNum", Integer.valueOf(dto.get("perPageNum")));
	      }
	      else
	      {
	      	 cri.setPage(1);
	      	 dto.put("perPageNum", cri.getPerPageNum());
	      }
	      dto.put("pageStart", cri.getPageStart());     
	      PageMaker pageMaker = new PageMaker();
	      pageMaker.setCri(cri);
	      pageMaker.setTotalCount(service.listSearchCount(dto,"Board_Mapper.Board_select_cnt"));
	      List<Map<String, Object>> list = service.select(dto, "Board_Mapper.Board_select");
	      R_data.put("list", list);
	      R_data.put("pageMaker", pageMaker);
	      R_data.put("result", "SELECT_OK");
	      return R_data;
	  }

데이터를 요청 받았어요. 

그럼 받은 데이터를 화면에 표시해줘요. 

var callback_list = function (result_data)
{
	if(result_data['result']=='SELECT_OK')
	{
		var result = result_data.list;
	   	pageMaker = result_data.pageMaker;
	   	$("#board_list").empty();
	   	var i = $('#board_list').length + 2; //두칸뒤로.
	   	$("#board_list").append('<colgroup>'
   				+'						<col style="width:60px" />'
   				+'						<col style="width:200px" />'
   				+'						<col style="width:*" />'
   				+'						<col style="width:120px" />'
   				+'						</colgroup>					'
   				+'						<tr>'
   				+'							<th>번호</th>'
   				+'							<th>날짜</th>'
   				+'							<th>제목</th>'
   				+'							<th>작성자</th>'
   				+'						</tr>'
   				);
	   	var item_count=1 + (pageMaker.cri.page-1)*pageMaker.cri.perPageNum;
   		var no_num=0; 
   		jQuery.each( result, function( index, value ) {
   			$("#board_list").append('<tr>'
					  +'<td>'+value.idx+'</td>'
					  +'<td class="left">'
					  +value.mdate
					  +'</td>'
					  +'<td class="left">'
					  +'<a class="" href="/board/board?idx='+value.idx+'">'
					  +value.title
					  +'</a>'
					  +'<input type="hidden" class="form-control" id="b_idx'+index+'"' 
					  +' value="'+value.idx+'">'
					  +'</td>'
					  +'<td>'
					  +value.uname
					  +'</td>'
					  +'</tr>'
					  );	
   			item_count++;
			});
   		$("#item_list_page").empty();
   		if(pageMaker.prev)
   		{
   			$("#item_list_page").append('<li  class="page-link"><a href="#" onclick="list_page('+(pageMaker.startPage - 1)+')">&laquo;</a></li>');
   		}
   		for(var f_i=pageMaker.startPage;f_i<=pageMaker.endPage;f_i++)
   		{	
   			
   			if(pageMaker.cri.page == f_i)
   			{	
   				$("#item_list_page").append('<li class="page-link"><a href="#" onclick="list_page('+(f_i)+') ">'+f_i+'</a></li>');
   			}
   			else
   			{
   				$("#item_list_page").append('<li class="page-link"><a href="#" onclick="list_page('+(f_i)+') ">'+f_i+'</a></li>');
   			}
   			
   		}
   		if(pageMaker.next && pageMaker.endPage > 0)
   		{
   			$("#item_list_page").append('<li class="page-link"><a href="#" onclick="list_page('+(pageMaker.endPage + 1)+')">&raquo;</a></li>');
   		}
	}		
}

이렇게 하면 화면에 이렇게 표시되요. 

게시판 목록

오늘은 여기까지 정리 할께요. 

필요한 파일은 여기에 첨부할께요. 

남은 항목은 첨부파일, 게시글 이미지 따로 저장, 댓글 기능등이 남았네요.

오늘은 여기까지 정리할게요. 

jsp파일들이에요. 

board.jsp
0.00MB
list.jsp
0.01MB
write_e.jsp
0.01MB

컨트롤러 파일이에요. 

Board_Controller.java
0.01MB

다음은 맵퍼 파일이에요. 

Board_Mapper.xml
0.00MB

아 그리고 service와 dao를 수정했어요. 몽땅 올릴테니 파일을 변경해주세요. 

commonDAO.java
0.00MB
first_commonDAOImpl.java
0.00MB
second_commonDAOImpl.java
0.00MB

먼저 DAO파일이였구요 다음은 SERVICE파일이에요. 

common_Service.java
0.00MB
Common_ServiceImpl.java
0.01MB
First_ServiceImpl.java
0.00MB
Second_ServiceImpl.java
0.00MB

이상입니다. 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

스프링 게시판 만들기 1

홈페이지를 만들때 필수적으로 만드는게 게시판인거 같아요.

간단하게 게시판을 만들어 볼께요.

테이블은 이렇게 만들었어요. 

CREATE TABLE `tb_board` (
  `idx` int(11) NOT NULL AUTO_INCREMENT COMMENT '게시물 고유키값',
  `mdate` datetime DEFAULT NULL COMMENT '작성일',
  `title` varchar(50) DEFAULT NULL COMMENT '제목',
  `muuid` varchar(40) DEFAULT NULL COMMENT '고유id',
  `content` longtext DEFAULT NULL COMMENT '내용',
  `always` varchar(1) NOT NULL DEFAULT 'N' COMMENT '상단글인지',
  `m_delete` varchar(1) DEFAULT 'N' COMMENT '삭제여부',
  `division` varchar(50) DEFAULT NULL COMMENT '게시글구분',
  `mt_input_wdate` datetime DEFAULT NULL COMMENT '입력일',
  `mt_input_id` int(11) DEFAULT NULL COMMENT '입력ID',
  `mt_update_wdate` datetime DEFAULT NULL COMMENT '최종수정일',
  `mt_update_id` int(11) DEFAULT NULL COMMENT '최종수정ID',
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='게시판 기본형';

  게시글 구분으로 한테이블에 여러게시판들을 만들거에요. 

ALWAYS를 체크하면 목록으로 볼때 항상 맨위에 뜨게 만들거에요 그외엔 작성일 기준으로 최근글이 위로 오도록 할거에요.

uid는 첨부파일 게시판 생성시 사용할건데 지금은 그냥 만들어 놓기만 할께요.

일단 글쓰기 부터 해볼께요. 

@RequestMapping(value = "/write_e", method = RequestMethod.GET)
	public String write_e(HttpServletRequest request,HttpSession session, Model model) throws Exception {
		 Map<String, String[]> paramMap=request.getParameterMap();
		 Iterator keyData = paramMap.keySet().iterator();
		 CommonData dto = new CommonData();
		 while (keyData.hasNext()) {
	        String key = ((String)keyData.next());
	        String[] value = paramMap.get(key);
	        dto.put(key, value[0].toString());
	        model.addAttribute(key,value[0].toString());
	        smsp.print_String_no_line("key : " + key + ", value : " + value[0].toString());
		 }
		 model.addAttribute("issave","no");
		 Member vo = (Member) session.getAttribute("login");
		 if(dto.get("idx")!=null)
		 {
			 CommonData result_list = service.selectone(dto,"Board_Mapper.Board_editor_select");
			 smsp.print_CommonData(result_list);
			 Iterator keyData4 = result_list.keySet().iterator();
		     while (keyData4.hasNext()) {
		    	String key = ((String)keyData4.next());
		     	String value = result_list.get(key);          
		     	model.addAttribute(key,value);
		     }
		     if(vo!=null) //vo 로그인상태일때.
		     {
				 if(vo.idx==Integer.parseInt(result_list.get("mt_input_id")))
				 {
					 model.addAttribute("issave","yes");
				 }
				 if(vo.getMenu_lv()>9)
				 {
					 model.addAttribute("issave","yes");
				 }
		     }
		 }
		 else
		 {
			 String uuid = smsp.getUUID();//UUID.randomUUID();
			 model.addAttribute("uuid", uuid.toString());
			 model.addAttribute("issave","yes");
		 }
		 return "/board/write_e";
	 }

글쓰기로 들어가는 컨트롤러를 만들어요. 

내용은 써진 글일때 글쓴이는 issave값을 가져서 수정이 가능하고 레벨9이상의 메뉴권한을 가진사람도 수정권한을 가져요. 

아닐땐 아무런값없이 신규페이지에요. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@include file="../include/top.jsp"%>

  <!-- summernote -->
  <link rel="stylesheet" href="${pageContext.request.contextPath}/resources/AdminLTE/plugins/summernote/summernote-bs4.css">
  <!-- Summernote -->

<!-- Content Wrapper. Contains page content -->
  <div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <div class="content-header">
      <div class="container-fluid">
        <div class="row mb-2">
          <div class="col-sm-6">
            <h1 class="m-0 text-dark"> 회원가입 <small>?</small></h1>
          </div><!-- /.col -->
          <div class="col-sm-6">
            <ol class="breadcrumb float-sm-right">
              <li class="breadcrumb-item"><a href="#">Home</a></li>
              <li class="breadcrumb-item active">회원가입</li>
            </ol>
          </div><!-- /.col -->
        </div><!-- /.row -->
      </div><!-- /.container-fluid -->
    </div>
    <!-- /.content-header -->

    <!-- Main content -->
    <div class="content">
      <div class="container-fluid">
        <div class="row">
          <div class="col-lg-12">
            <div class="card  card-primary card-outline">
              <div class="card-body">
                <h5 class="card-title"></h5>
                
                <div class="card-body register-card-body">
			      <p class="login-box-msg">글쓰기</p>
				      <table class="table table-write" id="add_mt">
						<colgroup>			
						<col style="width:120px" />
						<col style="width:*" />						
						</colgroup>
						<tr>						
							<th>작성일</th>
							<td>
								<input type="text" class="form-control" data-inputmask-alias="datetime" data-inputmask-inputformat="yyyy-mm-dd" data-mask="" im-insert="false"  id ="mdate" name="mdate" value="${mdate}"  disabled="disabled">
							</td>
						</tr>
						<tr>						
							<th>제목</th>
							<td><input type="text" class="form-control" id="title" name="title" placeholder="제목" value="${title}" required></td>
						</tr>
						<tr>						
							<th>공지설정</th>
							<td>
								<input type="checkbox" id="always" name="always" placeholder="공지설정"
								<c:if test="${always == 'Y'}">				
										 checked
										 </c:if> 
								> ${always}
							</td>						
						</tr>
						<tr>
							<th>내용</th>
							<td>
								<div id="summernote">${content}</div>
							</td>
						</tr>
					</table>			      
			      <input type="hidden" id="division" name="division" value="test1" />
			    </div>
			    
			    <div style="text-align: center;">
					<button title="목록" type="button" class="btn btn-outline-primary" onclick="move_list_note();">목록</button>
					<c:if test="${issave == 'yes'}">
					<button title="저장" type="button" id="a_save_btn" class="btn btn-outline-primary" onclick="save_note();">저장</button>
					<button title="삭제" type="button" class="btn btn-outline-primary" onclick="delete_note();">삭제</button>
					</c:if>
				</div>

                
              </div>
            </div>
		  </div>
        </div>
        <!-- /.row -->
      </div><!-- /.container-fluid -->
    </div>
    <!-- /.content -->
  </div>
  <!-- /.content-wrapper -->
  

<%@include file="../include/bottom.jsp"%>
<script src="${pageContext.request.contextPath}/resources/AdminLTE/plugins/summernote/summernote-bs4.min.js"></script>
<script src="${pageContext.request.contextPath}/resources/AdminLTE/plugins/summernote/lang/summernote-ko-KR.min.js"></script>
<script src="${pageContext.request.contextPath}/resources/AdminLTE/plugins/moment/moment.min.js"></script>
<script src="${pageContext.request.contextPath}/resources/AdminLTE/plugins/inputmask/min/jquery.inputmask.bundle.min.js"></script>
//${pageContext.request.contextPath}/resources/AdminLTE/
<script>
$(function () {
    //Money Euro
    $('[data-mask]').inputmask()
	if($("#mdate").val()=='')
	{
		$("#mdate").val(getTimeStamp());
	}
    // Summernote
	$('#summernote').summernote({
	    lang: 'ko-KR', // default: 'en-US'
	   	height: 500,                 // set editor height
		minHeight: 500,             // set minimum height of editor
		maxHeight: 500,             // set maximum height of editor
		focus: true,                  // set focus to editable area after initializing summe
	  });
  })
</script>  

write_e.jsp 파일 내용이에요. 아직 저장하고 이런내용은 없어요. 

summernote 에딕터를 이용해서 글을 적어요.

일단 여기까지 해보세요 다음은 저장컨트롤러를 만들고 저장을 해볼께요. 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

spring mvc homepage 스프링 홈페이지 만들기 6

이번에는 로그인을 해볼예정이에요. id와 패스워드가 필요할텐데요. 전 아까 sunplan 이라고 id를 만들었어요. 패스워드는 쉽게 121212로 하였네요. 이걸 가지고 로그인 하는걸 만들어 볼께요. 

TOP.JSP파일을 수정할꺼에요. 

 <!-- Right navbar links -->
      <ul class="order-1 order-md-3 navbar-nav navbar-no-expand ml-auto">
      <c:if test="${not empty login}">			
      	<li class="nav-item">
      		<button type="button" class="btn btn-outline-primary nav-link"  onclick="goLogout()">${login.uname}님</button>&nbsp;
      	</li>
	  </c:if>
	  <c:if test="${empty login}">
	  	<li class="nav-item">
      		<input type="text" class="form-control" placeholder="아이디" id="uid">&nbsp;
      	</li>
      	<li class="nav-item">
      		<input type="password" class="form-control" placeholder="패스워드" id="upassword">&nbsp;
      	</li>
      	<li class="nav-item">
          <button type="button" class="btn btn-outline-primary" onclick="goLogin()">로그인</button>&nbsp;
        </li>	  
      	<li class="nav-item">
          <a class="nav-link" href="/user/register">가입하기</a>
        </li>
      </c:if>
        <!-- Messages Dropdown Menu -->
        <li class="nav-item dropdown">
        </li>
        <!-- Notifications Dropdown Menu -->
        <li class="nav-item dropdown">
        </li>
        <li class="nav-item">
          <a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#" role="button"><i
              class="fas fa-th-large"></i></a>
        </li>
      </ul>
    </div>
  </nav>
  <!-- /.navbar -->


  
<script>
function goLogout()
{	
	var url;
	url = '/user/logout';	
	var data = JSON.stringify({
	});
	getPostData(url,data,callback_common,false);
}
function goLogin()
{	
	var url;
	url = '/user/login';
	
	
	var data = JSON.stringify({
		uid : $("#uid").val()
		 , upw : $("#upassword").val()
	});
	getPostData(url,data,callback_common,false);
}
var callback_common = function (result)
{
	if(result['result']=='LOGIN_SUCCESS')
	{
		showmessage("알림","로그인 되었습니다..",5000,'');
		self.location = "${pageContext.request.contextPath}/";
	}
	if(result['result']=='LOGOUT_SUCCESS')
	{
		showmessage("알림","로그아웃 되었습니다..",5000,'');
		self.location = "${pageContext.request.contextPath}/";
	}
	else if(result['result']=='ID_NOT_FIND')
	{	
		showmessage("알림","아디를 확인해주세요.",5000,'');
		$("#uid").val("");
		$("#uid").focus();
	}
	else if(result['result']=='PASSWORD_FAIL')
	{	
		showmessage("알림","아디를 확인해주세요.",5000,'');
		$("#uid").val("");
		$("#uid").focus();
	}
	else
	{
		showmessage("알림",result['message'],20000,'');
		ms_alert("알림","내용이 등록/수정을 실패하였습니다");
	}
}
</script>

 <!-- Right navbar links --> 아래쪽에 로그인이 가능한 폼을 추가했어요. 

login 값의 유무에 따라 로그인 로그아웃 기능을 넣었어요. 

top.jsp
0.01MB

컨트롤러는 이렇게 추가했어요. 

	@ResponseBody
	public CommonData logout(HttpServletRequest request, HttpServletResponse response, @RequestBody CommonData dto, Model model) throws Exception{
		Map<String, String> paramMap = new HashMap<>();
		CommonData result = new CommonData();
		HttpSession session = request.getSession();
		Util_Message smsp = Util_Message.getInstance();
	   Object obj = session.getAttribute("login");
	   if (obj != null) {
		Member vo = (Member) obj;
		String ip = request.getRemoteAddr();
		dto.put("u_idx", vo.getIdx());
		dto.put("uip", ip);
		dto.put("ustate", "logout");
		service.insert(dto, "User_Mapper.user_login_history");
		System.out.println("logout.................................2");
		session.removeAttribute("login");
		session.invalidate();

		System.out.println("logout.................................3");
		Cookie loginCookie = WebUtils.getCookie(request, "loginCookie");

		if (loginCookie != null) {
			loginCookie.setPath("/"); loginCookie.setMaxAge(0);
			response.addCookie(loginCookie); 
			}
			
		}
	   result.put("result", "LOGOUT_SUCCESS");
	    return result;
	}
	@RequestMapping(value = "/login", method = RequestMethod.POST)
	@ResponseBody
	public CommonData post_login(HttpServletRequest request, HttpServletResponse response, @RequestBody CommonData dto, Model model) throws Exception{
		Map<String, String> paramMap = new HashMap<>();
		CommonData result = new CommonData();
		HttpSession session = request.getSession();
		Util_Message smsp = Util_Message.getInstance();
	    if (session.getAttribute("login") != null) {
	      smsp.print_String("clear login data before");
	      session.removeAttribute("login"); //로그인 정보 삭제
	    }	    
	    smsp.print_CommonData(dto); //넘어온데이터 출력.
	    
	    String useCookie=dto.get("useCookie");
	    
		int cnt = service.listSearchCount(dto, "User_Mapper.user_id_check");
		if (cnt == 0)
		{
			result.put("result", "ID_NOT_FIND");
			result.put("message", "ID가 없습니다.");
			return result;
		}
		Member vo = service.select_member(dto, "User_Mapper.tb_member_select_one");
		if(vo==null)
		{
			result.put("result", "PASSWORD_FAIL");
			result.put("message", "패스워드를 확인해주세요.");
			return result;
		}
		String ip = request.getRemoteAddr();
		dto.put("u_idx", vo.getIdx());
		dto.put("uip", ip);
		dto.put("ustate", "login");
		service.insert(dto, "User_Mapper.user_login_history");
		smsp.print_String_no_line("로그인정보가 있습니다.");
		String CPath = "/";
		//SecurityMember s_mem = new SecurityMember(vo);
		model.addAttribute("userVO", vo);
		session.setAttribute("login", vo);
		if(useCookie!=null)
		{	
			if(useCookie.equals("true"))
			{
				smsp.print_String_no_line("쿠키정보를 추가합니다.");
				//쿠키...
			    //로그인 유지기간 섹션값저장
				int limit_time = 60*60*24*365;//1년일
				Date sessionLimit = new Date(System.currentTimeMillis()+(1000*limit_time));
				dto.put("sessionId",session.getId());
				dto.put("sessionLimit",sessionLimit);
				service.update(dto, "User_Mapper.keepLogin");
				Cookie loginCookie = new Cookie("loginCookie", session.getId());
				loginCookie.setPath("/");
				loginCookie.setMaxAge(limit_time);
				smsp.print_String("CPath : " + CPath);
				CPath = "/";			
				response.addCookie(loginCookie);
			}
		}
		result.put("result", "LOGIN_SUCCESS");
		return result;
	}

로그인 로그아웃 부분을 추가했어요. 

User_Controller.java
0.01MB

mapper파일도 수정을 해줘요. 

 <select id="tb_member_select_one" resultType="com.eunhocompany.domain.Member"> 
        SELECT tm1.idx
		     , tm1.uid
		     , tm1.uname
		     , tm1.uchart
		     , tm1.uemail
		     , tm1.umobile
		     , tm1.menu_lv
		     , tm1.join_pass
		     , tm1.mt_use
		FROM tb_member tm1
         where tm1.mt_use = 'Y'
           and tm1.uid = #{uid}
           and tm1.upw = #{upw}
         order by menu_lv desc
		 limit 1
    </select>
    
     <insert id="user_login_history">		
		insert into tb_login_history(
					u_idx
				  , uip
				  , ustate
				  , mt_input_wdate
				  )
		   values(  #{u_idx}
				  , #{uip}
				  , #{ustate}
				  , now()
		          )
	</insert>

 

User_Mapper.xml
0.00MB

로그인 로그아웃 을 해볼께요. 

로그인 로그아웃

로그인 로그아웃을 확인해봤어요. 

히스토리도 잘 남는지 볼께요. 

로그인 기록

다음은 게시판을 만들어볼께요. 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

spring mvc homepage 스프링 홈페이지 만들기 5

db연결까지 되었어요 이제 회원 가입후 로그인 기능을 추가할예정인데요. 

db생성부터 해요. 정보는 많이 받지 않을예정이에요. 

아디, 비번, 이름, 이메일, 전화번호 이렇게만 받을거에요.  전화번호는 선택사항이구요 이메일은 필수 사항이에요. 

CREATE TABLE `tb_member` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(100) DEFAULT NULL COMMENT '유저id_로그인',
  `uname` varchar(40) DEFAULT NULL COMMENT '이름',
  `uchart` varchar(40) DEFAULT NULL COMMENT '차트번호',
  `uemail` varchar(255) DEFAULT NULL COMMENT '메일',
  `umobile` varchar(100) DEFAULT NULL COMMENT '전화번호',
  `upw` varchar(255) DEFAULT NULL COMMENT '패스워드',
  `menu_lv` int(11) DEFAULT 1 COMMENT '권한레벨',
  `join_pass` varchar(50) DEFAULT 'HOME' COMMENT '가입위치(SNS,WEB등)HOME',
  `mt_use` enum('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용유무가입됨',
  `sessionKey` varchar(100) DEFAULT NULL COMMENT '섹션',
  `sessionlimit` varchar(100) DEFAULT NULL,
  `mt_input_wdate` datetime DEFAULT NULL COMMENT '입력일',
  `mt_update_wdate` datetime DEFAULT NULL COMMENT '최종수정일',
  PRIMARY KEY (`idx`),
  UNIQUE KEY `uid` (`uid`),
  KEY `sessionKey` (`sessionKey`),
  KEY `uchart` (`uchart`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='회원정보';

DB는 위 테이블을 참고해서 만드시면 될것 같아요. 요즘 SNS로그인도 많이 하니까 SNS로그인도 되게끔 만들었어요. 

CREATE TABLE `tb_login_history` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `u_idx` int(11) DEFAULT NULL COMMENT '멤버테이블',
  `uip` varchar(100) DEFAULT NULL COMMENT '유저ip',
  `ustate` varchar(100) DEFAULT NULL COMMENT '로그인로그아웃',
  `mt_input_wdate` datetime DEFAULT NULL COMMENT '입력시간',
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='로그인 정보';

로그인할때 정보를 저장해요 언제 로그인했는지 ip는 뭐였는지정도만 저장해 놓을께요. 

CREATE TABLE `common_code_table` (
  `idx` int(11) NOT NULL AUTO_INCREMENT COMMENT '고유키값',
  `mt_parents_key` varchar(100) DEFAULT NULL COMMENT '코드번호(부모키)',
  `mt_code` varchar(50) DEFAULT NULL COMMENT '코드번호(자신)',
  `mt_code_value` varchar(100) DEFAULT NULL COMMENT '코드값',
  `mt_ranking` varchar(100) DEFAULT NULL COMMENT '정렬순위',
  `mt_use` enum('Y','N') DEFAULT NULL COMMENT '사용유무',
  `mt_remarks1` varchar(255) DEFAULT NULL COMMENT '비고1',
  `mt_remarks2` varchar(255) DEFAULT NULL COMMENT '비고2',
  `mt_remarks3` varchar(255) DEFAULT NULL COMMENT '비고3',
  `mt_remarks4` varchar(255) DEFAULT NULL COMMENT '비고4',
  `mt_input_wdate` datetime DEFAULT NULL COMMENT '입력일',
  `mt_input_id` varchar(100) DEFAULT NULL COMMENT '입력ID',
  `mt_group` varchar(100) DEFAULT NULL COMMENT '그룹ID',
  `mt_update_wdate` datetime DEFAULT NULL COMMENT '최종수정일',
  `mt_update_id` varchar(100) DEFAULT NULL COMMENT '최종수정ID',
  PRIMARY KEY (`idx`),
  KEY `mt_parents_key` (`mt_parents_key`),
  KEY `mt_use` (`mt_use`),
  KEY `mt_code` (`mt_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='공통코드';

 공통코드를 저장해요. 

이제 페이지가 필요로 해요. 

/AdminLTE-3.0.4/AdminLTE/pages/examples/register.html

위경로에 보면 html 파일이 있어요. 이페이지를 가지고 회원가입 페이지를 만들어 볼께요. 

register.jsp파일을 만들어요

컨트롤러를 만들어서 페이지를 열어야 하는데 컨트롤러를 모아놓을 패키지를 만들께요.

com.eunhocompany.controller 만들어 주시고요. 

servlet-context.xml 보시면 이미 등록해 놓았어요. 

<context:component-scan base-package="com.eunhocompany.controller" />

그리고 js.파일을 복사해요. 이건 제가 사용하는대로 모아 놓은거라 적당히 재작성해서 사용하시면되요. 

common.myeongsu.js
0.02MB
jsgrid.myeongsu.js
0.06MB

PNotify 이것도 사용할예정인데요. https://sciactive.com/pnotify/

 

PNotify

JavaScript notification plugin.

sciactive.com

리소스에 core폴더 만들어서 다 넣어주세요. 

animate.css 와 PNotify만 있으면 되요. 다른 파일은 신경쓰지 마세요. 

PNotify폴더 파일이구요.

pnotify.custom.css
0.01MB
pnotify.custom.js
0.07MB
pnotify.custom.min.css
0.01MB
pnotify.custom.min.js
0.07MB

animate.css폴더 내용이에요. 

파일이 많아서 core 압축해서 올려요. 

core.zip
0.07MB

그럼 bottom.jsp파일을 수정해요. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

  <!-- Control Sidebar -->
  <aside class="control-sidebar control-sidebar-dark">
    <!-- Control sidebar content goes here -->
    <div class="p-3">
      <h5>Title</h5>
      <p>Sidebar content</p>
    </div>
  </aside>
  <!-- /.control-sidebar -->

  <!-- Main Footer -->
  <footer class="main-footer">
    <!-- To the right -->
    <div class="float-right d-none d-sm-inline">
      Anything you want
    </div>
    <!-- Default to the left -->
    <strong>Copyright &copy; 2014-2019 <a href="https://adminlte.io">AdminLTE.io</a>.</strong> All rights reserved.
  </footer>
</div>
<!-- ./wrapper -->

<!-- REQUIRED SCRIPTS -->

<!-- jQuery -->
<script src="${pageContext.request.contextPath}/resources/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="${pageContext.request.contextPath}/resources/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="${pageContext.request.contextPath}/resources/AdminLTE/dist/js/adminlte.min.js"></script>

<script src="${pageContext.request.contextPath}/resources/core/myjavascript/common.myeongsu.js"></script>
<!-- PNotify -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/core/PNotify/pnotify.custom.min.css">
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/core/animate.css/animate.min.css">
<script src="${pageContext.request.contextPath}/resources/core/PNotify/pnotify.custom.min.js"></script>			
</body>
</html>

top.jsp 파일도 수정을 해요 메뉴에 가입하기 바로가기버튼을 추가할거에요.

아래쪽에  <!-- Right navbar links --> 있을거에요. 

	<li class="nav-item">
          <a class="nav-link" href="/user/register">가입하기</a>
        </li>

 

bottom.jsp
0.00MB
top.jsp
0.01MB

 

가입하기 버턴을 누르면 가입하는 화면으로 이동을 해요.

register.jsp파일을 수정할예정이에요.

register.jsp
0.01MB

유효성검사 부분은 https://samdo0812.tistory.com/27 여기를 참고해서 수정할께요. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@include file="../include/top.jsp"%>


<!-- Content Wrapper. Contains page content -->
  <div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <div class="content-header">
      <div class="container-fluid">
        <div class="row mb-2">
          <div class="col-sm-6">
            <h1 class="m-0 text-dark"> 회원가입 <small>?</small></h1>
          </div><!-- /.col -->
          <div class="col-sm-6">
            <ol class="breadcrumb float-sm-right">
              <li class="breadcrumb-item"><a href="#">Home</a></li>
              <li class="breadcrumb-item active">회원가입</li>
            </ol>
          </div><!-- /.col -->
        </div><!-- /.row -->
      </div><!-- /.container-fluid -->
    </div>
    <!-- /.content-header -->

    <!-- Main content -->
    <div class="content">
      <div class="container-fluid">
        <div class="row">
          <div class="col-lg-12">
            <div class="card  card-primary card-outline">
              <div class="card-body">
                <h5 class="card-title"></h5>
                
                <div class="card-body register-card-body">
			      <p class="login-box-msg">회원정보</p>
			
			      <form action="../../index.html" method="post" id="quickForm">
			        <div class="input-group mb-3">
			          <input type="text" class="form-control" placeholder="이름" id="uname">
			          <div class="input-group-append">
			            <div class="input-group-text">
			              <span class="fas fa-user"></span>
			            </div>
			          </div>
			        </div>
			        <div class="input-group mb-3">
			          <input type="email" class="form-control" placeholder="이메일" id="uemail">
			          <div class="input-group-append">
			            <div class="input-group-text">
			              <span class="fas fa-envelope"></span>
			            </div>
			          </div>
			        </div>
			        <div class="input-group mb-3">
			          <input type="text" class="form-control" placeholder="아이디" id="uid">
			          <div class="input-group-append">
			            <div class="input-group-text">
			              <span class="fas fa-envelope"></span>
			            </div>
			          </div>
			        </div>
			        <div class="input-group mb-3">
			          <input type="password" class="form-control" placeholder="패스워드" id="upassword">
			          <div class="input-group-append">
			            <div class="input-group-text">
			              <span class="fas fa-lock"></span>
			            </div>
			          </div>
			        </div>
			        <div class="input-group mb-3">
			          <input type="password" class="form-control" placeholder="패스워드확인" id="upassword_chk">
			          <div class="input-group-append">
			            <div class="input-group-text">
			              <span class="fas fa-lock"></span>
			            </div>
			          </div>
			        </div>
			        <div class="row">
			          <div class="col-8">
			            <div class="icheck-primary">
			              <input type="checkbox" id="agreeTerms" name="terms" value="agree">
			              <label for="agreeTerms">
			               I agree to the <a href="#">terms</a>
			              </label>
			            </div>
			          </div>
			          <!-- /.col -->
			          <div class="col-4 text-right">
			            <button type="button" class="btn btn-outline-primary" onclick="goSubmit()">가입하기</button>
			          </div>
			          <!-- /.col -->
			        </div>
			      </form>
				<!-- 
			      <div class="social-auth-links text-center">
			        <p>- OR -</p>
			        <a href="#" class="btn btn-block btn-primary">
			          <i class="fab fa-facebook mr-2"></i>
			          Sign up using Facebook
			        </a>
			        <a href="#" class="btn btn-block btn-danger">
			          <i class="fab fa-google-plus mr-2"></i>
			          Sign up using Google+
			        </a>
			      </div>
			 -->
			      <a href="login.html" class="text-center">I already have a membership</a>
			    </div>

                
              </div>
            </div>
		  </div>
        </div>
        <!-- /.row -->
      </div><!-- /.container-fluid -->
    </div>
    <!-- /.content -->
  </div>
  <!-- /.content-wrapper -->
  
<script>
function goSubmit()
{	
	if(!checkz()) //유효성검사를 먼저하기.
	{
		return;
	}
	var url;
	url = '/user/regedit';
	
	
	var data = JSON.stringify({
		uid : $("#uid").val()
		 , uname : $("#uname").val()
		 , uemail : $("#uemail").val()
		 , upw : $("#upassword").val()
		 , mt_use : 'Y'
	});
	getPostData(url,data,callback_common,false);
}
var callback_common = function (result)
{
	if(result['result']=='INSERT_OK')
	{
		showmessage("알림","가입되었습니다.",5000,'');
	}
	
	else if(result['result']=='ID_DUPLICATE')
	{	
		showmessage("알림",result['message'],5000,'');
		$("#uid").val("");      
		$("#uid").focus();
	}
	else
	{
		showmessage("알림",result['message'],20000,'');
		ms_alert("알림","내용이 등록/수정을 실패하였습니다");
	}
}
function checkz() {
    var getMail = RegExp(/^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+/); 
    var getCheck= RegExp(/^[a-zA-Z0-9]{4,12}$/); 
    var getName= RegExp(/^[가-힣]+$/);  

    //아이디 공백 확인
    if($("#uid").val() == ""){
      alert("아이디 입력해주세요.");
      $("#uid").focus();
      return false;
    }

    //아디 유효성 검사
    if(!getCheck.test($("#uid").val())){
      alert("형식에 맞게 입력해주세요.");
      $("#uid").val("");      
      $("#uid").focus();
      return false;
    }

    //비밀번호
    if(!getCheck.test($("#upassword").val())) {
    alert("형식에 맞춰서 PW를 입력해주세요.");
    $("#upassword").val("");
    $("#upassword_chk").val("");
    $("#upassword").focus();
    return false;
    }

    //아이디랑 비밀번호랑 같은지
    if ($("#uid").val()==($("#upassword").val())) {
    alert("비밀번호가 ID와 똑같은지 확인해주세요.");
    $("#upassword").val("");
    $("#upassword_chk").val("");
    $("#upassword").focus();
  }

    //비밀번호 똑같은지
    if($("#upassword").val() != ($("#upassword_chk").val())){ 
    alert("패스워드를 확인해주세요.");
    $("#upassword").val("");
    $("#upassword_chk").val("");
    $("#upassword").focus();
    return false;
   }

   //이메일 공백 확인
    if($("#mail").val() == ""){
      alert("이메일을 입력해주세요");
      $("#mail").focus();
      return false;
    }
         
    //이메일 유효성 검사
    if(!getMail.test($("#uemail").val())){
      alert("이메일형식에 맞게 입력해주세요")
      $("#uemail").val("");
      $("#uemail").focus();
      return false;
    }

    //이름 유효성
    if (!getName.test($("#uname").val())) {
      alert("이름을 확인해주세요.");
      $("#uname").val("");
      $("#uname").focus();
      return false;
    }
  	return true;
}
</script>
  
<%@include file="../include/bottom.jsp"%>
  

getPostData부분은 ajax를 편하게 사용하기위해서 만들어 놓은 함수에요. 

컨트롤러 부터 만들어줘요. 기존에 만들어놓은 User_controller에 추가할께요. 

package com.eunhocompany.controller;

import java.sql.SQLIntegrityConstraintViolationException;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.eunhocompany.domain.CommonData;
import com.eunhocompany.persistence.commonDAO;
import com.eunhocompany.service.Common_ServiceImpl;
import com.eunhocompany.service.Second_ServiceImpl;
import com.eunhocompany.util.Util_Message;

import java.util.Date;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.web.util.WebUtils;

@Controller
@RequestMapping("/user")
public class User_Controller {
	@Autowired
	private Common_ServiceImpl service;
	Util_Message smsp = Util_Message.getInstance();

	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String create(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model)
			throws Exception {
		Util_Message smsp = Util_Message.getInstance();
		String CPath = request.getContextPath().toString();
		UrlPathHelper urlPathHelper = new UrlPathHelper();
		String originalURL = urlPathHelper.getOriginatingRequestUri(request);
		smsp.print_String("OriginalURL ==>" + originalURL);

		return "/user/register";
	}
	
	@RequestMapping(value = "/regedit", method = RequestMethod.POST)
	@ResponseBody
	public Map<String, String> regedit(@RequestBody CommonData dto) throws Exception{
		Map<String, String> paramMap = new HashMap<>();
		smsp.print_CommonData(dto);
		//AES128 aes = AES128.getInstance();
		String loginpass = dto.get("upw");
		//smsp.print_String_no_line("CONTROLLER: " + loginpass);
		//String AES_loginpass = aes.encrypt(loginpass);
		//dto.put("upw", AES_loginpass);
		int cnt =service.listSearchCount(dto, "User_Mapper.user_id_check");
		if(cnt>0)
		{
			paramMap.put("result", "ID_DUPLICATE");
			paramMap.put("message", "ID가 있어요.");
			return paramMap;
		}
		service.insert(dto, "User_Mapper.user_insert");
		paramMap.put("result", "INSERT_OK");		
		return paramMap;
	}

}

 패스워드 암호화 관련해서는 따로 할게요 

User_Controller.java
0.01MB

regedit라는 걸 post로 만들어 주고요. User_Mapper를 만들어요. 

User_Mapper.xml
0.00MB
위치에요.

db를 확인해보면 이렇게 잘 데이터가 입력이 되었어요. 

db내용

이어서 로그인관련해서 정리할께요. 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

spring mvc homepage 스프링 홈페이지 만들기 4

이번에는 DB와 데이터를 주고 받을 DOMIAN 객체와 서비스를 만들어 볼게요. 

아 그전에 전 util이라는 패키지를 만들어서 자주 사용하는 log나 가끔 정보 볼때 사용하는 명령어들을 모아놓았어요.

com.eunhocompany.util 패키지에 유틸메세지를 복사해요.

Util_Message.java
0.02MB

이파일이 에러날때 pom.xml에 바코드고나련 메이븐 설정이 빠져서 그래요. 

<!-- 구글바코드 오픈소스 -->
		 <dependency> 
		 	<groupId>com.google.zxing</groupId> 
		 	<artifactId>core</artifactId> 
		 	<version>3.4.0</version> 
		 </dependency> 
		 <!-- https://mvnrepository.com/artifact/com.google.zxing/javase --> 
		 <dependency> 
		 	<groupId>com.google.zxing</groupId> 
		 	<artifactId>javase</artifactId> 
		 	<version>3.4.0</version> 
		 </dependency>

com.eunhocompany.domain com.eunhocompany.persistence com.eunhocompany.service 패키지를 만들어주세요. 

 

CommonData.java
0.00MB
Criteria.java
0.00MB
PageMaker.java
0.00MB
Member.java
0.00MB
MemberRole.java
0.00MB
SearchCriteria.java
0.00MB

 

domain에 위 클래스를 넣어주세요. 

소스내용은 살펴보시면 돼요.

다음은 persistence 이쪽을 만들어 줄텐데요. 

 

commonDAO.java
0.00MB
first_commonDAOImpl.java
0.00MB
second_commonDAOImpl.java
0.00MB

 

db별로 만들어 주었어요. 다음은 service를 만들게요.

 

common_Service.java
0.00MB
First_ServiceImpl.java
0.00MB
Common_ServiceImpl.java
0.01MB
Second_ServiceImpl.java
0.00MB

 

db별로 서비스를 만들어주고 공통으로 사용할 것도 만들었어요. 

이제 홈컨트롤러에서 시간을 db에서 받아와서 출력해볼께요. 

package com.eunhocompany.home;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.eunhocompany.domain.CommonData;
import com.eunhocompany.persistence.commonDAO;
import com.eunhocompany.service.Common_ServiceImpl;
import com.eunhocompany.service.Second_ServiceImpl;
import com.eunhocompany.util.Util_Message;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	
	@Autowired
	private Common_ServiceImpl service;
	
	Util_Message smsp=Util_Message.getInstance();
	/**
	 * Simply selects the home view to render by returning its name.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) throws Exception {
		//logger.info("Welcome home! The client locale is {}.", locale);
		smsp.print_String("Welcome home! The client locale is"+locale.toString());
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		CommonData test = new CommonData();
		String time = service.selectstr(test, "BasicMapper.getCurrentDateTime_second");
		
		model.addAttribute("dbserverTime", time );
		return "home";
	}
	
}

 

홈 컨트롤러를 수정했어요.  그리고 db에서 데이터 가져올때

String time = service.selectstr(test, "BasicMapper.getCurrentDateTime_second"); 이런식으로 사용하는데요. 두번째 칸에 mapper이름 그다음 id값이 들어가면되요. 

<?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.eunhocompany.mapper.first.BasicMapper">
	<select id="getCurrentDateTime_second" resultType="String"> 
		SELECT NOW() 
	</select>
</mapper>

바로 실행하시면 에러가 나요. 서비스랑 db부분을 등록시켜줘야되요. 

servlet-context.xml
0.00MB
root-context.xml
0.00MB

위 파일을 받아서 수정을 해요. 넣어주세요. 경로는 이래요. 

 

마지막으로 home.jsp에 수정을 해줘요.

  				<P>  The time on the server is ${serverTime}. </P>
                <P>  The time on the dbserver is ${dbserverTime}. </P>

그럼 출력결과를 확인할수 있어요. 

 

 

 

 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

spring mvc homepage 스프링 홈페이지 만들기 3

mysql을 설치해주세요. 헐.. 전 mariadb를 설치되어 있네요. 

mariadb10.4

음 mariadb로 설치할께요 mysql과 동일하게 접속이 되니 그냥 진행할께요. 

db를 하나 만들어요. home_page로 만들었어요. 
schemas 잘만들어지네요.

mysql workbench 프로그램으로 생성이 되니 mysql홈페이지에서 다운받아 설치하시면되요. 

SELECT HOST, USER, PASSWORD FROM USER;

CREATE USER 'eunhopapa'@'%' IDENTIFIED BY 'eunho20190000';
SELECT HOST, USER, PASSWORD FROM USER;

db를 생성해요. mariadb도 버전이 오르면서 툴에서 생성하는게 잘 안되어서 명령어로 생성해요. 

권한등을 설정할꺼에요. 
dba설정

전 모든권한을 주었어요.

이렇게 db생성이 되었습니다. 

그리고나서 toad for mysql 설치합니다. 

접속 설정

이렇게 해서 db에 접속을 해요. 잘되네요. 이제 스프링에 세팅해줄께요. 

/homepage/src/main/webapp/WEB-INF/spring/root-context.xml
/homepage/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml

두파일을 수정해요.

엑셀다운로드 mybitis log 인터셉터등으로 다양한 파일을 생성해야해요. 내용은 없고 추가해주도록할게요.

interceptor를 추가해줄께요. 하나는 로그인 관련 처리할것이고 하나는 메타태그 관련정보를 다를거에요. 

AuthInterceptor.java
0.00MB
MetaInterceptor.java
0.00MB

src->main->resources 안에 아래의 파일을 추가수정해요. 

log4j.xml
0.00MB
log4jdbc.log4j2.properties
0.00MB
mybatis-config.xml
0.00MB

그리고 쿼리 관련 xml도 만들어줘요. 

BasicMapper.xml
0.00MB

WIN-INF 에다가 views.xml 파일을 복사해줘요. 

views.xml
0.00MB

그럼 실행을 해보면 별로 변한건 없이 db연결만 되었어요. 테스트는 따로 안할께요. 

그리고 jsp 파일에 <div class="container"> 부분을 모두 <div class="container-fluid"> 이렇게 변경을 해주세요

전 화면에 꽉찬 페이지를 만들고 싶어서 그래요. 

홈페이지

꽉 찬 페이지가 나오는것을 확인할수 있어요. <div class="col-lg-6"> 을 <div class="col-lg-12"> 변경해야하는것도 잊지 마세요.

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

spring  mvc homepage  스프링 홈페이지 만들기 2

adminlte를 붙여볼게요. 

여기에 복사

경로는 src -> main -> webapp -> resources 에 압축을 푼 adminlte를 복사를 해요. 

※AdminLTE-3.0.4 가 길어보여서 AdminLTE로 이름 변경했어요. 

샘플소스

복사를 모두 해도 되겠지만 일단 조금씩 해볼께요. 용량이 큰지라 top-nav.html 기준으로 가져와 볼게요.

top-nav.html 파일을 메모장에서 열어요. 대충 보니까 두 군데 파일이 필요해 보이는데 2 폴더 용량이 61메가나 되네요.

모든 소스가 다 포함되어 있어서 사용하는 파일만 하나하나 복사할까 했지만 그냥 다 복사할게요.

그리고 home.jsp파일내용을 top-nav.html내용으로 수정해줍니다. 경로도 수정야 하는데요. 첨부파일을 참고해주세요.

home.jsp
0.01MB

실행하여 결과를 보면요. 

home.jsp수정후 결과

결과를 잘 보았는데요. 이제 이걸 쪼갤 예정입니다. 위쪽 메뉴 부분과 아래쪽 부분은 다른 페이지에서 공통으로 사용하는 영역이고요. 

본문 내용만 계속 수정이 이루어질 예정이기 때문에 그래요.

페이지 소스를 보니 보니 <!-- Content Wrapper. Contains page content --> 부분 위쪽과 <!-- /.content-wrapper --> 부분 아래쪽으로 나누면 될 거 같아요. 

views안에 하위 폴더를 만들어요 저는 include라는 폴더를 만들었어요. 

그리곤 home.jsp파일을 복사를 했어요. 

파일명은 top과 bottom이라고 지었어요 주석을 보니 헤더와 풋터로 해야 할 것 같은 느낌인데 그냥 진행할게요. 

top bottom.

top는 <!-- Content Wrapper. Contains page content --> 위쪽만 남기고 bottom은 <!-- /.content-wrapper -->아래쪽만남겨요.

home.jsp 파일내용도 수정을 해요. 

<!-- Content Wrapper. Contains page content --> 와  <!-- /.content-wrapper --> 사이내용만 남기고 위아래를 지워요. 

그리고 위아래로 두파일을 포함시켜요. 

<%@include file="include/top.jsp"%>
<%@include file="include/bottom.jsp"%>

그럼 이렇게 파일3개가 수정되었어요. 첨부한 파일을 참고하세요. 

home.jsp
0.00MB
top.jsp
0.01MB
bottom.jsp
0.00MB

그리고 결과를 확인해보면 이렇게 나와요. 

아까와 결과가 같지요? 

이제 로그인이라던지 가입하기 같은 걸 해볼 거예요. db를 설치하고 해야 할 텐데 

전 mysql을 사용할 예정이에요. 버전은 상관없어요. 

참고자료 book.naver.com/bookdb/book_detail.nhn?bid=9425458

 

코드로 배우는 스프링 웹 프로젝트

[코드로 배우는 스프링 웹 프로젝트]는 개발 현장에서 사용하는 도구로서 스프링을 취급하는 책으로, SPRING FRAMEWORK(이하 스프링)를 이용해서 ‘웹 프로젝트’를 어떻게 진행하는지를 설명한다. �

book.naver.com

참고 카페 cafe.naver.com/gugucoding

 

구멍가게코딩단 : 네이버 카페

안녕하세요? 구멍가게 코딩단의 활동을 위한 카페입니다.

cafe.naver.com

 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

spring  mvc homepage  스프링 홈페이지 만들기 1

스프링을 이용하여 홈페이지를 제작해볼 예정입니다. 

최대한 간단하게 필요한 결과 위주로 구성해볼 예정입니다.

UI는 https://adminlte.io/themes/v3/pages/layout/top-nav.html를 이용할 예정입니다.

소스코드를 다운로드 받아주세요.
용량

압축을 해제하니 용량이 제법 많으네요. 일단 다운로드한 후 잘 보관해 놓으세요.

STS를 설치해주세요. 그리고 새로운 프로젝트를 시작해요.

스프링프로젝트생성

프로젝트를 생성을 해요. 생성할때 Spring MVC Project로 해주세요. 

서버를 실행해보세요. 톰캣서버로 실행을 할 거예요. 8 버전으로 맞추어 주세요. 

실행을 하면 이런 화면이 보일꺼에요. 

hello world

??? 표도 나오고 그러죠? 이제 utf8환경으로 세팅을 할 건데요. 세팅되어 있는 환경을 복사하는 형태로 진행할게요.

안에 내용은 따로 공부해보세요. 검색하면 잘 나와요. 

처음에 할 일은 pom.xml을 수정할 거예요. 

pom.xml

이 부분을 남기고 모두 첨부한 pom.xml과 같게 수정을 해줘요 안에 필요 없는 내용은 삭제하시면 돼요. 

pom.xml
0.01MB

다음은 web.xml을 수정할게요. 

web.xml
0.00MB

web.xml내용을 복사해주세요.

이제 jsp페이지를 수정할 거예요. 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>

 

내용일 텐데요 아래와 같이 수정을 해요. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>

 

서버 폴더 안에 톰캣 8이 있어요 거기에 server.xml이 있는데 이걸 수정할 거예요.

<Context docBase="homepage" path="/" reloadable="true" source="org.eclipse.jst.jee.server:homepage"/></Host>

path를 지우세요. 이러면 localhost:8080으로 접속 시 바로 home.jsp내용이 나와요. 

헬로우 월드가 출력되었죠?

다음은 ADMINLTE3 네이게이션페이지를 출력해볼께요. 

 

참고자료

https://book.naver.com/bookdb/book_detail.nhn?bid=9425458

 

코드로 배우는 스프링 웹 프로젝트

[코드로 배우는 스프링 웹 프로젝트]는 개발 현장에서 사용하는 도구로서 스프링을 취급하는 책으로, SPRING FRAMEWORK(이하 스프링)를 이용해서 ‘웹 프로젝트’를 어떻게 진행하는지를 설명한다. �

book.naver.com

참고카페

https://cafe.naver.com/gugucoding

 

구멍가게코딩단 : 네이버 카페

안녕하세요? 구멍가게 코딩단의 활동을 위한 카페입니다.

cafe.naver.com

 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

summernote img 태그 이미지 첨부 스프링

https://summernote.org/ 에가면 사용법등 잘설명되어 있어요.

저는 스프링에서 summernote를 사용하는 방법에대해서 정리할거에요.

일단 summernote를 다운로드 받으세요. 사이트에 가면 잘나와 있어요. 

	<link href="${pageContext.request.contextPath}/resources/editor/summernote.css" rel="stylesheet">
	<script src="${pageContext.request.contextPath}/resources/editor/summernote.js"></script>
	<!-- include summernote-ko-KR -->
	<script src="${pageContext.request.contextPath}/resources/editor/lang/summernote-ko-KR.js"></script>
    

받으셨으면 페이지에 첨부를 해요. 

페이지를 시작하는 부분에 $(document).ready(function() {});

아래코드를 첨부해요.

$('#summernote').summernote({
	    lang: 'ko-KR', // default: 'en-US'
	   	height: 500,                 // set editor height
		minHeight: 500,             // set minimum height of editor
		maxHeight: 500,             // set maximum height of editor
		focus: true,                  // set focus to editable area after initializing summe
		callbacks: {
          onImageUpload: function(files, editor, welEditable) {
            for (var i = files.length - 1; i >= 0; i--) {
              sendFile(files[i], this);
            }
          },
          onChange: function(contents, $editable) {
              console.log('onChange:', contents, $editable);
             
              new_img_list=$(".note-editable .sn_insert_img");
              if(old_img_list!='' &&new_img_list!='')
              {
              	note_image_sync(old_img_list,new_img_list);
              }
              old_img_list= $(".note-editable .sn_insert_img");
              
            },
          onBlur: function() {
              console.log('Editable area loses focus');
            },
          onFocus: function() {
              console.log('Editable area is focused');
            }
        }
	  });
	$("#summernote").summernote({
	    onMediaDelete : function($target, editor, $editable) {
	         alert($target.context.dataset.filename);         
	         $target.remove();
	    }
	}); 

섬머노트 페이지에 가면 설명이 잘되어 있어서 설명은 안하겠어요. 여기서 onImageUpload 부분을 구현해줘야 해요. 

sendFile부분을 구현해야해요. 

function sendFile(file, el) {
    var form_data = new FormData();
    form_data.append('file', file);
    $.ajax({
      data: form_data,
      headers : {
			'X-CSRF-TOKEN': $("#csrf_token").val()
		},
      type: "POST",
      url: '/admin/chart/image_upload',
      cache: false,
      contentType: false,
      enctype: 'multipart/form-data',
      processData: false,
      async: false
    }).done(function( msg ) {
        if(msg.result=='IMAGE_OK')
        {
	        var url = msg.url;
	        id = msg.id;        
	        $(el).summernote('editor.insertImage', url,fun_summernote_imgcallback);
	        $('#imageBoard > ul').append('<li><img src="'+url+'" class="summernoteimg_obj" id="'+id+'" width="100%" height="100%"/></li>');
        }
        else
    	{
        	showmessage("알림","이미지 파일이 아닙니다.",2000,'');
    	}
    });
  }

저는 이미지 파일을 db에 보관을 해요. 

image_upload부분은 이렇게 해요. 

@ResponseBody
		@RequestMapping(value ="/image_upload", method=RequestMethod.POST, produces = "application/json;charset=UTF-8")
		public Map<String, String> update_file_upload(MultipartFile file,HttpServletRequest request)throws Exception{
			Map<String, String[]> paramMap=request.getParameterMap();
			Iterator keyData = paramMap.keySet().iterator();
			CommonData dto = new CommonData();
			while (keyData.hasNext()) {
			    String key = ((String)keyData.next());
			    String[] value = paramMap.get(key);
			    dto.put(key, value[0].toString());        
			    smsp.print_String("key : " + key + ", value : " + value[0].toString());
			} 
			MediaUtils MediaUtils = new MediaUtils();
			String formatName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
			MediaType mType = MediaUtils.getMediaType(formatName);
			BufferedImage resizeimg;
			if(mType!=null)
			{
				BufferedImage srcImg = ImageIO.read(file.getInputStream()); 
				/*
			    if(srcImg.getWidth()>1920) //사이즈 조절 할때
			    {
			    	smsp.print_String("사이즈 조절 1920");
			    	resizeimg = Scalr.resize(srcImg
			    			, Scalr.Method.QUALITY
			    			, Scalr.Mode.FIT_TO_WIDTH
			    			, 1920
			    			,Scalr.OP_ANTIALIAS);
			    	ByteArrayOutputStream baos_re = new ByteArrayOutputStream();
			 	    boolean foundWriter_re = ImageIO.write(resizeimg, formatName.toLowerCase(), baos_re);
			 	    baos_re.flush();
			 		byte[] imageInByte_re = baos_re.toByteArray();
			 		dto.put("mt_contentlength",baos_re.toByteArray().length);
			 		dto.put("mt_data", imageInByte_re);
			 		baos_re.close();
			    }
			    else //사이즈 조절안할때.
			    */ 
			    {	
			    	smsp.print_String("사이즈 조절안함. 1920");
			    	dto.put("mt_contentlength",file.getBytes().length);
			 	    dto.put("mt_data", file.getBytes());
			    }	   
			    BufferedImage destImg = 
			            Scalr.resize(srcImg, 
			            		Scalr.Method.BALANCED, 
			                180,180
			                ,Scalr.OP_ANTIALIAS);
			    ByteArrayOutputStream baos = new ByteArrayOutputStream();
			    boolean foundWriter = ImageIO.write(destImg, "png", baos);
				baos.flush();
				byte[] imageInByte = baos.toByteArray();
				dto.put("mt_s_data", imageInByte);
				baos.close();
			}
			Map<String, String> result = new HashMap<>();
			result.put("result", "NOT_AN_IMAGE");
			if(mType!=null)
			{
			    dto.put("mt_filename",file.getOriginalFilename());
			    dto.put("mt_type",file.getContentType());
			    HttpSession session = request.getSession();
			    Member vo = (Member) session.getAttribute("login");
			    dto.put("mt_input_id", vo.idx);
			    dto.put("mt_update_id", vo.idx);
			    first_service.insert(dto, "File_UpDown_Mapper.insert_editor_image_upload");
			    int idx= first_service.listSearchCount(dto, "File_UpDown_Mapper.select_editor_image_upload");
				result.put("result", "IMAGE_OK");
			    String url = "/editor/get_editor_image/?idx="+idx;
			    String id = ""+idx;
			    result.put("url", url);
			    result.put("id", id);
			    }
		    return result;
		}

db에 바로 넣고 있어요. 

db의 테이블은 이렇게 생겼어요. 

CREATE TABLE `editor_image_table` (
  `idx` int(11) NOT NULL AUTO_INCREMENT COMMENT '게시물 고유키값',
  `mt_uuid` varchar(40) DEFAULT NULL,
  `mt_contentlength` int(11) DEFAULT NULL COMMENT '파일사이즈.',
  `mt_filename` varchar(100) DEFAULT NULL COMMENT '이름',
  `mt_type` varchar(100) DEFAULT NULL COMMENT '파일타입',
  `mt_data` longblob DEFAULT NULL COMMENT '파일내용',
  `mt_s_data` longblob DEFAULT NULL COMMENT '축소파일내용',
  `mt_input_wdate` datetime DEFAULT NULL COMMENT '입력일',
  `mt_input_id` bigint(20) DEFAULT NULL COMMENT '입력ID',
  `mt_update_wdate` datetime DEFAULT NULL COMMENT '최종수정일',
  `mt_update_id` bigint(20) DEFAULT NULL COMMENT '최종수정ID',
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='파일정보';

쿼리부분입니다. 

<!-- 이미지파일 업로드 -->
	<insert id="insert_editor_image_upload">	
		INSERT INTO editor_image_table (
						   mt_filename						
						 , mt_type
						 , mt_data
						 <if test="mt_s_data != null">
						 , mt_s_data
						 </if>
						 <if test="uid != null">
						 , mt_uuid
						 </if>
						 , mt_contentlength
						 , mt_input_wdate
						 , mt_input_id
						 , mt_update_wdate
						 , mt_update_id
						 ) 
				     VALUES (
				           #{mt_filename}				         	
				         , #{mt_type}
				         , #{mt_data}
				         <if test="mt_s_data != null">
				         , #{mt_s_data}
				         </if>
				         <if test="uid != null">
						 , #{uid}
						 </if>
				         , #{mt_contentlength}
				         , now()		          
				         , #{mt_input_id}
				         , now()
				         , #{mt_update_id}	         
				         )
	</insert>

이상입니다.

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,