JSP에서 받은 Parameter를 Post로 Servlet에 넘기는 방법이다.

-JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> </head> <body> <form method="post" action="/Serv1"> param : <input type="text" name="param"> <input type="submit" value="전송"> </form> </body> </html>

- Servlet

package pack; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class Servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String param = request.getParameter("param"); // 받아온 Parameter를 변수 param에 저장한다. response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>FORM</TITLE></HEAD>"); out.println("<BODY>"); out.println("Parameter = " + param); out.println("</BODY>"); out.println("<HTML>"); out.close(); } }

이렇게 파라미터를 넘겨주면 된다. 여기서 중요한 점은 characterEncoding을 UTF-8 로 했다면 받는 부분도 UTF-8 로 해주어야 한다. 그렇지 안으면, 영어로 받았을 때는 문제가 없지만 한글로 받았을 때는 깨지는 현상이 발생한다.

문자 셋이 안 맞았을 때의 왼쪽 영어, 오른쪽 한글

JSP는 post 부분에 action을 web.xml 부분에 매핑 해준 url을 넣어주면 된다. 아래는 web.xml 매핑한 코드이다.

<servlet> <servlet-name>Servlet</servlet-name> <servlet-class>pack.Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet</servlet-name> <url-pattern>/Serv1</url-pattern> </servlet-mapping>

'Java > JSP' 카테고리의 다른 글

maven 이란?  (0) 2019.09.12
JSP, Servlet, 자바빈 등 용어 정리  (0) 2019.09.12
intellij 에서 Servlet 생성하기  (0) 2019.09.12
intellij 에서 Tomcat 적용하기  (0) 2019.09.12
MVC 디자인 패턴이란?  (0) 2019.09.12

우선에는 servlet을 생성할 폴더는 아래와 같이 src 폴더이다.

servlet을 만들기전에 library 추가가 필요하다.

직접 타이핑을 해준다!

ok를 누르고 적용을 하면 끝난다. 아래는 servlet을 생성하는 방법이다.

여기서 servlet을 만들어준다.

이렇게 만들기를 하면 web.xml 이 뜰 것이다. 안 뜬다면 아래 경로에 있다.

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>Servlet2</servlet-name> <servlet-class>com.servletex.Servlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet2</servlet-name> <url-pattern>/Serv2</url-pattern> </servlet-mapping> </web-app>

그리고 위와 같이 servlet을 xml 매핑을 해줘야한다.

이 후 servlet에 아래와 같은 코드를 삽입하면

package pack; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; public class Servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); Date today = new Date(); out.println("<html>" + "<body>" + "<h1 align=center>Servlet </h1><br>" + "<br>" + today +"</body></html>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }

이 화면을 볼 수 있게 된다. 분명히 알아야 할 점은 doGet 과 doPost에서 doGet에 내용을 적어줘야 화면을 볼 수가 있다.

이로써 intellij로 servlet을 설정하여 jsp와 servlet으로 MVC패턴의 모델2로 개발할 수 있는 환경을 맞추어 보았다.

'Java > JSP' 카테고리의 다른 글

maven 이란?  (0) 2019.09.12
JSP, Servlet, 자바빈 등 용어 정리  (0) 2019.09.12
JSP 에서 Post로 Servlet 에 parameter 넘기기  (0) 2019.09.12
intellij 에서 Tomcat 적용하기  (0) 2019.09.12
MVC 디자인 패턴이란?  (0) 2019.09.12

먼저 JetBrain에서 intellij IDEA ULTIMATE 를 받아준다.

Community 버전은 지원하지 않는 듯 하니 대학생이라면 학교메일을 이용하여 ultimate 버전을 받아 주면 될 듯 하다.

okky 에서 뒤져보니 유료버전인 ultimate 버전만 지원한다고 한다.

아래는 JetBrain 사의 IntelliJ IDEA, Oracle Java, Apache Tomcat 이며 필자의 세팅은 자바 8, 톰캣 7이다.

ultimate를 받고 프로젝트를 새로 생성하려면 아래와 같이 창이 뜨는데 아래와 같이 설정을 하여주면 된다.

위와 같이 설정하여 주고 넘어가서 finish를 눌러주게 되면 아래와 같이 된다.

여기서 tomcat을 잡아 줘야하므로 Edit Configurations 를 들어가 준다.

아래와 같이 하면이 뜨나 처음에는 Tomcat Server가 잡혀 있지 않다. 그러므로 잡아 줘야하므로 왼쪽 상단에 + 기호를 눌러 준다.

<

<

여기서 more items를 눌러서 Tomcat Server를 찾아본다. 필자는 나와있다. 그리고 화살표를 따라서 Local을 선택하여준다.

그리고 Configure... 버튼을 클릭하여준다.

이 후 창이 뜨면 아래에 빨간 표시 부분을 클릭하여 Tomcat 위치를 잡아준다. 필자의 위치는 C:\javalec 안에 미리 받아 둔 톰캣을 넣어두었다.

그리고 적용을 하여주면 IDEA에서 tomcat이 잡히는 것을 볼 수 있다.

'Java > JSP' 카테고리의 다른 글

maven 이란?  (0) 2019.09.12
JSP, Servlet, 자바빈 등 용어 정리  (0) 2019.09.12
JSP 에서 Post로 Servlet 에 parameter 넘기기  (0) 2019.09.12
intellij 에서 Servlet 생성하기  (0) 2019.09.12
MVC 디자인 패턴이란?  (0) 2019.09.12

JSP를 공부해보기 전에 MVC 패턴에 대하여 알아보려고 한다.

우선 MVC라는 용어가 어떻게 나왔는지에 대하여 한번 알아볼 필요가 있다.

MVC 란 Model, View, Controller 의 앞글자만 따와서 만들어 낸 용어라고 한다.

아래는 위키 백과에서 따온 설명 글이다.

모델-뷰-컨트롤러(Model–View–Controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.

Model - 어떠한 동작을 수행하는 코드. 표시형식에 의존하지 않으므로 사용자에게 어떻게 보일지에 대해 신경 쓰지 않아도 된다. 모델은 순수하게 public 함수로만 이루어진다. 몇몇 함수들은 사용자의 질의(query)에 대해 상태 정보를 제공하고 나머지 함수들은 상태를 수정한다.

View - 모델은 여러개의 뷰를 가질 수 있으며, 뷰는 모델에게 질의를 하여 모델로 부터 값을 가져와 사용자에게 보여준다.

Controller - 뷰는 여러개의 컨트롤러를 가지고 있으며, 사용자는 컨트롤러를 사용하여 모델의 상태를 바꾼다. 컨트롤러는 모델의 mutator 함수를 호출하여 상태를 바꾼다. 이때 모델의 상태가 바뀌면 모델은 등록된 뷰에 자신의 상태가 바뀌었다는 것을 알리고 뷰는 거기에 맞게 사용자에게 모델의 상태를 보여 준다.

MVC패턴은 모델1, 모델2로 나뉜다고 한다.

모델 1은 구성은 다음과 같다.

view와 controller 를 jsp로 한번에 처리하는 방식을 말하며 개발이 빠르고 손쉽게 진행하지만, 분업이 어렵고 수정이 용이하지 않아 작은 프로젝트에 적합하다고 한다.

모델2의 구성은 다음과 같다.

view와 controller를 따로따로 처리하여 JSP의 'html 해석 용이' 라는 장점으로 view에 사용하고, controller의 자바 코드의 가독성을 위하여 Servlet을 사용한다.

모델 2는 처음에 구성이 어렵지만, 분업이 용이하고 수정이 손 쉬워 대형 프로젝트에 어울린다고 한다.

'Java > JSP' 카테고리의 다른 글

maven 이란?  (0) 2019.09.12
JSP, Servlet, 자바빈 등 용어 정리  (0) 2019.09.12
JSP 에서 Post로 Servlet 에 parameter 넘기기  (0) 2019.09.12
intellij 에서 Servlet 생성하기  (0) 2019.09.12
intellij 에서 Tomcat 적용하기  (0) 2019.09.12

안드로이드 에서 타이틀 바를 없애는 방법은 간단하다.

먼저 app/res/values/style.xml 로 가 준다.

<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!--title bar 없애기--> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> </resources>

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

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

이 두가지를 넣어주면 깔끔하게 없어 진다.

상태바는 엑티비티에서 바꿔주면 된다.

메인 엑티비티 자바코드에서 아래와 같이

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

이 코드를 super.onCreate()와 setContentView() 사이에 넣어준다.


매우 간단하게 아래와 같이 지정 하여 주면 된다. 이벤트 함수에서 자주 사용하게 될 것 같다.

getWindow().getDecorView().setBackgroundColor(Color.DKGRAY/*원하는 색*/);

안드로이드는 직접적으로 외부 DB를 연결할 수가 없다고 했을 때가 지금 어플을 만들면서 가장 당황하였던 부분이 아닌가 싶다.

<!-- (2019.8.5 추가) JDBC로 연결이 가능하다. -->

안드로이드는 내부에 sqlite를 이용할 때는 바로 연결할 수 있는 듯 하지만, 외부의 DB를 연결할 때는 php로 DB를 Json으로 파싱하여 웹으로 뿌려 준 후 안드로이드에서 그 Json을 받아 오는 방법으로 정보를 가져와야 한다.

구글링을 통하여 얻은 결과 가장 보편적인 방법 같은 HttpURLConnection 을 이용해볼 것이다.

//SELECT SQL문을 받아 줄 php <?php error_reporting(E_ALL); ini_set('display_errors',1); require('/*DB 커넥션 php 경로*/'); $android = strpos($_SERVER['HTTP_USER_AGENT'], "Android"); if($android) { $query=$_POST['query']; // 안드로이드에서 넘어올 query 문 $stmt = $PDO->query($query); $stmt->execute(); if ($stmt->rowCount() > 0) { $data = array(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { array_push($data, $row); } header('Content-Type: application/json; charset=utf8'); $json = json_encode(array("/*Json의 이름 되지만 지정하지 않을 수 있다.*/" => $data), JSON_PRETTY_PRINT + JSON_UNESCAPED_UNICODE); echo $json; } } ?>

이렇게 php를 작성하여 Json으로 파싱하여준다.(자바에서 쿼리문을 받아오기 때문에 여러 테이블을 참조할 수 있게 제작)

이번에는 안드로이드에서 DB의 내용을 표현할 recyclerview를 만들것이다. activity의 xml이다.

mainactivity.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" android:layout_margin="15dp" android:padding="10dp"> <android.support.v7.widget.RecyclerView android:id="@+id/fieldRecycle" android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="5dp" android:layout_weight="6" android:padding="5dp" /> </LinearLayout>

item_list.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:layout_margin="5dp" android:padding="5dp"> //받아올 필드가 2개라면 2개 선언! <TextView android:id="@+id/textView_field" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dp" android:padding="5dp" /> </LinearLayout>

그리고 아래는 main activity.java이다.

import를 시켜야할 라이브러리들이다.

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.widget.Button; import android.app.ProgressDialog; import android.os.AsyncTask; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import android.util.Log;

아래는 메인 엑티비티이다.

public class MainActivity extends AppCompatActivity { public static String IP_ADDRESS = "/*Json으로 파싱해줄 php가 있는 web 경로*/"; private static String TAG = "Json"; private RecyclerView subjectRecycle; private ArrayList<PersonalData> mArrayList; private UsersAdapter mAdapter; private String mJsonString; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 리사이클러리스트를 통하여 여러 줄로 db 표현 fieldRecycle = (RecyclerView) findViewById(R.id.fieldRecycle); fieldRecycle.setLayoutManager(new LinearLayoutManager(this)); mArrayList = new ArrayList<>(); mAdapter = new UsersAdapter(this, mArrayList); fieldRecycle.setAdapter(mAdapter); mArrayList.clear(); mAdapter.notifyDataSetChanged(); GetData task = new GetData(); task.execute( IP_ADDRESS, ""); } private class GetData extends AsyncTask<String, Void, String> { ProgressDialog progressDialog; String errorString = null; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = ProgressDialog.show(MainActivity.this, "Please Wait", null, true, true); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); progressDialog.dismiss(); Log.d(TAG, "response - " + result); if (result == null){ } else { mJsonString = result; showResult(); } } @Override protected String doInBackground(String... params) { String serverURL = params[0]; String postParameters = "/* 쿼리문 작성 */"; try { URL url = new URL(serverURL); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setReadTimeout(5000); httpURLConnection.setConnectTimeout(5000); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setDoInput(true); httpURLConnection.connect(); OutputStream outputStream = httpURLConnection.getOutputStream(); outputStream.write(postParameters.getBytes("UTF-8")); outputStream.flush(); outputStream.close(); int responseStatusCode = httpURLConnection.getResponseCode(); Log.d(TAG, "response code - " + responseStatusCode); InputStream inputStream; if(responseStatusCode == HttpURLConnection.HTTP_OK) { inputStream = httpURLConnection.getInputStream(); } else{ inputStream = httpURLConnection.getErrorStream(); } InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder sb = new StringBuilder(); String line; while((line = bufferedReader.readLine()) != null){ sb.append(line); } bufferedReader.close(); return sb.toString().trim(); } catch (Exception e) { Log.d(TAG, "GetData : Error ", e); errorString = e.toString(); return null; } } } private void showResult(){ String TAG_JSON="/*Json의 이름 ""로 생략 가능*/"; String TAG_field = "/*필드를 받아 올 변수*/"; try { JSONObject jsonObject = new JSONObject(mJsonString); JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON); for(int i=0;i<jsonArray.length();i++){ JSONObject item = jsonArray.getJSONObject(i); String field = item.getString(TAG_field); PersonalData personalData = new PersonalData(); personalData.setMember_subject(subject) mArrayList.add(personalData); mAdapter.notifyDataSetChanged(); } } catch (JSONException e) { Log.d(TAG, "showResult : ", e); } }

userAdaptor class 이다.

package com.example.ondroid; import android.app.Activity; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.CustomViewHolder> { private ArrayList<PersonalData> mList = null; private Activity context = null; public UsersAdapter(Activity context, ArrayList<PersonalData> list) { this.context = context; this.mList = list; } class CustomViewHolder extends RecyclerView.ViewHolder { protected TextView subject; public CustomViewHolder(View view) { super(view); this.field = (TextView) view.findViewById(R.id.textView_field); } } @Override public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list, null); CustomViewHolder viewHolder = new CustomViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(@NonNull CustomViewHolder viewholder, int position) { viewholder.field.setText(mList.get(position).getMember_field()); } @Override public int getItemCount() { return (null != mList ? mList.size() : 0); } }

personalData class 이다.

package com.example.ondroid; public class PersonalData { private String member_field; public String getMember_field() { return member_field; } public void setMember_field(String member_field) { this.member_fieldt = member_field; } }

처음 어플을 마주하고 보니 당황스럽고 어려운 부분이 한 두가지가 아니다.

그 중 하나가 스레드를 작동시키면 다 괜찮다가 UI를 변경하는 부분이 들어가면 에러가 나면서 멈춘다는 것이다.

runOnUiThread(new Runnable() { @Override public void run() { } });

위와 같이 구현한 스레드는 runOnUiThread라는 스레드 안에 저 코드를 구현하여 UI를 변경한다면 UI가 변경되는 것을 볼 수 있을 것이다.

new Thread(new Runnable() { @Override public void run() { // 스레드 안에 삽입을 하여준다. while(true){ try { Thread.sleep(10); // 주기를 만들기 위해 만든 메소드 } catch (InterruptedException e) { e.printStackTrace(); } runOnUiThread(new Runnable() { @Override public void run() { // 이곳에 계속해서 진행할 코드를 작성 한다. } }); } } }).start();


안드로이드의 핸들러의 기존 구현 방식을 따르면 Memory 누수가 발생한다고 한다.

final Handler handle = new Handler(){ public void handleMessange(Message msg){ } };

안드로이드 스튜디오에서도 문제가 있다고 노란색 형광칠을 잔뜩 해 둔다.

이 문제의 해결법은 이렇게 핸들러를 사용하는 것이다.

final Handler handle = new Handler(new Handler(){ public boolean handleMessange(Message msg){ ... return false; } });


'Java > 안드로이드' 카테고리의 다른 글

안드로이드- php-Json -DB 통신  (0) 2019.09.12
안드로이드 runOnUiThread  (0) 2019.09.12
안드로이드 activity Life Cycle  (0) 2019.09.12
안드로이드 Timer 구현  (0) 2019.09.12
안드로이드 스튜디오 시작  (0) 2019.09.12


'Java > 안드로이드' 카테고리의 다른 글

안드로이드 runOnUiThread  (0) 2019.09.12
안드로이드 Handler 의 Memory Leak  (0) 2019.09.12
안드로이드 Timer 구현  (0) 2019.09.12
안드로이드 스튜디오 시작  (0) 2019.09.12
안드로이드 앱 개발 준비  (0) 2019.09.12

+ Recent posts