Log
httpClient는 아파치 재단에서 URL 클래스를 훨씬 좋게 만든 것 (HTTP 프로토콜로 요청/ 응답 수행 가능)
안드로이드 OS에도 표준탑재되어 서버에서 정보를 다운받는 용도로 사용한다.
public class Test127{
public static void main(String[] args) throws IOException{
//CloseableHttpCilent : 실제로 요청 / 응답을 수행하는 핵심
CloseableHttpClient httpClient = HttpClients.createDefault();
String l = "http://192.168.2.11:8081/study3/Test126.jsp?pw=1234";
HttpGet httpGet = new HttpGet(l); //get 방식요청
httpGet.addHeader("User-Agent", "Mozila/5.0"); //헤더 조작 여지
// execute 실제로 요청/응답을 수행한다. httpResponse가 응답이다
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
int resCode = httpResponse.getStatusLine().getStatusCode();
if(resCode == 200) {
InputStream in = httpResponse.getEntity().getContent();
BufferedReader bin = new BufferedReader(new InputStreamReader(in));
// new InputStremReader(in, "utf-8") 한글 깨지면 이거 써라...
BufferedReader bin = new BufferedReader(new InputStreamReader(in));
// new InputStremReader(in, "utf-8") 한글 깨지면 이거 써라… **
// why? => java default unicode / web default utf-8
String str = null;
while((str=bin.readLine())!=null){
System.out.println(str);
}
}
}
}
우리는 지금 Get 방식으로 사용하는 법을 배웠다. 많은 정보를 서버에서 다운받는 것에는 차이가 없다 GET이 든 POST든 Client에서 대량의 정보를 업로드 하려면 POST를 써야함 ** 위 코드와 많이 틀려지게 되니 이 점 유의할것 BufferedReader bin = new BufferedReader(new InputStreamReader(in)); ** new InputStremReader(in, "utf-8") 한글 깨지면 이거 써라… **
commons-logging.jar log4j-1.2.17.jar 은 lib 폴더에 넣는다.
Commons-logging.properties, log4j.properties는 src 폴더에 넣는다.
그러면 classes 폴더에 자동으로 복사된다. (실제 운영할 때는 classes 폴더에 넣으면 된다)
jar 파일이 버전이 다른 두개가 모이는 경우가 있는데 그럴 경우에는 안돌아가는 경우가 흔하다
Commons-logging.properties
# org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
> 원하는 것 고르고
log4j.properties
log4j.appender.A2.File=./../0805/web/log.txt
>경로 고치고
<%@page import="org.apache.log4j.Logger"%>
<%! static Logger logger = Logger.getLogger("about"); %>
<% logger.info("HelloWorld"); %>
>실행시키고 하면 ! ==> log.txt <== HelloWorld 이런식으로 찍힌다!
1. Commons-logging 에 대한 설정이 commons-logging.properties에 있음
Log4JLogger : log4j 를 내부적으로 사용하겠다는 설정
Log4JLogger에 대한 설정이 log4j.properties가 된다
2. log4j.appender.A2.layout.ConversionPattern = [%d] %5p %d : %m%n
%m%n 만 해도 됨ㅎㅎ [시간] INFO about : HelloWorld 이런 식으로 뜸
로그 파일의 형식 지정 : 단순히 콘솔에 찍어보는 걸 넘어서 내부적인 동작을 고스란히 담아낼 수 있다.
로그파일 분석 툴을 이용하면 사이트 전반의 분석을 가능하게 한다.
3. 실전에는 Util.L(…) 같은 거 만들어서 쓰는 경우가 많다.
pageNavigation
페이지 개수 = ((글 갯수 -1) / 페이지 크기 ) + 1
블럭 사이즈 (BS) : 10 단위로 하단에 보여짐
이전 페이지 : (BB!=1)
다음 페이지 : (BE != 총 페이지 수)
BB = ((CP -1)/ 10) * 10 +1 : 처음 보여줄 1 2 3 4 5 개 / CP 는 1 2 3 4 5 .. 들 중 하나
1. 정렬된 순서 보기
SELECT id, title FROM Temp10T ORDER BY id DESC;
2. rownum??
SELECT id, rownum FROM Temp10T;
SELECT id, rownum FROM Temp10T ORDER BY id DESC;
—row num은 order by 이전에 부여된다. 따라서 order by 이후에 rownum으로 쪼개는 건 무의미
— 그러면 orderby 시켜놓고 그 다음에 rownum 붙이겠다?
SELECT id, rownum FROM ( SELECT id FROM Temp10T ORDER BY id DESC );
3. rownum을 기준으로 페이지 나누기?
SELECT id, rownum FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) WHERE rownum > 0 AND rownum <= 5;
SELECT id, rownum FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) WHERE rownum > 5 AND rownum <= 10;
Rownum 이 10까지 없고 모자란다? 5개 가져오는 중에 5~10 사이가 없음 안됨
4. rownum을 field로 굳혀놓고 나누기!!
SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC );
SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) ) WHERE sq > 0 AND sq <= 5; SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) ) WHERE sq > 5 AND sq <= 10;
5. 서브쿼리로 정리해서 깔끔하게!!
SELECT * FROM Temp10T WHERE id IN ( SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) ) WHERE sq > 10 AND sq <= 20 ) ORDER BY id DESC;
select * from (select id, rownum as sq from (select id from temp10t where 0=0 order by id desc))
where sq>20 and sq<=30;
6. 나중의 검색을 위해서 0 = 0 은 그냥 끼워 넣어준다(검색을 어떻게 할지 생각해 보자)
SELECT * FROM Temp10T WHERE id IN ( SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T WHERE 0 = 0 ORDER BY id DESC ) ) WHERE sq > 5 AND sq <= 10 ) ORDER BY id DESC;
여기에서 0 = 0 을 응용하여 검색기능에서의 나누기 시도한다.
StringBuffer find = new StringBuffer(" WHERE 0 = 0"); if( title != null ){ find.append(" AND title LIKE '%"); find.append( title ); find.append("%'"); } if( user != null ){ find.append(" AND user ='"); find.append( title ); find.append("'"); } if( content != null ){ find.append(" AND content LIKE '%"); find.append( content ); find.append("%'"); }
String subSql = "SELECT id FROM " + "( SELECT id, rownum as sq FROM " + "( SELECT id FROM Temp10T "+ find.toString() + " ORDER BY id DESC ) )" + "WHERE sq > 5 AND sq <= 10";
String countSql = "SELECT COUNT(*) FROM Temp10T " + find.toString(); String sql = "SELECT * FROM ("+ subSql +") ORDER BY id DESC";
그러면 아래와 같은 형태의 결과를 보게 될 것이다.
SELECT COUNT(*) FROM Temp10T WHERE 0 = 0 AND user = 'root' AND content LIKE '%ab%'
....
SELECT * FROM Temp10T WHERE id IN ( SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T WHERE 0 = 0 AND user = 'root' AND content LIKE '%ab%' ORDER BY id DESC ) ) WHERE sq > 0 AND sq <= 3 ) ORDER BY id DESC;
0=0 위치가 검색 조건이 들어갈 위치
select * from temp10t where id in(select id from (select id, rownum sq from (select id from temp10t where title like '%bc%' order by id desc))where sq>0 and sq<=10) order by id desc;
Mysql
create table Temp10t(
-> id integer(3),
-> title varchar(7));
~insert로 입력
select * from temp10t order by id desc limit 0, 10;
10 씩 쪼개줌
select * from temp10t order by id desc limit 10, 10;
10개 세고 또 10개
> form-group으로 지정된 div를 이용하여 label과 input을 한쌍으로 묶어서 보여준다
<form role="form">
<div class="form-group">
<label for="email">이메일</label>
<input type="text" id="email" class="form-control"/>
</div>
</form>
>그리드 이용하여 모바일용 화면과 pc용 화면을 하나의 페이지에서 구현한 사례
<div class="row">
<div class="col-xs12 col-sm-4">
<form role="form">
<div class="form-group">
<label for="email">이메일</label>
<input type="text" id="email" class="form-control temp"/>
</div>
<div>
<label>암호</label>
<input type="password" id="password" class="form-control" />
</div>
</form>
</div>
</div>
>> form에 추가
class = "form-inline"
sm 크기 이상인 경우 class="form-inline"이 지정되면 라벨과 컨트롤은 좌우로 배치된다.
input 크기가 가지런하지 않아 이 부분 개선 class="form-hoizontal"로 지정된 경우에 라벨과 인풋이 가지런하게 배치되도록 할 수 있다
input은 div에 넣어 크기를 지정하고
label의 class에 크기를 지정한다
JavaScript
<a href = "javascripts:alter('<%=1%>');"> Click </a>
브라우저가 요청하면 서버가 요청을 받고, 요청에 해당하는 servlet/jsp가 동작한다
보여지는 브라우저 상 에서 javascript는 동작한다
jsp 에서 javascript 코드를 생성하는 일은 가능하다.
하지만 javascript에서 jsp쪽이 코드를 생성하는 일은 불가능하다.
왜? jsp가 먼저 동작하기 때문에
함수의 매개변수의 갯수가 틀려도 호출된다.
만일 갯수가 틀리면 앞의 변수부터 대입이 된다.
변수 선언시에는 var라는 키워드를 사용한다.
변수는 모든 값이 대입 가능 (정수, 문자열, 실수, 함수, 객체...)
두번 선언해도 에러 안나고, var없이 선언해도 에러 안난다
script 태그 안에 있는 코드는 페이지가 모두 로딩 되지 않은 상태에서
호출 변수를 선언하지 않고 사용하면 초기값은 undefined이고 여난이 불가능하다.
var total=0; 코드가 빠졌을 때 에러가 나는 이유를 점검하자.
java는 블럭 안에서 선언한 변수는 블럭에서만 쓸 수 있는 개념인데
javascript는 선언만 되어 있으면 쓸 수 있고, 선언 안해도 쓴다
모든 html 요소는 id 속성을 가질 수 있다
속성 값은 pk처럼 겹치면 안된다
Document.getElementById("abcd") : id 값으로 객체의 포인터를 찾는다
window.onload = function(){
var op = document.getElementById("abcd");
op.onclick = function () {
alert();
}
}
/*op라는 포인터 변수로 해당 객체를 가리킨다
포인터를 통해 객체가 가진 속성을 읽고, 조작할 수 있다
op.onclick은 op 포인터가 가리키는 객체의 onclick 이라는 변수(프로퍼티)
javascript 변수는 다 가리킬 수 있다.
onclick은 이름없는 함수와 다름 없다.
가리키는 것과 호출하는 것은 다르다(여기서는 가리키기만 한다.)
호출되는 시점?
op 가리키는 객체에 click 상황이 벌어지면 onclick 이 가리키는 함수가 호출된다.
이벤트 처리의 두가지 방법
1. onXXX 속성을 이용하는 방법 : onclick="alert();"
2. onXXX 속성을 함수포인터로 쓰는 방법 : 위 코드의 방법.(이 방법이 더 많이 스임).*/
window.onload = function(){
var is = document.getElementsByTagName("img");
for(var i=0;i<is.length;i++){
alert(is[i].src);
}
}
/*ls[0] = function(){alter(i)} 가리키는 시점에서는 i가 0인데, 호출하는 시점에서는 4가 된다
가리키는 시점의 값과 호출하는 시점의 값이 같아야 한다
=> 함수의 매개변수를 활용한 로컬변수를 사용해야한다*/
'Language Study > Java' 카테고리의 다른 글
6. 자바, 더 간편하게 (0) | 2019.09.08 |
---|---|
5. 자바, 더 정확하게 (0) | 2019.09.08 |
제주에서 자바_Week3_4 (0) | 2019.08.11 |
##자바 헷갈리는 이론 (0) | 2019.08.01 |
제주에서 자바_Week3_3 (0) | 2019.07.31 |