Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

기록

[TIL] 23.04.19 스프링 본문

SPRING

[TIL] 23.04.19 스프링

김짝 2023. 4. 19. 11:55

어제한 tiles 미니 프로젝트 이어서

오시는길

web inf 에 load폴더에 map.jsp

ipgocontroller.class는

오시는길로 가기 .... 쌍용교육센터..sub레이아웃으로 나오기.

<iframe src=" https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.3658219668437!2d127.03062587647582!3d37.499289227980356!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca1c32408f9b7%3A0x4e3761a4f356d1eb!2z7IyN7Jqp6rWQ7Jyh7IS87YSw!5e0!3m2!1sko!2skr!4v1681864044308!5m2!1sko!2skr " width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe>

 

구글 맵의 지도 퍼가기를 이용해서 iframe 태그를 가져온다.그걸 오시는길 누르면 sub에 보이게 한다.

 

sub로(레이아웃2) 안나타나게 하려면 sub를 지운다.

 

그후 회원가입

테이블먼저만드는데 member가 이미 있어서 bootmember로 만듬

create table bootmember (num smallint auto_increment primary key,
name varchar(20),
id varchar(20),
pass varchar(20),
photo varchar(100),
hp varchar(30),
addr varchar(30),
email varchar(100),
gaipday datetime)

 

MemberDto만들어준다. boot.data.dto에

package boot.data.dto;

import java.sql.Timestamp;
import org.apache.ibatis.type.Alias;
import lombok.Data;

@Data
@Alias("MemberDto")
public class MemberDto {
	public String num;
	public String id;
	public String name;
	public String pass;
	public String photo;
	public String hp;
	public String addr;
	public String email;
	public Timestamp gaipday;
}

src/main/java의 boot.data.mapper에 MemberMapperInter도 만들어준다.(처음만들때는 빈인터페이스 나중에 sql.xml 적고 적어준다)

package boot.data.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import boot.data.dto.MemberDto;

@Mapper
public interface MemberMapperInter {
	public List<MemberDto> getAllMembers();
	public void insertMember();
	public int getSearchId(String id);
}

 

 

src/main/java에 boot.data.service 패키지도 만들어준다.

그 안에 인터페이스와 클래스를 만든다. MemberServiceInter, MemberService(class) 둘이 상속관계로 만든다.(처음에는 빈인터페이스 , 빈클래스임 나중에 sql하고 적는다)

package boot.data.service;

import java.util.List;

import boot.data.dto.MemberDto;

public interface MemberServiceInter {
	public List<MemberDto> getAllMembers();
	public void insertMember();
	public int getSearchId(String id);
}

 

package boot.data.service;

import java.util.List;

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

import boot.data.dto.MemberDto;
import boot.data.mapper.MemberMapperInter;

@Service
public class MemberService implements MemberServiceInter {
	
	@Autowired
	MemberMapperInter mapper;
	
	@Override
	public List<MemberDto> getAllMembers() {
		// TODO Auto-generated method stub
		return mapper.getAllMembers();
	}

	@Override
	public void insertMember() {
		// TODO Auto-generated method stub
		mapper.insertMember();
	}

	@Override
	public int getSearchId(String id) {
		// TODO Auto-generated method stub
		return mapper.getSearchId(id);
	}
	
}

 

src/main/resources에 mapper폴더에 MemberSql.xml도 만들어준다.

namespace도 수정해준다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="boot.data.mapper.MemberMapperInter">
	<select id="getAllMembers" resultType="MemberDto"><!-- 인터페이스명과 같아야함 -->
		select * from bootmember order by id asc
	</select>
	
	<insert id="insertMember" parameterType="MemberDto">
		insert into bootmember (name,id,pass,photo,hp,addr,email,gaipday) values(#{name},#{id},#{pass},#{photo},#{hp},#{addr},#{email},now)
	</insert>
	
	<!-- id중복체크 -->
	<select id="getSearchId" parameterType="String" resultType="int">
		select count(*) from bootmember where id = #{id}
	</select>
</mapper>

 

 

 

방금 MemberSql.xml에 적은 내용을 MemberMapperInter에 적는다. 위의 코드에는 미리적어둠.

 

그걸 MemberServiceInter에 적는다.이것도 위의 코드에는 미리적어둠

그후 MemberService에 MemberServiceInter를 autowired해주고 MemberServiceInter에 적힌것을 적는다.(영상참고)

 

멤버 컨트롤러로 가서

멤버리스트(회원목록)뜨게 해준다.

@GetMapping("/member/list")
public String list(Model model) {

    //전체 조회 불러오기
    List<MemberDto> list = service.getAllMembers();
    model.addAttribute("list", list);
    model.addAttribute("count", list.size());

    return "/member/memberlist";
}

메서드 타입을String으로 만들어서 파라미터로 Model을 받아 model.addattribute로 넘긴다.

 

 

 

멤버컨트롤러에 이전에 만든 서비스를 autowired해준다. dao가 서비스로 변한것같음.

@Autowired
MemberService service;

 

 

멤버폼도만든다. webinf아래에 member에 memberform.jsp 전체코드

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Insert title here</title>
	<link href="https://fonts.googleapis.com/css2?family=Anton&family=Edu+VIC+WA+NT+Beginner:wght@600&family=Gamja+Flower&family=Single+Day&family=Jua&family=Nanum+Pen+Script&display=swap" rel="stylesheet">
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
	<script src="https://code.jquery.com/jquery-3.6.3.js"></script>
	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
	<style type="text/css">
		#showimg {
			border: 1px solid gray;
			width:130px;
			height: 160px;
		}
	</style>
	<script type="text/javascript">
		$(function(){
			//버튼클릭시 사진불러오는 이벤트 추가
			$("#btnphoto").click(function() {
				$("#myphoto").trigger("click");
				
			});
			
			//사진 불러오면 미리보기하기
			$("#myphoto").change(function(){
				if($(this)[0].files[0]) {
					var reader=new FileReader();
				  	reader.onload=function(e){
				   		$("#showimg").attr("src",e.target.result);
					}
					reader.readAsDataURL($(this)[0].files[0]);
				}
			});
			
			//아이디 입력시 idsuccess값 지원
			$("#loginid").keydown(function() {
				$("span.idsuccess").text("");
			});
			
			
			//중복체크 버튼 출력시 아이디체크 ajax로
			$("#btnidcheck").click(function() {
				$.ajax({
		            type: "get",
		            url:"idcheck",//넘어가는위치
		            data:{"id":$("#loginid").val()},//넘길 값
		            dataType:"json", 
		            success : function(res){ //res == {count:1}
		                if(res.count == 0) {//컨트롤러에서 map에 키값을 count로 설정함.
		                	
		                    $("span.idsuccess").text("ok");
		                    $("span.idsuccess").css("color","green");
		                } else {
		                	$("span.idsuccess").css("color","red");
		                	$("span.idsuccess").text("중복있음");
		                }
		            }
		        });
			})
			
			//2번째 비밀번호 입력시 체크
			$("#pass2").keyup(function() {
				var p1 = $("#pass").val();
				var p2 = $(this).val();
				
				if(p1 == p2) {
					$("span.passsuccess").text("ok");
				} else {
					$("span.passsuccess").text("fail");
				}
			});
			
		});
		
		//submit 전에 호출
		function check(){
			//사진
			if($("#myphoto").val()==''){
				alert("사진을 넣어주세요");
				return false;
			}
			
			//아이디 중복체크
			if($("span.idsuccess").text() != 'ok') {
				alert("아이디 중복체크를 해주세요");
				return false;
			}
			
			//비밀번호
			if($("span.passsuccess").text() != 'ok') {
				alert("비밀번호가 서로다릅니다.");
				return false;
			}
		}
	</script>
</head>
<body>
<button type="button" class="btn btn-info" onclick="location.href='list'">전체 회원 목록</button>
<form action="insert" method="post" enctype="multipart/form-data" onsubmit="return check()">
	<table class="table table-bordered" style="width: 600px;">
		<caption><b>회원가입</b></caption>
		<tr>
			<td style="width:200px;" rowspan="4" align="center">
				<input type="file" id="myphoto" name="myphoto" style="display: none;">
				<button type="button" id="btnphoto" class="btn btn-success" >사진선택</button>
				<br>
				<img id="showimg">
			</td>
			
			<td>
				<div class="form-inline">
					<input type="text" placeholder="아이디입력:" id="loginid" name="id" class="form-control" style="width:120px;" required="required">
					<button type="button" class="btn btn-danger" id="btnidcheck">중복체크</button>
					&nbsp;<span class="idsuccess" style="width: 60px; color: green;"></span>
				</div>
			</td>
		</tr>
		
		<tr>
			<td>
				<div class="form-inline">
					<input type="password" style="width:120px" class="forn-control" name="pass" id="pass" placeholder="숫자4자리" required="required">
					<input type="password" style="width:120px" class="forn-control" name="pass2" id="pass2" placeholder="비밀번호확인" required="required">
					
					&nbsp;<span class="passsuccess" style="width:60px;"></span>
				</div>
			</td>
		</tr>
		
		<tr>
			<td>
				<input type="text" name="name" class="form-control" style="width:130px;" placeholder="이름을 입력" required="required">
			</td>
		</tr>
		
		<tr>
			<td>
				<input type="email" name="email" class="form-control" style="width:130px;" placeholder="이메일을을 입력" required="required">
			</td>
		</tr>
		
		<tr>
			<td colspan="2">
				<div class="form-inline">
					<input type="text" name="hp" class="form-control" style="width:200px;" placeholder="(-)없이 hp숫자만 입력" required="required">
					<input type="text" name="addr" class="form-control" style="width: 200px;" placeholder="간단주소입력" required="required">
				</div>
			</td>
		</tr>
		
		<tr>
			<td colspan="2" align="center">
				<button type="submit" class="btn btn-info">회원가입</button>
			</td>
		</tr>
		
	</table>
</form>

</body>
</html>

 

 

onsubmit도 해준다 submit으로 넘어가기전에 다시한번 체크해준다는 의미

그 안에jquery 이벤트 코드 짠다

사진선택 버튼 눌렀을때 사진선택하는 창과 선택했을때 이미지가 뜨게하는것들.

 

멤버 컨트롤러(MemberController.java)에서 중복체크에 관한 메서드를 만들어준다.

//중복체크에 관한 메서드 만들기
@GetMapping("/member/idcheck")
@ResponseBody //json 반환 파싱
public Map<String, Integer> idCheckPass(@RequestParam String id) {
    Map<String , Integer> map = new HashMap<>();

    //id
    int n = service.getSearchId(id);
    map.put("count", n); // 0 or 1 ("count": 0)

    return map; 
}

 

 

 

jsp 페이지의 아이디를 중복체크하는 jquery(ajax)의 로직 코드는 아래와같다.

//<!-- $function 안에-->
//중복체크 버튼 출력시 아이디체크 ajax로
$("#btnidcheck").click(function() {
    $.ajax({
        type: "get",
        url:"idcheck",//넘어가는위치
        data:{"id":$("#loginid").val()},//넘길 값
        dataType:"json", 
        success : function(res){ //res == {check:1}
            if(res.count == 0) {

                $(".idsuccess").text("ok");
                //location.reload();//새로고침
            } else {
                $("span.idsuccess").css("color","red");
                $("span.idsuccess").text("중복있음");
            }
        }
    });
})

 

1. 사진 버튼 눌렀을때 사진선택창 나오게하고,
2. 사진선택 하면 이미지 태그에 사진 뜨게하는 jquery코드($functoin안에)

3. 아이디를 입력 중이면 "중복있음", "ok" 글씨 지우기.

//버튼클릭시 사진불러오는 이벤트 추가
$("#btnphoto").click(function() {
    $("#myphoto").trigger("click");

});

//사진 불러오면 미리보기하기
$("#myphoto").change(function(){
    if($(this)[0].files[0]) {
        var reader=new FileReader();
        reader.onload=function(e){
            $("#showimg").attr("src",e.target.result);
        }
        reader.readAsDataURL($(this)[0].files[0]);
    }
});

//아이디 입력시 기존의 중복 메세지 지워주기
$("#loginid").keydown(function() {
    $("span.idsuccess").text("");
});

 

 

비밀번호 입력 창 두개 비교해서 같은지 다른지 판별

//2번째 비밀번호 입력시 체크
$("#pass2").keyup(function() {
    var p1 = $("#pass").val();
    var p2 = $(this).val();

    if(p1 == p2) {
        $("span.passsuccess").text("ok");
    } else {
        $("span.passsuccess").text("fail");
    }
});

 

form에서 submit 하기전에 호출되는 함수

//submit 전에 호출
function check(){
    //사진
    if($("#myphoto").val()==''){
        alert("사진을 넣어주세요");
        return false;
    }

    //아이디 중복체크
    if($("span.idsuccess").text() != 'ok') {
        alert("아이디 중복체크를 해주세요");
        return false;
    }

    //비밀번호
    if($("span.passsuccess").text() != 'ok') {
        alert("비밀번호가 서로다릅니다.");
        return false;
    }
}

 

 

 

 

 

회원목록 리스트로 구현(삭제버튼도)

 

 

'SPRING' 카테고리의 다른 글

[TIL] 23.04.21 스프링  (0) 2023.04.21
[TIL] 23.04.20 스프링(로그인, 회원가입)  (0) 2023.04.20
[TIL] 23.04.13 스프링  (0) 2023.04.13
[TIL] 23.04.12 스프링  (0) 2023.04.12
[TIL] 23.04.11 스프링  (0) 2023.04.11
Comments