2010-07-05 11 views
5

Normalmente, un usuario hace una búsqueda, obtiene una lista de visitas y luego puede buscarla. La lista de resultados es un resultado intermedio que permanece constante durante toda la navegación y, por lo general, se almacena en estado de sesión. P.ej. si nuevos elementos se agregan simultáneamente por otros, aparecerían solo en una búsqueda posterior.Paginación en una aplicación web REST

En una aplicación REST, no puedo tener este resultado intermedio fácilmente, ni pertenece al cliente, ni al modelo. He leído Pagination in a REST web app, pero no estoy del todo claro con la respuesta. La solución parece suponer que el modelo no se actualiza mientras el usuario navega por los resultados.

Por supuesto, podemos imaginar el mundo (el modelo) como una serie de instantáneas inmutables. Al proporcionar una marca de tiempo (o un número de versión global), obtenemos una vista consistente del modelo en ese momento, que resuelve el problema desde un punto de vista conceptual. Sin embargo, implica la versión completa del modelo. (También me pregunto si hay una conexión para dibujar con programación funcional)

¿Cómo debo tratar este problema?

Nota: Pregunto porque planeo usar el play framework, que no tiene ninguna noción de estado HTTP o sesión en absoluto; es puro descanso.

Respuesta

0

Estoy algo perdido acerca de cuál es su contexto, pero si tengo que proporcionar una respuesta breve, es que los resultados de búsqueda deben ser parte del modelo. Supongo que tienes un modelo de búsqueda. Lo que hace es indexar las partes que necesita para buscar y almacenar la información del índice (también lo hace parte del modelo). Cuando ejecuta una búsqueda, consulta el índice y muestra los resultados. Realizar la búsqueda por segunda vez no contendría elementos recién agregados, a menos que el índice se haya regenerado.

Esto elimina la necesidad de utilizar cualquier estado de sesión y lo mantiene tranquilo, ya que la indexación es simplemente otra operación realizada en un recurso. ¿Esto es lo que necesitas?

+0

El modelo de dominio está formado por entidades persistentes. ¿Sugiere que también deba persistir el resultado de la búsqueda? – ewernli

5

Después de obtener el resultado de la consulta en la primera búsqueda, puede guardar el resultado en una caché. Para un servidor, puede ser ehcache (compatible con el juego) o memcached (también compatible con Play) para un entorno de clúster. Puede guardar el resultado con un nombre estático + ID de sesión. Por lo tanto, solo necesita el ID de sesión para cada solicitud, se guarda en la cookie del cliente y está disponible en su aplicación de reproducción. Puede usar datos en caché para buscar páginas. También estoy recomendando ElasticSearch.

EDIT: Una mejor manera es que puede utilizar la reproducción de búsqueda de http://github.com/jfp/play-search, la muestra:

Query q = Search.search("object:dogs", Folder.class); 
q.orderBy("object") 
    .page(2,5) 
    .reverse(); 

PS: Su decisión con Play es perfecto. Soy un desarrollador profesional de .net y puedo decir que el único framework web (óptimo) en el mundo que puede competir con asp.net mvc 2 es Play framework. Grails tiene errores, Django/Python, Yii/Php, Rails, todos son lentos, no son seguros y están lejos de los frameworks jvm/clr. wicket, tapiz, struts, jsf, spring mvc son todos muy detallados e inútiles. spring roo es solo un generador de plantillas. Asp.net mvc superó a asp.net y se convirtió en la plataforma de desarrollo # 1 para .net, pero el sol funcionó para un antiguo clon de asp.net con jsf para la siguiente generación, un gran error. La única esperanza para Java es el marco de juego en mi opinión. Con el módulo scala, es perfecto ...

+0

Voy a investigar un poco la función de almacenamiento en caché a continuación. Pero el resultado de la búsqueda podría desalojarse de la memoria caché en cualquier momento, independientemente de si la sesión del usuario se agotó o no, ¿no? – ewernli

+1

play.Cache el camino a seguir ... play-search se ve interesante, gracias! – qeek

+0

Documentación sobre el caché en el marco de juego: http://www.playframework.org/documentation/1.1/cache – ewernli

Cuestiones relacionadas