24 Nisan 2017 Pazartesi

Hiding Fields

Giriş
Açıklaması şöyle. Bu shadow veya shadowing ile aynı şey.
Within a class, a field that has the same name as a field in the superclass hides the superclass's field, even if their types are different
Elimizde şöyle bir kod olsun
class A {
  int i = 10;
}

class B extends A {
  int i = 20;
}

A a = new B();
System.out.println(a.i);
Java'da alanlar kalıtılmaz. Dolayısıyla A tipi kendi alanına B tipi ise kendi alanına erişir.  Çıktı olarak A 10 alırız.

22 Nisan 2017 Cumartesi

web.xml

Giriş
Bu dosyanın bulunduğu dizin şöyle
/usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
web-app tag
Bu dosyada servlet spec'inden hangisini kullanacağımızı belirtiyoruz. Örneğin spec 2.4 kullanılabilir.
 3.0 içinse şöyle yaparız.


<web-app 
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    httpp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">
servlet tanımlamak için şöyle yaparız.
<?xml version="1.0" encoding="UTF-8"?>
<web-app
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">

  <display-name>TomcatRestExample</display-name>

  <servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>...</servlet-class>
    <init-param>
      <param-name>...</param-name>
      <param-value>...</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/maven/*</url-pattern>
  </servlet-mapping>

</web-app>

context-param tag
Bu parametre servlet ayağa kalkarken okunuyor ve ServletContext arayüzüne yerleşiyor. How to get context-param value in java? sayfasında konuyla ilgili örnek var. Spring gibi bazı çatı yapıları belli isimdeki parametrelerin kullanılmasını gerektiriyor. Örneğin contextConfigLocation

<!-- Configure spring -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml
        /WEB-INF/applicationContext-security.xml
        /WEB-INF/applicationContext-integration.xml
    </param-value>
</context-param>

Bir başka örnekte ise xml dosyasına tam path te verilmeden başlatılıyor.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:beans.xml</param-value>
</context-param>

display-name
Yönetim ekranında gösterilen servlet ismi. Şöyle yaparız. Servlete http isteği ile erişmek için bu isim değil war dosyasının ismi kullanılı.r
<display-name>TomcatRestExample</display-name>

filter tag
Uygulamaya sadece belli IP'lerin erişmesini istersek şöyle yaparız.
<filter>
  <filter-name>Remote Address Filter</filter-name>
  <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
  <init-param>
    <param-name>allow</param-name>
    <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Remote Address Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
listener tag
ServletContextListener sınıfları bu tag ile tanıtılıyor.

session-config
30 dakika tanımlamak için şöyle yaparız.
<session-config>
  <session-timeout>30</session-timeout>     
  <tracking-mode>COOKIE</tracking-mode>
</session-config>
servlet tag
Servlet sınıflarını tanımlıyor. Şöyle  yaparız:
<servlet>
   <servlet-name>Faces Servlet</servlet-name>
   <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
servlet-mapping tag
Yukarıda tanımlanan servlet sınıfını ile servletin hizmet edeceği url adreslerini eşleştiriyor. Eşleştirme için servlete verilen ismin kullanıldığına dikkat etmek lazım. Örnek:
<servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
Servlet mapping kuralları şöyle. Bu kurallardan sadece '/' verileni ilginç.

  • A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping.
  • A string beginning with a ‘*.’ prefix is used as an extension mapping.
  • The empty string ("") is a special URL pattern that exactly maps to the application's context root, i.e., requests of the form  http://host:port/<contextroot>/. In this case the path info is ’/’ and the servlet path and context path is empty string (““).
  • A string containing only the ’/’ character indicates the "default" servlet of the application. In this case the servlet path is the request URI minus the context path and the path info is null.
  • All other strings are used for exact matches only
welcome-file-list tag
Uygulama ilk açılırken gösterilecek sayfayı tanımlıyor. Şöyle yaparız:
<welcome-file-list>
  <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

21 Nisan 2017 Cuma

Tomcat setenv.sh

Giriş
Bu dosya içinde ortam değişkenleri tanımlanır.

JAVA_OPTS
Örnek
Sadee IPv4 adresleri kullansın istersek şöyle yaparız.
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true
  -Djava.net.preferIPv4Addresses"

JRE_HOME
Eğer sistem için değil de Tomcat'e mahsus bir JRE tanımlamak istersek CATALINA_BASE\bin altına setenv.bat veya setenv.sh dosyası oluşturur ve içine şöyle yazarız.
set "JRE_HOME=C:\Program Files\Java\jdk1.7.0_03\jre"
exit /b 0

ZipInputStream Sınıfı

constructor - FileInputStream
Şöyle yaparız.
File f = new File("C:\\test.zip")

InputStream inStream = new FileInputStream (f);
ZipInputStream zipInputStream = new ZipInputStream (inStream);
Şöyle yaparız.
InputStream inStream = new FileInputStream(path);
ZipInputStream zipInputStream = 
  = new ZipInputStream(new BufferedInputStream(inStream));
constructor - URL
Şöyle yaparız.
URL jar = ...;
ZipInputStream zip = new ZipInputStream(jar.openStream());
close metodu
Şöyle yaparız.
zipInputStream.close();
closeEntry metodu
Şöyle yaparız.
ZipEntry ze = null;
while ((ze = zipInputStream.getNextEntry()) != null) {
  ...

  zipInputStream.closeEntry();
} 
getNextEntry metodu
ZipEntry nesnelerini dolaşmamızı sağlar. Şöyle yaparız.
ZipEntry entry;
while ((entry = zipInputStream.getNextEntry()) != null) {
  ...
}


Tomcat server.xml

Giriş
TOMCAT_HOME\conf\server.xml dosyadır. Açıklaması şöyle
Tomcat can work in 2 modes:

BIO (one thread per connection), or NIO (many more connections than threads).

Tomcat7 is BIO by default, although consensus seems to be "don't use Bio because Nio is better in every way". You set this using the "protocol" parameter in the server.xml file - BIO will be "HTTP1.1" or "org.apache.coyote.http11.Http11Protocol" and NIO will be "org.apache.coyote.http11.Http11NioProtocol"
Cluster
Şöyle yaparız.
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
             channelSendOptions="8">

  ...
</Cluster>
Connector
BIO için
org.apache.coyote.http11.Http11Protocol
NIO için
org.apache.coyote.http11.Http11NioProtocol
kullanılır.

Connector - AJP
Cluster şeklinde kullanmak için şöyle yaparız.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Örnek
Şöyle yaparız.
<Connector port="8012" protocol="AJP/1.3" redirectPort="8446"
  connectionTimeout="10000" keepAliveTimeout="10000" />
httpd'ye şöyle yaparız.
vi /etc/httpd/conf.d/mydomain.com.conf

<VirtualHost www.mydomain.com:80>
    ServerName www.mydomain.com
    ServerAlias mydomain.com
    ErrorLog /var/log/httpd/mydomain_com_error.log
    CustomLog /var/log/httpd/mydomain_com_requests.log combined
    ProxyPass / ajp://my.public.ip.addr:8012/
    ProxyPassReverse / ajp://my.public.ip.addr:8012/
</VirtualHost>

Connector - Http
server.xml dosyasında Connector ayarı değiştiriliyor. Örnek'te port 80 yerine 8080 yapılabilir.
<Connector port="8080" maxHttpHeaderSize="8192"
  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  enableLookups="false" redirectPort="8443" acceptCount="100"
  connectionTimeout="20000" disableUploadTimeout="true"
  URIEncoding="UTF-8"
/>
Connector - Https
Tomcat ile https kullanmak için server.xml dosyasında bir connector tanımı olmalı. Şöyle yaparız.
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
  clientAuth="false" sslProtocol="TLS" />
Connector - keystore
Şöyle yaparız.
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
  clientAuth="true" sslProtocol="TLS"
  keystoreFile="/etc/pki/mykeystore.jks"
  keystoreType="JKS" keystorePass="password"
  truststoreFile="/etc/pki/server_truststore.jks"
  truststoreType="JKS"   truststorePass="password"/>
Connector - maxConnections
Açıklaması şöyle. NIO için varsayılan değer 10,000
The maximum number of connections that the server will accept and process at any given time. When this number has been reached, the server will accept, but not process, one further connection. This additional connection be blocked until the number of connections being processed falls below maxConnections at which point the server will start accepting and processing new connections again. Note that once the limit has been reached, the operating system may still accept connections based on the acceptCount setting. The default value varies by connector type. For BIO the default is the value of maxThreads unless an Executor is used in which case the default will be the value of maxThreads from the executor. For NIO the default is 10000. For APR/native, the default is 8192.
Note that for APR/native on Windows, the configured value will be reduced to the highest multiple of 1024 that is less than or equal to maxConnections. This is done for performance reasons. If set to a value of -1, the maxConnections feature is disabled and connections are not counted.
Connector - maxHttpHeaderSize
Şöyle yaparız
<Connector port="8443" 
  maxHttpHeaderSize="8192" 
  maxThreads="150" 
  minSpareThreads="25" 
  maxSpareThreads="75" 
  enableLookups="false" 
  disableUploadTimeout="true" 
  acceptCount="100" 
  scheme="https" 
  secure="true" 
  SSLEnabled="true" 
  clientAuth="true" 
  sslProtocol="SSL/TLS" 
  keystoreFile="C:/EBCM_Client_TEST.pfx"
  keystorePass="allianzebcm"
  keystoreType="PKCS12"/>
Connector - maxThreads
Açıklaması şöyle
If you're using NIO then actually "maxConnections=1000" and "maxThreads=10" might even be reasonable. The defaults are maxConnections=10,000 and maxThreads=200. With NIO, each thread can serve any number of connections, switching back and forth but retaining the connection so you don't need to do all the usual handshaking which is especially time-consuming with HTTPS but even an issue with HTTP. You can adjust the "keepAlive" parameter to keep connections around for longer and this should speed everything up.
NIO modda kaç thread kullanmak istediğimizi belirtmek için şöyle yaparız.
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
       maxThreads="250" SSLEnabled="true" scheme="https" secure="true"
       clientAuth="false" sslProtocol="TLS" connectiontimeout="20000"/>
Connector - redirect
Niçin redirect kullanırız sorusunun cevabı şöyle. Http'den Https'e yönlendirmek için kullanılabilir.
For usability reasons you need to offer a redirect to HTTPS from all HTTP URL:s. Otherwise first time visitors who simply enter example.com/some/page into the URL bar of the browser will be greeted by a connection error.
Şöyle yaparız.
<Connector port="80" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" />
Connector - URIEncoding
Http Get isteğinde HttpServletRequest sınıfı Http standardında belirtildiği gibi gönderilen parametreleri Latin 1 olarak string'e çevirir. Eğer UTF-8 olarak çevirsin istersek bunu URIEncoding ile belirtiriz. Şöyle yaparız.
URIEncoding="UTF-8"
Listener
Şöyle yaparız.
<Listener className="org.apache.catalina.core.AprLifecycleListener"
 SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
Realm
Şöyle yaparız.
<Realm className="org.apache.catalina.realm.JNDIRealm"
  connectionURL="ldap://mycomapny.org:636" 
  userSubtree="true"
  userBase="DC=test,DC=win,DC=user,DC=org" 
  userSearch="(&amp;(sAMAccountName={0})(objectcategory=user))"
  userRoleName="memberOf" 
  roleBase="DC=test,DC=win,DC=user,DC=org" 
  roleName="cn"
  roleSearch="(member={0})" 
  roleSubtree="true" 
  roleNested="true"/>