Spring 은 프레임 워크다.
하는 방법을 익혀 그대로 사용하면 된다.
jar 파일 넣어 주기.
이제 jdbc와 jstl 도 사용해야 하므로 jar 파일을 같이 넣어 준다.
jar 파일
혹시 모르니까 블로그에도 압축 파일로 올려 놔야지.
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="10" maxIdle="5" maxWait="-1" name="jdbc/oracle" password="fin01" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:xe" username="fin01"/>
</GlobalNamingResources>
예전에는 다 아래에 일일이 추가를 해 줬는데 이제는 이쪽에 등록해 주고 아래에서 사용하는 걸로 한다.
<Context docBase="studentSpring" path="/studentSpring" reloadable="true" source="org.eclipse.jst.jee.server:studentSpring">
<ResourceLink name="jdbc/oracle" global="jdbc/oracle" type="javax.sql.DataSource"/>
</Context></Host>
아래에서는 이렇게 이름 값만 받으면 되는 걸로.
이제는 spring 이 알아서 다 해 주기 때문에 dao 는 별로 할 일이 없다. 알아서 받아오고 보내 주고 하기 때문에 우리는 그 기능을 사용만 하면 된다.
public class StudentDAO {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
기본 설정.
jdbcTemplate 을 받아 준다. 그래서 아래에서 받아서 쓸 수 있도록 해 준다.
public int insertStudent(StudentDTO dto) {
String sql = "insert into student values(?,?,?)";
Object[] values = new Object[] {dto.getId(), dto.getName(), dto.getCname()};
int res = jdbcTemplate.update(sql, values);
return res;
}
public int deleteStudent(String id) {
String sql = "delete from student where id=?";
int res = jdbcTemplate.update(sql, id);
return res;
}
추가 메서드들은 obj 에 담아서 jdbcTemplate으로 보내 준다.
그런데 리스트 등을 전달하고 싶다?
class MyRowMapper implements RowMapper<StudentDTO>{
@Override
public StudentDTO mapRow(ResultSet rs, int arg1) throws SQLException {
StudentDTO dto = new StudentDTO();
dto.setId(rs.getString("id"));
dto.setName(rs.getString("name"));
dto.setCname(rs.getString("cname"));
return dto;
}
}
private MyRowMapper mapper = new MyRowMapper();
Mapper를 통해 일반 중첩 클래스, 익명 중첩 클래스를 사용하여 myrowMapper 클래스를 사용
- 중첩 클래스 (Inner Class)
- 일반 중첩 클래스 : 클래스 내부에 있는 클래스 (내부 클래스, 중첩 클래스)
: OuterInner_Inner
: 객체를 만들 때는 Outer01.Inner01 oi; oi = ot.new Inner01();- static 중첩 클래스 : 내부 클래스 이름 앞에 static이 붙은 클래스
: 프로그램 시작 시 메모리에 미리 올라간다.
따라서, 바깥 클래스 멤버 중 static 멤버가 아니면 사용 불가
내부 클래스지만, 독립적으로 클래스를 운영하고자 할 때 사용- 지역 중첩 클래스 : 메서드 내부에서 만드는 클래스
: 메서드가 실행이 될 때만 사용할 수 있다
메서드 안에서 만들어지는 클래스라고 해서 지역 중첩 클래스라고 하고, 지역에 생성이 되므로
같은 이름으로 여러개가 만들어질 수 있다.
그래서 클래스명에 Outer$1Inner03.class 처럼 $ 뒤에 index를 붙혀 만든다- 익명 중첩 클래스 : 객체를 생성할 때, 메서드를 재정의하여 새로운 클래스를 만든 후,
새로운 클래스로 객체를 만들고자 할 때 사용
이제부터 Mapper 가 자동으로 makeList를 만들어 준다.
public List<StudentDTO> listStudent() {
String sql = "select * from student";
List<StudentDTO> list = jdbcTemplate.query(sql, mapper);
return list;
}
mapper를 사용해서 mapper의 객체를 전달하기만 하면 dao 는 끝.
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>springStudent</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springStudent</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
xml 은 이렇게 간다. do로 끝나는 친구들을 springStudent-servlet 에 연결해 준다.
이제 servlet 은 xml 파일로 관리한다.
이 친구는 xml 파일이지만 기존 xml 파일처럼 other-xmlfile로 만드는 게 아니라 서블릿으로 직접 만들어 주어야 한다.
이 친구로 만들어 주어야 한다.
한 부분 한 부분 떼어내서 정리해 보자.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>WEB-INF/student/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
이 부분은 앞에 굳이 쓰지 않도록 되게 접두사 접미사를 정해 주는 부분이다. 이게 있으면 귀찮게 폴더 명과 .jsp 를 다 써 주지 않아도 됨.
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/oracle</value>
</property>
<property name="resourceRef">
<value>true</value>
</property>
</bean>
DataSource 등록.
이름을 등록해 준다.
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="studentDAO" class="student.StudentDAO">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
여기는 dataSource 를 이름으로 등록해 주는 부분. DAO 를 jdbcTemplate 으로 받는 부분도 여기 있다.
<bean name="/student.do" class="student.StudentIndexController">
</bean>
<bean name="/insert_student.do" class="student.StudentInsertAbstractCommandController">
<property name="studentDAO" ref="studentDAO"/>
<property name="commandClass" value="student.StudentDTO"/>
<property name="commandName" value="studentCmd"/>
</bean>
<bean name="/list_student.do" class="student.StudentListController">
<property name="studentDAO" ref="studentDAO"/>
</bean>
<bean name="/delete_student.do" class="student.StudentDeleteAbstractCommandController">
<property name="studentDAO" ref="studentDAO"/>
<property name="commandClass" value="student.StudentDTO"/>
<property name="commandName" value="studentCmd"/>
</bean>
<bean name="/find_student.do" class="student.StudentFindAbstractCommandController">
<property name="studentDAO" ref="studentDAO"/>
<property name="commandClass" value="student.StudentDTO"/>
<property name="commandName" value="studentCmd"/>
</bean>
</beans>
나머지는 student의 주소를 관리해 주는 부분이다.
package student;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class StudentListController implements Controller {
private StudentDAO studentDAO;
public void setStudentDAO(StudentDAO studentDAO) {
this.studentDAO = studentDAO;
}
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
List<StudentDTO> list = studentDAO.listStudent();
ModelAndView mav = new ModelAndView("list", "listStudent", list);
return mav;
}
}
리스트 컨트롤러를 할 때는 Add를 눌러서 Controller implements 상속 받아 주기.
여기서는 ModelAndView 친구들로 객체 송수신을 한다.
ModelAndView mav = new ModelAndView("list", "listStudent", list);
이 파트에서 맨 앞이 가려고 하는 jsp 이름이 되는 거고, 뒤가 listStudent 이름으로 list를 보내는 것을 말한다.
find 에서는 Browse 를 해 준다.
그리고 Abstra... 를 implements 해 준다.
package student;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
public class StudentFindAbstractCommandController extends AbstractCommandController {
private StudentDAO studentDAO;
public void setStudentDAO(StudentDAO studentDAO) {
this.studentDAO = studentDAO;
}
@Override
protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object obj, BindException be)
throws Exception {
StudentDTO dto = (StudentDTO)obj;
List<StudentDTO> list = studentDAO.findStudent(dto.getName());
ModelAndView mav = new ModelAndView("list", "listStudent", list);
return mav;
}
}
그리고 dto 로 객체를 바로 받아서 getName() 을 해 준 다음 리스트를 넘겨준다.
그런데 쉽게 getParameter 로 받아도 됨.
package student;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
public class StudentDeleteAbstractCommandController extends AbstractCommandController {
private StudentDAO studentDAO;
public void setStudentDAO(StudentDAO studentDAO) {
this.studentDAO = studentDAO;
}
@Override
protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object obj, BindException be)
throws Exception {
StudentDTO dto = (StudentDTO)obj;
int res = studentDAO.deleteStudent(dto.getId());
ModelAndView mav = new ModelAndView("forward:message.jsp");
if (res>0) {
mav.addObject("msg", "학생삭제성공!! 학생목록페이지로 이동합니다.");
mav.addObject("url", "list_student.do");
}else {
mav.addObject("msg", "학생삭제실패!! 학생관리페이지로 이동합니다.");
mav.addObject("url", "student.do");
}
return mav;
}
}
forward로 가는 법은 이렇게. 이렇게 하면 추가적인 메시지도 띄울 수 있음.
이렇게 하면 오늘의 Spring 정리 끝.