topmenu에 게시판 처리를 해주기위해 TopMenuMapper를 선언하고
select문을 작성해서 list에 boardinfobean형식으로 담아주고 getTopMenuList() 메서드로 지칭하였다.
이 부분 마지막에 ; 빼야한다.... 이것 때문에 고생 좀 했다 ㅜㅜㅜㅜ
이 mapper는 ServletAppContext.java에 선언해준다.
이 mapper를 통해 dao를 사용하는데 dao임을 알리기 위해 @Repository 어노테이션을 단다.
mapper를 autowired 해주고 getTopMenuList를 받아와서 return 해준다.
이 dao 패키지 또한 ServletAppContext.java에 스캔해주어야 한다.
service를 만들고 dao와 마찬가지로 이번에는 dao를 autowired 받고 gettopmenulist() 메서드를 호출하고 리턴해준다.
service 패키지 또한 ServletAppContext.java에 스캔해주어야 한다.
이것들을 처리해주기위해 interceptor 패키지와 class 를 생성하였다. topmenu는 모든 곳에서 호출되기 때문에 interceptor에서 처리를 해주면 한결 편하기 때문이다.
HandlerInterceptor를 implements 받아 만든 interceptor 이다. 다음단계로 넘어갈 수 있게끔 return true; 해주는 것 잊지말자
interceptor를 이제 ServletAppContext.java에 등록을 해야한다.
/**를 통해 모든 경우에서 이것을 검사하게끔 하였다.
이제 top_menu.jsp 에서 이것을 이용해준다. request에 list를 topmenulist로 담아주었으니 ${} 를 통해서 obj에 담는다.
c:forEach 는 위에 c태그 선언을 해주었으니 가능하다.
나중에 board_info_idx 를 통해 게시판을 구분해 주기위하여 ?board_info_idx=${obj.board_info_idx}를 달아주었다.
이렇게 돌리면 interceptor 에서 List<BoardInfoBean> topMenuList=topMenuService.getTopMenuList();
부분이 nullpointerexception 오류가 뜨게된다. 왜냐면 interceptor에서는 자동주입을 통해서 bean을 주입받지를 못한다.
그래서 interceptor 주입받는 곳에서 생성자로 넘겨줘야 한다.
다음과 같이 생성자로 넘겨주는 방식
악!!!!!!!!!!!!!!!!!!!! topmenuservice autowired 할 때에 db value 값들 선언 이후에다가 해놔야 한다. 아니면 오류난다. 이걸로 몇 시간 헤맸다...
ServletAppContext.java에서 Autowired를 통해 주입받은 후에 생성자에 매개변수로 넘겨주었다.
이제 유효성 검사를 할 것인데, /user/join.jsp 에 form 태그를 선언하고 form 태그로 바꿔줄 것이다.
action을 join_pro로 수정해주었고 post방식이며 joinUserBean에 담길 것이다.
lbael 는 label 오타이다.
다음과 같이 form 태그로 바꿔주고 기존의 것을 없애준다.
button은 다음과 같이 바꾼다. submit 버튼이 아니면 그냥 둬도 된다. user_pw2 같은 경우에 기존의 bean 에 없을 텐데 이때에는 추가해주면 된다.
usercontroller에 다음과 같이 modelattribute 로 joinUserBean 의 이름으로 userbean을 변수로 달아준다.
이제 유효성 검사를 해주기 위해 userbean에 유효성 조건들을 달아준다.
jsp error 메세지에 style='color:red' 를 추가하면 빨간색 글씨로 나오게 할 수 있다.
error_message.properties를 만들어서 조건.빈.변수명 으로 에러메세지를 커스텀 할 수가 있다.
그리고 이 메세지를 사용하기위해 다음과 같이 ServletAppContext.java에 등록을 해준다.
이 상태로 실행을 하게되면 ${db.classname} 오류가 뜨는데 이는
@PropertySource("/WEB-INF/properties/db.properties") 를 통해 db 프로퍼티를 가져와서 @Value("${db.classname}") private String db_classname 에다가 넣어놨었는데 실행을 하면서 propertysource 의 property 와 message 기능의 property 구분을 못하기 때문이다.
이것을 막기위해 다음을 추가해주면 해결이 된다.
이제 비밀번호와 비밀번호 확인 이 부분이 같은 값이 들어갔는지 확인을 해야하는데, 이것은 어노테이션으로 처리를 하지 못하기 때문에 따로 validator를 만들어서 처리를 한다.
코드는 정해져있으므로 그대로 따라가면 된다.
user_pw 에 notequals 라는 에러 이름으로 error 처리를 해준 것이다.
프로퍼티에 설정해주고
이것을 UserController에서 사용할 것이기 때문에 다음과 같이 선언해준다.
이제 아이디 중복 검사를 해주려고 usermapper를 선언해 주었다.
마찬가지로 servletappcontext.java에 올려주고
dao 와 service를 만들었다. service는 중복 여부니깐 boolean으로 하였고 dao 에서 name 들고와서 존재하면 false 존재하지 않다면 true 존재한다면 false로 하였다. 위의 코드는 반대로 되어있음.
html 형식이 아닌 리턴이면 respful api를 사용하는 것이 좋기 때문에 restapicontroller를 선언해 주었다.
restful 형식에서는 파라미터보다는 pathvariable 형식을 보통 이용하기 때문에 다음과 같이 user_id값을 받아주었다.
return 은 string 이 아닐 경우에 변환하는 것이 복잡하기 때문에 chk+"" 를 통해 string 형식으로 반환한 것이다.
위에 어노테이션 오타인데 Controller가 아닌 RestController로 해야한다.
url에 치면 다음과 같이 확인할 수가 있다. 그냥 Controller 라고 하면 true.jsp 없다고 그런다...
이제 이것을 jsp 써볼 것이다. join.jsp 의 중복확인 버튼에 onclick을 달아두고
script태그에 다음과 같이 기입해둔다. var user_id=$("#user_id") 에서 뒤의 user_id는 jsp에서 id='user_id' 의 이것이다.
2번 째 alert가 else 안에 들어가야 된다. 오타다..
이제 이 중복검사를 유효성 검사에 적용시키기 위해서 hidden 태그를 이용해서 userIdExist를 선언해주고
true일 경우에 이 값에 true 그 외에는 false를 집어 넣는다.
물론 userBean안에 userIdExist 변수를 새로이 넣어주어야 한다. 처음엔 false여야 되니 생성자로 false로 만들어주었다.
그리고 validator안에 다음과 같이 false 일 경우에 dontcheckuseridexist로 에러 처리를 해주었다.
프로퍼티에도 적어주었고,
그런데, 아이디를 새로 타입하면 중복확인을 다시해주어야 할 것이다. 그래서 onkeypress 에다가 resetuseridexist 함수를 달고 script태그에다가 userIdExist 변수에 false를 집어넣게끔 하였다.
여기서 UserService 를 autowired 받아줘야 한다.
join_success 이다.
로그인 했는지 여부를 알기위해서 UserBean에 userLogin 변수를 만들어주고 생성자로 false로 만들어준다.
프로젝트 설정에 관한 것은 ServletAppContext.java에 작성하고
프로젝트 작업에 사용할 것은 RootAppContext.java에 작성한다.
loginUserBean의 이름으로 UserBean 형식으로 만들어준다.
그리고 login.jsp 를 form 태그로 수정해주고 UserController도 알맞게 수정해준다.
이제 submit을 눌렀을 때에 login_pro postmapping을 처리해준다.
에러메세지도 처리해주고~
userbean의 유효성 검사는 다음처럼 되어있는데,
DontCheckUserIdExist 에러에 해당하는 부분이 error_message.properties에 tempLoginUserBean으로 등록이 안되어있기 때문이다. 애초에 중복검사를 할 필요가 없으니 등록할 이유도 없다. 따라서 구분을 해주어야 한다. bean의 이름을
UserBean은 다 UserValidator 를 통과하게끔 해놨기 때문에 발생하는데, 이를 방지하기 위해서
errors 에서 bean의 이름을 가지고 올 수 있는 것을 이용해 joinUserBean 일 때에만 밑의 error 유효검사를 하게끔 한 것이다.
이제 로그인을 해보자.
loginUserBean을 받아서 로그인 정보를 얻은 tempLoginUserBean2 에서 idx와 name 을 집어넣고 현재 로그인 중이라고 setUserLogin 에 true를 집어넣는다.
이제 이것을 UserController에서도
@Resource(name="loginUserBean")
private UserBean loginUserBean; 를 통해 받아와서
isUserLogin()==true 를 통해 판별한다.
login_fail.jsp
이곳에 parameter 값으로 fail에 true를 넣는다.
그것을 fail에 넣고 이것을 model로 넘겨준다.
만약 fail이 true면 해당 로그인 실패라는 div 을 보여주게 된다.
java 방식에선 interceptor에 바로 bean 주입이 안되므로 ServletAppContext.java에서 다음과 같이 주입하여 생성자로 넘겨주었다.
interceptor에서 다음과 같이 받아서 request영역에 저장하였다.
이것을 top_menu.jsp 에서 true/false 값에 따라 상단 메뉴 보이는 것을 조정하였다.
logout시에는 userLogin 값을 false 로 두어 로그아웃 처리하였다.
login을 하지않고 user/modify 라던지 logout 이라던지 이런 것을 막아보자
loginUserBean을 생성자로 받아와서 userLogin 값을 확인하고 만약 로그인이 아닌 false 라면 user/not_login으로 보내준다.
그리고 modify/logout 그리고 board 작업의 모든 것을 금지시켜놓는다.
main 보는 것은 예외로 둔다.
오늘은 요까지... 힘들돠
'공부 기록들' 카테고리의 다른 글
2020.05.26 mvc 프로젝트 다시하기(4) (0) | 2020.05.27 |
---|---|
2020.05.23 mvc 프로젝트 다시하기(3) (0) | 2020.05.23 |
2020.05.19 - mvc프로젝트 다시하기(1) (0) | 2020.05.19 |
2020.05.12 ssafy 자소서를 작성하였다. (0) | 2020.05.12 |
2020.05.09 2020 카카오 인턴 코딩 테스트를 보았다... (0) | 2020.05.09 |