Spring SQL Server 연동 (실습)

Back-End/Spring 2019. 7. 12. 11:55

SQL Server 연동 실습 예제


1. SQL Server에 데이터베이스 및 테이블 생성


   Microsoft SQL Server Management Studio 실행


   인증 : SQL Server 인증


   로그인 : sa


   암호 : 1234



  

  데이터베이스 만드는 방법


  데이터베이스 우클릭 => 새 데이터 베이스 => web라는 이름의 데이터베이스 생성




  

  참고 -


  기존의 데이터베이스만 지우고, 같은 이름의 데이터베이스를 만들때 속성 이름이 같으면 에러가 발생할 수 있으니


  속성 이름을 다르게 하고 만들면 에러가 발생하지 않는다.




아래 그림처럼 데이터베이스를 만들고 "새 쿼리" 버튼을 눌러 쿼리를 입력한다.





-데이터베이스 쿼리 작성-


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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
--web데이터베이스를 사용하겠다는 쿼리
--마우스로 드래그 하고 f5를 누르면 쿼리가 실행된다.
use web;
 
 
--설문문항 테이블
create table survey(
--identity는 sql server에서 일련번호를 매길때 사용하는 옵션
--(1,1)은 1부터 시작해서 1씩 증가한다는 의미이다.
--일련번호를 기본키로 지정함
survey_idx int identity(1,1primary key,
--sql server에서는 varchar2는 없고 varchar만 있다. varchar2는 오라클에만 있다.
question varchar(500),
ans1 varchar(100),
ans2 varchar(100),
ans3 varchar(100),
ans4 varchar(100),
--status는 기본값이 Y라는 뜻이다.
status char(1default 'Y'
);
 
 
--문제번호는 자동증가가되므로 넣지 않았다.
insert into survey (question, ans1, ans2, ans3, ans4) values
('좋아하는 과일은 무엇입니까?','사과','배','수박','참외');
 
 
select * from survey;
 
 
--응답 테이블 생성
create table answer(
answer_idx int identity(1,1primary key--응답 일련번호 1부터 시작해 1씩 증가함, 기본키로 설정함
survey_idx int
num int
-- 문제번호에 대해 응답한 번호
);
 
 
--테이블이 잘 만들어졌는지 확인하기 위해 값들을 하나씩 넣어본다.
--응답 번호를 하나씩 넣어본다.
insert into answer (survey_idx, num) values (1,1);
insert into answer (survey_idx, num) values (1,2);
insert into answer (survey_idx, num) values (1,2);
insert into answer (survey_idx, num) values (1,2);
insert into answer (survey_idx, num) values (1,3);
insert into answer (survey_idx, num) values (1,4);
insert into answer (survey_idx, num) values (1,4);
 
 
--테이블 목록을 확인할때는 infomation_schema가 있는데 거기서 
--테이블 목록을 확인한다는 쿼리이다.
select distinct table_name from information_schema.tables;
 
 
 
--설문조사의 결과를 확인하는 쿼리--

select survey_idx,num,count(num) sum_num, 
--ex) 1번 문제 (survey_idx)에 대해 1번(num)으로 응답한 사람이 1명(sum_num)
--    이므로 정답률(rate)는 14.3%라는 뜻.  
 
 
round(--round는 반올림 하라는뜻, 정답률은 소수점이므로 반올림을 해야한다.
        --맨뒤에 있는 ,1은 소수 둘째자리에서 반올림을 해서 소수 첫째자리까지만
        --출력하게 하라는 뜻.
 
    (select count(*from answer 
    where survey_idx=a.survey_idx and num=a.num) *100.0 --분자
    --응답 테이블로부터 응답테이블의 설문번호와 설문테이블의 설문번호가 일치함과 동시에
    --선택한 답의 번호가 응답 테이블의 선택한 답의 번호와 일치하는 것에 count(개수)를 파악하고 백분율
    --이기 때문에 100을 곱한다.
 
 
    / (select count(*from answer                    --분모
        where survey_idx=a.survey_idx),1) rate
        --응답 테이블로부터 설문테이블의 문항 번호와 응답테이블의 문항번호가 같은것에 개수를 검색한다.
        --그리고 분모와 분자 그리고 100을 곱해서 나온 백분율 (소수점값) 값뒤에 ,1이 써있으므로,
        --소수 둘째자리에서 반올림해서 소수 첫째자리까지만 나오게해서 rate에 넣는다.
 
 
from answer a --answer테이블 (약자로 a라고 표현) 로부터 검색 
where survey_idx=1 --조건 : 문항 번호가 1인것.
group by survey_idx, num --  --번호별로 하기 위해서 group by를 사용
order by num; --num의 내림차순으로 정렬시킨다.

cs



-Spring Project 생성-


  Spring Legacy Project 생성


  프로젝트 이름 : spring05_mssql


  패키지 이름 : com.example.spring05 로 한다.




  - 기본 구조 -



    프로젝트를 실행하면 컨트롤러에 있는 "/"로 맵핑이 되서 show_survey() 메소드가 실행되어서 survey테이블에 


    저장되어 있는 문제를 Dao와 mapper을 거쳐서survey DTO 타입으로 dto 변수에 저장되고, 


    main페이지로 dto값을 같이 보낸다.main.jsp 페이지가 실행되고, 아까 보낸 dto값을 출력해서 문제와 보기들을 출력한다.


    보기를 선택하고 "투표" 버튼을 누르면 hidden 타입으로 내가 투표한 보기의 번호 (survey_idx) 가 컨트롤러의 save_survey.do로 맵핑된다.


    컨트롤러에 save_survey.do로 맵핑된 메소드에서는 dto에 저장된 (폼에서 입력받은 자료) 자료를 Dao와 mapper을 거쳐서


    answer테이블에 저장하고, success jsp 페이지로 리턴한다.


    success jsp페이지에서는 (Home) 시작페이지로 이동시키는 링크를 걸고, 링크를 클릭하면 시작페이지인 main.jsp 페이지로 이동


    main.jsp 페이지에서 "결과 확인" 버튼을 누르면 자바스크립트 함수인 show_result()가 실행되서

  

    컨트롤러에 show_result.do로 맵핑되고, survey_idx값 (문항번호)를 같이 넘긴다.


    show_result.do로 맵핑된 메소드에선 hashmap에 설문문항 내용과, 설문응답 리스트를 저장하고, result.jsp 페이지로 이동시키고, map를 넘긴다.


    result.jsp 페이지에선 map의 dto에 담긴 문제 및 list에 담긴 문항, 응답수, 응답비율을 차례로 출력시키고, home로 가는 링크를 추가시킨다.


 




프로젝트를 만들고 pom.xml을 열고, 라이브러리에 버전을 수정하고 아까 sql server에 jar파일을 로컬저장소에 추가했기 때문에


불러와야한다.


pom.xml (이 라이브러리 말고 나머지는 동일함)

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

<properties>
        <java-version>1.8</java-version>
        <org.springframework-version>5.1.4.RELEASE</org.springframework-version>
        <org.aspectj-version>1.9.2</org.aspectj-version>
        <org.slf4j-version>1.7.25</org.slf4j-version>
    </properties>
    
    <!-- 로컬 저장소 추가 -->
    <!-- 아까 sql server jar파일이 메이븐 저장소에 없어서 로컬저장소에 추가했기 때문에 그걸 알려줘야 한다. -->
    <repositories>
        <repository>
            <id>local</id>
            <name>local</name><!-- user은 사용자 계정이고 한글로 쓰면 안된다. -->
            <url>file://C:/Users/user/.m2/repository</url>
        </repository>
    </repositories>

    <dependencies>
    <!-- SQL Server 라이브러리 선언 -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
        </dependency>

cs



프로젝트 우클릭 => Java Build Path와 Java Compiler, Project Facets를 확인해서 Java 버전을 다 1.8버전으로 맞춰준다.


맞춰주고 난 후에 에러가 나면 Project update를 한다.




테스트용 페이지 생성


home.jsp 페이지를 생성해서 한글이 깨지지않도록 문자셋 처리를 해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
    <!-- 한글깨짐 방지를 위해  문자셋설정 코드를 추가함 -->
    
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
 
<meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8">
 
<title>Home</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  The time on the server is ${serverTime}. </P>
</body>
</html>
 
cs



web.xml (한글처리를 위한 인코딩 필터 추가)

1
2
3
4
5
6
7
8
9
10
11
12
13

<!-- 한글 인코딩을 위한 필터 선언 -->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

cs



servlet-context는 서블릿에 관련된 설정을 모아놓은 xml이고,


root-context는 서블릿을 제외한 나머지 설정들을 모아놓은 xml이다.


servlet-context는 따로 바꿀필요가 없고, root-context를 보면 데이터베이스 연동 설정을 해주어야 한다.



root-context.xml

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
49
50
51
52
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
 
    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 
        <!-- 드라이버 클래스 이름이 변경됨 -->
        <property name="driverClassName"  <!-- 드라이버 클래스 이름 -->
        value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"> <!--드라이버 클래스 이름이 변경되는것이 로그에 찍힌다는 의미 -->
</property>
 
        <!-- 연결문자열에 log4jdbc가 추가됨 --> 중요!!
        <!--SQL Server에 접속하는 코드, 아이디와 비밀번호, 데이터베이스 이름-->
<!-- value에 log4jdbc가 들어있기 때문에, 로그가 찍혀 과정이 출력되게 된다. -->
<property name="url"
            value=
"jdbc:log4jdbc:sqlserver://localhost:1433;DatabaseName=web" /> <!--로컬호스트 기본 포트번호인 1433으로 web 데이터베이스를 연결 -->
        <property name="username" value="sa" /> <!-- id는 sa 라고 한다 -->
        <property name="password" value="1234" /> <!-- 비밀번호는 1234 라고 한다 -->
    </bean>
 

  <!-- SqlSessionFactory 객체 주입 -->
<!-- mybatis를 이용해서 SQL Server와 연동을 할 예정 -->
    <bean id="sqlSessionFactory" 
    class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" 
        value="classpath:/mybatis-config.xml"></property>
        <property name="mapperLocations" 
        value="classpath:mappers/**/*Mapper.xml"></property>
    </bean>
 

  <!-- SqlSession 객체 주입 -->
    <bean id="sqlSession" 
    class="org.mybatis.spring.SqlSessionTemplate"
        destroy-method="clearCache">
        <constructor-arg name="sqlSessionFactory" 
        ref="sqlSessionFactory"></constructor-arg>
    </bean>
</beans>


cs



SurveyDTO.java (문제를 저장할 클래스)

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.example.spring05.model.dto;
 
public class SurveyDTO {
    
    //설문조사 문항을 저장할 필드들
    private int survey_idx;
    private String question;
    private String ans1;
    private String ans2;
    private String ans3;
    private String ans4;
    private String status;
    //getter,setter,toString()
    
    public int getSurvey_idx() {
        return survey_idx;
    }
    public void setSurvey_idx(int survey_idx) {
        this.survey_idx = survey_idx;
    }
    public String getQuestion() {
        return question;
    }
    public void setQuestion(String question) {
        this.question = question;
    }
    public String getAns1() {
        return ans1;
    }
    public void setAns1(String ans1) {
        this.ans1 = ans1;
    }
    public String getAns2() {
        return ans2;
    }
    public void setAns2(String ans2) {
        this.ans2 = ans2;
    }
    public String getAns3() {
        return ans3;
    }
    public void setAns3(String ans3) {
        this.ans3 = ans3;
    }
    public String getAns4() {
        return ans4;
    }
    public void setAns4(String ans4) {
        this.ans4 = ans4;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    @Override
    public String toString() {
        return "SurveyDTO [survey_idx=" + survey_idx + ", question=" + question + ", ans1=" + ans1 + ", ans2=" + ans2
                + ", ans3=" + ans3 + ", ans4=" + ans4 + ", status=" + status + "]";
    }
    
}
 
cs



AnswerDTO.java (사용자 응답 저장 클래스)

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
49
50
51
package com.example.spring05.model.dto;
 
//사용자 응답 저장 클래스
 
public class AnswerDTO {
    
    private int answer_idx; //응답 일련번호
    private int survey_idx;    //문제 번호
    private int num;        //선택한 번호
    private int sum_num;    //카운트 (그 답을 선택한 사람의 숫자)
    private double rate;    //카운트에 대한 백분율 비율
    //getter,setter,toString()
    
    public int getAnswer_idx() {
        return answer_idx;
    }
    public void setAnswer_idx(int answer_idx) {
        this.answer_idx = answer_idx;
    }
    public int getSurvey_idx() {
        return survey_idx;
    }
    public void setSurvey_idx(int survey_idx) {
        this.survey_idx = survey_idx;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getSum_num() {
        return sum_num;
    }
    public void setSum_num(int sum_num) {
        this.sum_num = sum_num;
    }
    public double getRate() {
        return rate;
    }
    public void setRate(double rate) {
        this.rate = rate;
    }
    @Override
    public String toString() {
        return "AnswerDTO [answer_idx=" + answer_idx + ", survey_idx=" + survey_idx + ", num=" + num + ", sum_num="
                + sum_num + ", rate=" + rate + "]";
    }
    
}
 
cs



SurveyDAO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.example.spring05.model.dao;
 
import java.util.List;
 
import com.example.spring05.model.dto.AnswerDTO;
import com.example.spring05.model.dto.SurveyDTO;
 
public interface SurveyDAO {
    
    
    //설문문항 보기, 문제보기
    public SurveyDTO showSurvey(int survey_idx);
    
    
    //설문응답 처리, 응답 내용 저장
    public void save(AnswerDTO dto);
    
    
    //설문결과 목록 보기
    public List<AnswerDTO> showResult(int survey_idx);
    
}
 
cs



SurveyDAOImpl.java

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
package com.example.spring05.model.dao;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.spring05.model.dto.AnswerDTO;
import com.example.spring05.model.dto.SurveyDTO;
 
@Repository //dao bean
public class SurveyDAOImpl implements SurveyDAO {
 
    
    @Inject //mybatis 실행을 위한 객체를 주입, 의존관계를 주입 (DI)
    SqlSession sqlSession;
    
    
    @Override
    public SurveyDTO showSurvey(int survey_idx) {//문제 보기
        //selectOne 레코드 1개, selectList 레코드 리스트
        //문제번호를 보내서 select쿼리를 보내서 문제를 받아옴
        return sqlSession.selectOne("show_survey", survey_idx); 
    }
 
    
    @Override
    public void save(AnswerDTO dto) { //응답을 저장
        sqlSession.insert("save_answer", dto);
    }
 
    
    @Override
    public List<AnswerDTO> showResult(int survey_idx) {    //설문 결과
        //리스트를 받아와야 하기때문에 selectList()를 사용한다.
        return sqlSession.selectList("show_result", survey_idx);
    }
 
}
cs



root-context파일에 가보면 mapper의 경로가 나와있는데, 이 경로대로 mapper을 만들어주어야 mapper이 실행이 된다.


root-context중 일부

1
2
<property name="mapperLocations" 
        value="classpath:mappers/**/*Mapper.xml"></property>
cs



경로에 맞춰서 Mapper 파일 생성


surveyMapper.xml

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
49
50
51
52
53
54
55
56
57
58
59
60
61
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="survey">
    
    <!-- 문제를 가져오는 sql 쿼리 -->
    <select id="show_survey" resultType="com.example.spring05.model.dto.SurveyDTO">
    
    <!--문항테이블로부터 전체항목을 검색 (내가 선택한 문제번호와 저장된 문제 번호가 같은경우)-->
    <!-- 여기서 검색된 항목은 dto타입으로 변환되서 넘겨준다. -->
        select * from survey
        where    survey_idx=#{survey_idx}
    </select>
    
    <insert id="save_answer">
    <!-- answer테이블에 문제번호와 응답한 번호를 저장한다. -->
        insert into answer (survey_idx, num) values 
            (#{survey_idx},#{num})
    </insert>
    
    <select id="show_result"
        resultType="com.example.spring05.model.dto.AnswerDTO">
        <!-- 아래의 쿼리를 실행해서 결과값을 AnswerDTO 타입으로 리턴함 -->
        
            <!--  ex) 1번 문제 (survey_idx)에 대해 1번(num)으로 응답한 사람이 1명(sum_num) 이므로 
정답률(rate)는 14.3%라는 뜻.-->        
        select
            survey_idx, num, count(num) sum_num,
            
                
            round(
            <!--  round는 반올림 하라는뜻, 정답률은 소수점이므로 반올림을 해야한다.
            맨뒤에 있는 ,1은 소수 둘째자리에서 반올림을 해서 소수 첫째자리까지만
            출력하게 하라는 뜻.-->
            
            
        <!-- 응답 테이블로부터 응답테이블의 설문번호와 설문테이블의 설문번호가 일치함과 동시에
        선택한 답의 번호가 응답 테이블의 선택한 답의 번호와 일치하는 것에 count(개수)를 파악하고 백분율
        이기 때문에 100을 곱한다. -->    
             (select count(*) from answer
                    where survey_idx=a.survey_idx
                        and num=a.num)*100.0 <!--분자-->
                        
                            
            <!--응답 테이블로부터 설문테이블의 문항 번호와 응답테이블의 문항번호가 같은것에 개수를 검색한다.
            그리고 분모와 분자 그리고 100을 곱해서 나온 백분율 (소수점값) 값뒤에 ,1이 써있으므로,
            소수 둘째자리에서 반올림해서 소수 첫째자리까지만 나오게해서 rate에 넣는다. -->                    
                    / (select count(*) from answer
                    where survey_idx=a.survey_idx),1) rate <!-- 분모 -->
                    
                                    
        from answer a                      <!-- answer테이블 (약자로 a라고 표현) 로부터 검색 -->
        where survey_idx=#{survey_idx}     <!-- 조건 : 문항 번호가 1인것. -->
        group by survey_idx, num          <!-- 번호별로 하기 위해서 group by를 사용 -->
        order by num                     <!-- num의 내림차순으로 정렬시킨다. -->
    
</select>
</mapper>
cs



mybatis관련 파일들을 복사 ( log4j.xml , log4jdbc.log4j2.properties , logback.xml , mybatis-config.xml )


이번에는 서비스 계층을 만들지 않고, 컨트롤러에서 곧바로 DAO를 호출해서 사용할 예정


컨트롤러를 생성



SurveyController.java (컨트롤러)

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.example.spring05.controller;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.spring05.model.dao.SurveyDAO;
import com.example.spring05.model.dto.AnswerDTO;
import com.example.spring05.model.dto.SurveyDTO;
 
@Controller //controller bean
public class SurveyController {
 
    
    //@Inject //의존관계 주입
    @Autowired //스프링 프레임워크 의존관계 주입 어노테이션
    SurveyDAO surveyDao;
        
    
    //시작페이지는 main.jsp로 가서 문제화면을 출력하는 메소드
    @RequestMapping("/"// http://localhost/spring05
    public ModelAndView show_survey() {  //문제를 보여주는 메소드
        SurveyDTO dto=surveyDao.showSurvey(1); //1번 설문을 dto로 저장해서 보낸다.
        // main.jsp로 포워딩, 전달할 변수명 dto
        return new ModelAndView("main","dto",dto);
    }
    
    
    @RequestMapping("/save_survey.do"//응답 내용을 저장하는 메소드
    public String save_survey( @ModelAttribute AnswerDTO dto ) {
        surveyDao.save(dto); //테이블에 저장 (form에서 입력받은걸 받아서)
        return "success"//success.jsp로 포워딩
    }
    
    
    @RequestMapping("/show_result.do"

//설문 결과
    public ModelAndView show_result() {
        
        
        Map<String,Object> map=new HashMap<>();
        
        //설문문항 내용 (1번 설문문항의 내용을 dto에 저장)
        SurveyDTO dto=surveyDao.showSurvey(1);
        
        //설문응답 리스트
        
        List<AnswerDTO> items=surveyDao.showResult(1);
        
        //map에 자료 저장
        map.put("dto", dto);
        map.put("list", items);
        
        //result.jsp로 포워딩, 변수명 : map
        return new ModelAndView("result""map", map);    
    }    
}
cs



컨트롤러에서 리턴할 View ( main,jsp ) 페이지 생성

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
49
50
51
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
 
<script>
 
function show_result(){    //
    //이 함수가 실행되게 되면 컨트롤러에 있는 show_result.do로 맵핑되고, 설문번호 값이 같이 넘어가게 된다.
    location.href="show_result.do?survey_idx=${dto.survey_idx}";
 
}
 
</script>
 
</head>
    <body>
 
    <h2>온라인 설문조사</h2>
 
    <!-- dto에 저장된 문제의 내용 -->
    <h2>${dto.question}</h2
 
 
    <!--여기서 받은 자료들을 post방식으로 컨트롤러에 save_survey.do에 맵핑시킨다.-->
    <form method="post" action="save_survey.do">
 
 
    <!-- radio버튼 타입으로 각 번호마다 문항을 받아와서 출력함 -->
    <!-- radio타입이기때문에 1개만 선택가능 -->
    <input type="radio" name="num" value="1">${dto.ans1}<br
    <input type="radio" name="num" value="2">${dto.ans2}<br>
    <input type="radio" name="num" value="3">${dto.ans3}<br>
    <input type="radio" name="num" value="4">${dto.ans4}<br>
    <br>
    
    <!-- 내가 선택한 문항의 번호가 hidden 타입으로 넘어가야된다. -->
    <input type="hidden" name="survey_idx" value="${dto.survey_idx}">
    
    <!-- 투표버튼을 누르면 넘어가게 된다. -->
    <input type="submit" value="투표">
    
    <!-- 결과확인 버튼을 누르면 자바스크립트 함수인 show_result()가 실행되게 된다. -->
    <input type="button" value="결과 확인" onclick="show_result()">
    
</form>
</body>
</html>
cs



View ( success.jsp )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<h2>온라인 설문조사</h2>
완료되었습니다.
<a href="<%=request.getContextPath()%>/">Home</a>
<!-- 시작페이지로 이동하는 링크, 스프링 부트가 아니기 때문에 ContextPath()를 붙여줘야 한다.-->
 
</body>
</html>
cs



View ( result.jsp )

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ taglib prefix="c" 
uri="http://java.sun.com/jsp/jstl/core" %>
<h2>설문조사 결과</h2>
문제 : ${map.dto.question}<br><br<!-- 문제 -->
<table border="1">
    <tr align="center">
        <th>문항</th>
        <th>응답수</th>
        <th>응답비율</th>
    </tr>
<c:forEach var="row" items="${map.list}"<!-- 각 항목별 결과의 list를 하나씩 출력해준다. -->
    <tr align="center">
        <td>${row.num}</td<!-- 문항 -->
        <td>${row.sum_num}</td>    <!-- 응답수 -->
        <td>${row.rate}%</td>    <!-- 응답비율 -->
    </tr>
    
</c:forEach>
</table>
<a href="<%=request.getContextPath()%>">Home</a<!-- home로 가는 링크추가 -->
</body>
</html>
cs




: