JSP 页面无法从带有或不带有 .getSession 的 Servlet 获取属性

问题描述 投票:0回答:1

我有一个网络应用程序,必须获取城市名称,并且通过 API 请求,它应该提供该城市的广播。但在 jsp 文件中,我无法从 servlet 中的 setAttribute 获取带有 getAttribute 的变量。不知道为什么。

Servlet

package package1;

//Librerie da Importare
import jakarta.servlet.ServletException;
import java.util.Date;
import java.text.SimpleDateFormat;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.PrintWriter;


// Definisce la servlet con nome "MyServlet" e specifica il l'indirizzo dell'URL a cui andare
@WebServlet(name = "MyServlet", urlPatterns = {"/MyServlet"})
public class MyServlet extends HttpServlet
{
    //Variabile identificatore della versione attuale per la serializzazione
    private static final long serialVersionUID = 1L;
       
    //Costruttore che chiama il costruttore della superclasse
    public MyServlet()
    {
        super();
    }
    
    //Metodo che processa ogni richiesta fatta, dicendo che la risposta deve essere di tipo HTML
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
    }
    
    //Metodo per le richieste HTTP Get
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    //Metodo per le richieste HTTP Post
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        //Chiave Personale dell’API OpenWeatherMap
        String chiaveAPI = "47da379d1f4d98cfb31a7fa10a00c010";
        
        //Stringa per la variabile della città da cercare
        String città = request.getParameter("città");
        
        //URL creato, da inviare per la API request
        String apiUrl = "https://api.openweathermap.org/data/2.5/weather?q=" +città+ "&appid="+ chiaveAPI;
        
        try
        {
            //Integrazione con l’API
            //Oggetto di tipo URL con l'URL dell'API.
            URL url = new URL(apiUrl);
            
            //Apre una connessione HTTP all'URL
            HttpURLConnection connessione = (HttpURLConnection)url.openConnection();
            
            //Setta il metodo della richiesta HTTP a Get
            connessione.setRequestMethod("GET");

            
            //Legge i dati dalla rete;
            //Prende il flusso di input dalla connessione aperta
            InputStream inpStream = connessione.getInputStream();
            
            //InputStreamReader per leggere dal flusso di input
            InputStreamReader reader = new InputStreamReader(inpStream);

            
            //Salva i dati presi nella stringa definita, con uno StringBuilder
            StringBuilder risposta = new StringBuilder();

            //Crea un’oggetto scanner per prendere in input dal reader
            Scanner scanner = new Scanner(reader);
            while(scanner.hasNext())
            {
                risposta.append(scanner.nextLine());
            }
            scanner.close();


            //La risposta prodotta dalla API produce un file in formato JSON
            //Deserializzazione del file JSON in un oggetto
            //Crea un oggetto gson
            Gson gson = new Gson();
            
            //Converte la stringa JSON in un oggetto JsonObject
            JsonObject oggettoJSON = gson.fromJson(risposta.toString(), JsonObject.class);
            
            //Stampa l'oggetto
            System.out.println(oggettoJSON);

            
            //Parte per estrarre i dati dal JSON e salvarli
            //Temperatura
            double temperaturaKelvin = oggettoJSON.getAsJsonObject("main").get("temp").getAsDouble();
            int temperatura = (int)(temperaturaKelvin - 273.15);
             
            
            //Umidità
            int umidità = oggettoJSON.getAsJsonObject("main").get("humidity").getAsInt();
        
            
            //Velocità del Vento
            double velocitàVento = oggettoJSON.getAsJsonObject("wind").get("speed").getAsDouble();
                 
            
            //Visibiltà
            int visibilitàMetri = oggettoJSON.get("visibility").getAsInt();
            int visibilità = visibilitàMetri / 1000;
               
            
            //Condizioni Meteo Generali
            String condizioni = oggettoJSON.getAsJsonArray("weather").get(0).getAsJsonObject().get("main").getAsString();
                
            
            //Copertura Nuvole
            int nuvole = oggettoJSON.getAsJsonObject("clouds").get("all").getAsInt();
                 
            
            //Tempo e Data Attuali al momento della richiesta
            //Estrae il formato dell'ora della data dalla risposta JSON.
            long x = oggettoJSON.get("dt").getAsLong() * 1000;
            
            //Crea un SimpleDateFormat per formattare la data
            SimpleDateFormat y = new SimpleDateFormat("MMM dd yyyy");
            
            //Converte il timestamp in una stringa di data formattata
            String data = y.format(new Date(x));

            
            //Formato dell’ora
            //Crea un SimpleDateFormat per formattare l'ora
            SimpleDateFormat z = new SimpleDateFormat("HH:mm");
            
            //Ottiene l'ora formattata
            String ora = z.format(new Date());


            //Setta i dati presi dal JSON per mandarli alla pagina JSP
            request.setAttribute("date", data);
            request.setAttribute("city", città);
            request.setAttribute("visibility",visibilità);
            request.setAttribute("temperature", temperatura);
            request.setAttribute("weatherCondition", condizioni); 
            request.setAttribute("humidity", umidità);    
            request.setAttribute("windSpeed", velocitàVento);
            request.setAttribute("cloudCover", nuvole);
            request.setAttribute("currentTime", ora);
            request.setAttribute("weatherData", risposta.toString());
            
            request.setAttribute("pisello", 1);
            
            
            //Chiusura della connessione HTTP
            connessione.disconnect();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        request.setAttribute("pisello", "funzionaOK");
        
        //Manda la richiesta al file JSP per elaborare i dati da mostrare
        request.getRequestDispatcher("index.jsp").forward(request, response);
    
    }
}

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>


<html>
    <head>
        <meta charset="UTF-8">
        <title>Web App Meteo - Dettagli</title>
        <link rel="stylesheet" href="jsp-style.css" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
    </head>
    <body>

        <div class="container">
            <h1>Dettagli Meteo</h1>

                <div class="weather-image-container">
                    <img id="weather-icon" src="immagine/img1.png" alt="Weather Image">
                        <div class="temp-city">
                            <h2>
                                <i class="fas fa-city"></i> ${city}
                            </h2>
                            <h2>
                                <i class="fas fa-thermometer-half"></i> ${temperature}&deg;C
                            </h2>
                        </div>
                </div>

                <div class="weather-info">
                    <p>
                        <i class="fas fa-calendar-alt"></i> Data: ${date}
                    </p>
                    
                    
                    <p>
                        <i class="fas fa-calendar-alt"></i> Prova: ${pisello}
                        <%=request.getSession().getAttribute("pisello")%>
                    </p>
                    
                    <p>
                        <i class="fas fa-clock"></i> Ora Attuale: ${currentTime}
                    </p>
                    <p>
                        <i class="fas fa-cloud-sun"></i> Condizioni: ${weatherCondition}
                    </p>
                    <p>
                        <i class="fas fa-eye"></i> Visibilità: ${visibility}km
                    </p>
                    <p>
                        <i class="fas fa-wind"></i> Velocita del Vento: ${windSpeed}km/hr
                    </p>
                    <p>
                        <i class="fas fa-cloud"></i> Copertura delle Nuvole: ${cloudCover}%
                    </p>
                </div>

                <div class="container">
                    <h2>Esegui una nuova ricerca rapida da qui</h2>
                    <form id="formMeteo" action="MyServlet" method="post">
                        <input type="text" id="city" name="city" placeholder="Es. Roma, New York, Londra">
                        <button type="submit">Cerca</button>
                        <p id="messaggioErrore" style="color: red; padding: 6px 6px; display: none;">Inserisci il nome di una città</p>
                    </form>
                </div>
        </div>
        <script src="script.js"></script>
    </body>

    <footer>
        <div class="footer-container">
            <p>Realizzato dal Gruppo di Lavoro: D.Salvatore, D.Tirro, M.Picciuto, D. Tamilia - 5BI</p>
        </div>
    </footer>
</html>

HTML

<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Web App Meteo - Home</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
        <link rel="stylesheet" href="style.css" />
    </head>
    
    <body>
        <div class="container">
            <h1>Web App Meteo</h1>
            
            <form id="formMeteo" action="MyServlet" method="post">
                <div class="input-wrapper">
                    <input type="text" id="city" name="city" placeholder="Inserisci il nome della città">
                    <button type="submit">
                        <i class="fas fa-search"></i> Cerca
                    </button>
                    <p id="messaggioErrore" style="color: red; padding: 6px 6px; display: none;">Please enter the name of the place.</p>
                </div>
            </form>
        </div>
        
        <script src="script.js"></script>
        
    </body>

    <footer>
        <div class="footer-container">
            <p>Realizzato dal Gruppo di Lavoro: D.Salvatore, D.Tirro, M.Picciuto, D. Tamilia - 5BI</p>
        </div>
    </footer>

</html>

JS

document.getElementById('formMeteo').addEventListener('submit', function(event)
{
    event.preventDefault(); //Per prevenire l'invio del form nello stato di default/predefinito
    
    var cittàInput = document.getElementById('city');
    var messaggioErrore = document.getElementById('messaggioErrore');
    
    if (cittàInput.value.trim() === '')
    {
        messaggioErrore.style.display = 'block'; //Mostra messaggio di errore
    }
    else
    {
        messaggioErrore.style.display = 'none'; //Nascondi il messaggio
        this.submit(); //invia il form
    }
});

JSP 应该从 Servlet 获取值并在 HTML 页面中显示变量的值,没有问题,但我的变量为 NULL。

java html jsp servlets
1个回答
0
投票

使用

getSession().getAttribute()
,您只能获得 会话范围 属性。但是您将属性添加到请求范围

request.setAttribute("city", città);

如果您想从会话范围中获取属性,那么您应该使用

request.getSession().setAttribute("city", città);

如果使用调度程序转发请求,则请求属性在 JSP 中可用。如果您重定向到另一个 URL,那么您应该使用会话范围属性。

此外,您没有提交属性的值或从错误的键获取它。正如@g00se 提到的:

String città = request.getParameter("città");

始终为

null
,因为您提交了参数名称
city

© www.soinside.com 2019 - 2024. All rights reserved.