usebean 활용
package member.dto;
public class MemberBean {
private String id;
private String name;
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setId(String id) {
this.id=id;
}
public void setName(String name) {
this.name=name;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title style="text-align:center;">회원정보1</title>
<style>
#container{
width: 400px;
height: 200px;
margin: 0 auto;
padding: 10px;
border: 1px solid #222;
}
.inputTag{
width: 360px;
height: 40px;
margin: 0 auto;
padding: 5px;
vertical-align:middle;
text-align:center;
}
</style>
</head>
<body>
<form action="MemberGet.jsp" method="post">
<div id="container">
<h3 style="text-align:center; margin-bottom:25px;">회원정보 입력</h3>
<div class="inputTag">아이디:
<input name="id" value="" size="10" required="required">
</div>
<div class="inputTag">이름:
<input name="name" value="" size="10" required="required">
</div>
<div class="inputTag">
<input type="submit" value="전송">
</div>
</div>
</form>
</body>
</html>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager" %>
<%@page import="java.sql.Connection" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!-- 요청시 들어오는 글자를 utf-8로 변경해라 -->
<% request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="member" class="member.dto.MemberBean" scope="page"/>
<jsp:setProperty property="*" name="member"/>
<jsp:getProperty name="member" property="id"/>와
<jsp:getProperty name="member" property="name"/>을
저장 합니다.
<%
//웹 라이브러리 저장. mysql은 connector/j, oracle은 jdbc
//드라이버를 클래스로 받아라.
Class.forName("com.mysql.jdbc.Driver");
//Class.forName("com.mysql.jdbc.Driver");
//데이터베이스와 길을 뚫어라 Connection 연결 객체 생성
//DriverManager 단 하나의 connection을 객체로 갖고 오게 해준다.(singleton)
Connection conn=
DriverManager.getConnection("jdbc:mysql://localhost:3306/boarddb","root","1234");
PreparedStatement pstmt = null;
if(conn!=null){
//성공하면 데이터베이스에 저장
String id = member.getId();
String name = member.getName();
//?를 사용하면 외부에서 잘못된 정보로 공격하는 것을 막을 수 있음.
String sql = "insert into member(id,name) values (?,?)";
/*쿼리문을 가지고 다니는 객체*/
pstmt = conn.prepareStatement(sql);
//? 완성
pstmt.setString(1, id);
pstmt.setString(2, name);
//실행하라.
int c = pstmt.executeUpdate(); // insert, update, delete 실행하는 메서드.
if (c>0) out.println("저장성공");
}else{
out.println("연결실패");
}
if(pstmt!=null)pstmt.close();
if(conn!=null) conn.close();
%>
package common.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CommonEncodingFilter implements Filter {
/**
* 인코딩을 수행할 인코딩 캐릭터 셋 지정
*/
private String encoding = null;
/**
* 필터 설정 관리자
*/
protected FilterConfig filterConfig = null;
/**
* @return
*/
public FilterConfig getFilterConfig() {
return filterConfig;
}
/**
* @param cfg
*/
public void setFilterConfig(FilterConfig cfg) {
filterConfig = cfg;
}
@Override
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
@Override
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (request.getCharacterEncoding() == null) {
if (encoding != null) {
request.setCharacterEncoding(encoding);
}
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
}
}
타입 불일치를 잡아준다.
열거형을 정의하는 방법
열거형 타입의 변수를 선언하고 사용하는 방법
열거형 상수의 비교에 ==와 compareTo() 사용가능
모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
values(), valueOf는 컴파일러가 자동으로 추가
enum Direction{ EAST, SOUT, WEST, NORTH }
class Ex12_5{
public static void main(String[] args){
Direction d3 = Enum.valueOf(Direction.class, “EAST”);
}
예제
boolean
과 Boolean
byte
와 Byte
short
와 Short
int
와 Integer
long
와 Long
float
와 Float
double
와 Double
char
와 Character
불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적는다.
열거형의 생성자는 묵시적으로 PRIVATE이므로, 외부에서 객체 생성 불가
values()란?
of()란?
of()
메서드는 매개변수로 전달된 값들을 컬렉션에 추가하여 초기화한 불변 컬렉션 객체를 생성예제
- @Override
- 오버라이딩을 올바르게 했는지 컴파일러가 체크
- 오버라이딩 할 때 메서드 이름을 잘못 적는 실수를 하는 경우가 많다.
- 오버라이딩 할 때는 메서드 선언부 앞에 @Override를 붙이자.
- @Deprecated
- 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
- 필드나 메서드에 문제가 발생하던가, 더 좋은 필드나 메서드가 나왔을 때.
- 자바는 호환이 중요하기때문에 함부로 지울 수 없는 경우가 있음.
- @FunctionalInterface
- 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
- 함수형 인터페이스에는 하나의 추상 메서드만 가져야 한다는 제약이 있음.
- @SuppressWarnings
- 컴파일러의 경고 메시지가 나타나지 않게 억제한다.
- 괄호()안에 억제하고자 하는 경고의 종류를 문자열로 지정
- @Target
- 애너테이션을 정의할 때, 적용 대상 지정에 사용
- @Retention
- 애너테이션이 유지(retention)되는 기간을 지정하는데 사용
- 컴파일러에 의해 사용되는 애너테이션의 유지정책은 SOURCE이다.
- 실행시 사용 가능한 애너테이션의 정책은 RUNTIME이다.
- @Documented, @Inheited
- javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다.
- 애너테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙인다.
- @Repeatable
- 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용
- @Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있다.
- @Repeatable인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 정의해야함
@interface 애너테이션이름 {
타입 요소이름(); //애너테이션의 요소를 선언한다.
...
}
애너테이션의 메서드는 추상메서드이며, 애너테이션을 적용할 때 지정(순서X)
상수는 허용됨
하나의 새로운 프로세스를 생성하는 것보다, 하나의 새로운 쓰레드를 생성하는게 비용이 적다!
프로세스의 병렬처리
프로세스의 병행처리
대부분의 프로그램이 멀티쓰레드로 작성되어 있다. 그러나, 멀티쓰레드 프로그래밍이 장점만 있는 것이 아님.
main에서 start()를 호출
start메서드는 새로운 호출스택 생성
호출스택에 run을 올린다.
그리고 start()는 종료된다.
각각의 쓰레드가 자기만의 호출스택을 가지고 실행한다. 따라서 서로 독립적인 작업을 할 수 있다.
실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다.
싱글쓰레드
멀티쓰레드
멀티스레딩이 시간이 더 오래걸린다.
하지만 시간이 더 걸리더라도 여러가지 기능을 같이 수행하는 것이 장점이다.
블락킹 : 입출력시 작업중단하는 것
이럴 때 멀티스레드를 돌린다면?
.setPriority(n)
.getPriority()
작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있다.
하지만 이는 희망사항.
OS의 스케줄러는 공평하게 돌아간다. 따라서 OS스케줄러가 참고만 하는 수준이다.
서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것
모든 스레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 한다.
쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 main쓰레드 그룹에 속한다.
자신을 생선한 쓰레드(부모 쓰레드)의 그룹과 우선순위를 상속받는다.
상태 | 설명 |
---|---|
NEW | 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태 |
RUNNABLE | 실행 또는 실행 가능한 상태 |
BLOCKED | 동기화블럭에 의해 일시정지된 상태(lock이 풀릴때까지 기다리는 상태) |
WAITING, TIMED_WAITING | 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지상태. TIMED_WAITING은 일시정지시간이 지정된 경우를 의미 |
TERMINATED | 쓰레드의 작업이 종료된 상태 |
메서드 | 간단설명 | 설명 |
---|---|---|
static void sleep(long millis) | 일시정지 | 지정된 시간(1/1000 초 단위)동안 쓰레드를 일시 정지시킨다. 지정한 시간이 지나고 나면 자동적으로 다시 실행대기 상태가 된다. |
static void sleep(long millis, int nanos) | ||
void join() | 다른 쓰레드 기다리기 | 지정된 시간동안 쓰레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다. |
void join(long millis) | ||
void join(long millis, int nanos) | ||
void interrupt() | 다른사람 꺠우기 | sleep()이나 join()에 의해 일시정지상태인 쓰레드를 깨워서 실행대기상태로 만든다. 해당 쓰레드에서는 interrupted Exception이 발생함으로써 일시정지 상태를 벗어나게 된다. |
void stop() | 쓰레드 종료 | 쓰레드 즉시 종료 |
void suspend() | 일시정지 | 쓰레드 일시정지시킨다. resume()을 호출하면 다시 실행대기 상태가 된다. |
void resume() | 일시정지 재개 | suspend()에 의해 일시정지상태에 있는 쓰레드를 실행대기상태로 만든다. |
static void yield() | 양보 | 실행 중 자신에게 주어진 실행시간을 다른 쓰레드에게 양보(yield)하고 자신은 실행대기상태가 된다. |
Static은 쓰레드 자기 자신에게만 호출 가능
대기상태(WAITING)인 쓰레드를 실행대기 상태(RUNNABLE)로 만든다.
void suspend() :쓰레드를 일시정지 시킨다.
void resume() : suspend()에 의해 일시정지된 쓰레드를 실행대기상태로 만든다.
void stop() : 쓰레드를 즉시 종료시킨다.교착상태(Dead-lock)을 일으킬 수 있기때문에 쓰지 않는것을 권장한다.
지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.
void join() : 작업이 모두 끝날때까지
void join(long millis) : 천분의 일초동안
void join(long millis, int nanos) : 천분의 일초+나노초 동안
남은 시간을 다음 쓰레드에게 양보하고, 자신(현재 쓰레드)은 실행 대기한다.
static이다.(자기자신에게 쓸 수 있는 것)
yield()와 interrupt()를 적절히 사용하면, 응답성과 효율을 높일 수 있다.
사용여부에 따른 큰 차이가 없으나, yield를 쓰는게 아주조오오금 더 빠를때가 있다고 한다.
=객체 선언과 생성을 동시에 하는 것
람다식의 참조변수타입은 함수형인터페이스를 사용하면 된다.
클래스이름::메서드이름
- 하나의 메서드만 호출하는 람다식은 ‘메서드 참조’로 간단히 할 수 있다.