24 Nisan 2019 Çarşamba

DispatcherServlet Nedir?


Spring uygulamalarinin merkezi Dispatcher Servlettir. Tum istekler buradan yonetilir. Servlet yapisindadir.
Gelen Http istekleri alir onlari ilgili kontroller a yonlendirir. Gerekli islemler yapildiktan sonra kontroller bize bir view dondurur ve ilgili view i response olarak dondurur.

Oncelikle bize bir web.xml gerekli. Burada bize gelen url uzantilarinin DispatcherServlet te handle edilmesi icin url-pattern tagi icinde handle edilmesi gerekir. Ornegin tum isteklerin handle edilmesi icin

<url-pattern>/</url-pattern>

yazmamiz yeterlidir.
html icin ise <url-pattern>*.html</url-pattern> seklinde yazilmalidir.

context:component-scan tagi icinde ise kodlarin scan edilecegi package i vermemiz gerekir.

<context:component-scan base-package="com.pluralsight" />

Diger bir kontrol ise

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/jsp/"></property>
                <property name="suffix" value=".jsp"></property>
</bean>

Burada da view dosyalarinin hangi folder altinda olacagi prefix icinde, uzantilari ise suffix icinde belirtilir.Buna viewResolver denir.

Kontroller kismi ise su sekilde calisir.

@Controller
public class AddGoalController {
       
        @RequestMapping(value="/addGoal", method=RequestMethod.GET)
        public String addGoal(Model model){
                    return "addGoal";
}

Yani url olarak http://localhost:8093/FitnessTracker/addGoal.html seklinde bir istek atildiginda bu metod tarafindan yakalanir ve return olarak view in adi verilmis. dosya uzantilarinin jsp olacagini
DispatcherServlet yapisinda belirtmistik. Yani kontroller addGoal.jsp adindaki view i bize response olarak dondurecektir.


Yani DispatcherServlet gelen istegi alir ve handlermapping ile ilgili controlleri bulur. orada gerekli islemler yapildiktan sonra view isaretcisi doner. Daha sonra view resolver ile ilgili view
bulunup response olarak dondurulur.

14 Nisan 2019 Pazar

Palindrome - Java Kodu

10 Nisan 2019 Çarşamba

Spring configuration

Spring projelerinde konfigurasyon dosyalari ornegi asagidaki resimlerde yer almaktadir.

web.xml


servlet_config.xml

Context initialization failed Hatasi

Pluralsight ta yer alan Spring eğitimini yapmaya calisirken ilk örnekte Server loglarinda asagidaki hatayi aldim.
 
SEVERE: Context initialization failed
java.lang.IllegalArgumentException
SEVERE: StandardWrapper.Throwable
java.lang.IllegalArgumentException
SEVERE: Allocate exception for servlet fitTrackerServlet
java.lang.IllegalArgumentException
 
 
Tomcat v8.0 kullaniyordm
 
Yardim aldgim link asagidaki gibidir. 
 
https://stackoverflow.com/questions/32416540/http-status-500-servlet-init-for-servlet-fittrackerservlet-threw-exception
 
jdk
 
Tomcat v7.0 kurmak yerine Pom.xml deki versionlari asagidaki gibi değiştirdim.
 
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.3.RELEASE</version>
    </dependency>        
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>3.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>3.2.3.RELEASE</version>
    </dependency>

ANDROID JSOUP

Merhaba,
Bu yazimdan Jsoup kullanimi ile ilgili ornek yapacagim.
Oncelikle Jsoup nedir kisaca ondan bahsedelim. Jsoup html parse eden yani ayristiran bir java kutuphanesidir. Jsoup ile html sayfalarindan css elemanlarini kullanarak veri cekebilir ve bu verileri uygulamamiz icinde kullanabiliriz.

Dezavantaji ise web sitesinin html elemanlarinda degisiklik yapildiginda istedigimiz veriyi cekemeyebiliriz.

Oncelikle ilk adim olarak build.gradle a jsoup u ekleyelim.

compile 'org.jsoup:jsoup:1.11.3'



Simdi de Manifest e gidip internet izni verelim cunku uygulamamiz internetten veri cekecek.

Simdi layoutumuza bir buton koyalim ve o butona tiklandiginda http://sengamze.blogspot.com/2019/04/android-resim-ekleme.html
bu linkte yer alan yazimin basligini ekrana yazdirsin.

package gykizmir.com.jsoupexample;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;


public class MainActivity extends AppCompatActivity {

    Button learnTitleBtn;
    TextView titleOfBlog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        titleOfBlog = (TextView) findViewById(R.id.learnTitle);

        learnTitleBtn = (Button) findViewById(R.id.learnTitle);

        learnTitleBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Title().execute();
            }
        });


    }

    private class Title extends AsyncTask<Void, Void, Void>{

        String url = "http://sengamze.blogspot.com/2019/04/android-resim-ekleme.html";
        String title;
        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setTitle("Jsoup Example");
            progressDialog.setMessage("Title is retrieving");
            progressDialog.setIndeterminate(false);
            progressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                Document document = Jsoup.connect(url).get();
                title = document.title();
            } catch (IOException ex){
                ex.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void avoid){
            titleOfBlog.setText(title);
            progressDialog.dismiss();
        }
    }

}




layoutumuz ise asagidaki gibi olmali.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="gykizmir.com.jsoupexample.MainActivity">

    <Button
        android:id="@+id/learnTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Learn Title"/>


    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="Title" />


</LinearLayout>




Calistirdigimizda ise ekran goruntusu asagidaki gibidir.

          

4 Nisan 2019 Perşembe

Android - Move layouts up when keyboard is shown

Android uygulamalarimizda ekranimizdaki ogeler ekrani kapliyorsa o ekranda klavey acildiginda itemlerin bazilari klavyenin altinda kalir. Bu durumda ilgili edittex secildiginde o layout yukari tasinir ve ilgili item in gorunmesi saglanir.

Bunu yapmamizi saglayan kod parcasi ve nasil yapilcagi asagidadir.

Activity nin onCreate() methoduna alttaki kod yapistirilir.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

3 Nisan 2019 Çarşamba

Android Resim Ekleme

Merhaba,
Bir android projesi olusturdugumuzda android icinde var olan resimleri nasil ekleriz onu anlatacagim.
File -> New -> Vector Asset diyoruz ve ekrana gelen icon listesinden birini seciyoruz.


Daha sonra layoutlarda @drawable altindan ekledigimiz dosya adini veriyoruz.


<item    android:id="@+id/navigation_diet"    
android:icon="@drawable/ic_room_service_black_242dp" 
 android:title="@string/title_diet" />