D:\내 프로젝트 경로\app\build\intermediates\navigation_json\debug\navigation.json 

이 없다는 오류

-----> 결론 : 다운그레이드 해주기(navigation.json을 다시 받아올 수 있도록)

 

1. build.gradle 편집

 

dependencies {
        classpath 'com.android.tools.build:gradle:4.1.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

dependencies {
        classpath 'com.android.tools.build:gradle:4.0.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

 

 

2. gradle-wrapper.properties 편집

distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip

distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip

자바 스레드랑 똑같아서...

 

1. 이미 상속받고있는 AppCompatActivity가 있으니까 Runnable 구현하기

public class MainActivity extends AppCompatActivity implements Runnable{
			// 중략
}

 

2. run() 메소드 구현하기

public class MainActivity extends AppCompatActivity implements Runnable{
	//중략
    
    @Override
    public void run() {
        while(true) {
            try {
               //반복할 부분 코드
                Thread.sleep(1000); // 밀리세컨드. 1초=1000, 10초=1000*10
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

3. 스레드 start() 시키기

public class MainActivity extends AppCompatActivity implements Runnable{
	 
     //생략
     
     @Override
   	 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Thread thread = new Thread(this);
        thread.start();
     	//생략
     }       
}

value-style.xml

앱테마에 추가

	<item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>

build.gradle(app 레벨)에 dependency추가

 

implementation 'androidx.core:core:1.5.0-alpha04'

1. Volley를 사용하겠다고 build.gradle에 선언해준다(매니페스트에 인터넷 사용은 당연한것!)

dependencies {

    implementation 'com.android.volley:volley:1.1.1'
    /* 생략 */
}

 

2. RequestQueue를 한번만 생성하도록 싱글톤으로 만든다

(출처 : developer.android.com/training/volley/requestqueue?hl=ko)

public class MySingleton {
        private static MySingleton instance;
        private RequestQueue requestQueue;
        private ImageLoader imageLoader;
        private static Context ctx;

        private MySingleton(Context context) {
            ctx = context;
            requestQueue = getRequestQueue();

            imageLoader = new ImageLoader(requestQueue,
                    new ImageLoader.ImageCache() {
                private final LruCache<String, Bitmap>
                        cache = new LruCache<String, Bitmap>(20);

                @Override
                public Bitmap getBitmap(String url) {
                    return cache.get(url);
                }

                @Override
                public void putBitmap(String url, Bitmap bitmap) {
                    cache.put(url, bitmap);
                }
            });
        }

        public static synchronized MySingleton getInstance(Context context) {
            if (instance == null) {
                instance = new MySingleton(context);
            }
            return instance;
        }

        public RequestQueue getRequestQueue() {
            if (requestQueue == null) {
                // getApplicationContext() is key, it keeps you from leaking the
                // Activity or BroadcastReceiver if someone passes one in.
                requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
            }
            return requestQueue;
        }

        public <T> void addToRequestQueue(Request<T> req) {
            getRequestQueue().add(req);
        }

        public ImageLoader getImageLoader() {
            return imageLoader;
        }
    }

 

3. 사용하고 싶은 곳에서 호출한다

3-1. 이렇게 위에서 만든 싱글톤으로 사용하거나

RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
        getRequestQueue();

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            // Display the first 500 characters of the response string.
            textView.setText("Response is: "+ response.substring(0,500));
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            textView.setText("That didn't work!");
        }
    });

    // Add the request to the RequestQueue.
    queue.add(stringRequest);

3-2. 그냥 바로 겟인스턴스해서 써도 된다

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            // Display the first 500 characters of the response string.
            textView.setText("Response is: "+ response.substring(0,500));
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            textView.setText("That didn't work!");
        }
    });

    // Add the request to the RequestQueue.
    MySingleton.getInstance(this).addToRequestQueue(stringRequest);

 

4. 파라미터로 요청을 보내고 싶다면 getParmas를 사용해 Map에 담아 보내면 된다. StringRequest, POST에서만 된다. JsonRequest에서는 안됨.

StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            // Display the first 500 characters of the response string.
            textView.setText("Response is: "+ response.substring(0,500));
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            textView.setText("That didn't work!");
        }
    }){
    	@Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("key", value);
                params.put("key", value);
                
                return params;
            }
    };

    // Add the request to the RequestQueue.
    queue.add(stringRequest);

 

5. json으로 받고싶다면 argument 하나가 중간에 추가된다.

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                
            }
        });
        
        queue.add(jsonObjectRequest);

 

 

자세한건 여기에 더 있다

https://developer.android.com/training/volley?hl=ko

안드로이드 에뮬레이터에서는 localhost나 127.0.0.1같은 주소가 안먹힌다.

(이유는 뭐 셀프로 어쩌고 해서 핑이 생겨서 어쩌고 하는 이유라는데 구글링하면 잘 나옴)

 

그래서 로컬로 에뮬레이터를 돌릴때에는

 

localhost:8080/어쩌고 대신

 

10.0.2.2:8080/어쩌고

 

를 써야한다

 

참고 :

https://developer.android.com/studio/run/emulator-networking?hl=ko

안드로이드는 보안상 DB서버와 바로 연결할 수 없다고 한다.

그래서 

 

안드로이드 앱 - php/jsp(주로 php) - 서버

 

이런 구조로 db서버와 연결을 한다.

 

php자료는 검색해보니 상당히 많이 나오던데 jsp는 나오긴 하지만 php보다는 적다ㅠ

 

php가 아무리 쉽다고들 하지만, 나는 jsp를 알기때문에 jsp로 만든다..

 

 

 

서버는 MySql을 사용할 것이다.

 

우선 jsp와 MySQL을 연동해준다

 

 

 

먼저 기초작업.

커넥터-j를 이곳저곳에 뿌려주기

여러군데에 다 안뿌려도 된다. 프로젝트안에 넣는게 보통인듯한데, 나는 편의상 톰캣에 넣는다

 

https://coldsummernight.tistory.com/entry/mySQl%EA%B3%BC-JAVA-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-connecter-j

 

mySQl과 JAVA 연결하기 (connecter-j)

1. 내컴퓨터 C:\Program Files (x86)\MySQL\Connector J 5.1 에서 mysql-connector-java-5.1.48-bin 복사 2. C:\Program Files\Java\jre1.8.0_221\lib\ext 에 붙여넣기(관리자 권한 필요) 2-1. C:\Program Files..

coldsummernight.tistory.com

 

 

 

게시판의 기본은 CRUD 인데, 일단 쉬운 Read부터 한다.

먼저 모든 글 다 가져오는 페이지를 만든다.

 

list.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR" import="java.sql.*, org.json.*"%>
<%
	request.setCharacterEncoding("utf-8");

	Connection conn = null;
	PreparedStatement ptst = null;
	ResultSet rs = null;
	
	JSONArray jArray = new JSONArray();
		
	try {
		Class.forName("com.mysql.cj.jdbc.Driver");
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC", "root",
		"1234");
	
		String sql = "select * from dbtest";
	
		ptst = conn.prepareStatement(sql);
		rs = ptst.executeQuery();
				
		int index = 0;
		while (rs.next()) {
			JSONObject jObject = new JSONObject();
			jObject.put("no", rs.getString("no"));
			jObject.put("title", rs.getString("title"));
			jObject.put("content", rs.getString("content"));
			
			jArray.put(index, jObject);
			index++;
		}
	
		out.println(jArray);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		if (rs != null) {
			rs.close();
		}
		if (ptst != null) {
			ptst.close();
		}
		if (conn != null) {
			conn.close();
		}	
	}
%>

 

test는 내 스키마 이름, dbtest는 테이블 이름, root는 db계정 명, 1234는 비밀번호이다.

칼럼은 no, title, content 세개로 구성했다

(가장 간단한 구성.... 가장 쉽고 easy....)

 

 

 

 

 

나머지는 나중에 생각날때 추가....

기존에 쓰던 코드는 이건데 오류로 안되더라

클래스 찾아오는 부분은 deprecated 뜨고

타임존을 입력하라는 에러가 뜬다

 

<% 
	Connection conn = null;
	PreparedStatement ptst = null;
		
	try {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/스키마여기에", "DB계정",
		"계정 비밀번호");
	
		/* 생략 */
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		if (ptst != null) {
			ptst.close();
		}
		if (conn != null) {
			conn.close();
		}
	
	}
%>

 

 

그래서 요즘 쓰는건 아래와 같다

클래스 찾아오는 부분에 cj가 추가되었고

캐릭터 인코딩과 타임존을 추가하였더니 오류 없이 잘됨~!

 

<% 
	Connection conn = null;
	PreparedStatement ptst = null;
		
	try {
		Class.forName("com.mysql.cj.jdbc.Driver");
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/스키마명여기에?characterEncoding=UTF-8&serverTimezone=UTC", "DB계정",
		"계정 비밀번호");
	
		/* 생략 */
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		if (ptst != null) {
			ptst.close();
		}
		if (conn != null) {
			conn.close();
		}
	
	}
%>

'jsp' 카테고리의 다른 글

jstl로 map에 접근하기 HashMap<String, Object>  (0) 2020.05.04
MultipartRequest를 통한 파일업로드하기  (0) 2020.02.03

+ Recent posts