JSP get / setParameter与整个对象

时间:2013-05-19 19:37:46

标签: jsp

我是这个社区的新人,并提出了我的第一个问题。

我使用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。

只要我使用电影的标题,一切都很棒。

那么我做错了什么?

1 个答案:

答案 0 :(得分:3)

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

您不应仅使用JSP构建应用程序。 JSP很适合生成HTML。其余的(获取参数,验证它们,从数据库中检索和保存对象等)应该使用Java代码,servlet或首选MVC框架的控制器来完成。

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

  1. 将请求发送到ListMovies servlet
  2. servlet搜索数据库中的电影,并将电影列表存储在请求属性
  3. servlet转发到listMovies.jsp
  4. listMovies使用JSTL和EL迭代存储在request属性中的影片,并为每个影片生成指向displayMovie?id=theMovieId的链接。当使用链接时,请勿使用仅包含按钮的表单。
  5. 用户点击该链接。请求将发送到DisplayMovie servlet
  6. servlet获取id参数的值。它使用此ID在数据库中查找影片,并将其存储在请求属性
  7. servlet转发到displayMovie.jsp页面
  8. displayMovie.jsp页面使用JSTL和EL显示电影的详细信息
  9. 完全忘记jsp:useBean,jsp:setProperty和jsp:getProperty。它们属于过去,不应再使用了。

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