337 lines
11 KiB
TeX
337 lines
11 KiB
TeX
\part{Allgemeines \& Config}
|
||
\section{Logging}
|
||
\subsubsection{Vorteile Logging mittels Framework (z.B.: log4j)}
|
||
\begin{itemize}
|
||
\item Nutzt ein einheitliches Format / Konventionen
|
||
\item logging kann optional an und ausgeschalten werden
|
||
\item durch verschiedene Log-level können Logs gefiltert erstellt werden
|
||
\item Layout für Ausgabe kann zentral definiert/geändert werden
|
||
\end{itemize}
|
||
\section{Annotationen}
|
||
\begin{itemize}
|
||
\item @MappedSuperclass
|
||
\begin{itemize}
|
||
\item ist im Hybernate Framework
|
||
\item eine Klasse durch die gemeinsame Felder definiert werden.
|
||
\item definiert eine abstrakte Superklasse
|
||
\end{itemize}
|
||
\item @Produces
|
||
\begin{itemize}
|
||
\item kommt während deployment, markiert Factory Method damit man nicht direkt auf die Klasse zugreifen muss
|
||
\end{itemize}
|
||
\item @Typed
|
||
\begin{itemize}
|
||
\item zeigt die Vererbung Wieso bei uns allein stehend?
|
||
\end{itemize}
|
||
\item @Named
|
||
\begin{itemize}
|
||
\item Zeigt bei Mehrdeutigkeit das richtige Objekt mit dem Namen
|
||
\end{itemize}
|
||
\item @Resource
|
||
\begin{itemize}
|
||
\item fast wie Dependency Injection
|
||
\end{itemize}
|
||
\item @Stateless
|
||
\begin{itemize}
|
||
\item speichert den Client Status nicht
|
||
\end{itemize}
|
||
\item @Entity
|
||
\begin{itemize}
|
||
\item Data Access Layer
|
||
\end{itemize}
|
||
\item @Table
|
||
\begin{itemize}
|
||
\item Tabellenname im SQL
|
||
\end{itemize}
|
||
\item @Column
|
||
\begin{itemize}
|
||
\item SQL-Spalten nullable=false
|
||
\end{itemize}
|
||
\item @OneToMany
|
||
\item @JoinColums
|
||
\begin{itemize}
|
||
\item welche Spalten zusammen gehören FK
|
||
\end{itemize}
|
||
\item @OneToMany
|
||
\begin{itemize}
|
||
\item auf anderen Seite
|
||
\end{itemize}
|
||
\item @ApplicationScoped
|
||
\begin{itemize}
|
||
\item lebt die ganze Applikation lang, wird einmal gemacht.
|
||
\end{itemize}
|
||
\item @PersistenceContext
|
||
\begin{itemize}
|
||
\item persistance.xml auslesen für Treiber und andere JPA Geschichten + Data Source. Entity Manager
|
||
\end{itemize}
|
||
\item @Id
|
||
\begin{itemize}
|
||
\item das ist die id
|
||
\end{itemize}
|
||
\item @GeneratedValue
|
||
\begin{itemize}
|
||
\item Wert kommt aus der DB
|
||
\end{itemize}
|
||
\item @Local
|
||
\begin{itemize}
|
||
\item Klasse für lokale Aufrufe.
|
||
\end{itemize}
|
||
\item @Remote
|
||
\begin{itemize}
|
||
\item interprozessaufrufe. RMI
|
||
\end{itemize}
|
||
\item @ApplicationException
|
||
\begin{itemize}
|
||
\item Rollback wenn so eine Exception kommt, Nachricht zum Client.
|
||
\end{itemize}
|
||
\end{itemize}
|
||
|
||
\section{Konfigurationsdateien}
|
||
\subsection{standalone-psoe.xml}
|
||
|
||
Wird ein JBoss Applikationsserver im \emph{standalone}-Modus betrieben, läuft jede Instanz in einem eigenen Prozess.
|
||
Diese Datei ist eine Java Enterprise Edition 6 zertifizierte Web-Profil Konfiguration welche alle benötigten Technologien (z.B. Extensions von JBoss, Datasources etc.) definiert.
|
||
|
||
JBoss EAP benutzt standardmäßig die standalone.xml Konfigurationsdatei, kann aber auch unter Verwendung einer anderen gestartet werden.
|
||
|
||
Abschnitte der standalone.xml
|
||
\begin{itemize}
|
||
\item extensions (z.B. diverse Wildfly Module)
|
||
\item management (z.B. Access Control -> role-mapping)
|
||
\item profile (z.B. JPA Subsystem)
|
||
\item interfaces (z.B. \${jboss.bind.address:127.0.0.1})
|
||
\item socket-binding-group (z.B \${jboss.http.port:8080})
|
||
\end{itemize}
|
||
|
||
\begin{code}
|
||
\captionof{listing}{standalone.xml (auszugsweise)}
|
||
|
||
|
||
\begin{minted}[linenos,breaklines=true]{xml}
|
||
|
||
........
|
||
|
||
</endpoint-config>
|
||
<client-config name="Standard-Client-Config"/>
|
||
</subsystem>
|
||
<subsystem xmlns="urn:jboss:domain:weld:3.0"/>
|
||
</profile>
|
||
<interfaces>
|
||
<interface name="management">
|
||
<inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
|
||
</interface>
|
||
<interface name="public">
|
||
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
|
||
</interface>
|
||
</interfaces>
|
||
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
|
||
<socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
|
||
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
|
||
<socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
|
||
<socket-binding name="http" port="${jboss.http.port:8080}"/>
|
||
<socket-binding name="https" port="${jboss.https.port:8443}"/>
|
||
<socket-binding name="txn-recovery-environment" port="4712"/>
|
||
<socket-binding name="txn-status-manager" port="4713"/>
|
||
<outbound-socket-binding name="mail-smtp">
|
||
<remote-destination host="localhost" port="25"/>
|
||
</outbound-socket-binding>
|
||
</socket-binding-group>
|
||
</server>
|
||
|
||
\end{minted}
|
||
\end{code}
|
||
|
||
\subsection{persistence.xml}
|
||
|
||
Die Datei \emph{persistence.xml} ist der zentrale Bestandteil der Persistierungs-Konfiguration.
|
||
|
||
Folgende Dinge können konfiguriert werden:
|
||
|
||
\begin{itemize}
|
||
\item SQL dialect
|
||
\item the persistence provider that shall be used at runtime
|
||
\item the data source you want to use to connect to your database
|
||
\item several provider-specific configuration parameters
|
||
\end{itemize}
|
||
|
||
|
||
\begin{code}
|
||
\captionof{listing}{persistence.xml}
|
||
|
||
|
||
\begin{minted}[linenos,breaklines=true]{xml}
|
||
|
||
<?xml version="1.0" encoding="UTF-8"?>
|
||
<persistence version="2.0"
|
||
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
|
||
|
||
<persistence-unit name="primary">
|
||
<jta-data-source>java:jboss/datasources/psoeDS</jta-data-source>
|
||
<properties>
|
||
<!-- Properties for Hibernate -->
|
||
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
|
||
<property name="hibernate.enable_lazy_load_no_trans" value="true" />
|
||
<!--
|
||
SQL stdout logging
|
||
-->
|
||
<property name="hibernate.show_sql" value="true"/>
|
||
<property name="hibernate.format_sql" value="false"/>
|
||
<property name="use_sql_comments" value="true"/>
|
||
|
||
<!--
|
||
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||
-->
|
||
</properties>
|
||
</persistence-unit>
|
||
|
||
</persistence>
|
||
|
||
\end{minted}
|
||
\end{code}
|
||
|
||
|
||
\begin{figure}[!htp]
|
||
\centering
|
||
\includegraphics[width=0.7\textwidth]{pics/ConfigFiles.png}
|
||
\end{figure}
|
||
\subsection{web.xml}
|
||
\begin{itemize}
|
||
|
||
%TODO des is zu ungenau!
|
||
\item konfiguriert den Java Webserver (Wildfly - JBOSS)
|
||
\item befindet sich im Ordner \textbf{src/main/webapp/WEB-INF/web.xml}
|
||
\end{itemize}
|
||
\begin{minted}[linenos,breaklines=true]{xml}
|
||
<?xml version="1.0" encoding="UTF-8"?>
|
||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 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>Faces Servlet</servlet-name>
|
||
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
|
||
<load-on-startup>1</load-on-startup>
|
||
</servlet>
|
||
<servlet-mapping>
|
||
<servlet-name>Faces Servlet</servlet-name>
|
||
<url-pattern>*.xhtml</url-pattern>
|
||
</servlet-mapping>
|
||
|
||
<!-- Security roles -->
|
||
<security-role>
|
||
<description>administrators</description>
|
||
<role-name>ADMIN</role-name>
|
||
</security-role>
|
||
<security-role>
|
||
<description>portal administrators</description>
|
||
<role-name>PORTALADMIN</role-name>
|
||
</security-role>
|
||
<security-role>
|
||
<description>standard user</description>
|
||
<role-name>USER</role-name>
|
||
</security-role>
|
||
|
||
<!-- Security constraints -->
|
||
<security-constraint>
|
||
<web-resource-collection>
|
||
<web-resource-name>admin area</web-resource-name>
|
||
<url-pattern>/admin/*</url-pattern>
|
||
</web-resource-collection>
|
||
<auth-constraint>
|
||
<role-name>ADMIN</role-name>
|
||
</auth-constraint>
|
||
</security-constraint>
|
||
|
||
<security-constraint>
|
||
<web-resource-collection>
|
||
<web-resource-name>community area</web-resource-name>
|
||
<url-pattern>/community/*</url-pattern>
|
||
</web-resource-collection>
|
||
<auth-constraint>
|
||
<role-name>USER</role-name>
|
||
<role-name>PORTALADMIN</role-name>
|
||
<role-name>ADMIN</role-name>
|
||
</auth-constraint>
|
||
</security-constraint>
|
||
|
||
<security-constraint>
|
||
<web-resource-collection>
|
||
<web-resource-name>user administration area</web-resource-name>
|
||
<url-pattern>/userAdministration/*</url-pattern>
|
||
</web-resource-collection>
|
||
<auth-constraint>
|
||
<role-name>USER</role-name>
|
||
<role-name>PORTALADMIN</role-name>
|
||
<role-name>ADMIN</role-name>
|
||
</auth-constraint>
|
||
</security-constraint>
|
||
|
||
|
||
<security-constraint>
|
||
<web-resource-collection>
|
||
<web-resource-name>user functionalities</web-resource-name>
|
||
<url-pattern>/user.xhtml</url-pattern>
|
||
<url-pattern>/userlist.xhtml</url-pattern>
|
||
<url-pattern>/notImplemented.xhtml</url-pattern>
|
||
</web-resource-collection>
|
||
<auth-constraint>
|
||
<role-name>USER</role-name>
|
||
<role-name>PORTALADMIN</role-name>
|
||
<role-name>ADMIN</role-name>
|
||
</auth-constraint>
|
||
</security-constraint>
|
||
|
||
<security-constraint>
|
||
<web-resource-collection>
|
||
<web-resource-name>other functionalities</web-resource-name>
|
||
<url-pattern>/notImplemented.xhtml</url-pattern>
|
||
</web-resource-collection>
|
||
<auth-constraint>
|
||
<role-name>USER</role-name>
|
||
<role-name>PORTALADMIN</role-name>
|
||
<role-name>ADMIN</role-name>
|
||
</auth-constraint>
|
||
</security-constraint>
|
||
|
||
<login-config>
|
||
<auth-method>FORM</auth-method>
|
||
<realm-name>pse</realm-name>
|
||
<form-login-config>
|
||
<form-login-page>/login.xhtml</form-login-page>
|
||
<form-error-page>/login.xhtml</form-error-page>
|
||
<!-- <form-error-page>/loginerror.xhtml</form-error-page> -->
|
||
</form-login-config>
|
||
</login-config>
|
||
</web-app>
|
||
\end{minted}
|
||
\subsection{pom.xml}
|
||
\begin{itemize}
|
||
\item Resource plugin – klar für Ressourcen
|
||
\item Wildfly – server
|
||
\begin{multicols}{2}
|
||
\begin{enumerate}
|
||
\item Compile
|
||
\item Surefire (unitTests)
|
||
\item Packaging - war file erstellen
|
||
\item Wildfly - fressen und deployen
|
||
\item Failsafe IT-test
|
||
\item MVN site
|
||
\item Gui test
|
||
\end{enumerate}
|
||
\end{multicols}
|
||
\item Primeafce = jsf Framework
|
||
\item Jacoco = test Coverage
|
||
\item Slf4j = logger
|
||
\item Jaxb – xml
|
||
\item Cdi = context dependancy injection
|
||
\end{itemize}
|
||
\section{Frageart Prüfung}
|
||
Welche Fehler können bei Exception-Handling vorkommen in unserem Projekt?? – wie funktioniert es grundsätzlich in unserem Code
|
||
|
||
DocumentDAO – DocumentService – DocumentController – so sollte Exception-Handling implementiert warden
|
||
|
||
DAO wirft Exception – im ServiceLayer wird dies gefangen und der Stack-Trace wird im weggeloggt und eine benutzerfreundliche Fehlermeldung wird ausgegeben (Destructive Wrapping).
|
||
|
||
Alle Patterns, die vorkommen – praktische Beispiele aus dem Code
|
||
|
||
Was sind JavaBeans? Wie funktioniert das Konzept? Wie wird es genau implementiert?
|
||
NamedBean, TypedBean etc. |