네 개의 테이블 blog, youtube, columnn, data 에서 키워드를 뽑아와야 한다.

 

테이블 이름을 잘못 지었다..

column, data 같은 이름을 피했어야 했는데.

 

WITH searchResult AS (
    SELECT * FROM blog WHERE title LIKE '%검색%'
    UNION
    SELECT * FROM columnn WHERE title LIKE '%검색%'
    UNION
    SELECT * FROM `data` WHERE title LIKE '%검색%'
    UNION
    SELECT * FROM youtube WHERE title LIKE '%검색%'
) 
--with 절로 임시 테이블 정의


SELECT * FROM searchResult

 

 

 

 

 

Union은 중복 결과를 삭제하고,

Union All은 중복 결과까지 모두 출력한다.

 

 

 

 

 

여기에서 다른 테이블과 다시 조인을 해서 ibatis로 써야 하는 상황이었기 때문에

with 절 대신 from 절로 집어넣었다.

 

SELECT
    searchResult.name, searchResult.title, searchResult.contents
FROM 
    ( SELECT * FROM blog WHERE title LIKE '%검색%'
      UNION
      SELECT * FROM columnn WHERE title LIKE '%검색%'
      UNION
      SELECT * FROM `data` WHERE title LIKE '%검색%'
      UNION
      SELECT * FROM youtube WHERE title LIKE '%검색%'
    ) as searchResult

<%@ page import ="java.util.date" %>

자바 라이브러리 import 시 사용한다.

이 속성은 중복으로 사용 가능하다.

 

 

<%@ include file="config.jsp" %>

페이지 삽입 시 사용하는 지시어로,

공통으로 사용하는 변수, 상수, 메소드를 정의할 때 사용하고,

소스 자체를 통째로 가져온다.

유지보수할 때 편리하다는 장점이 있지만, 중복 정의 시 오류가 발생한다.

 

 

import와 include file 의 차이점을 잘 이해하지 못해서 오늘 발생했던 일..

 

headHtml.jsp 상단에 config.jsp를 include 해놓고선

작업하던 A파일에 headHtml.jsp 와 config.jsp를 함께 import 했다.

그러니까 A파일에는 config.jsp가 두 번 include 된 것이다.

그래서 config.jsp에 있던 변수들이 중복 정의되는 오류가 발생했다.

이제 알았으니 같은 실수를 하지 말자.

GET 방식으로 전송된 값을 가져올때 사용한다.

예를 들어 다음과 같은 URL이 있다고 할때

 

 

http://test.com/index.jsp?no=21 

 

 

no라는 이름으로 전달된 값인 21을 가져오기 위해서는

 

$_GET['no'] 라고 사용한다.

 

<a href="http://test.com/index.jsp?no=<?=$_GET['no']?>">

'개발일지 > php' 카테고리의 다른 글

str_replace &lt; &gt; &quot;  (0) 2023.03.10

동적 해석형 언어 : 미리 컴파일되지 않았음

전송 중 컴파일링 되기 때문에 런타임에 코드가 평가되고 실행되는데,

코드가 런타임에서 변경될 수도 있음을 의미한다.

코드 내에서 다른 프로그래밍 언어에서는 허용되지 않는 작업을 수행할 수도 있다.

 

자바스크립트에서는 데이터 유형을 동적으로 전환할 수 있다.

처음에는 변수에 텍스트를 저장했다가 추후 동일한 변수에 숫자를 저장할 수도 있다.

자바스크립트에서 동적이라는 것은 런타임에 분석, 해석을 하여 컴파일하기 때문에

특정 작업이 수행이 가능해진다.

 

가장 중요한 점은 수행 중 컴파일링, 해석이라는 점이다.

 

 

 

 

 

 

약형 :

다른 언어에서는 변수에 숫자가 들어갈지, 문자가 들어갈지 미리 데이터 유형을 정의해야 하고,

그렇지 않으면 오류가 발생하지만

자바스크립트에서는 알려줄 필요가 없다.

데이터 유형을 가정해 자동으로 유추하기 때문이다.

한 줄마다 변경될 수도 있다는 동적 특성과도 관련이 있다.

 

따라서 데이터 유형은 고정되어 있지 않고, 바뀔 수도 있다.

<script src="assets/scripts/app.js" defer></script>

 

페이지가 모두 로드된 후 해당 외부 스크립트가 실행된다는 것을 명시

 

 

 

 

boolean 속성으로, 명시하지 않으면 자동으로 false 값을 가지고,

명시한 경우 true 값으로 처리된다.

 

외부 스크립트를 참조하는 경우에만 사용할 수 있어서

src 속성을 반드시 함께 사용해야 한다.

 

참조된 외부 스크립트 파일은 여러 가지 방법으로 실행시킬 수 있다.

 

 

 

 

 

 

 

 

async 속성은 다운로드가 끝나면 바로 js 코드를 실행하기 때문에

어느 시점에 실행될지 알 수 없다.

 

 

<script async src="./script.js"></script>

 

 

여러 개의 스크립트 파일을 순차 실행할 때에는 defer가 좋다.

 

여러개의 독립된 js 파일을 삽입하는 경우에는 async를 사용하는 것이 성능 면에서 유리하다.

다운로드 완료 즉시 실행되기 때문이다.

 

 

 

 

1. async 속성이 명시된 경우

  브라우저가 페이지를 파싱하는 동안에도 스크립트 실행

 

2. async 속성은 명시X, defer 속성만 명시

  브라우저가 페이지의 파싱을 모두 끝내면 스크립트 실행

 

3. async 속성과 defer 속성이 모두 명시 X

  브라우저가 페이지를 파싱하기 전에 스크립트를 가져와 바로 실행시킨다

 

 

 

 

 

 

http://www.tcpschool.com/html-tag-attrs/script-defer

https://www.daleseo.com/js-script-defer-async/

 

&lt; : <

&gt; : >

&quot; : "

 

$data[contents_m] 에 &lt; 가 포함되어 있을 경우

< 로 변환하여 $contents_m_temp에 저장

 

쌍따옴표를 문자로 인식하게 하기 위해 앞에 \를 붙여준다.

 

$contents_m_temp = str_replace("&lt;", "<", $data[contents_m]);
$contents_m_temp = str_replace("&quot;", "\"", $data[contents_m]);

 

 

'개발일지 > php' 카테고리의 다른 글

$_GET['name']  (0) 2023.03.30

증상 : 

오랫동안 접속이 없다가 이용할 시 에러 페이지가 한번 뜨고 새로고침하면 그 다음부터 정상 이용 가능

 

아래와 같은 메시지

 

java.sql.SQLException: No operations allowed after statement closed.

 

 

 

 

찾아보니

일정 시간이 지나면 DB 접속에 필요한 커넥션 풀이 close 되는 현상이고,

에러 페이지가 뜬 시점에서 다시 커넥션 풀이 연결되고 DB 접속이 된다.

그렇기 때문에 새로고침하면 정상 작동한다.

 

이런 현상을 방지하기 위해 config 에 다음과 같은 설정을 하나 넣어준다.

?autoReconnect=true

 

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://[ip]:[port]/[dbname]?autoReconnect=true
username=[username]
password=[password]

 

 

 

그러나 이 방법 보다는 validationQuery 를 사용한다.

select 1 쿼리로 유효 커넥션을 유지하기 위한 설정이다.

 


	<dataSource type="DBCP">
		<property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>			
		<property name="JDBC.ConnectionURL" value="jdbc:mysql://${DB접속에 필요한 경로}/>			
		<property name="JDBC.Username" value="${ID}"/>
		<property name="JDBC.Password" value="${PASSWORD}"/>
		<property name="maximumActiveConnections" value="10"/>
		<property name="maximumIdleConnections" value="5"/>
		<property name="maximumCheckoutTime" value="120000"/>
		<property name="timeToWait" value="10000"/>
		<property name="validationQuery" value="select 1"/>			
	</dataSource>

 

 

TODO Auto-generated method stub 삭제

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;

public class timer {

	public static void main(String[] args) {
		Thread01 th01 = new Thread01();
		Timer timeStart = new Timer();
		timeStart.schedule(th01, 1000, 1000);
	}
	
}

class Thread01 extends TimerTask {
	
	public void run() {
		
		Calendar cal = new GregorianCalendar();
		int y, m, d, h, m1, s;
		
		y = cal.get(Calendar.YEAR);
		m = cal.get(Calendar.MONTH)+1;
		d = cal.get(Calendar.DATE);
		h = cal.get(Calendar.HOUR);
		m1 = cal.get(Calendar.MINUTE);
		s = cal.get(Calendar.SECOND);
		
		int[] timeArr1 = {y, m, d, h, m1, s};
		String[] timeArr2 = {"년 ", "월 ", "일 ", "시 ", "분 ", "초"};
		
		for (int i=0; i<timeArr1.length; i++) {
			System.out.print(timeArr1[i] + timeArr2[i]);
		}
		
		System.out.println();
		
	}
	
}

 

 

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class timer {

	public static void main(String[] args) {

		Timer t = new Timer();
		Tictoc tt = new Tictoc();
		tt.schedule(tt, 1000, 1000);
		
	}

}

class Tictoc extends TimerTask {
	public void run() {
		printDays();
	}
	private void printDays() {
		Calendar cal = Calendar.getInstance();
		System.out.print(cal.get(Calendar.YEAR)+"년 ");
		System.out.print(cal.get(Calendar.MONTH)+"월 ");
		System.out.print(cal.get(Calendar.DATE)+"일 ");
		System.out.print(cal.get(Calendar.HOUR)+"시 ");
		System.out.print(cal.get(Calendar.MINUTE)+"분 ");
		System.out.println(cal.get(Calendar.SECOND)+"초");
		
	}
}

 

 

 

 

 

 

 


 

 

 

 

AWT 패키지를 이용하여 새 창으로 띄우기 (JFrame, JLabel, Thread, LocalDateTime)

 

import java.awt.*;
import java.time.*;
import javax.swing.*;

class TimeNow implements Runnable {
	private JLabel laTime;
	
	public TimeNow (JLabel laTime) {
		this.laTime = laTime;
	}
	
	@Override
	public void run () {
		while (true) {
			LocalDateTime now = LocalDateTime.now();
			int year = now.getYear();
			int month = now.getMonthValue();
			int day = now.getDayOfMonth();
			int hour = now.getHour();
			int minute = now.getMinute();
			int second = now.getSecond();
			
			int[] nowArr1 = {year, month, day, hour, minute, second};
			String[] nowArr2 = {".", ".", " ", ":", ":", ""};
			String timeText = "";
			
			for (int i=0; i<nowArr1.length; i++) {
				timeText += Integer.toString(nowArr1[i])+nowArr2[i];
			}
				
			laTime.setText(timeText);
		}
	}
} // TimeNow class end

public class goHome extends JFrame {
	
	private Container c;
	private JLabel laTime;
	
	private void initObject() {
		c = getContentPane();
		laTime = new JLabel("");    // 타이머 값이 출력될 레이블
	}
	
	private void initSetting() {
		c.setLayout(new FlowLayout());
		laTime.setFont(new Font("Century Schoolbook", Font.BOLD, 80));
		setTitle("정각 알리미");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(900,160);
		
		Toolkit tk = Toolkit.getDefaultToolkit();
		Dimension screenSize = tk.getScreenSize();
		
		setLocation(screenSize.width / 4*3-300, screenSize.height / 4*3);
	}
	
	private void initBatch() {
		c.add(laTime);
	}
	
	private void getTime() {
		Thread t1 = new Thread(new TimeNow(laTime));
		t1.start();
	}
	
	public goHome() {
		initObject();	// 객체 생성
		initSetting();	// 객체 속성 변경
		initBatch();	// 객체 배치
		getTime();	// 현재 시간 정보를 받아오는 스레드 실행
		setVisible(true);
	}

	public static void main(String[] args) {
		
		new goHome();
	}

}

 

 

 

참고 :

 

https://blog.naver.com/chmh0805/222154216588

https://blog.naver.com/jiae7634/222837488965

 

 

 

 

 

톰캣 8.5가 설치되어 있는데 이클립스에 추가하려고 하면 8.0까지만 선택지가 제공되고

8.0으로 8.5를 불러오면 오류가 난다.

 

 

 

 

 

 

 

Help > Install New Software... 메뉴를 들어가 Add에서 아래 주소를 입력한다

 

https://download.eclipse.org/releases/neon

 

Web, XML, Java EE and OSGi Enterprise Development 하위의 JST 관련 플러그인을 모두 설치한다

 

 

 

 

 

 

설치가 완료되면 이클립스를 끄고 다시 시작한다.

 

 

 

 

 

 

 

 

 

참고 : https://engineeringcode.tistory.com/303

wrtie 페이지에서 input type="text" 로 입력란을 생성해

사용자에게 url 을 입력받아 DB에 저장,

그것을 jsp 화면으로 불러와 a 태그로 링크를 걸어주어야 하는 상황.

 

<%=  %> 로 db에서 사용자가 입력한 url 을 가져올 땐 잘 가져와지고, 그 주소를 직접 타이핑해서 들어갈 땐 잘 연결이 되는데,

내가 링크를 걸면 프로젝트 명이 포함되어 버려서 곤란했다.

 

www.daum.net 에 커서를 올리면 아래 캡쳐와 같이 프로젝트 명이 같이 연결되어 버렸다.

검색해보니까 프로젝트의 설정을 변경하라는데 그걸 내 마음대로 할 수 있는 상황이 아니었음

 

<!-- String rurl 에 주소값을 저장 -->

<a href ="<%=rurl %>" target="_blank">
    <%=rurl %>
</a>

 

 

 

 

사용자 입력 란에는 placeholder를 이용하여 http://를 제외하고 입력받고 다음과 같이 내용을 구성하여 해결했다.

 

<a href ="http://<%=rurl %>" target="_blank">
    <%=rurl %>
</a>

 

 

target="_blank" 를 a 태그 안에 추가하면 새 탭을 열어 링크 이동한다.

 

_blankblank 에는 차이점이 있는데,

_blank는 링크를 계속 클릭하면 계속 새 창을 연다

blank는 최초 한번만 새 창을 열고 계속 클릭하면 새로 열었던 그 창에서 계속 이동한다.

 

 

java.text 패키지에 포함되어 있어서 import가 필요하다.

 

NumberFormat은 숫자에 다양하게 형식을 지정하여 반환하는 클래스가 있다.

 

 

 

 

 

그 중, 가격 표기에 많이 사용되는 숫자 세 자리마다 구분자 콤마을 찍어주는 형식은

getInstance로 호출한다. ( static 메소드라서 new 연산자로 객체를 생성하지 않는다.)

int 형을 String으로 변환하여 출력해준다.

 

인스턴스에 locale로 지역을 선택하여 그 국가의 표기법으로 포맷을 지정할 수 있다.

비워둘 경우 default 값인 locale.US 로 지정된다.

 

 

import java.text.NumberFormat;



int value = 123456789;

System.out NumberFormat.getInstance(locale.KOREA).format(value);
System.out NumberFormat.getCurrencyInstance(locale.KOREA).format(value);
System.out NumberFormat.getPercentInstance(locale.KOREA).format(value);

 



결과

+ Recent posts