1ª Avaliação

1. Em arquivos JSP, podemos criar uma URL relativa ao contexto com a tag <c:url>.

Por exemplo,

<c:url value="/listagem.jsp"/>

gera a url /BlogApp/listagem.jsp sendo /BlogApp o caminho do contexto.

Usando essa tag, crie três páginas JSP, page1.jsp, page2.jsp e page3.jsp onde no topo das páginas tenha um menu simples com links para todas as páginas, inclusive ela mesma.

Dica: você pode utilizar a tag <jsp:include> para reutilizar um arquivo com o menu.

A solução mais direta possível seria criar um arquivo menu.jsp para ser incluído nos arquivos page1.jsp, page2.jsp e page3.jsp.

Essa solução pode ser vista aqui.

2. Para obtermos uma URL relativa ao contexto da aplicação, basta usar como prefixo a string resultante da chamada request.getContextPath(), que é um método que obtém o caminho da aplicação configurado no container.

Por exemplo, o servlet abaixo tem o objetivo único de redirecionar o cliente para /perfil.jsp:

public class ExemploServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String url = getUrl(request, "/perfil.jsp");
        response.sendRedirect(url);
    }

    private static String getUrl(HttpServletRequest request, String relativePath) {
        return request.getContextPath() + relativePath;
    }
}

Veja que a URL resultante estará no mesmo servidor, isto é, se esse servlet estiver acessível em http://127.0.0.1/WebApp/exemplo sendo /WebApp o caminho do contexto, então:

url = "http://127.0.0.1/WebApp/perfil.jsp"

Sendo assim, como tarefa da questão, crie um servlet mapeado para /livro que identifique o idioma solicitado e redirecione

Lembre-se que todos esses são caminhos relativos ao contexto da aplicação.

Na Revisão 1.1, tem uma questão muito parecida com essa.

A solução que eu fiz para esta questão é baseada nela e pode ser vista aqui.

Note que só era necessário como resposta um servlet!

3. Para esta questão, considere o formulário de múltiplas opções a seguir:

<form method="post">
    Linguagens preferidas: <br>
    <input type="checkbox" name="linguagem" value="java">    Java    <br>
    <input type="checkbox" name="linguagem" value="python">  Python  <br>
    <input type="checkbox" name="linguagem" value="ruby">    Ruby    <br>
    <input type="checkbox" name="linguagem" value="php">     PHP     <br>
    <input type="checkbox" name="linguagem" value="c">       C       <br>
    <input type="checkbox" name="linguagem" value="haskell"> Haskell <br>
    <input type="checkbox" name="linguagem" value="julia">   Julia   <br> 
    <br>
    <input type="submit">
</form>

Utilizando esse formulário, crie um servlet para gravar em um ou mais cookies as opções marcadas anteriormente pelo usuário, de forma que quando o usuário acessar o formulário novamente, essas opções apareçam já marcadas.

Note que o formulário envia por método POST, assim a gravação dos cookies devem ser implementados no método doPost() enquanto o formulário deve ser exibido para o usuário no método doGet().

Para que uma opção apareça pré-marcada, adicione o atributo checked à tag <input>:

<input type="checkbox" name="linguagem" value="java" checked>

Semelhante à questão anterior, a solução foi baseada em outra questão da Revisão 1.1, porém lá havia uma lista de marcação única enquanto aqui é de marcação múltipla.

Dessa forma, existem basicamente duas estratégias de solução:

  1. Utilizar um cookie para cada item da lista.

    Nesse caso, cada um dos cookies teria o valor "marcado" quando o usuário enviasse com a opção checada e no JSP bastaria fazer algo como

    ${cookie['java'].value == 'marcado' ? 'checked' : ''}
    

    A desvantagem dessa estratégia é que precisamos identificar as linguagens que não foram marcadas e remover esses cookies do usuário.

    Veja aqui a solução usando a estratégia 1.

  2. Utilizar um único cookie para identificar os itens marcados.

    A ideia é receber o array de strings com as linguagens e criar um string único para armazenar no cookie. Por exemplo, se o usuário marcou as linguagens Java, Python e PHP, então criaremos a string "java:python:ruby", nesse exemplo usando : como separador.

    Para que o JSP consiga identificar se a opção deva ser marcada, convertemos a string obtida nos cookies para um objeto do tipo List que permite consulta com o método contains()

    Essa estratégia é um pouco mais difícil de estruturar, mas fica mais fácil de manter. Na estratégia anterior, se adicionarmos uma nova linguagem à lista? Teríamos que modificar tanto o arquivo Java como o JSP.

    Nessa estratégia, só é preciso mudar apenas o JSP.

    Veja no link a solução com a estratégia 2.

Citação

Às vezes você acorda. Às vezes a queda lhe mata.
E às vezes, quando você cai, você voa.

Neil Gaiman