[12][메모장] 등록, 조회, 수정, 삭제, Action Tag(useBean, setProperty, getProperty) 변환
[01] 등록
http 프로토콜을 이용해서 요청한다.
웹 컴포넌츠- jsp
자바빈 - 디애이오 디티오 부이오친구들
[02] Action Tag
1. <jsp:useBean id="" class="" scope=""/>
- id와 scope 속성에 맞는 기존의 존재하는 객체를 먼저찾고 찾지 못했을 경우에 새로운 객체를 생성한다.
//기존에 이름이 같은 애가 있으면 코드 이상해지는거십니다
- id : 빈을 유일하게 구분하는 속성 - class : 빈의 패키지를 포함한 이름 - scope : application, session, request,page 자바빈즈의 유효범위(생명력이 다하는 때까지)를 나타내며, 기본값은 page
application : 응용프로그램 모든 페이지에서 자바빈즈 객체 사용 session : 세션이 유효한 페이지까지 자바빈즈 이용가능
//브라우저가 서버가 연결되어진 상태 request : request 객체가 영향을 미치는 모든 JSP페이지 까지 자바빈즈 사용가능 page : 현재의 jsp페이지 내에서만 사용가능, 기본값으로 지정하지 않으면 이옵션 적용 페이지가 젤 작은 유효범위 애플리케이션이 제일 큰 유효범위
- HTML은 구조 및 데이터 출력의 목적을 갖으며 CSS는 출력되는 HTML을 시각적인 효과를 적용하는 기능을 함.
- HTML에서 시각적인 부분을 CSS로 분리하면 유지보수성이 향상된 웹사이트 개발가능. - 디자인 쪽은 따로 분리하는 것이 좋음...
. HTML이 간결해짐.
- SELECTOR{속성:값}의 형태, SELECTOR(태그 선택자)는
어느 태그에 CSS를 적용할지를 지정
예)
BODY{ <-- BODY 태그에 적용
font-size: 20px;
}
OL LI{ <-- OL태그안의 LI 태그
font-size: 20px;
}
*{ <-- 모든 태그
font-size: 20px;
}
#menu LI{ <-- id가 menu인 태그안의 LI 태그
font-size: 20px;
}
.title{ <-- class 속성으로 사용 text-align: center; }
- 주석: /* */
- 태그에 class 속성과 style 속성이 있으면 style속성이 우선 적용 됩니다. <td width="500" class="td_left" style="height:250px" >
<%=content%>
</td>
- 스타일 속성 - 클래스 속성은 보통 생각하는 거랑 반대임
1. 태그에 직접 스타일을 주는 경우 - 태그 발생시마다 스타일을 적용하여 주어야 함으로 반복 코드가 많이 발생되.
<DIV style='font-size: 24px'></DIV>
2. <HEAD>태그안에 스타일을 주는 경우 - 태그안에 직접 명시한 것보다 우수하나 다른 파일에서는 CSS 가져다 사용이 어려움.
<style type="text/css">
*{
font-family: gulim;
font-size: 24px;
}
</style>
3. CSS 파일에 스타일을 주는 경우(권장) - CSS를 독립 파일로 만들어두어 프로젝트에 경로 설정만으로 재사용이 가능. - CSS 파일의 사용: <link href="../css/style.css" rel="Stylesheet" type="text/css"> //얘네를 빠트리면 인식이 안된다 ! href + rel + type
>>>>> /WebContent/css/style.css
/* 제목 */
.title{
font-size: 28px;
text-align: center;
border-style: solid; /* 실선 */
border-width: 1px; /* 선 두께 */
border-color: #AAAAAA; /* 선 색깔 */
color: #000000; /* 글자 색깔 */
width: 30%; /* 화면의 30% */
padding: 10px; /* 위 오른쪽 아래 왼쪽: 시간 방향 적용 */
/* padding: 50px 10px; 50px: 위 아래, 10px: 좌우 */
/* padding-top: 30px; 상단만 간격을 30px 지정 */
margin: 20px auto; /* 가운데 정렬 기능, 20px: 위 아래, auto: 오른쪽 왼쪽*/
파일 3개를 저장하시고, 브라우저에서 http://localhost:8080/ok.jsp 로 실행해보십시오. 물론 기본디렉토리에 위치시켜야죠. 이거 질문하는 분들 장난아니게 많습니다. tomcat 의 경우 server.xml 을 변경하지 않고 bin/startup.bat (startup.sh) 를 실행하셨다면 webapps/ROOT/ 가 기본디렉토리입니다. resin 의 경우는 doc 디렉토리가 기본 디렉토리겠죠. apache 랑 연동했을 경우 apache의 DocumentRoot 를 톰캣의 c:/jakarta-tomcat/webapps/ROOT 로 맞춰주시는 것이 헷갈리지 않을 겁니다.
include Directive 는 <%@ ... %> 로 싸여있습니다. @은 Directive 라는 의미죠. 포함하는 문서에 정적으로 컴파일 됩니다. 포함하는 파일(ok.jsp)에서 사용한 변수를 따로 선언하지 않고 바로 사용할 수 있습니다. 물론 여기(okD.jsp)에서 선언된 변수도 포함하는 파일(ok.jsp)에서 따로 선언하지 않고 사용할 수 있습니다. 대신 이 파일(okD.jsp)을 변경할 경우 포함하는 파일(ok.jsp)의 시스템 날짜를 변경해서 재컴파일을 유도해야 이 파일(okD.jsp)의 변경사항이 적용되는 것을 볼 수 있습니다.
include Action은 xml 형식으로 <jsp:include page=... flush="true" /> 를 사용합니다. flush="true" 는 그냥 쓰십시오 false로 바꾼다거나 빼먹거나 하면 안됩니다. 묻지 마십시오. 다칩니다. (==O%TT; 퍽!)
include Action은 동적이라고 합니다. 처음엔 저도 이해가 안 갔습니다. 하지만 쓰면서 이 넘이 얼마나 독립적인지 아주 잘 알게 되었고, 왠만한 경우 저는 directive 보다는 action 을 사용합니다. 이 넘은 포함하는 파일과 상관없이 실행이 됩니다. directive 의 경우 ok.jsp와 okD.jsp 의 소스가 합져져서 하나로 컴파일되어 동작하는 것과 같지만 action 의 경우 ok.jsp 컴파일하고 okA.jsp 따로 컴파일되어서 ok.jsp가 okA.jsp를 호출해서 사용하고 다시 ok.jsp가 동작하는 구조라고 생각하시면 될 것입니다. (죄송합니다만 제가 경험상 체득한 것이라 검증이 필요한 부분입니다.)
include Action 에는 page directive가 있습니다. include directive 에는 Page directive 가 없습니다. 만일 okD.jsp 에 <%@ page contentType="text/html;charset=euc-kr"%> 를 넣는다면 contentType="text/html;charset=euc-kr" 가 두개가 되기 때문에 Page directive: can't have multiple occurrences of contentType 라고 Exception 메시지를 보실 수 있습니다. import 속성이 틀리다면 contentType="text/html;charset=euc-kr" 만 삭제해주시면 될 것입니다. (이것도 자주 질문 하시는 것 중의 하나입니다.)
- ANSI SQL92, 99에 기준하여 각 데이터베이스상에서 SQL을 사용할 수 있습니다.
- DQL(Data Query Language), 데이터 질의어, 데이터 검색, 출력과 관련된 쿼리 . SELECT..FROM..WHERE //얘는 있는걸 갖다가 검색해서 쓸 때 쓰는것 씰렉트(뭐를) 패쓰워드 푸롬(위치) 멤바테이블 웨어(조건) 10개만(다갖다써도됨)
- DML(Data Manapulation Language), 데이터 조작어, 데이터 입력, 수정, 삭제와 관련된 쿼리 . INSERT, UPDATE, DELETE // 얘는 데이타 입력 수정 삭제 할 떄 쓰는 거임 -_-)
인써트도 어쩌구저쩌구가 있는데 나중에 하것지 인서트 인투 어쩌구
업데이트 셋 어쩌구 저저구
- DDL(Data Definition Language), 데이터 정의어, 테이블 생성 및 삭제, 테이블 구조 수정과 관련된 쿼리 . CREATE TABLE, DROP TABLE, ALTER TABLE // 아까 쟤네 어디다가 넣냐고 -> 공간 확보! :> 테이블 형태로 만들어져서 다 테이블임
크리에이트 테이블 - 생성맨
드롭 테이블 - 이건 delete 기능임
알터 테이블 - column이 부족할 때 추가 추가
- TCL(Transaction Control Language), 트랜잭션 제어 언어, 안정적인 데이터 처리를 위한 데이터 처리와 관련된 명령어 . COMMIT, ROLLBACK, SAVEPOINT // 트랜잭션 :>! - 응? 계좌이체?
A라는 계좌에서 B라는 계좌로 돈을 이체시킴!
1) A에서 돈을 뺸다
2) 그 돈을 B라는 계좌로 넣는다
원자성... 어 아톰...뭔데 -_-);; Atomic?
이힣ㅎㅎㅎ
- DCL(Data Control Language)데이터 제어 언어, 권한 부여와 관련된 쿼리 . GRANT, REVOKE // ㅋㅋㅋㅋㅋㅋㅋ임 아니네 이건 DBMS가 해준댕 :D 굿
잉 OCP OCJP 볼라면 계정이 있어야한대 _-_) 흐흥
오라클 - 네이버 계정으로 만들었음
비번은 어.. .아마 잊을듯 -_-)
이거 다시 복습 :>
------------------------
Memo의
DBCLOSE
DBOPEN
MEMODAO
MEMOVO
CONSTANT
그리고 test.memo의 MEMOTEST 를 쓰고 있는뎅
//Constant.java
package memo;
public class Constant {
public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
public static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
public static final String USER = "soldesk";
public static final String PASSWORD = "1234";
}
//DBOPEN.java
package memo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBOpen {
public static Connection getConnection() {
Connection con = null;
try {
Class.forName(Constant.DRIVER);
//드라이버를 메모리에 올리는 것
//-_-? ★
try {
con =DriverManager.getConnection(Constant.URL, Constant.USER, Constant.PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
}
//DBclose
package memo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBClose {
public static void close(Connection con, PreparedStatement pstmt, ResultSet rs) {
// TODO Auto-generated method stub
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void close(Connection con, PreparedStatement pstmt) {
// TODO Auto-generated method stub
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//MemoVO
package memo;
public class MemoVO {
private int memono;
private String title;
private String content;
private String wdate;
private int viewcnt;
public int getMemono() {
return memono;
}
public void setMemono(int memono) {
this.memono = memono;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
public int getViewcnt() {
return viewcnt;
}
public void setViewcnt(int viewcnt) {
this.viewcnt = viewcnt;
}
}
----------------
//이제 수정중인 애들입니다
//MemoDAO
package memo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MemoDAO {
public int update(MemoVO vo){
int cnt = 0;
Connection con = DBOpen.getConnection();
PreparedStatement pstmt = null;
StringBuffer sql = new StringBuffer();
sql.append(" UPDATE memo ");
sql.append(" SET title = ?, ");
sql.append(" content = ? ");
sql.append(" WHERE memono = ? ");
try {
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, vo.getTitle());
pstmt.setString(2, vo.getContent());
pstmt.setInt(3, vo.getMemono());
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
DBClose.close(con, pstmt);
}
return cnt;
}
public MemoVO read(int memono){
MemoVO vo = null;
Connection con = DBOpen.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuffer sql = new StringBuffer();
sql.append(" SELECT * from memo ");
sql.append(" where memono = ? ");
try {
pstmt = con.prepareStatement(sql.toString());
pstmt.setInt(1, memono);
rs = pstmt.executeQuery();
if(rs.next()){
vo = new MemoVO();
vo.setMemono(rs.getInt("memono"));
vo.setTitle(rs.getString("title"));
vo.setContent(rs.getString("content"));
vo.setViewcnt(rs.getInt("viewcnt"));
vo.setWdate(rs.getString("wdate"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBClose.close(con, pstmt, rs);
}
return vo;
}
public int create(MemoVO vo){
int cnt=0;
Connection con = DBOpen.getConnection();
PreparedStatement pstmt = null;
StringBuffer sql = new StringBuffer();
sql.append(" insert into memo(memono, title, content, wdate) ");
Java Resource에 짠 memo 패키지의 java 파일을 좀뒤에 올리겠음 (-_-);;
이건 액션태그 쓰는 법 입니다.
액션 태그
action tag
객체를 생성하는 법을 액션 태그로 만드는 법
이건 한번 밀고 하는 것 ㅋㅋㅋㅋㅋㅋ
즐거운것
큰일났다 ㅋㅋㅋㅋ
--------------자바빈이 뭔데?----------------
출처: http://fromvenus.tistory.com/94
#자바빈(JavaBean)이란?
일반적인 웹사이트는 디자이너와 프로그래머가 협력하여 개발한다. 그런데 프로그래머가 JSP페이지에 자바코드를 입력했을때 디자이너 입장에서는 해석하기 어려워지고 효율또한 매우 떨어지게 된다. 이런 비효율적인 부분을 지원하기위해 제공되는 기능의 형태가 자바빈이다. 자바빈은 JSP페이지의 디자인 부분과 로직부분을 나눔으로써 복잡한 자바코드를 줄이고 프로그램의 재사용성을 증가시킨다.
#자바빈의 설계 규약
자바빈을 작성하기 위해서는 설계규약을 따라야 한다. 만약 설계규약과 맞지 않는 경우 자바빈의 특성을 갖지 않는 클래스가 되어버릴수 있다.
1. 멤버변수마다 별도의 get/set 메소드가 존재해야 한다.
2. get 메소드는 매개변수가 존재하지 않아야한다.
3. set 메소드는 반드시 하나 이상의 매개변수가 존재해야 한다.
4. 생성자는 매개변수가 존재하지 않아야 한다.
5. 멤버변수의 접근제어자는 private이고 각 set/get메소드의 접근제어자는 public , 클래스의 접근제어자는 public 으로 정의한다.
#자바빈 사용하기
1.<jsp:useBean/>태그
자바빈 객체를 생성하기 위한 코드이고 태그 속성은 다음과 같다.
<jsp:useBeanid="빈이름"class="자바빈클래스명"scope="사용범위"/>
id는 JSP페이지에서 자바빈 객체의 변수명, class는 자바빈에 사용할 클래스명(클래스가 패키지 않에 있다면 패키지 경로까지 적어주어야 한다. scope는 자바빈의 사용범위를 뜻하며 request, page, session, application 네종류가 존재한다. 디폴트값은 page로 설정된다.
name은 선언된 자바빈 객체의 id property는 객체내의 속성명, value는 속성에 넣을 값을 의미한다. 여기서 클라이언트에서 전송되어오는 파라미터 값을 속성값으로 할당 하고 싶다면 value 속성대신 param속성을 이용하면된다. 그런데 여기서 자바빈으로 사용되는 클래스의 속성들은 설계규약에 의하여 private으로 설정되는데 <jsp:setProperty/>태그로 접근이 가능한 이유는 변수에 직접적인 접근이 아닌 set 메소드를 호출하여 접근하게 되는 것이다.
3.<jsp:getProperty/>태그
자바빈 클래스의 속성값을 가져오기 위한 태그이고 속성은 다음과 같다.
<jsp:getPropertyname="빈이름"property="속성명"/>
name는 값을 가져올 빈의 id, property는 가져올 속성의 이름이다.
#자바빈 예제
BeanTest.java
package test;
publicclass BeanTest {
private String name = null;
privateintage = 0;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
}
자바빈으로 사용할 클래스이다. 멤버변수는 모두 private으로 선언되어있고 설계규약에 따라 set/get메소드를 만들어줘야 한다.
+ 로 연결하여 assign 하게 된다면 + 하는 String 의 갯수가 늘어나면 늘어날수록 GC 대상 object 수도 함께 늘어나고 그만큼 memory 할당도 추가로 늘어나게 된다는 것입니다.
하지만 이 문제는 query 문을 만드는데서 많이 발생합니다. Query Operation은 매우 무거운 작업입니다. 복잡한 Database 를 쓰는 경우, 여러번의 query 를 통해 결과를 도출하는 것은 엄청난 시간을 소비하기도 합니다. 따라서 가능한 query 횟수를 최소화 하여 원하는 결과를 뽑아내는 작업이 필요하며 이 과정에서 String + operation이 엄청나게 발생하곤 합니다.
[10][메모장] 메모장 version 2.0으로 업그레이드, SSI(Server Side Include)
[01] SSI(Server Side Include) - 하나 이상의 jsp페이지에서 반복적으로 사용되는 코드를 모아 특정 jsp페이지에 저장해두고, 필요시에 추가하여 사용하는 방법을 말합니다.
- 처리 결과가 합쳐지는 것이 아니라 파일의 소스가 하나의 파일에 합쳐진 다음 실행됩니다. list.jsp 소스 + ssi.jsp 소스 = jsp 통합 큰 소스 ==> 실행 --------------------------------------------------------
- 사용 방법 <%@ include file="Local URL" %>
<%@ include file="./ssi.jsp" %>
- Eclipse Project: memo 계속 사용 Folder Name: /WebContent/memov2 Library: WEB-INF/lib/ojdbc14.jar or ojdbc6.jar
★ SSI 파일의 사용의 경우 아래의 Page Directive는 포함되는 JSP 및 포함하는 JSP 파일 모두 대소문자 및 공백도 일치해야합니다.
Note that backslashes (\) and dollar signs ($) in the replacement
string may cause the results to be different than if it were being
treated as a literal replacement string; see Matcher.replaceAll. Use
java.util.regex.Matcher.quoteReplacement to suppress the special
meaning of these characters, if desired.
See Also:
java.util.regex.Pattern
Parameters:
regex the regular expression to which this string is to be
matched
replacement the string to be substituted for each match
Returns:
The resulting String
Throws:
PatternSyntaxException if the regular expression's syntax
is invalid
Since:
1.4
@spec
JSR-51
이런 시스템입니다.
content = content.replaceAll(regex, replacement);
얘를 찾아서, 얘로 바꿔주면 됩ㄴ니다
정규 표현식(正規表現式, 영어:regular expression, 간단히 regexp 또는 regex) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.
4. application 내부 객체 - javax.servlet.ServletContext 인터페이스의 구현 객체 - 서블릿이 서블릿 컨테이너(Tomcat)에서 실행 될 때의 환경 정보를 저장 - 절대 경로 추출시 JSP 형식 String upDir = "/pds/storage"; upDir = application.getRealPath(upDir);
2) action: 폼에서 입력받은 데이터를 보내(전송)는 서버의 주소로써 인터넷 브러우저는 주소상에 도메인 생략시 도메인을 자동으로 연결하여 전송합니다. 예) action="./sungjuk_proc.jsp" ▶ 현재 브러우저로 로딩된 파일과 같은 폴더에있는 jsp로 전송 (*)
action="../sungjuk_proc.jsp" ▶ 현재 폴더의 상위 폴더에 있는 파일로 전송
action="../object/sungjuk_proc.jsp" - 다른 폴더로 가는 것
..의 뜻은 현재 폴더에서 나온다는 뜻 -_-)ㅋㅋ -> 그담에 오부젝트라는 다른 폴더로 감 ▶ 현재 폴더의 상위폴더로 나간 후 object폴더안으로 이동하여 전송
action="http://172.16.4.1:8000/object/sungjuk_proc.jsp" ▶ 전체 IP를 직접 기록한 경우
action="http://www.test.co.kr/object/sungjuk_proc.jsp" ▶ 전체 도메인을 직접 기록한 경우
3) method: 전송 방식 GET: 데이터 조회용(SQL: SELECT) POST: 데이터 수정용(SQL: INSERT, UPDATE, DELETE)
* 특정 기업은 요청을 전부 POST로 요구하는 기업도 있음, POST만 써도 개발 가능
2. GET 전송 방식 - 서버의 데이터를 변경할 목적이 아닌 조회의 목적으로 사용(SQL: SELECT)
- 전송할 데이터를 문자열 형태로 URL의 뒤에 인수로 붙여서 전송합니다. 따라서 보안성이 없어 누구나 전송 내용을 볼 수 있습니다. - 파라미터가 url로 나오니까... Form 태그에서의 'GET'방식은 서버로 전송시 서버의 처리가 지연될 경우 중복해서 데이터 전송이 발생합니다.
- A 태그를 이용할 경우 일반적으로 GET방식 전송만 가능하나 Javascript를 이용하면 POST 방식으로 전송이 가능함.
- 4KB이상의 파라미터 문자열은 전송할 수 없음으로 대용량 전송이 어려움.
- 주소를 공개할 목적으로 사용하는 경우
1) 주소와 데이터의 구분 - ?: 전송되는 데이터(변수)의 시작 - &: 변수가 2개 이상일 경우 구분
갖다 붙여쓰는 데이빗 넘나 똑똑한거 같다
다 외운 데이빗인 것인가 아닌가가 문제이긴함
2) 전송 예
- 한줄로 나타낸 경우 http://localhost:8000/object/form/select2_proc.jsp?city=%EC%8B%9C%EC%B9%B4%EA%B3%A0&period=6%EB%B0%957%EC%9D%BC&img=ro37.jpg
- 여러줄로 나타낸 경우 http://localhost:8000/object/form/select2_proc.jsp ? <-- 전송 데이터의 시작 city=%EC%8B%9C%EC%B9%B4%EA%B3%A0 & <-- 전송 데이터가 여러개 일 경우의 구분자 period=6%EB%B0%957%EC%9D%BC & img=ro37.jpg
요청 페이지가 브러우저의 접속 리스트에 노출됨으로, 처리페이지를 필요에따라 마음대로 호출가능하여 잘못된 데이터 주입으로 서버에러 발생 가능.
3. POST 전송 방식 - 서버의 데이터를 변경할 목적으로 가지고 있음(SQL: INSERT, UPDATE, DELETE)
님왜탈퇴함? 진짜탈퇴함? 왜탈퇴함? 우리의서비스가 어쩌구저쩌구 - 포스트 방식
- 파일의 형태로 전송됨으로 URL상에 나타나지않아 보안성이 있습니다.
- GET방식에 비해서 대용량의 데이터를 전송할 수 있습니다.
- 일반적으로 Form은 post 방식으로 전송됩니다.
※ GET/POST 방식 사용시 HTTP의 사용은 보안성이 약함으로 암호화(JAVA API) 전송이나 HTTPS(서버의 설정 필요)를 사용할 수 있다.
※ GET방식은 특히 URL에 전송값이 노출되어 사용됨으로 보안이 필요 없는 전송에 이용함.
※ 프로젝트 개발시 URL에 기록이 남는것을 방지하기위해 POST 방식만 사용할것을 요청하는 기업도 있음.
4. JSP 코드 첫라인에 한글 변환을 선언함. - 한글등 전송시 브러우저 별 지정된 인코딩 타입에 따라 변환됨으로 한글이 깨짐. URL 인코딩을 각자의 형식으로 변환함으로 추가로 데이터 변환을 해주어야함. 한글 --> Chrome ------------> Server FireFox Opera Internet Explorer
<% request.setCharacterEncoding("utf-8"); %>
조 선언문 필수신것
첨에 해야함 - 나중에 하면 무슬모
5. 뉴스 등록: TEXT, TEXTAREA, PASSWORD - 일반적으로 HTML은 대소문자를 가리지 않으나 HTML태그의 name 속성과 value 속성은 대소문자를 구분합니다.
아! 파라메타가 대소문자 구분한다는 얘기입니다
-------------3시 42분! :>
2시간 30분 뒤면 배송이 완료되었을까
1) TEXT: 한줄을 입력받을때 사용 <input type='text' name='title' value='' size='30'> - text: 한줄만 입력 - value: 초기값 - size: 입력받는 창의 크기 - maxlength: 최대 입력 글자 수
2) TEXTAREA: 여러라인을 입력받을 때 사용 <textarea name='content' rows='10' cols='30'></textarea> - rows: 행의 갯수(문자수) - cols: 열의 갯수(문자수)
3) PASSWORD: 패스워드 입력시 사용, 입력글 순간 비공개 <input type='password' name='passwd' size='30'>
4) Submit Button: 서버로 입력받은 데이터를 전송 <input type='submit' value='등록'>
왜 5가없지가 아니라 다른거군
6. 여행 등록: SELECT ~ OPTION - SELECT: TEXT로 입력을 받으면 사용자가 다양한 값을 입력하여 처리 규칙을 만들기가 힘듬. 따라서 지정된 데이터만 입력받도록 제한을 가하는 기능이 있음.
<SELECT name='area2'>
<OPTION value='일본'>일본</OPTION>
<OPTION value='중국'>중국</OPTION>
<OPTION value='베트남'>베트남</OPTION>
<OPTION value='태국'>태국</OPTION>
<OPTION value='캐나다'>캐나다</OPTION>
</SELECT>
7. 취미: RADIO, CHECKBOX
1) RADIO: 다양한 선택 항목을 출력하고 하나만 선택 가능 - checked="checked": 기본 선택 <input type='radio' name='area' value='서울' checked="checked"> 서울 지역
<input type='radio' name='area' value='인천'> 인천 지역
<input type='radio' name='area' value='경기'> 경기 지역
2) CHECKBOX: 여러개 선택 가능, 취미의 선정, 선택안하면 null이 출력됨 - checked="checked": 기본 선택 <input type='checkbox' name='hobby1' value='독서'>독서
- HTML은 자료를 처리, 저장, 검색하는 기능이 없고 단지 출력하는 기능만 가지고 있습니다. 따라서 이런 데이터를 처리하려면 DBMS(Oracle, MySQL)같은 데이터베이스가 필요하며, 이 데이터베이스에 접속하기위해서 서버스크립트(JSP, PHP, ASP.NET)가 필요합니다.
//쟤도 그런 소리입니다.
어쨌든 우리는 jsp 배워서 데이타베이스에다가 보낸다는 소리입니다.
- JSP: SUN의 서버쪽 스크립트 기술, 모든 운영체제 지원, JAVA 기반, Servlet Container(서버)를 설치해야 실행 할 수 있습니다. - ASP.NET: MS의 스크립트 기술, MS 운영체제만 지원, C# 기반, 윈도우에 웹서버가 기본적으로 설치되어 있으며, .NET Framework를 설치해야 실행 할 수 있습니다. - ASP: MS의 서버쪽 스크립트 기술, MS 운영체제만 지원, Visual Basic 기반, IIS의 asp.dll이 처리하여 HTML로 결과를 생성함, 별다른 서버설치가 필요 없음, 유지보수, 수정이 매우 어렵습니다.
// 얘도 노동자가 되면 먹어줍니다.
- PHP: 서버쪽 공개 스크립트 기술, 모든 운영체제 지원, C 기반, 관련 dll파일이 처리, 속도가 느리고 유지보수, 수정이 매우 어렵습니다.
//얘는 모든 운영체제를 지원해서 아직도 먹어줍니다. (소규모)
3. http 프로토콜을 이용해서 요청과 응답을 하는 서버환경 확인
요새는 톰캣이 먹어주기 때문에 얘만 깔아도 써버 다 씁니다.
내가 보려고 적었는데 자꾸
서부릿을
servlet이 아니고 servelt으로 써진다 ㅡㅡ
출처: http://blog.naver.com/ktw3722/220674776516
자바 컨테이너하고 servlet 컨테이너는 다른 개념임!
그냥 서버라고 생각하면 됨! :> (갱신) -그리고 심지어 c로 짠 서버임 :>
[2] 서블릿의 이해 - Java로 만든 최초의 web관련 언어입니다.
2. 서블릿을 이용한 구성 - CGI에 비해 Thread 기술을 이용하여 동시접속자로 인한 과부하를 많이 해소했습니다. - 자바 기반 Web Application 구축 기술중에 가장 빠른 속도를 가지고 있습니다. - Servlet의 단점은 디자인 부분과 혼합하여 작업하기가 매우 어렵습니다. - 속도는 JSP에 비하여 컴파일 단계가 생략됨으로 빠른 형태를 가지고 있습니다. - JSP가 Servlet으로 변환되는 과정에서 불필요한 코드가 많이 발생하나 서블릿은 이 과정이 생략되어 있어 속도가 매우 빠릅니다. - 확장자가 java로 개발되어 .class 입니다.(jsp파일은 확장자가 *.jsp입니다.)
근뎅 어짜피 느린것도 개발맨이 테스트해서 쓸거라 속도 별로 차이 안남... -.,-
임이래여
이게 디자인이 개 어려워서 그냥 쉽게 만듬! 쪠이얘쓰피
3. JSP를 이용한 구성 - Servlet의 불편한 디자인 부분을 좀더 간결하게 제작하도록 개선된 서버 스크립트입니다. - 하나의 JSP페이지에는 HTML, JavaScript, Java Code등이 혼합되어 존재하게 됩니다. - 디자이너가 작업한 내용이 JSP 페이지로 변경됩니다. - 변경된 JSP 페이지를 개발자가 코드 작업을 하게됩니다. - 대형 사이트의 경우 유지보수 및 기능 확장이 어려워 나중에 JSP, Beans로 분리되게 됩니다.
IE <------ 응답 <----- HTML <----- JSP --> Servlet으로 변환 ------------------------ *.jsp --> *.java --> *.class
4. JSP + Beans(JAVA class) 를 이용한 구성 - JSP는 사이트 구축시 디자이너가 작업하게 되며, 일부 jsp 개발자가 코드 작업을 하게됩니다. . 디자인쪽 비중이 매우 큽니다. - BEANS는 콤포넌트 자바 개발자가 Business Logic(Process Logic)를 구현하는 목적으로 사용됩니다. . DB관련 INSERT, UPDATE, DELETE, SELECT등
빈즈가 JSP의 꽃이래여
근뎅 요새는 이딴거 안쓰고 MVC(-_-?) 로 한대영
배우긴 배우는것
MySQL에서 DAO DTO 같은 애들이 BEANS임
IE <---- 응답 <--- HTML <--- JSP --> Servlet으로 변환 -> JSP Beans --------------------- *.jsp --> *.java --> *.class
JDK는 깔려 있으니까 TOMCAT 깔거임!
설치는 그냥 압축 해제해서 실행하면 됨
파일명을 tomcat-8.0로 바꿔줌
D:\javadb\web 요기다가 넣어줌
한글 처리에서 중요한 것 3가지.
1.서버 -> 브라우저로 자원(페이지)를
보낼 때
그 자원에 한글이 있으면 다 깨짐!
-> 그래서 source 내에서 처리한다! :>
2. 브라우저 -> 서버로 데이터(정보)
를 보낼 때 거기 한글이 있으면
다 깨짐 ^^
↑(GET) 방식으로 데이터를 보낼 때
(GET) = Tomcat의 설정파일에 설정 // <%@ page contentType="text/html;charset=utf-8" %>
- D:/bigdata02/web/tomcat-8.0/webapps/jsptest/WEB-INF . *.xml 환경 설정 파일이 위치, 이곳은 Client가 접속할 수 없습니다. . 반드시 대문자로 폴더명이 되어 있어야 합니다. . 잘못된 예: web-inf, WEB_INF, Web-Inf 대소문자 철저 구분
- D:/bigdata02/web/tomcat-8.0/webapps/jsptest/WEB-INF/classes . 서블릿이 위치 합니다. . JSP Beans등이 위치합니다.
확장자가 jsp면
<%@ page contentType="text/html;charset=utf-8" %>
가 꼭 필요함! :>
한글처리하면서 첫번째로 필요하던 것:>
실행하려면
1. 자원 생성(만들었음)
2. 포트 열기 - 8000! :>
. = 현재 페이지하고 같은 경로
귀찮아서 그냥 찍었다...
2. 테스트 - D:/bigdata02/web/tomcat-8.0/bin/startup.bat를 실행합니다. . 인식이 안되면 톰캣을 재시작하세요.
- contentType: jsp의 출력 형식 지정, 문자 셋을 지정합니다. . 형식: contentType="text/html; charset=UTF-8" ㅇ -_-); <%@ page contentType="text/html; charset=UTF-8" %> . JSP처리 결과가 HTML임으로 MIME Type을 'text/html'과 문자 코드(UTF-8)를 선언. . MIME Type: 브러우저가 출력하는 데이터의 종류를 나타낸 코드값, 브러우저에게 데이터 타입을 알려줌 예)image/jpg는 이미지가 출력됨 . 문자 코드는 UTF-8이 표준화 되어가고 있음으로 권장. . XML, Ajax 사용시 주로 UTF-8를 선언합니다. . EUC-KR, UTF-8 중 어떤 문자셋이든 브러우저가 자동으로 한글 코드를 적용시킴. . 대소문자 상관 없음(자료실의 한글 파일명은 UTF-8을 사용할 것). . HTML 태그의 META태그도 일치시켜야함(브러우저용). <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
임뽀트는 중복 사용이 가능함! ^ㅁ^) 응 그러니까 그냥 java util * java util scanner ad sadsada wqewqe qw 이런거랑 같은거임
- pageEncoding: jsp1.2에 추가된 규약으로 jsp페이지의 문자셋 형식을 지정합니다. <%@ page pageEncoding="UTF-8" contentType="text/html" %>
구냥 따로 문자셋 지정해도 됨미다
1. import속성의 실습, http://127.0.0.1:8000/jsp_test/import.jsp - <%@ page contentType="text/html; charset=UTF-8" %>: Tomcat 서버 입장에서의 한글 처리 방법 선언 - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">: Web Browser 입장에서의 한글 처리 방법
실제의 네트웍 경로를 가리키며, 네트웍 상의 리소스 접근시에 사용된다 URL의 첫 번째 부분은 다음과 같은 프로토콜을 명시하는데, 대부분의 경우 http이며, 가끔은 ftp 혹은 mailto이며, 드물게 gopher, news, telnet, file 등을 사용합니다. 이와 같은 URL 프로토콜 부분을 scheme이라고 한다.
URL URL은 보통 브라우저의 주소 창에 입력하는 주소를 URL이라고 할 수 있습니다. 삼성SDS 멀티캠퍼스의 URL은 “http://www.e-campus.co.kr/” 입니다. 이 주소가 URL이라고 볼 수 있습니다. 또한 좀더 상세하게 찾아보면 다음과 같은 URL도 있을 수 있습니다.
“http://www.e-campus.co.kr/image/img_top.gif”
URL은 보통 다음과 같은 내용으로 구성됩니다. 프로토콜 http:// 도메인 www.e-campus.co.kr 자원을 식별할 수 있는 자원의 경로명 /image/img_top.gif 즉, 위와 같은 URL을 통하여 인터넷 상의 자원을 지정할 수 있습니다. URL을 통하여 지칭할 수 있는 자원의 종류는 제한이 있는데 URL을 통해서 가져올 수 있는 자원은 유형, 무형의 자원 중 명백하게
통합 자원 식별자(Uniform Resource Identifier, URI)는 인터넷에 있는 자원을 나타내는 유일한 주소이다. URI의 존재는 인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에 항상 붙어 다닌다.
URI는 자원을 식별할 수 있는 문자열정도로 생각하면 될 것 같다
URI 인터넷 상에서 일반적으로 이루어지는 작업은 자원(resource)을 찾고 가져오는 일에 관련되어 있습니다. 자원이란 인터넷상에 존재하는 html 파일이나 gif 파일 등을 의미합니다. 또한 넓은 의미로 생각한다면 인터넷을 통하여 얻을 수 없는 자원도 포함합니다. 이러한 상황을 전제로 URI를 정의하면 다음과 같습니다.
URI 란 리소스를 식별하는 문자열이다. 선호도에 따라 우리가 잘 알고 있는 URL(Uniform Resource Locator) 또는 URN(Universal Resource Name)의 둘 중 하나의 형태로 쓸 수 있다.
위 정의를 보면 URI는 URL이나 URN 둘 중의 하나라고 말하고 있습니다. 둘 중의 하나라면 URI는 URN도 될 수 있고 URL도 될 수 있다는 것을 의미합니다. 그렇다면 URL과 URN은 어떤 의미로 사용할까요?
아래와 같이 하면.. getRequestURL() 는 https://www.abc123.com:80/test1.jsp, getRequestURI() 는 /test1.jsp 라고 나온다.
getRequestURL() 에는 getRequestURI() 내용 외에, 1. http:// 이냐 https:// 이냐의 프로토콜 2. :80 이냐 :8080 이냐의 포트 등이 추가로 표시된다.
http://raisonde.tistory.com/295
보니까 더 어렵다 -_-);;
URI는 인터넷 서비스를 통해 접근하고자 하는 자원의 식별 체계(경로)를 가리킨다. 즉, 어떤 파일이나 어떤 웹페이지에 접근 하고자 할때 사용되는 주소 체계를 말 하는 것이다. URI와 URL의 차이에 대해서 궁금해 하는 사람이 많은데, URL은 URI에 속하는 주소 체계중 하나이다. URI에는 URL말고도 URN, URC 라는 주소체계가 있다. 즉 URI는 이를 모두 포함하는 개념인 것이다.
URI ⊃ {URL, URN, URC}
URL은 우리가 흔히 알고 있는 주소 체계이다. 프로토콜 + 호스트 + 하위 경로로 구성되어 인터넷상의 특정 자원에 접근 할 수 있다. 예를 들어,
http://raisonde.tistory.com/227
는 http라는 프로토콜로, raisonde.tistory.com 이라는 호스트로 접속하여 227 이라는 경로에 가면 원하는 문서가 있다는 말이다.
URN은 좀 더 복잡하지만 안정된, 영구적인 주소체계이다. URL은 해당 경로에 원하는 자원(파일, 웹페이지 등)이 변경되거나 이동 될 경우 더이상 접근이 불가능 해 지는 문제가 있는데 URN은 이런 자원에 대한 접근 경로를 지속적으로 추적 해 줌으로써 특정 자원에 반영구적으로 접근할 수 있다. 이를 위한 추적 에이전시로는 RSS(Resolution System Switcher)가 있으며 주소 체계는 IETF RFC 2141 에서 정의한다.
URC는 인터넷 상에 존재하는 자원에 관한 저자, 위치, 제목을 표현하는 메타 데이터의 일종이다. URL과 URC를 포함하는 컨테이너적인 체계이다.
In some applications, the unknown user requests must log resources, prompting the user to log on at this time to the current page, remember the user access to the URL, when he after successful login URL to the user according to remember last visited page:
<p>The overflow property specifies what to do if the content of an element exceeds the size of the element's box.</p>
<p>overflow:scroll</p>
<div class="scroll">You can use the overflow property when you want to have better control of the layout. The default value is visible.</div>
<p>overflow:hidden</p>
<div class="hidden">You can use the overflow property when you want to have better control of the layout. The default value is visible.</div>
</body>
</html>
---------------
<!DOCTYPE html>
<html>
<head>
<style>
div {
color: red;
}
h1 {
color: initial;
}
</style>
</head>
<body>
<div>
<h1>Initial</h1>
<p>The header and this text is inside a DIV element, which has the color property set to "red". The header element has its color property set to "initial", which in this case is "black".</p>
</div>
<p><b>Note:</b> The initial keyword is not supported as a property value in Internet Explorer, or in Opera before version 15.</p>
</body>
</html>
이거 할떄 졸았음 - 빨간색
<!DOCTYPE html>
<html>
<head>
<style>
span {
color: blue;
border: 1px solid black;
}
.extra span { // 엑쓰트라를 먼저 찾고 - 그담에 자식요소 인것
color: inherit;
}
</style>
</head>
<body>
<div>
Here is <span>a span element</span> which is blue, as span elements are set to be.
</div>
<div class="extra" style="color:green">
Here is <span>a span element</span> which is green, because it inherits from its parent.
</div>
<div style="color:red">
Here is <span>a span element</span> which is blue, as span elements are set to be.
</div>
</body>
</html>
http://webdir.tistory.com/347
졸은거 땜빵!
overflow
요소의 박스에 콘텐츠가 넘칠때 표현방법을 지정한다.
CSS
div{width: 150px;height: 150px;overflow: scroll;}
overflow-x와 overflow-y 속성에 대한 축약 속성이다.
이 속성의 두 번째 값은 선택적이며, 하나의 값만 지정할 경우 overflow-x와 overflow-y 속성에 모두 적용된다.
<p>Click the "Try it" button to change the overflow-x property of the DIV element:</p>
<button onclick="myFunction()">Try it</button>
<div id="myDIV">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,<br> sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<br> Ut wisi enim ad minim veniam,<br> quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
Oracle 뿐만 아니라 DB2 에서도 실행되는(?) 수행되는 이라고 해야 맞으려나?? - -;; 암튼... 이번엔 JAVA 의 IF ~ ELSE 문과도 같은 CASE WHEN 문에 대해서 알아 봅시다.
CASE ~ WHEN ~ THEN ~ ELSE ~ END
[형식] CASE 컬럼명 | 표현식 WHEN 조건식1 THEN 결과1 WHEN 조건식2 THEN 결과2 ....... WHEN 조건식n THEN 결과n ELSE 결과 END
조건문과 조건문 사이에는 콤마(,) 를 사용하지 않는다. CASE 문은 반드시 END 로 끝내야 한다. CASE 표현식은 ANSI SQL 형식도 지원한다. 결과 부분은 NULL 을 사용해서는 안된다.
case when x = y then a else b end : 조건 x =y 가 true 일 경우 a 이고 그렇지 않으면 b
case when x < y then a when x = y then b else c end : 조건 x<y 가 true 일 경우 a 로, 조건 x = y 일 경우엔 b 로 그렇지 않으면 c 로 변경
case XYZ when 'foo' then 'moo' else 'bar' end : XYZ 가 foo 일 경우 moo 로 변경, 그렇지 않으면 bar 로 변경
예제 만들기!
CREATE TABLE TEST_CASE_WHEN (A VARCHAR2 (5), B VARCHAR2 (5));
INSERT INTO TEST_CASE_WHEN VALUES ('*','*'); INSERT INTO TEST_CASE_WHEN VALUES ('+','+'); INSERT INTO TEST_CASE_WHEN VALUES ('-','-'); INSERT INTO TEST_CASE_WHEN VALUES ('.','.');
COMMIT;
토드나 SQLPLUS 혹은 SQLGATE 에서 Qurey 를 날려 봅시다.
자, Alias 인 as B 를 붙이므로 좀더 Grid 의 컬럼이 보기 깨끗해집니다. ^^
SELECT a, CASE WHEN b = '*' THEN 'star' WHEN b = '+' THEN 'plus' WHEN b = '-' THEN 'minus' ELSE '????' END AS B FROM test_case_when;
DBMS의 중요한 목적 중 하나는 데이터를 효율적으로 관리하는 것이다. 그래서 개별 테이블을 만들어 가급적 중복성을 피해서 꼭 필요한 데이터를 저장하게 된다. 하지만 각각의 테이블 하나만 놓고 본다면 그안에 들어있는 데이터는 정보로서의 가치가 많이 떨어진다. 하지만 각각의 테이블에 분리되어 있는 연관성 있는 데이터들을 연결하거나 조합하여 데이터를 사용할 수 있다면 중요한 정보로서 가공될수 있다.
이런 작업들을 조인(Join)이라고 한다.
1. WHERE 절
조인에 대해 알아보기 전에 먼저 WHERE 절 에 대해 살펴 봐야 한다.
WHERE 절은 SELECT, UPDATE, DELETE 등 여러 DML 문장에서 사용되어 특정 조건을 처리하는 필터 역할을 수행한다. 그리고 조인에 사용되는 조건들 역시 WHERE 절에 기술한다. SQL 문장을 얼마나 잘 작성하느냐의 척도는 WHERE 절을 얼마만큼 잘 사용하느냐에 달려 있다.
IN
BETWEEN ..AND 조건과는 다르게 여러 개의 값을 동시에 비교해야 할 경우에는 IN 을 사용한다.
IN연산자는 OR 연산자와 동일한 기능을 수행하며 비교할 값들이 많을때 IN 을 사용하면 문장이 짧아진다.
부서 ID가 30 OR 60 OR 90 인 사원들만 구하겠다 할때 사용할 수 있다.
EXISTS
IN과 비슷한 용도로 EXISTS 조건이 있다 어떤 값에 포함되는지 여부를 체크하는 것이 IN 이라면 EXISTS는 특정 컬럼값이 존재하는지 여부를 체크한다. IN은 괄호 안에 비교할 값이 올 수도 있고 서브쿼리가 올 수도 있는 반면에 EXISTS는 오직 서브쿼리만 올 수 있다.
테이블 부서ID가 30, 60, 90인 사원을 구하고 싶을때 EXISTS를 사용했다.
결과는 IN을 사용했을때와 동일하면서 SQL 문장은 더 길어졌다 왜 사용할까?
EXISTS는 IN보다 탁월한 성능을 발휘한다 그만큼 쿼리결과가 빨리나온다. 문장은 길어졌지만 오라클 SQL 엔진 입장에서는 EXISTS가 더빨리 처리 되는 것이다. 이것에 대해서는 SQL튜닝과 관련된 곳에서 공부를 더 해야 한다.