我正在学习如何将jdbc与jsp一起使用,我遇到了一个问题,我一直试图弄清楚无用,并希望有人可以提供一些见解。我的问题是starlist对象由于某种原因最终变空,而genrelist很好。我能够根据用户输入看到所选类型的电影类型,但每部电影的相关明星都没有显示。我怀疑这可能是因为我的功能是从列表中搜索星星。我会尝试调试并找到错误但是我建立tomcat和eclipse的方法以及我对这种类型的编程缺乏知识使得它非常困难。任何帮助表示赞赏谢谢。 output of jsp
`
public class GenreServlet extends HttpServlet
{
String query;
List<Genre> genreList;
List<Movie> genreSelect;
List<Star> starSelect;
@Override
public void init(ServletConfig config) throws ServletException
{
query = null;
genreList = null;
genreSelect = null;
ServletContext context = config.getServletContext();
context.getRequestDispatcher("/jsp/genrelist.jsp");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
query = req.getParameter("query");
if(query == null)
{
try
{
genreList = new GenreDAO().genreList();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
req.getSession().setAttribute("genres", genreList);
req.getRequestDispatcher("/jsp/genrelist.jsp").forward(req, resp);
}
else
{
try
{
genreSelect = new MovieDAO().findMoviesFromGenre(query);
starSelect = new StarDAO().findStarsFromMovies(genreSelect);
}
catch(Exception e)
{
e.printStackTrace();
}
req.getSession().setAttribute("movies", genreSelect);
req.getSession().setAttribute("starlist", starSelect);
req.getRequestDispatcher("/jsp/movielist.jsp").forward(req, resp);
}
}
}
`
public class StarDAO
{
public List<Star> findStarsFromMovies(List<Movie> movieList) throws Exception
{
List<Star> result = new ArrayList<Star>();
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/";
String dbName = "moviedb";
String user = "andrew";
String password = "bg79jd7c";
String sql = "select * from stars where id in (select star_id from stars_in_movies where"
+ " movie_id in (select id from movies where title = ?));";
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
for(Movie movie: movieList)
{
try
{
Class.forName(driver).newInstance();
connection = DriverManager.getConnection(url + dbName, user, password);
statement = connection.prepareStatement(sql);
statement.setString(1, movie.getTitle());
resultSet = statement.executeQuery();
while(resultSet.next())
{
Star star = new Star();
star.setId(resultSet.getInt("id"));
star.setFirstName(resultSet.getString("first_name"));
star.setLastName(resultSet.getString("last_name"));
star.setDOB(resultSet.getString("dob"));
star.setPhoto(resultSet.getString("photo_url"));
result.add(star);
}
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}
}
return result;
}
}
public class MovieListServlet extends HttpServlet
{
List<Movie> movieItems;
List<Star> starList;
String query;
Movie movie;
@Override
public void init(ServletConfig config) throws ServletException
{
query = null;
movie = null;
ServletContext context = config.getServletContext();
context.getRequestDispatcher("/jsp/movielist.jsp");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
movieItems = (List<Movie>) req.getAttribute("movies");
req.getSession().setAttribute("movies", movieItems);
starList = (List<Star>) req.getAttribute("starlist");
req.getSession().setAttribute("stars", starList);
req.getRequestDispatcher("/jsp/movielist.jsp").forward(req, resp);
}
catch(Exception e)
{
System.out.println(e);
}
/**
try
{
movieItems = new MovieDAO().movieList();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
req.getSession().setAttribute("movies", movieItems);
req.getRequestDispatcher("/jsp/movielist.jsp").forward(req, resp);
*/
}
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<table>
<a href="home">Home</a>
<c:forEach var="star" items="${stars}">
<tr>
<td>${star.id}</td>
<td>${star.first_name}</td>
<td>${star.last_name}</td>
<td>${star.dob}</td>
<td>${star.photo_url}</td>
</tr>
</c:forEach>
<c:forEach var="movie" items="${movies}">
<tr>
<td>${movie.id}</td>
<td><a href="movies?query=${movie.id}"> ${movie.title}</td>
<td>${movie.year}</td>
<td>${movie.director}</td>
<td> <img src ="${movie.banner}"></td>
<td><a href="${movie.trailer}">trailer</a></td>
</tr>
</c:forEach>
</table>
答案 0 :(得分:0)
经过一番思考后,我决定从另一个方向接近并创建一个包含以前类的私有字段的类。通过使用单个类,我可以创建一个SQL查询而不是两个单独的SQL查询。它没有解决我之前的问题,但它确实有效。