使用播放框架的博客Web应用程序的逻辑错误

时间:2012-03-08 21:53:27

标签: java web-applications playframework blogs

我正在使用播放框架创建一个简单的博客Web应用程序,其中有某些类别,用户可以发布到他们想要的类别,但问题是,当我发布到一个类别时,帖子也会发布到所有类别

Application code:
    import java.util.*;
    import models.*;
    public class Application extends Controller {
        public static void index() {
            List Posts = Post.find ("order by type desc").fetch();
            render(Posts); 
        }
        public static void addpost (String content) {
            Post post = new Post(content).save();

            renderJSON(content);
html code:                 
<h2>
        CollabBlog
    </h2>
#{extends 'main.html' /}
#{set title:'Home' /}
<head>
        <title>#{get 'title' /}</title>     
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <link rel="stylesheet" type="text/css" media="screen" 
            href="@{'/public/stylesheets/categories.css'}" />        
    </head> 
<h3>Category: Health</h3>
#{ifnot Posts} 
    No posts to view
#{/ifnot}
<ul>
    #{list items:Posts, as: 'Post'}
    <li>        
        <p>${Post.poster}</p><p>${Post.content}</p>        
    </li>
    #{/list}
</ul>
<p>
    <a id="addpost" href="#">add new Health's post</a>    
</p>
<h3>Category: Politics</h3>
#{ifnot Posts} 
    No posts to view
#{/ifnot}
<ul>
    #{list items:Posts, as: 'Post'}
    <li>        
        <p>${Post.poster}:</p><p>${Post.content}</p>        
    </li>
    #{/list}
</ul>
<p>
    <a id="addpost" href="#">add new Politic's post</a>    
</p>
<h3>Category: Entertainment</h3>
#{ifnot Posts} 
    No posts to view
#{/ifnot}
<ul>
    #{list items:Posts, as: 'Post'}
    <li>        
        <p>${Post.poster}</p><p>${Post.content}</p>        
    </li>
    #{/list}
</ul>
<p>
    <a id="addpost" href="#">add new Entertainment's post</a>    
</p>
<body>
    <link href="index.css" rel="stylesheet" type="text/css">
</body>
<script type="text/javascript" charset="utf-8">
$('#addpost').click(function() {
    $.post('@{addpost()}', {content: prompt('post content ?')}, function(Post){
        $('ul').prepend()
    })
    $.post('@{addpost()}', {poster : prompt('which category ?')}, function(Post){
        $('ul').prepend()
    })   
})
</script>                
            }


        }

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

在阅读了您的其他评论后(希望我没有误解),您可以在控制器中执行的操作是在type列中找到所有唯一类别。然后对于每种类型(由下面的代码段中的categories变量表示),您可以进行此调用:

Map<String, List<Post>> map = new HashMap<String, List<Post>>();
// the categories variable here is the unique types from the Post table
for (String category : categories) {
    List<Post> posts = Post.find("type = ?", category).fetch();
    map.put(category, posts);
}
render(map);

然后在您的视图中,您可以查看将代表所有类别名称的地图键,然后获取与该键相关联的值并迭代该类别的帖子。

以上假设用户可以输入他们想要的任何内容。如果您真的希望他们根据原始帖子中的视图示例选择健康,政治和娱乐,那么您可能需要在数据库中对类别进行建模。一些选项可能是:

第一个选项

您可以拥有两个实体:(1)发布和(2)类别。你有第一个。你需要创建的第二个。因此,创建一个这样的类别实体:

@Entity
public class Category extends Model {

    @OneToMany(mappedBy = "category", targetEntity = Post.class)
    public List<Post> posts;

    ...
}

然后在你的Post实体中,你可以在Post和Category实体之间建立关系:

@Entity
public class Post extends Model {

    @ManyToOne
    @JoinColumn(name = "category_id")
    public Category category;

    ...
}

如果用户(或您)可以动态(或直接在数据库中)创建类别以允许用户选择预定义的类别,那将是很好的。

第二个选项

如果上面的例子是过度的,因为类别只是一个单词,并且没有其他属性,如描述,那么你可以只使用枚举类别:

public class Post extends Model {

    @Enumerated(EnumType.STRING)
    public Category category;

    ...
}

其中类别是这样的枚举:

public enum Category {
    HEALTH,
    ENTERTAINMENT,
    POLITICS
}

此选项再次表示用户将从预定义列表中进行选择。