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의
<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 |