컴포넌트 : JSP, Servlet, HTML 등의 웹어플리케이션을 구현하기 위한 구성요소

JSP(Java Server Page) : HTML 파일 내에서 JAVA언어를 삽입한 문서

Servlet(Server Applet) : JAVA언어로 이루어진 웹프로그래밍 문서

웹서버 : 클라이언트의 요청에 의해 정보를 제공해 주는 서버( Aphach, IIS). 별도의 구현이 필요한 로직이 있을 경우 웹어플리케이션 서버에 요청

웹브라우저 : 웹서버에 정보를 요청하고, 웹서버로부터 정보를 받는 매개체. 이때 HTTP 프로토콜을 사용함.

자바빈즈 : 동적 컨텐츠 개발을 위해 자바 코드를 사용하여 자바 클래스로 로직을 작성하는 방법. 즉, JSP 페이지에서 화면을 표현하기 위한 계산식이나 자료의 처리를 담당하는 자바 코드를 따로 분리하여 작성하는 것. (JSP 표준 액션 태그로 접근할 수 있는 자바 클래스)

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

JSP 에러페이지, HTTP 에러코드 정리  (0) 2019.09.12
maven 이란?  (0) 2019.09.12
JSP 에서 Post로 Servlet 에 parameter 넘기기  (0) 2019.09.12
intellij 에서 Servlet 생성하기  (0) 2019.09.12
intellij 에서 Tomcat 적용하기  (0) 2019.09.12

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();

+ Recent posts