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인 시켰어요. 

 

소스를 따로 주는데 소스와 밥 국수를 한꺼번에 넣어서 비벼서 먹었어요. 

반찬도 주는데 물회엔 반찬이 필요 없는거 같아요. 

미역국 도 조그만 그릇에 주는데 맛이 좋았어요. 

다른메뉴도 먹을게 많으니 들리면 괜찮은것 같아요. 

간절곳

간절곳은 사람이 많지도 적지도 않았어요. 

시간날때 한번 들러보세요. 이상입니다.

블로그 이미지

은호아빠

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

,

울산 중구 에어컨 청소 불러서 청소했어요.

최근 열대야로 인해서 에어컨을 켜게되는데요.. 

예전에 위니아에서 나온 에어워셔라는걸 사용했더니 습기가 많이 차서 곰팡이가 엄청 생겼어요. 

에어컨도 예외가 아니었어요. 아기가 있는집이라. 청소가 시급했어요.

집근처 청소업체를 알아보니 당일 방문이 가능하다고 하셔서 불렀어요.

2대를 청소해야 했는데 1대청소일땐 칠만원 2대라서 각각6만원에 했어요. 

두분이서 오셔서 청소를 진행하셨는데요. 

청소장비를 엄청 챙겨다니시더라구요. 포터 한대에 한가득... 

에어컨

2대모두 벽걸이 에어컨이라 분해를 했는데요. 곰팡이가 장난아니였어요. 4년전쯤 불러서 청소했었는데... 

분해

비닐로 밀봉을 하고. 

커버

이런커버를 덮고서는 친환경 곰팡이 제거제를 뿌렸어요. 왁스 냄새는 안나는게 맘에 들었어요. 

물통

흘러내리는 약물을 이렇게 받으시더라구요. 

고압세척기

고압세척기를 화장실에 설치를 하셧는데요. 에어컨의 다른 부위들은 이것으로 강한 압력의 물로 청소해주셨어요. 

 

드라이기

드라이기도 들고 다니셨는데요. 기계에 묻은 잔여 물들을 제거하셨어요. 

1시간정도 걸린다고 하셨는데.. 1시간 30분정도 걸렸던거 같아요. 

에어컨을 켜니 냄새도 안나고 좋았어요. 

더운 여름 에어컨 청소 받아보세요. ~

블로그 이미지

은호아빠

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

,

다운동 점심특선 고젠횟집 다녀왔어요.

고젠횟집에 다녀왔어요. 

친구와 점심을 먹기 위해 이것저것 검색을 해 보았어요. 

그러다 찾게된 점심특선 인데요. 고젠횟집이라는 곳에서 제공해요. 

고젠횟집

입구에 화분이 보이는데요 관리를 엄청 잘해놓아서 주인의 취미생활을 엿볼수 있었어요. 

메뉴판을 봤는데요. 점심특선 메뉴가 엄청 많아요. . 

메뉴판

저희는 회정식을 시켜서 먹었어요. 

가게내부
회정식

조금기다리자 회정식이 세팅되었는데요. 

가리비, 매운탕, 회, 초밥 , 두부 등 한상이 차려졌어요. 

먹어보니 맛도 좋고 회도 싱싱하고 다 좋았어요. 

점심메뉴가 고민된다면 고젠횟집 방문해보세요. 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, 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#

,

부산 사상구 오이시스시 점심특선 먹고 왔어요.

친구와 함께 점심을 먹으로 주례에 있는 초밥집을 들렀어요. 

뭘 먹을까 하다가 점심특선이 괜찮다고 해서 왔어요. 초밥이 무한으로 제공하는 곳과는 다르게 쫀득쫀득하다고 했어요. 

아주머니께서 기본 반찬을 주셨어요. 요즘 일식집 치고는 밑반찬이 많은 편인 거 같아요. 

회전초밥집을 가두 이런 건 서비스로 안 주는데 말이죠. 

무슨 죽였는지 모르겠지만 간이 알맞았어요. 

반찬을 먹으며 기다리다 보니 본 메뉴가 나왔어요. 

점심특선

초밥이 8개인데 사진 찍는 걸 깜빡해서 2개를 먹어버렸네요. 

와 초밥이 정말 쫀득쫀득하니 맛있었어요. 싱싱한 느낌?

간장엔 생겨자를 풀었는데요. 코를 찌르는 그 특유의 고추냉이 맛이 특징이었어요. 

대식을 하는 저에게 소식은 정말 중요한데요. 초밥 8개에 우동 한 그릇은 많지도 않았지만 모자라지도 않았어요. 

앞으로 식사를 할 땐 이 정도 량을 기준으로 식사를 해야겠어요. 

이상 오이시스시 방문기였어요. 

 

 

블로그 이미지

은호아빠

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

,

부산 해운대 핑크코끼리 베이비 카페 다녀왔어요.

토요일 아침 다녀왔어요. 

가게문

내비게이션이 안내하는 대로 갔더니 별 어려움 없이 찾을 수 있었어요. 건물 지하에 주차를 했어요. 핑크 코끼리는 3층에 위치해 있어요.

입구

10시 30분 오픈이라 적혀 있었어요.  문을 열고 들어가니 옷이 전시되어 있었어요.

사장님이 나오셔서 어떻게 오셨냐고 물어보셨어요. 예약하고 왔다고 하니 들어오라고 하셨어요. 

요즘 코로나19로 예약 손님만 받고 계신다고 했어요. 아이쿠.. 이렇게 넓은 카페에 우리 가족만 이용하다니;;;;

사장님이 혹시나싶어 양해를 구하셨어요. 다른 분들 오시면 같이 이용해도 되는지 아무래도 예약제이지만 시간보다 먼저 오거나 늦는 분들이 계신가 봐요. 저희는 상관없다고 했어요. 

창가에 자리를 잡고 음식을 주문했어요. 2인세트에 떡볶이를 추가로 시켰어요. 

음식이 나오는동안 핑크 코끼리를 둘러보았어요. 

자동차

아이사진을 이쁘게 찍을 수 있게 탈것이 있었어요.

가게 한가운데는 매트가 깔린 장난감 방이 있었고요. 

아이가 장난감에 호기심을 많이 가졌어요. 

기차

모퉁이에 기차가 있는데요. 버턴을 누르면 모터힘으로 달려요.

그렇게 빠르지 않은 속도인데.. 레일이 동그랗게만 있어서.. 아쉬웠어요. 

수유실

수요실이 따로 있어요. 기저귀도 갈수 있고 전자레인지도 있고 필요한건 다 갖춰져 있어요. 

핑크코끼리

여기저기 구경하며 사진을찍다 보니 음식이 나왔어요. 

요리

떡볶이, 김치 필라프, 불고기피자 에요. 둘이서 먹기엔 양이 많았어요. 

아이는 역시 혼자두면 안되나 봐요. 음식을 먹게 혼자 두었는데 이내 가족을 찾네요.

장난감보다는 부모가 더 좋은가봐요. 

파스타가 맛있다고들 했는데 저는 떡볶이랑 김치필라프가 너무 맛있었어요. 

특히 떡볶이 강력추천해요. 

2시간을 이용했는데요. 주차를 2시간 무료 등록을 해주셨어요. 이용하는데 참고하시길 바라요. 

 

블로그 이미지

은호아빠

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

,

ChromeDriver Chrome 용 WebDriver

크롬 브라우저로 자동화 프로그램을 개발시 유의해야 될 사항이 있어요. 

버전정보

크롬 브라우저의 버전이 업데이트되는 거예요. 

웹 드라이브도 그때마다 업데이트를 해줘야 해요. 

https://sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

여기에서 버전을 확인한 다음 다운로드를 해요. 

나의 크롬 버전을 확인해요. 뒤에 두 자리는 똑같지 않아도 돼요. 

 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, 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#

,

기장집 국수 다녀왔어요.

저녘으로 기장집 국수 에 다녀왔어요. 

와이프는 이미 장모님과 저녘을 먹은뒤라 혼자 먹었어요. 

입구

시장맞으면 2층에 위치해 있는데요. 손칼국수 해물수제비 전문이라고 적혀있어요. 

와이프말이 기장에서 맛있는집으로 유명하데요. 

메뉴판

칼국수 ,칼콩국수, 콩국수, 회빕빔국수, 양념비빔국수, 해물수제비, 물국수, 떡만두국, 찐만두를 판매하는데요.

저는 해물수제비와 찐만두를 시켰어요. 

가게내부

기다리는 동안 가게를 둘러보았는데요. 흰색 메뉴판과 안내판이 가게의 분위기를 말해주었어요.

깔끔한 느낌인데 과연 맛도 깔끔할지 궁금해졌어요. 

해물수제비
만두

찐만두는 어디서나 먹을수 있는 공장판 만두였어요. 

해물수제비는 주인아주머니께서 직접 조리해주셨는데요. 

와.. 숟가락으로 국물을 한입 넣으니 하~ 이맛 해물이 제대로 우러나와 뜨거운데 쉬지않고 먹었어요. 

김치와 단무지는 손도 안되고 먹었네요. 

정말 와이프 말대로 맛있는집이였어요. 

 

블로그 이미지

은호아빠

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

,