개발공부
- 50DAY / Android / 버튼 클릭 이벤트 처리, 터치이벤트 처리 2017.06.15
- 49DAY / Android Studio / 설치, 프로젝트생성, 아이콘바꾸기 2017.06.14
- 45DAY / JSP지시어 2017.06.08
- 40DAY / Git 2017.05.31
50DAY / Android / 버튼 클릭 이벤트 처리, 터치이벤트 처리
버튼 클릭 이벤트 처리
1) 액티비티에서 View타입을 매개변수로받는 메서드 생성 후
레이아웃에서 메서드 호출설정
레이아웃
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.firstapp.firstapp.MainActivity">
<Button
android:id="@+id/hellobtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click"android:onClick="testOnClick"/>
</android.support.constraint.ConstraintLayout>
액티비티
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
}
public void testonClick(View view) {
Toast.makeText(MainActivity.this, "EventTest Click", Toast.LENGTH_SHORT).show();
}
}
}
2)이벤트리스너를 사용
공통레이아웃
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.firstapp.firstapp.MainActivity">
<Button
android:id="@+id/hellobtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click"
</android.support.constraint.ConstraintLayout>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
Button button = (Button)findViewById(id.hellobtn);
button.setOnClickListener(new MyListener());
}
class MyListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "EventTest Click", Toast.LENGTH_SHORT).show();
}
}
}
3)익명클래스를 사용
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
Button button = (Button)findViewById(id.hellobtn);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "EventTest Click", Toast.LENGTH_LONG).show();
}
});
}
}
4)액티비티 스스로 이벤트리스너 구현
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
Button button = (Button)findViewById(id.hellobtn);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(this, "EventTest Click", Toast.LENGTH_LONG).show();
}
}
터치 이벤트 처리
안드로이드는 문자열을 다룰때 자바의 String타입이 아닌 CharSequence라는 자체 문자열 타입을 사용한다.
그래서 안드로이에서 생성된 문자열에 자바API를 사용할려면 먼저 toString()메서드를 이용하여 CharSequence타입을 String타입으로 변경해야 한다.
49DAY / Android Studio / 설치, 프로젝트생성, 아이콘바꾸기
안드로이드 프레임워크
C기반 개발툴
안드로이드 스튜디오 Android Studio 시작하기
안드로이드 스튜디오 다운로드
https://developer.android.com/studio/index.html
API7.0
1) 환경변수 설정하기
안드로이드 스튜디오를 사용하기 전에 Java JDK 환경변수를 설정해준다.
[제어판] - [시스템] - [시스템보호] - [고급]탭에 환경변수를 클릭한 후
아래 시스템변수 새로만들기에
변수 이름 : JAVA_HOME
변수값 : JDK설치된 경로
를 입력해준다
(2)새 프로젝트만들기
안드로이드 스튜디오 설치가 끝나면 실행하여 새로운 프로젝트를 생성한다.
프로젝트 명과 도메인 명 저장될 경로를 지정한다.
기본적으로 생성되는 액티비티와 레이아웃
(2)가상머신 설정하기
프로젝트에서 API 7 버전인 Nougat를 사용할 것이기 때문에 다운로드해준다.
디바이스 추가 완료!
휴대폰에 연결하기
(1)기종에 맞는 USB 드라이브 소프트웨어 설치후
(2)[ Tools ] - [ Android ] - [ Android Device Mointor ]
##안드로이드 스튜디오 디바이스 연결이 되지 않을 때
https://freeandroidroot.com/download-and-install-universal-adb-driver/
ADB드라이버를 설치 후 다시 시도한다.
아이콘 바꾸기
(3) AndroidMainfest.xml 파일에서 다음과 같이 수정한다.
android:icon="@mipmap/png파일명"
파일명은 영소문자만 가능하다
45DAY / JSP지시어
JSP지시어 (Directive)
<%@ page langauge = "java" %>
JSP파일 내에서 사용 될 스크립트 언어 지정
<%@ page extends = "클래스명" %>
상속할 부모 클래스 지정
<%@ page import = "패키지명.클래스명" %>
Java의 import와 같은기능
<%@ page session = "true" %>
JSP내에서 세션사용
*세션(Session) : HTTP의 Stateless특성으로 인해 커넥션을 매번 새로 생성해야하기 때문에 동일한 클라이언트에 대해 정보를 유지할 필요가 있는 경우, 정보유지가 가능하도록 만드는 가상의 커넥션
<%@ page buffer = "8kb" %>
JSP페이지가 서블릿으로 변환되어 응답을 생성해 클라이언트에 전송할 때 사용되는 버퍼의 크기 지정
none으로 설정 할 경우 버퍼를 사용하지 않는다
<%@ page autoFlush = "true" %>
buffer속성에서 지정한 버퍼가 다 채워졌을경우
true : 클라이언트에게 전송 후 버퍼비운다
false : Exception발생시킨다
<%@ page isThreadSafe = "true" %>
다중스레드에 의한 동시접근을 차단한다
<%@ page info = "페이지설명" %>
페이지전체에 대한 주석의 역할
<%@ page errorPage = "errorpage.jsp" %>
예외가 발생했을 때 에러페이지를 지정해 에러페이지에서 예외처리함
<%@ page contentType = "text/html" %>
JSP페이지가 전송할 응답의 MINE형식 지정 대분류/소분류 순으로 명시한다
<%@ page isErrorPage = "false" %>
현재 페이지가 다른 페이지에서 발생한 예외처리할 페이지 일때 지정한다
<%@ page pageEncoding = "euc-kr" %>
JSP페이지 문자셋 인코딩방식을 지정
파일 업로드
</form>
enctype 속성을 multipart/form-data 로 지정하지 않으면 파일객체가 아닌 파일이름 이 문자열형태로 전송된다.
예제 / 단일 파일 업로드
<form action="./partUplaodPro1" method="post" enctype="multipart/form-data">
<label for ="writer">작성자</label>
<input type=text name="writer" id="writer"><br>
<label for ="partFile1">업로드 파일</label>
<input type="file" name="partFile1" id="partFile1">
<input type="submit" value="업로드">
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/partUplaodPro1")
@MultipartConfig(
fileSizeThreshold=0 ,
location = "d:/upload"
)
public class partUploadPro1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String writer = request.getParameter("writer");
System.out.println(writer);
Part part = request.getPart("partFile1");
String contentDisposition = part.getHeader("content-disposition");
String contentType = part.getHeader("content-type");
System.out.println(part);
if(contentType.equals("image/gif")
|| contentType.equals("image/jpeg")
|| contentType.equals("image/png")){
System.out.println(contentDisposition);
int dotPosition = contentDisposition.lastIndexOf(".");
String temp = contentDisposition.substring(dotPosition,contentDisposition.length()-1);
UUID uuid = UUID.randomUUID();
String fileName = uuid.toString()+temp;
part.write(fileName);
File srcFile = new File("d:\\upload\\"+fileName);
File destFile = new File("d:\\upload\\_"+fileName);
BufferedImage srcbi = ImageIO.read(srcFile);
BufferedImage destbi = new BufferedImage(50, 50, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g = destbi.createGraphics();
g.drawImage(srcbi, 0, 0, 50, 50, null);
ImageIO.write(destbi, temp.substring(1), destFile);
}
else{
response.sendRedirect("./partUploadForm1.jsp");
}
}
}
코드설명 /
@MultipartConfig 는 서블릿에서 multipart/form-data 형태로 전송된 데이터를 처리할 수 있게 지정한다.
파일이 최종 저장될 경로는 d:/upload 이고
업로드된 파일이 0바이트보다 커지면 임시 디렉토리에 저장된다.
파일이 gif,jpeg,png형식이 아닐경우 partUploadForm1.jsp로 돌아가고 맞을경우엔 흰화면
40DAY / Git
Git
Git은 속도가 낮고 효율성이 높은 소규모 프로젝트부터 대규모 프로젝트까지 모든 것을 처리하도록 설계된 무료 오픈 소스 분산 버전 제어 시스템이다.
Git은 SVN과 다르게 commit은 로컬 저장소에서 이루어 지고 push라는 동작으로 원격 저장소에 반영되고 받을때도 pull 또는 fetch로 서버에서 변경된 내역을 받아 올 수 있다.
[window] - [Perspective] - [Open perspective] -[ Git ] 을 선택하여 연다
Java 파일에서 마우스 우클릭 - [ Team ] - [ Commit ] 창을 연다
Commit할 파일을 드래그하여 아래로 당긴후
Commit 메세지를 작성한 뒤 Commit 버튼을 누른다.
Commit 메세지는 일의 능률을 높이기 때문에 신중하게 작성해야한다.
간단한 예제로 Properties 사용
db.properties 파일을 생성한다.
-->무슨 이유인지는 몰라도 위에 공백을 넣어야 내용이 읽히는 오류가 발생하였다...
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class MemberDao {
private String url;
private String dbid;
private String dbpw;
private void dbPropertiesInit() throws IOException{
FileInputStream fin = new FileInputStream("d:\\db.properties");
Properties pro = new Properties();
pro.load(fin);
this.url=pro.getProperty("url");
this.dbid=pro.getProperty("dbid");
this.dbpw=pro.getProperty("dbpw");
}
public Member selectMemberById(String id) throws ClassNotFoundException, SQLException, IOException{
//properties 에서 db정보 가져옴(내부적으로 input)
this.dbPropertiesInit();
System.out.println(this.dbid+"<=id");
System.out.println(this.dbpw+"<=pw");
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection(this.url,this.dbid,this.dbpw);
String query ="select * from oracle_member where ora_id = ?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, id);
ResultSet rs = stmt.executeQuery();
Member mem=null;
if(rs.next()){
mem = new Member();
mem.setId(rs.getString("ora_id"));
mem.setPw(rs.getString("ora_pw"));
mem.setLevel(rs.getString("ora_level"));
mem.setName(rs.getString("ora_name"));
mem.setEmail(rs.getString("ora_email"));
}
return mem;
}
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException{
MemberDao mdao = new MemberDao();
Member m = mdao.selectMemberById("id001");
System.out.println(m.getId());
}
}
GitHub
2)주소 복사
3)이클립스로 돌아가서 PUSH 한다.
4)
5) [master(기본)]를 선택하고 [Add Spec]클릭시 추가된다.
6)GitHub에 가서 확인한다!