gpt4 book ai didi

JSP 获取/设置整个对象的参数

转载 作者:行者123 更新时间:2023-12-04 17:49:44 27 4
gpt4 key购买 nike

我是这个社区的新手,想出了我的第一个问题。

我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。

现在我想对整个对象做同样的事情(是的,我知道字符串也是一个对象 :P)。我尝试了以下方法:

这是我的 Bean:

@Entity
@Table(name="TBL_SPJ_MOVIE")
public class Movie implements Serializable {
@Id
@Column(name="MOVIE_ID", unique=true)
private int movieID = 0;

@Column(name="MOVIE_BACKDROPPATH")
private String backDropPath = "";

@Column(name="MOVIE_ORIGINALTITLE")
private String originalTitle = "";

@Column(name="MOVIE_POPULARITY")
private double popularity = 0.0;

@Column(name="MOVIE_POSTERPATH", length=1000)
private String posterPath = "";

@Temporal(TemporalType.DATE)
@Column(name="MOVIE_RELEASEDATE")
private Date releaseDate = null;

@Column(name="MOVIE_TITLE")
private String title = "";

@Column(name="MOVIE_ADULT")
private boolean adult = false;

@Column(name="MOVIE_BUDGET")
private int budget = 0;

@Column(name="MOVIE_HOMEPAGE", length=1000)
private String homepage = "";

@Lob
@Column(name="MOVIE_OVERVIEW", length=1000)
private String overview = "";

@Column(name="MOVIE_RUNTIME")
private int runtime = 0;

@Column(name="MOVIE_VOTEAVERAGE")
private double voteAverage = 0.0;

@Column(name="MOVIE_VOTECOUNT")
private int voteCount = 0;

public Movie() {}

//##########################################################################################
@SuppressWarnings("unchecked")
@Transient
public List<Movie> getMovies() {
List<Movie> movies = new ArrayList<Movie>();
EntityManagerFactory factory = Persistence.createEntityManagerFactory("SPJUnit");
EntityManager em = factory.createEntityManager();

Query query = em.createQuery("SELECT m FROM Movie m");

movies = (List<Movie>)query.getResultList();

return movies;
}
@Transient
private Movie currentMovie = null;
public Movie getCurrentMovie() {
return currentMovie;
}
public void setCurrentMovie(Movie currentMovie) {
this.currentMovie = currentMovie;
}
//##########################################################################################

// Getter and Setter

public String toString() {
return title;
}
}

这是我的 movies.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<jsp:useBean id="movie" class="de.Movie"></jsp:useBean>

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<head>
<link href="../css/movies.css" type="text/css" rel="stylesheet">
<title>Movie Titles</title>
</head>

<body>
<div id="wrapper">
<br></br>
<h2 id="title">Movie Titles</h2>
<br></br>

<ul>
<c:forEach var="movie" items="${movie.movies}">
<li id="listElement">
<form action="../pages/singleMovie.jsp">
<input type="submit"
name="currentMovie"
value="${movie}"
/>
</form>
</li>
</c:forEach>
</ul>
</div>
</body>
</html>

这里有一个包含所有电影的大列表。我想是因为我的 toString() 方法所有标题都打印出来了吗?好吧,有了这些表格,我想将选定的电影提交给另一个 jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<jsp:useBean id="movie" class="de.Movie"></jsp:useBean>

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<head>
<link href="../css/singleMovie.css" type="text/css" rel="stylesheet">
<title>Movie</title>
</head>

<body>
<div id="wrapper">

<jsp:setProperty name="movie" property="*" />

<br></br>
<h2 id="title"><jsp:getProperty name="movie" property="currentMovie" /></h2>
<br></br>

</div>
</body>
</html>

似乎只发送了电影的标题,因为当我调用 singleMovie.jsp 时出现以下错误:

org.apache.jasper.JasperException: org.apache.jasper.JasperException:  org.apache.jasper.JasperException: PWC6338: Cannot convert "Ariel" for the attribute currentMovie of the bean de.Movie: PWC6348: Property editor not registered with the PropertyEditorManager

“Ariel”是我选择提交的电影的标题。

我想发送整部电影,这样我就可以在我的文件中使用 Movie-Bean 的所有字段singleMovie.jsp.

只要我只处理电影的标题,一切都很好。

那我做错了什么?

最佳答案

您似乎没有意识到 HTML 和 HTTP 不适用于对象。他们只能提交字符串参数。

您不应仅使用 JSP 构建应用程序。 JSP 非常适合生成 HTML。其余部分(获取参数、验证参数、从数据库检索对象和将对象保存到数据库等)应该使用 Java 代码、在 servlet 中或在您首选的 MVC 框架的 Controller 中完成。

您也不应该将整部电影发送到服务器来显示它。电影在服务器端的数据库中。服务器需要从客户端获取的只是它必须显示的电影的 ID。所以应用程序应该像这样工作:

  1. 向 ListMovies servlet 发送请求
  2. servlet 在数据库中搜索电影,并将电影列表存储在请求属性中
  3. servlet 转发到 listMovies.jsp
  4. listMovies 使用 JSTL 和 EL 循环访问存储在请求属性中的电影,并为每个电影生成指向 displayMovie?id=theMovieId 的链接。当应该使用链接时,不要使用仅包含按钮的表单。
  5. 用户点击链接。向 DisplayMovie servlet 发送请求
  6. servlet 获取id 参数的值。它使用此 ID 在数据库中查找电影,并将其存储在请求属性中
  7. servlet 转发到 displayMovie.jsp 页面
  8. displayMovie.jsp 页面使用 JSTL 和 EL 显示电影的详细信息

完全忘记 jsp:useBean、jsp:setProperty 和 jsp:getProperty。它们属于过去,不应再使用。

此外,对数据库执行查询以获取电影的方法不应该在 Movie 类中。它们应该在 MovieDAO 类中。仅仅为了从数据库中获取其他电影而实例化一部电影没有多大意义。实体的责任不是查询数据库。

关于JSP 获取/设置整个对象的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16638668/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com