공연정보 상세정보 조회페이지 까지 구현
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user