1. 프로젝트 생성

eclipse->file->new->other->Spring Legacy Project -> Spring MVC Project 로 프로젝트 생성

2. pom.xml 버전 설정하기

<properties>
    <java-version>1.8</java-version>
    <org.springframework-version>4.2.3.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.10</org.aspectj-version>
    <org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

springframework버전을 처음에 4.2.2로 설정하였는데 java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext 에러가 발생하였다 (servlet을 만들때도 namespace지정에 context가 없었다.. maven 라이브러리에는 jar있었는데;) 그래서 버전을 4.2.3으로 바꿈 (다른 사람들은 똑같이 하고 4.2.2버전으로 돌아가던데...모를..)

3. src/WEB-INF/web.xml 에 서블릿 경로 설정하기

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- Processes application requests -->
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param> -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>*.do</url-pattern> <!--모든 do요청에 반응-->
    </servlet-mapping>
</web-app>

<init-param> 태그를 주석처리하지 않으면 <param-value>에 지정된 서블릿이 실행된다. 내가 만들어준 서블릿을 사용하기 위해 이부분은 주석처리 하였다. 이때 내가 만들어준 서블릿을 규칙을 지켜야한다. web.xml과 같은 위치에 이름은 <servlet-name>에 설정한 이름 여기선 app에 -servlet을 붙여서 app-servlet.xml로 이름을 지정해야한다.

4. UserController

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

@Controller
public class UserController {
    @Autowired
    UserDAO userDAO;

    @RequestMapping(value="login.do")
    public String login(UserVO vo){
        try{
            vo=userDAO.login(vo);
            if(vo.getName()!=null){
                return "loginOK";
            }else{
                return "loginFail";
            }
        }catch(Exception e){
            return "loginFail";
        }
    }
}

UserController를 Bean에 등록하기 위해 @Controller 사용하여 component-scan이 될 수 있게 해준다. @RequestMapping(value="/login.do") : login.do로 들어오는 요청을 처리하는 메소드 지정 여기서 login의 인자로 들어오는 UserVO 를 초기화하지 않고 사용하는 이유는 index에서 <input>태그의 name으로 지정한 값과 UserVO클래스의 멤버변수의 값이 일치하기때문에 자동으로 초기화가 된다.

5. UserDAO

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@Repository
public class UserDAO {
    @Autowired
    JdbcTemplate jdbcTemplate;

    public UserVO login(UserVO vo) throws Exception{
        String sql="select *from member where id=?and pw=?";
        Object[] args={vo.getId(),vo.getPw()};
        return jdbcTemplate.queryForObject(sql, args, new myRowMapper(vo));
    }

    private class myRowMapper implements RowMapper<UserVO>{
        UserVO vo;
        public myRowMapper(UserVO vo){
            this.vo=vo;
        }
        @Override
        public UserVO mapRow(ResultSet rs, int rowNum) throws SQLException {
            vo.setName(rs.getString("name"));
            return vo;
        }
    }
}

jdbcTemplate.queryForObject()에서 select된 값이 없으면 mapRow에 아예들어가지도 않고, EmptyResultDataAccessException이 나게되어 이부분을 controller로 예외를 던저준다.

JdbcTemplate를 import하기 위해 maven을 이용하여 jar파일을 받는다. (pom.xml의 태그 안에 다음과 같이 넣어준다.

... org.springframework spring-jdbc 4.3.3.RELEASE ... 그리고 bean을 등록해서 Autowired될 수 있게 서블릿 빈파일을 설정한다.(app-servlet.xml)

db connection pool을 사용하기 위해 dataSource 도 마찬가지로 다음과 같이 설정한다.

<dependencies>
 ... 
    <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
...
</dependencies>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
    <property name="username" value="root"></property>
    <property name="password" value="mysql"></property>
</bean>

6. mysql connecter (pom.xml)

<dependencies>
... 
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>
...
</dependencies>

7. viewResolver설정(app-servlet.xml)

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

8. index.html (로그인 화면)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
    <form action="login.do">
        ID<input name="id"></input>
        PW<input type="password" name="pw"></input>
        <input type="submit" value="login"></input>
    </form>
</body>
</html>

9. 로그인 성공 화면 (loginOK.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${userVO.name}님 로그인 성공:) 
</body>
</html>

<input>태그에서 name으로 설정한것과 UserVO의 멤버변수의 이름이 같으면 자동으로 초기화 되었고 UserVO의 앞글자를 소문자로 바뀐 이름으로 저장된다. 그리서 ${userVO.name}을 이용하여 로그인 완료시 저장되는 사용자의 이름을 출력할 수 있다.

10. 로그인 실패 화면 (loginFail.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    로그인 실패:(
</body>
</html>


'Spring > Spring' 카테고리의 다른 글

@RestController @Controller  (0) 2018.10.25
@RequestParam  (0) 2018.08.10
[Spring] Lombok  (0) 2018.08.07
[Spring] AOP  (0) 2017.08.19

+ Recent posts