Bom dia a todos,
Estou fazendo um curso de Jsp + Servlets e estou encontrando dificuldades em um dos exercícios que foi apresentado, gostaria de tentar sanar uma dúvida na correção do mesmo com os colegas. O meu objetivo é conseguir ler o conteúdo de um arquivo .txt, exibi-lo em uma página jsp de forma que eu consiga fazer um crud com ela.
Segue abaixo a minha classe Properties.
`
package model;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.TreeMap;
/**
* CLASSE QUE REPRESENTA A MINHA REGRA DE NEGÓCIO - faz o carregamento do conteúdo do arquivo e depois salva as alterações nele
* @author ALLINONE
*
*/
public class Properties {
// private static final String FILE_NAME = "c:/Bruno/properties.txt";
private static final String FILE_NAME = "e:/properties.txt";
// essa coleção properties serve para mapear chaves a valores
private static java.util.Properties props;
/**
* METODO RESPONSAVEL POR INSTANCIAR O OBJETO properties E CARREGAR AS INFORMAÇÕES DELE
* NO OBJETO properties.
*/
static {
props = new java.util.Properties();
try {
props.load(new FileInputStream(FILE_NAME));
}
catch(IOException e) {
e.printStackTrace();
}
}
private Properties() {
}
/**
* TEM POR OBJETIVO RETORNAR O CONTEÚDO DO ARQUIVO PROPERTIES.TXT
* @return string como chave e string como valor
*/
public static Map<String, String> getProperties() {
Map<String, String> map = new TreeMap<String, String>();
Enumeration<Object> e = props.keys();
while(e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = props.getProperty(key);
map.put(key, value);
}
return map;
}
/**
* REMOVE OS DADOS DESEJADOS NO PROPERTIES E RECRIA ELE NOVAMENTE CONTENDO OS DADOS
* @param key
* @throws IOException
*/
public static void delete(String key) throws IOException {
props.remove(key);
props.store(new FileOutputStream(FILE_NAME), "");
}
/**
* SALVA OS DADOS DESEJADOS NO PROPERTIES E RECRIA ELE NOVAMENTE CONTENDO OS NOVOS DADOS
* @param key
* @param value
* @throws IOException
*/
public static void save(String key, String value) throws IOException {
props.setProperty(key, value);
props.store(new FileOutputStream(FILE_NAME), "");
}
/**
* RETORNA UMA STRING COM BASE NA CHAVE QUE EU PASSO
* @param key
* @return
*/
public static String getValue(String key) {
return props.getProperty(key);
}
}
`
Servlet para listar as informações do arquivo e depois envia-lo para a página jsp.
`
package servlet;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.Properties;
@WebServlet("/List")
public class ListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
*
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// pegando o conteúdo das propriedades
Map<String, String> props = Properties.getProperties();
// o servlet coloca esse atributo "properties" na request, para que o jsp possa ler ele mais tarde
// a request é um atributo que cria uma comunicação entre o servlet e o jsp, fazendo com que através de uma var
// o conteúdo possa ser compartilhado. Nesse caso, o conteúdo do Map props poderá ser usado pelo jsp.
request.setAttribute("props", props);
//fazendo um direcionamento através do forward para a página list.jsp
request.getRequestDispatcher("list.jsp").forward(request, response);
}
}
`
Página Jsp a qual deverá exibir as informações para o usuário
`
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Propriedades</title>
</head>
<body>
<%
@SuppressWarnings("unchecked")
// estou lendo aqui os atributos enviados pelo servlet.
Map<String, String> props = (Map<String, String>) request.getAttribute("props");
%>
<CENTER><H1>Propriedades</H1></CENTER>
<a href="Edit">Criar nova propriedade</a>
<br><br>
<table border="1" width="100%">
<tr>
<td align="center"><strong>Propriedade</strong></td>
<td align="center"><strong>Valor</strong></td>
<td colspan="2"></td>
</tr>
<% for(Map.Entry<String, String> entry : props.entrySet()) { %>
<tr>
<td align="center"><%=entry.getKey()%></td>
<td align="center"><%=entry.getValue()%></td>
<td align="center"><a href="Edit?key=<%=entry.getKey()%>">Editar</a></td>
<td align="center"><a href="Delete?key=<%=entry.getKey()%>">Excluir</a></td>
</tr>
<% } %>
</table>
</body>
</html>
`
Quando eu executo a aplicação o seguinte erro tem sido exibido:
`
dez 10, 2016 12:01:00 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
ADVERTÊNCIA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Aula06_Integrando_Servlet_e_JSP' did not find a matching property.
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Server version: Apache Tomcat/8.0.32
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Server built: Feb 2 2016 19:34:53 UTC
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Server number: 8.0.32.0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: OS Name: Windows 7
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: OS Version: 6.1
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Architecture: amd64
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Java Home: C:\Program Files\Java\jre1.8.0_92
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: JVM Version: 1.8.0_92-b14
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: JVM Vendor: Oracle Corporation
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: CATALINA_BASE: C:\Users\ALLINONE\Google Drive\CURSOS\SOFTBLUE\ Java Web com Servlets e JSPs\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: CATALINA_HOME: C:\Program Files\Apache Software Foundation\Tomcat 8.0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dcatalina.base=C:\Users\ALLINONE\Google Drive\CURSOS\SOFTBLUE\ Java Web com Servlets e JSPs\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 8.0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dwtp.deploy=C:\Users\ALLINONE\Google Drive\CURSOS\SOFTBLUE\ Java Web com Servlets e JSPs\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat 8.0\endorsed
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dfile.encoding=UTF-8
dez 10, 2016 12:01:00 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFORMAÇÕES: Loaded APR based Apache Tomcat Native library 1.1.34 using APR version 1.5.1.
dez 10, 2016 12:01:00 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFORMAÇÕES: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
dez 10, 2016 12:01:01 PM org.apache.catalina.core.AprLifecycleListener initializeSSL
INFORMAÇÕES: OpenSSL successfully initialized (OpenSSL 1.0.1q 3 Dec 2015)
dez 10, 2016 12:01:01 PM org.apache.coyote.AbstractProtocol init
INFORMAÇÕES: Initializing ProtocolHandler ["http-apr-8080"]
dez 10, 2016 12:01:01 PM org.apache.coyote.AbstractProtocol init
INFORMAÇÕES: Initializing ProtocolHandler ["ajp-apr-8009"]
dez 10, 2016 12:01:01 PM org.apache.catalina.startup.Catalina load
INFORMAÇÕES: Initialization processed in 1816 ms
dez 10, 2016 12:01:01 PM org.apache.catalina.users.MemoryUserDatabase createRole
ADVERTÊNCIA: Null or zero length role name specified. The role will be ignored.
dez 10, 2016 12:01:01 PM org.apache.tomcat.util.digester.FactoryCreateRule begin
INFORMAÇÕES: [FactoryCreateRule] Create exception ignored: Null or zero length role name specified. The role will be ignored.
dez 10, 2016 12:01:01 PM org.apache.catalina.core.StandardService startInternal
INFORMAÇÕES: Starting service Catalina
dez 10, 2016 12:01:01 PM org.apache.catalina.core.StandardEngine startInternal
INFORMAÇÕES: Starting Servlet Engine: Apache Tomcat/8.0.32
dez 10, 2016 12:01:02 PM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFORMAÇÕES: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [176] milliseconds.
dez 10, 2016 12:01:02 PM org.apache.coyote.AbstractProtocol start
INFORMAÇÕES: Starting ProtocolHandler ["http-apr-8080"]
dez 10, 2016 12:01:02 PM org.apache.coyote.AbstractProtocol start
INFORMAÇÕES: Starting ProtocolHandler ["ajp-apr-8009"]
dez 10, 2016 12:01:02 PM org.apache.catalina.startup.Catalina start
INFORMAÇÕES: Server startup in 772 ms
dez 10, 2016 12:01:27 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [jsp] in context with path [/Aula06_Integrando_Servlet_e_JSP] threw exception [An exception occurred processing JSP page /list.jsp at line 28
25: <td colspan="2"></td>
26: </tr>
27:
28: <% for(Map.Entry<String, String> entry : props.entrySet()) { %>
29: <tr>
30: <td align="center"><%=entry.getKey()%></td>
31: <td align="center"><%=entry.getValue()%></td>
Stacktrace:] with root cause
java.lang.NullPointerException
at org.apache.jsp.list_jsp._jspService(list_jsp.java:138)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
`
E esse é o conteúdo contido dentro do meu arquivo (Properties.txt )para exibição na página jsp.
p1=v1
p2=v2
p3=v3
Desde já agradeço por qualquer ajuda.