Questa estate mi sono affacciato a Java Spring, e devo dire che adesso capisco perchè è un framework così usato!

Creando un progetto con Netbeans, i vari Controller vengono salvati di default nel dispatcher-servlet (o altro file di configurazione).

Nel caso di molti controller, lo trovo scomodo, e quindi, come ho fatto con le Servlet, sono passato all'uso delle Annotation.

E' possibile che dobbiate creare delle Servlet che richiedano dei parametri iniziali.

Impostare questi parametri è abbastanza facile, sia se li registriamo nel web.xml che non.

Nel primo caso la sintassi per la Servlet sarà una cosa del genere:

<web-app>
 <servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>mypackage.MyServlet</servlet-class>
  <init-param>
   <param-name>nome</param-name>
   <param-value>MattePuffo</param-value>
  </init-param>
.......
</servlet>
........
</web-app>

In pratica abbiamo aggiunto il tag init-param.

Le Servlet sono dei componenti fondamentali in una applicazione web scritta in Java.

L'unica cosa che bisogna ricordarsi è di registrarle; per farlo abbiamo due modi.

Il primo, quello classico, è usare il file web.xml; in genere gli IDE richiedono se registrare una Servlet nel web.xml o meno (o almeno Netbeans lo fa).

Coumunque è sempre possibile farlo a mano con questa sintassi:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>SimpleServlet</servlet-name>
        <servlet-class>com_mf.SimpleServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SimpleServlet</servlet-name>
        <url-pattern>/SimpleServlet</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

Nelle ultimissime versioni, però, non è più obbligatorio usare questo file; è possibile registrarle direttamente da codice usando una semplice riga.

Gestire le sessioni con le Servlet è abbastanza semplice.

Prendiamo uno scenario del genere:

-form di login

-se l'utente esiste viene creato un oggetto User

-l'oggetto viene passato alla Servlet che crea una sessione

Quindi partendo da un form del genere:

<table>
<form action="ServletLogin" method="post">
<tbody>
<tr>
<td>User:</td>
<td><input type="text" id="focus" name="username" value="" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" value="" /></td>
</tr>
<tr>
<td><input type="submit" value="Submit" name="submit" /></td>
</tr>
</form>
</table>

Questo form richiama la ServletLogin in POST:

public class ServletLogin extends HttpServlet {

private DBManager db = DBManager.getInstance(); // CLASSE PER LA CONNESSIONE

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean success = false;
HttpSession session = request.getSession(true);
if (session.getAttribute("user") == null) {
try {
User user = db.login(request.getParameter("username").trim(), request.getParameter("password").trim());
String userCreato = user.getName().toString();
int userCreatoId = user.getId();
session.setAttribute("user_id", userCreatoId);
session.setAttribute("user_name", userCreato);
success = true;
if (success) {
response.sendRedirect("index.jsp");
} else {
response.sendRedirect("error.jsp?err=Atenticazione fallita");
}
} catch (ClassNotFoundException ex) {
response.sendRedirect("error.jsp?err=" + ex.getMessage());
} catch (SQLException ex) {
response.sendRedirect("error.jsp?err=" + ex.getMessage());
} catch (NoSuchAlgorithmException ex) {
response.sendRedirect("error.jsp?err=" + ex.getMessage());
}
}
}

}

Istanzia un oggetto HttpSession con il quale prendiamo la sessione corrente.

Dopo un week-end di pausa riprendiamo con un argomento molto in voga: la conversione da valori esadecimali a String.

Nel mio caso mi è servito per il login in una wb application in JSP e Servlet.

Nel db sia utente e password sono cripati in SHA1.

Partiamo da questo metodo:

public User login(String name, String pwd) throws ClassNotFoundException, SQLException, NoSuchAlgorithmException, UnsupportedEncodingException {
  User user = new User();
  conn = DBManager.getInstance().takeConnection();
  MessageDigest md = MessageDigest.getInstance("SHA1");
  byte[] encodeName = md.digest(name.getBytes("UTF-8"));
  byte[] encodePwd = md.digest(pwd.getBytes("UTF-8"));
  String convName = ConvertHexToString.convert(encodeName);
  String convPwd = ConvertHexToString.convert(encodePwd);
  PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM user WHERE user_name = ? AND user_pass = ?");
  pstmt.setString(1, convName);
  pstmt.setString(2, convPwd);
  ResultSet rs = pstmt.executeQuery();
  if (rs.next()) {
   user.setId(rs.getInt("user_id"));
   user.setName(name);
   user.setPwd(pwd);
   rs.close();
   pstmt.close();
  } else {
   user.setId(0);
   user.setName("");
   user.setPwd("");
   rs.close();
   pstmt.close();
  }
  return user;
}

Al metodo passo due String.