Servlet JSP MVC Spring

게시판 프로젝트 - 본문 업데이트-

vhxpffltm 2020. 7. 25. 22:39
반응형

Tiles를 이용하여 페이지를 나타냈으며 해당 페이지에 우리가 개발한 목록창을 구현해본다.

 

tiles_member.xml에 /member/listMember.do 로 요청했을때, 표시할 <definition> 태그를 추가한다. name의 값은 URL 요청명에서 .do를 제외한 요청명과 일치해야 한다.

 

이전 포스팅 글을 보면 해당 내용이 있다. 아래 그림과 같이 작성한다.

 

이후, 브라우저에서 컨트롤러 요청 시 요청명에 대한 뷰이름을 가져온다. 그리고 ModelAndView 객체에 설정한 후 뷰리졸버를 반환하도록 한다. *코드 참조*

 

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
/pro27/src/main/java/com/myspring/pro27/member/controller/MemberControllerImpl.java
 
....
@Controller("memberController")//Controller 애너테이션을 이용해 maincontroller 클래스를 빈으로 자동 변환
@EnableAspectJAutoProxy//최상위 패키지에 있는 클래스에 Annotation을 적용해서 AOP를 찾을 수 있게 해준다.
public class MemberControllerImpl   implements MemberController {
//    private static final Logger logger = LoggerFactory.getLogger(MemberControllerImpl.class);
    @Autowired//기존 xml 파일에서 각각의 빈을 DI로 주입했던 기능을 코드에서 애너테이션으로 수행하고 생성자나 setter없이 속성에 빈을 주입
    private MemberService memberService;// id가 memberservice인 빈을 자동 주ㅇ입
    @Autowired
    private MemberVO memberVO ;
    
    @Override
    @RequestMapping(value="/member/listMembers.do" ,method = RequestMethod.GET)
    //두 번쨰 요청 url 요청이 위와 같으면 메인 컨트롤러 빈의 value에 있는 메서드에게 요청, get방식
    public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String viewName = getViewName(request);
//        String viewName = (String)request.getAttribute("viewName");
        //System.out.println("viewName: " +viewName);
//        logger.info("viewName: "+ viewName);
//        logger.debug("viewName: "+ viewName);
        List membersList = memberService.listMembers();
        ModelAndView mav = new ModelAndView(viewName); // viewName이 타일즈xml의 <definition>태그에 설정한 뷰이름과 일치
        mav.addObject("membersList", membersList);
        System.out.println("주석 부분은 로그를 출력하기 위한 설정 코드들");
        return mav;
        //ModelAndView 객체에 설정한 뷰이름을 타일즈 뷰리졸버로 반환
    }
cs

 

이제 로컬로 http://localhost:8090/pro27/member/listMembers.do 로 접속하면 페이지 본문에 회원 목록이 출력되는것을 확인할 수 있다.

 

 

 

로그인 기능

 

메인 페이지를 보면 로그인이 있는데 로그인 기능만 추가해보도록 한다.

먼저 로그인 버튼을 눌렀을때, 로그인창이 나오도록 타일즈를 설정한다. 이것도 이전 게시글에 같이 들어있다.

tiles_member.xml 의 아래 내용을 확인한다.

 

 

이후, 로그인창에서 입력한 ID와 비밀번호로 회원 정보를 조회하는 SQL문을 mapper에 추가한다.

 

 

이제 컨트롤러 클래스를 수정한다. RedirectAttributes 클래스를 이용해 리다이렉트시 로그인창으로 로그인 실패 메시지를 매개변수로 전달할 수 있다.

ID와 비밀번호로 회원 정보를 조회하여 해당 회원 정보가 존재하면 로그인 상태와 회원 정보를 세션에 저장하고 로그아웃 요펑을 받으면 세션의 정보를 모두 삭제한다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/pro27/src/main/java/com/myspring/pro27/member/controller/MemberControllerImpl.java
......
    @Override
    @RequestMapping(value = "/member/login.do", method = RequestMethod.POST)
    public ModelAndView login(@ModelAttribute("member") MemberVO member, //@ModelAttibute로 로그인창에서 전송된 ID와 비밀번호를 MemberVO 객체인 member에 저장
                              RedirectAttributes rAttr,// RedirectAttributes 클래스로 로그인 실패 시 다시 로그인창으로 리다이렉트하여 실패 메세지 전달
                               HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView();
    System.out.println("??????????????????????????");
    memberVO = memberService.login(member);//login() 메서드를 호출하면서 로그인 정보를 전달
    if(memberVO != null) {
            HttpSession session = request.getSession();
            session.setAttribute("member", memberVO); // 세션에 회원 정보를 저장
            session.setAttribute("isLogOn"true); // 세션에 로그인 상태를 true로 설정
            mav.setViewName("redirect:/member/listMembers.do"); //MemberVO로 반환된 값이 있다면 세션을 이용해 로그인 상태를 true로 
    }else {
            rAttr.addAttribute("result","loginFailed");
            mav.setViewName("redirect:/member/loginForm.do");
            //로그인 실패시 메세지를 로그인창으로 전달하고 리다이렉트 진행
    }
    System.out.println(mav);
    return mav;
    }
 
    @Override
    @RequestMapping(value = "/member/logout.do", method =  RequestMethod.GET)
    public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpSession session = request.getSession();
        session.removeAttribute("member"); // 로그아웃 요청 시 세션에 저장된 로그인 정보와 회원 정보를 삭제
        session.removeAttribute("isLogOn");
        ModelAndView mav = new ModelAndView();
        mav.setViewName("redirect:/member/listMembers.do");
        return mav;
    }    
 
    @RequestMapping(value = "/member/*Form.do", method =  RequestMethod.GET)
    private ModelAndView form(@RequestParam(value= "result", required=falseString result,//로그인창 요청시 매개변수 result가 전송되면 변수 result에 값을 저장, 최초 로그인창을 요청할 땐 result가 전송되지 않으므로 무시
                               HttpServletRequest request, 
                               HttpServletResponse response) throws Exception {
        String viewName = getViewName(request);
        //String viewName = (String)request.getAttribute("viewName");
        //위의 주석문으로 에러가 발생... form 양식을 할때 확인할것!!
        //error: tiles Could not resolve view with name in servlet with name 'appServlet'
        ModelAndView mav = new ModelAndView();
        mav.addObject("result",result);
        mav.setViewName(viewName);
        return mav;
    }
cs

 

컨트롤러를 수정한 후, 서비스 클래스와 memberDAO 클래스를 수정한다. 서비스 클래스에서는 전달된 ID와 비밀번호를 DAO클래스로 전달하도록 하고 DAO 클래스는 ID와 비밀번호를 SQL문으로 전달하도록 한다.

 

 

 

이렇게 구현을 끝낸 후, 이제 로그인창을 만드는 JSP를 구현하면 된다. 로그인이 된 상태면 회원 이름과 로그아웃이 표시되도록 한다. JSP는 코드를 생략하도록 한다.

 

화면에서 로그인 버튼을 누르면 아래와 같이 로그인 창이 나타난다. 

 

로그인이 성공하면 아래와 같고 입력이 올바르지 않으면 경고 메세지가 나타날 것이다.

 

 

Reference

자바 웹을 다루는 기술

 

 

반응형