공연정보 상세정보 조회페이지 까지 구현

This commit is contained in:
taesan
2020-03-10 15:38:44 +09:00
parent 81bbf4b0a1
commit 32a60b1229
7 changed files with 174 additions and 13 deletions

View File

@@ -30,16 +30,16 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter{
protected void configure(HttpSecurity http) throws Exception{
http
.authorizeRequests() // 해당 메소드 아래는 각 경로에 따른 권한을 지정할 수 있다.
.antMatchers("/" , "/login" , "/service" , "/resources/**" , "/create").permitAll() // 로그인 권한은 누구나, resources파일도 모든권한
.antMatchers("/admin").hasRole("ADMIN") // 괄호의 권한을 가진 유저만 접근가능, ROLE_가 붙어서 적용 됨. 즉, 테이블에 ROLE_권한명 으로 저장해야 함.
.antMatchers("/user").hasRole("USER")
.antMatchers("/member").hasRole("MEMBER")
.antMatchers("/" , "/login" , "/service" , "/resources/**" , "/create").permitAll() // 로그인 권한은 누구나, resources파일도 모든권한
.anyRequest().authenticated() // 로그인된 사용자가 요청을 수행할 떄 필요하다 만약 사용자가 인증되지 않았다면, 스프링 시큐리티 필터는 요청을 잡아내고 사용자를 로그인 페이지로 리다이렉션 해준다.
.and()
.formLogin() // 하위에 내가 직접 구현한 로그인 폼, 로그인 성공시 이동 경로 설정 가능. , 로그인 폼의 아이디,패스워드는 username, password로 맞춰야 함
.loginPage("/login") // 로그인이 수행될 경로.
.loginProcessingUrl("/loginProcess")// 로그인form의 action과 일치시켜주어야 함.
.defaultSuccessUrl("/loginSuccess") // 로그인 성공 시 이동할 경로.
.defaultSuccessUrl("/goHome") // 로그인 성공 시 이동할 경로.
//.failureUrl("/login?error=true") // 인증에 실패했을 때 보여주는 화면 url, 로그인 form으로 파라미터값 error=true로 보낸다. , failureHandler 사용으로 불필요해졌다.
.successHandler(successHandler)
.failureHandler(failureHandler)

View File

@@ -17,7 +17,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/", "/login");
registry.addRedirectViewController("/", "/goHome");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

View File

@@ -3,7 +3,9 @@ package com.boot.test1.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
@@ -31,7 +33,7 @@ import com.boot.test1.vo.PerformanceInfo;
public class AccountController {
// 공용 API 사용을위한 발급 KEY
private String PERFORMANCE_KEY = "key값 노출되지 않도록 !";
private String PERFORMANCE_KEY = "KEY 값 노출 없이..";
@Autowired
AccountService accountService;
@@ -73,7 +75,13 @@ public class AccountController {
public String goPerformancePage() {
return "/performanceSelectPage";
}
// 검색 조회 페이지로 이동.
@RequestMapping("/goSearchPage")
public String goSearchPage() {
return "/searchPage";
}
// 공공API 호출, 공연정보
@RequestMapping("/performanceAPI")
public String callAPI_performance(HttpServletRequest request) throws IOException {
@@ -89,7 +97,7 @@ public class AccountController {
urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=" + PERFORMANCE_KEY); /*Service Key*/
urlBuilder.append("&" + URLEncoder.encode("sido","UTF-8") + "=" + URLEncoder.encode(sido, "UTF-8")); /**/
urlBuilder.append("&" + URLEncoder.encode("realmCode","UTF-8") + "=" + URLEncoder.encode(realmCode, "UTF-8")); /*코드*/
urlBuilder.append("&" + URLEncoder.encode("cPage","UTF-8") + "=" + URLEncoder.encode("15", "UTF-8")); /*코드*/
urlBuilder.append("&" + URLEncoder.encode("cPage","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*코드*/
urlBuilder.append("&" + URLEncoder.encode("rows","UTF-8") + "=" + URLEncoder.encode("4", "UTF-8")); /**/
urlBuilder.append("&" + URLEncoder.encode("from","UTF-8") + "=" + URLEncoder.encode(from, "UTF-8")); /**/
urlBuilder.append("&" + URLEncoder.encode("to","UTF-8") + "=" + URLEncoder.encode(to, "UTF-8")); /**/
@@ -144,6 +152,8 @@ public class AccountController {
int cPage = jsonResponseMsgBody.getInt("cPage");
log.info(" totalCount : " + totalCount + ", maxPage : " + maxPage + " lastpageNum : " + lastPageNum);
log.info( " jsonResponseMsgBody : " + jsonResponseMsgBody.toString());
if ( totalCount == 0 ) {
log.info(" 해당 조건에 맞는 공연정보가 존재하지 않습니다.");
@@ -167,7 +177,7 @@ public class AccountController {
}
}
request.setAttribute("performanceInfo", performanceInfo);
request.setAttribute("performanceInfos", performanceInfo);
}
return "performanceAPI";
}
@@ -187,6 +197,58 @@ public class AccountController {
return info;
}
@RequestMapping("/goDetail")
public String detail(HttpServletRequest request, int seq) throws IOException {
log.info(" seq : " + seq );
StringBuilder urlBuilder = new StringBuilder("http://www.culture.go.kr/openapi/rest/publicperformancedisplays/d/"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=" +PERFORMANCE_KEY); /*Service Key*/
urlBuilder.append("&" + URLEncoder.encode("seq","UTF-8") + "=" + URLEncoder.encode(String.valueOf(seq), "UTF-8")); /**/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
BufferedReader rd;
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
System.out.println(sb.toString());
JSONObject jsonObject = XML.toJSONObject(sb.toString());
JSONObject jsonResponse = jsonObject.getJSONObject("response");
JSONObject jsonResponseMsgBody = jsonResponse.getJSONObject("msgBody");
JSONObject perforInfo = (JSONObject)jsonResponseMsgBody.get("perforInfo");
request.setAttribute("title", perforInfo.get("title"));
request.setAttribute("startDate", perforInfo.getInt("startDate"));
request.setAttribute("endDate", perforInfo.getInt("endDate"));
request.setAttribute("place" , perforInfo.get("place"));
request.setAttribute("area", perforInfo.get("area"));
request.setAttribute("price", perforInfo.get("price"));
request.setAttribute("phone", perforInfo.get("phone"));
request.setAttribute("imgUrl", perforInfo.get("imgUrl"));
request.setAttribute("placeUrl", perforInfo.get("placeUrl"));
return "performanceDetail";
}
// goHome
@RequestMapping("/goHome")

View File

@@ -10,9 +10,11 @@
</head>
<body>
<div align="center">
<br><br>
<a class="btn btn-outline-primary" href="/useJqGrid">Use JqGrid</a><br><br>
<a class="btn btn-outline-primary" href="/goPerformancePage">Use 공연정보 API</a><br><br>
<a class="btn btn-outline-primary" href="/useJqGrid" style="margin-top: 20px;">Use JqGrid</a><br>
<a class="btn btn-outline-primary" href="/goPerformancePage" style="margin-top: 20px;">Use 공연정보 API</a><br>
<a class="btn btn-outline-primary" href="/goSearchPage" style="margin-top: 20px;">Use 검색 API</a><br>
</div>

View File

@@ -29,10 +29,11 @@
<h3>공연정보</h3>
<c:forEach items="${performanceInfo}" var="row" varStatus="status">
<c:forEach items="${performanceInfos}" var="row" varStatus="status">
<table border="1">
<tr>
<th>thumbnail</th>
<th>seq</th>
<th>title</th>
<th>startDate</th>
@@ -40,9 +41,10 @@
<th>place</th>
<th>realmName</th>
<th>area</th>
<th>thumbnail</th>
<th>상세</th>
</tr>
<tr>
<td><img width="100" height="100" src="${row.thumbnail}" /></td>
<td>${row.seq}</td>
<td>${row.title}</td>
<td>${row.startDate}</td>
@@ -50,7 +52,7 @@
<td>${row.place}</td>
<td>${row.realmName}</td>
<td>${row.area}</td>
<td><img width="100" height="100" src=${row.thumbnail} /></td>
<td><a href="/goDetail?seq=${row.seq}">Detail</a></td>
</tr>
<br>
</table>

View File

@@ -0,0 +1,65 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="org.json.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main Page</title>
<link rel="stylesheet" type="text/css" href="/jqgrid/css/jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="/jqgrid/css/ui.jqgrid.css" />
<script type="text/javascript" src="/jqgrid/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="/jqgrid/js/i18n/grid.locale-kr.js"></script>
<script type="text/javascript" src="/jqgrid/js/jquery.jqGrid.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>
<body>
<div align="center">
<br>
<br>
<h3>공연정보</h3>
<table border="1">
<tr>
<td>imgUrl</td>
<th>title</th>
<th>startDate</th>
<th>endDate</th>
<th>place</th>
<th>area</th>
<th>가격</th>
<th>연락처</th>
<th>placeUrl</th>
</tr>
<tr>
<td><img width="100" height="100" src="${imgUrl}" /></td>
<td>${title}</td>
<td>${startDate}</td>
<td>${endDate}</td>
<td>${place}</td>
<td>${area}</td>
<td>${price}</td>
<td>${phone}</td>
<td>${placeUrl}</td>
</tr>
<br>
</table>
<br>
<br> <a class="btn btn-outline-success" href="/goHome">홈 화면으로가기</a><br>
<br> <br>
<br>
</div>
</body>
</html>

View File

@@ -0,0 +1,30 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main Page</title>
<!-- jquery -->
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<!-- Ajax -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/css/bootstrap-datetimepicker.min.css" />
<!-- bootstrap -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</head>
<div id="container">
<h1> 여기는 searchPage 입니다. </h1>
</div>
</body>
</html>