为前端实现Java servlet,MySQL和Javascript的分页

时间:2016-05-09 09:11:03

标签: javascript java mysql jsp

我遇到了一些麻烦,可视化我如何使用MySQL数据库,Java servlet以及使用javascript显示结果来完成对大型数据集的分页。

我正在开发一个带有小数据集的个人项目,以尝试学习Java servlets / MySQL / JavaScript。我有一个电影数据库,其中包含MySQL中的一些电影名称和其他属性:

CREATE TABLE `movies` (
    `id` int(11) NOT NULL AUTO INCREMENT,
    `title` varchar(100) NOT NULL DEFAULT '',
    `year` int(4) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

然后我有一个Movie java bean:

// Movie bean
import java.io.Serializable;
public class Movie implements Serializable {

    // Instance variables
    private Long            id;
    private String          title;
    private int             year;

    public Movie() {}

    // Setters
    public void setId    (long id)      { this.id = id;       }
    public void setTitle (String title) { this.title = title; }
    public void setYear  (int year)     { this.year = year;   }

    // Getters
    public long     getId()     { return id;    }
    public String   getTitle()  { return title; }
    public int      getYear()   { return year;  }
}

A MovieDAO访问数据库并检索所有电影的列表(下面是摘录,假设我已连接到数据库):

public class MovieDAO {
    private List<Movie> movies;

    private static ResultSet queryMovies(String st) throws SQLException {
        ResultSet res = null;
        try {
            PreparedStatement ps = dbcon.prepareStatement(st);
            res = ps.executeQuery();
        } catch(SQLException e) {
            System.out.println("Error with movieDAO query");
            e.printStackTrace();
        }
        return res;
    }

    public List<Movie> listMovies() throws SQLException {
        movies = new ArrayList<Movie>();
        ResultSet res = queryMovies("SELECT * FROM movies");
        while(res.next()) {
            Movie mov = new Movie();
            mov.setId(res.getLong("id"));
            mov.setTitle(res.getString("title"));
            mov.setYear(res.getInt("year"));
            movies.add(mov);
        }
        return movies;
    }
}

最后我的MovieServlet类只显示作为列表的JSP变量的所有信息:

@WebServlet("/movies")
public class MovieServlet extends HttpServlet {

    private MovieDAO movieDAO;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        movieDAO = new MovieDAO();
        try {
            List<Movie> movies = movieDAO.listMovies();
            request.setAttribute("movies", movies); // JSP variable: ${movies}
            request.getRequestDispatcher("movies.jsp").forward(request, response);
        } catch (SQLException e) {
            throw new ServletException("Could not retrieve movies from the database",e);
        }
        movieDAO.closeMovieDAO();
    }
}

对于事物的前端,我有一个通过jsp和javascript填充的表。我最初只有一个像这样生成的页码列表:

function showPageNumber() {
    var html = '';
    for(i = num_of_pages; i > 0; i--) { html += "<li class='page'><a>" + i + "</a></li>"; }
    $('.page').click(function() {
        result_min = ($(this).text() - 1) * results_per_page;
        result_max = $(this).text() * results_per_page;
        show(result_min,result_max);
    });
}

function show(min,max) {
    var $rows = $('#result_table');
    $rows.hide().slice(min, max).show();
}

在id为result_table的表的每一行中,我有jsp变量。我还有一个sort函数,所以当用户点击表格的每个标题时,它会按标题排序(即点击id将按升序id排序)。这对于几千部电影记录来说效果很好,而且实际上相对较快。

然后我在数据库中插入了大约80,000条记录。令人惊讶的是,加载所有这些数据需要很长时间。排序需要更长时间。

为了解决这个问题,我只想让用户访问next按钮,前十个页码按钮和一个转到最后一页的last按钮。我认为限制可能的电影数量有助于更快地显示数据。

我现在的问题是如何对每条记录进行排序并正确显示所有内容?例如,如果用户按id排序,他们将获得升序id的列表,如下所示:

1  - movie1 - 1990
2  - movie2 - 1996
3  - movie3 - 1934

如果他们点击相同的标题,订单将会反转:

3  - movie3 - 1934
2  - movie2 - 1996
1  - movie1 - 1990

但是,如果我限制检索的数据量,但我有一个范围为1-80,000的id,我如何重新排序所有数据并以相反的顺序检索id值..而不必调用再次SELECT

0 个答案:

没有答案