JSTL 不打印我从 servlet 传递的属性。范围或不访问 doGet() 是问题吗?

JSTL not printing my passed attribute from servlet. Is scope or not accessing doGet() the issue?

我正在制作一个简单的博客应用程序。用户输入一个公告,它被传递给 servlet,在那里它通过 DAO 在 POST 方法中被插入到一个数据库中。 GET 方法通过同一个 DAO 检索所有数据并将其传递到视图页面来创建一个 arrayList。不确定我是否没有使用正确的示波器? servlet 正在将公告插入数据库,我肯定知道这一点。

package testSource;

import java.io.IOException;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/testAnnounceServlet")
 public class testAnnounceServlet extends HttpServlet
{

    @Override
    protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException 
    {
        AnnouncementDAO dao = new AnnouncementDAO();
        ArrayList<Announcement> announcementList = new ArrayList<>(dao.getAllAnnouncements());

        request.setAttribute("jspList", announcementList);

        RequestDispatcher rd = getServletContext().getRequestDispatcher("/testPost.jsp");
                    rd.forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException 
    {
        String sentAnnouncement = request.getParameter("announceText"); 

        Announcement announcementForDatabase = new Announcement();
        AnnouncementDAO writeDAO = new AnnouncementDAO();

        if(sentAnnouncement != null)
        {
            announcementForDatabase.setDate();
            announcementForDatabase.setAnnouncement(sentAnnouncement);  

            try {
                    writeDAO.writeAnnouncement(announcementForDatabase);
                    response.sendRedirect("/test/testPost.jsp");
                } 
            catch (Exception ex) 
                {
                    Logger.getLogger(testAnnounceServlet.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
        else
        {
            response.sendRedirect("/Error.jsp");
        }  
    }    
}

这是我的 DAO

package testSource;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AnnouncementDAO 
{
    String driver = "com.mysql.jdbc.Driver";
    final String DB_URL = "jdbc:mysql://localhost:3306/POSTS";
    final String USER = "root";
    final String PASS = "Sorosh1310";
    Connection conn = null;
    Statement stmt = null;

    public void getConnection()
    {
        try 
        {
            Class.forName(driver);
        }catch (ClassNotFoundException ex) 
        {
            Logger.getLogger(AnnouncementDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try 
        {
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        }catch (SQLException ex) 
        {
            Logger.getLogger(AnnouncementDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try 
        {
            if(stmt== null)
            {
                stmt = conn.createStatement();
            }
        } catch (SQLException ex) 
        {
            Logger.getLogger(AnnouncementDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

    public void closeConnection()
    {
        try
        {
            if(stmt!=null)
            conn.close();
        }catch(SQLException se)
        {
        }

        try
        {
            if(conn!=null)
            conn.close();
        }
        catch(SQLException se)
        {
        }
    }

    public void writeAnnouncement(Announcement passedAnnouncement)
    throws Exception 
    {
        Announcement dbAnnouncement = passedAnnouncement;

        java.sql.Date sqlDate = dbAnnouncement.getDate();
        String dbText = dbAnnouncement.getAnnouncement();

        String SQL = "INSERT INTO POSTS.ANNOUNCEMENTS (AnnouncementDate, AnnouncementText)"+
        "VALUES (?, ?)";

        getConnection();

        if(stmt != null)
        {
            try
            {
                PreparedStatement preparedStmt = conn.prepareStatement(SQL);
                preparedStmt.setDate(1, sqlDate);
                preparedStmt.setString(2, dbText);
                preparedStmt.execute();

            }catch (SQLException ex) 
            {
                Logger.getLogger(AnnouncementDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


    }

    public ArrayList<Announcement> getAllAnnouncements()
    {
        String retrieveSql = "SELECT * FROM POSTS.ANNOUNCEMENTS ORDER BY AnnouncementID";
        ArrayList<Announcement> announcementList = new ArrayList<>();

        getConnection();

        if(stmt != null)
        {
            try
            {
                ResultSet rs = stmt.executeQuery(retrieveSql);

                while (rs.next())
                {
                    Announcement listItem = new Announcement();
                    listItem.setDate(rs.getDate("AnnouncementDate"));
                    listItem.setAnnouncement(rs.getString("AnnouncementText"));
                    announcementList.add(listItem);
                }
            }catch (SQLException ex) 
            {
                Logger.getLogger(AnnouncementDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        closeConnection();

        return announcementList;
    }

 /*    public static void main(String[] args)
    {

        Announcement mainAnnounce = new Announcement();
        mainAnnounce.setAnnouncement("This is a test from main");
        mainAnnounce.setDate();

        AnnouncementDAO mainDAO = new AnnouncementDAO();

        try 
        {
            mainDAO.writeAnnouncement(mainAnnounce);
        } catch (Exception ex) 
        {
            Logger.getLogger(AnnouncementDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try
        {
            ArrayList<Announcement> mainList = mainDAO.getAllAnnouncements();
            for(Announcement item : mainList)
            {
                out.print("\n"+item.toString());

            }
        }
        catch(Exception e)
                {
                    System.err.println(e);
                }




     }   
 */   

}

这是我的浏览页面

<%@page import="testSource.Announcement"%>
<!DOCTYPE HTML>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
  <head>
    <title></title>

  </head>

  <body>
    <div> 
        <form action="${pageContext.request.contextPath}/testAnnounceServlet">
            <c:forEach items="${jspList}" var="announcement">
                <p class ="cssStylesParagraph">
                  <c:out value="${announcement.currentTime}"/>
                  <c:out value="${announcement.dbAnnouncement}"/>
                </p>
            </c:forEach>    
        </form>      
    </div>
    <footer>

  </footer><!-- end .footer -->

</body>
</html>

这是我的豆子

package testSource;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Announcement 
{
    String dbAnnouncement = "";
    java.sql.Date currentTime = null;

    public String getAnnouncement()
    {
        return dbAnnouncement;
    }

    public java.sql.Date getDate()
    {
        return currentTime;
    }

    public void setDate(java.sql.Date dateToSet)
    {
        this.currentTime = dateToSet;
    }

    public void setDate()
    {
        String dateString = new Date().toString();

        try {
            Date utilDate = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy").parse(dateString);
            java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
            this.currentTime = sqlDate;
        } catch (ParseException ex) {
            Logger.getLogger(Announcement.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void setAnnouncement(String announcemenToSet)
    {
        this.dbAnnouncement = announcemenToSet;
    }


    @Override
    public String toString()
    {
        return currentTime.toString()+":" +"\n"+ dbAnnouncement;
    }

}

您需要在控制器上执行 GET 请求,而不是在视图上。 IE。您在浏览器地址栏中看到的 URL 必须是 servlet URL,而不是 JSP URL。这样将调用 servlet 的 doGet()

  1. 首先将testPost.jsp文件移动到/WEB-INF文件夹中,这样您(或最终用户)就不会再犯这个错误了。

  2. 然后在 servlet 代码中更改 forward() 调用如下:

     request.getRequestDispatcher("/WEB-INF/testPost.jsp").forward(request, response);
    

    sendRedirect() 调用如下:

     response.sendRedirect(request.getContextPath() + "/testAnnounceServlet");
    
  3. 最后确保您 open/link 通过以下 URL 页面:

     http://localhost:8080/test/testAnnounceServlet
    

另请参阅: