modulos - modularidad en java
Cuál es la mejor manera de hacer una aplicación web java modular (7)
Estoy construyendo un pequeño sitio web en Java (Spring MVC con vistas JSP) y estoy tratando de encontrar la mejor solución para hacer e incluir pocos módulos reutilizables (como "novedades", "próximos eventos" ...).
Entonces la pregunta es: ¿Portlets, tiles o alguna otra tecnología?
Las baldosas pueden ser un dolor. Gran mejora sobre lo que vino antes (es decir, nada), pero bastante limitado.
Wicket podría ser más de lo que estás buscando, a menos que te hayas decidido por JSP.
Soy un gran admirador de GWT . Le permite escribir sus componentes como clases normales de Java y luego puede insertarlos en sus páginas a voluntad. Todo termina siendo compilado a Javascript.
Aquí hay un ejemplo:
public class MyApplication implements EntryPoint, HistoryListener
{
static final String INIT_STATE = "status";
/**
* This is the entry point method. Instantiates the home page.
*/
public void onModuleLoad ()
{
RootPanel.get ().setStyleName ("root");
initHistorySupport ();
}
private void initHistorySupport ()
{
History.addHistoryListener (this);
// check to see if there are any tokens passed at startup via the browser’s URI
String token = History.getToken ();
if (token.length () == 0)
{
onHistoryChanged (INIT_STATE);
}
else
{
onHistoryChanged (token);
}
}
/**
* Fired when the user clicks the browser''s ''back'' or ''forward'' buttons.
*
* @param historyToken the token representing the current history state
*/
public void onHistoryChanged (String historyToken)
{
RootPanel.get ().clear ();
Page page;
if (Page1.TOKEN.equalsIgnoreCase (historyToken))
{
page = new Page1 ();
}
else if (Page2.TOKEN.equalsIgnoreCase (historyToken))
{
page = new Page2 ();
}
else if (Page3.TOKEN.equalsIgnoreCase (historyToken))
{
page = new Page3 ();
}
RootPanel.get ().add (page);
}
}
No estoy 100% seguro de lo que significan los "componentes reutilizables" en este contexto, pero si quiere decir que quiere que aparezcan ciertos elementos comunes en cada página, como banner, pie de página, enlaces de navegación, etc., no busque más SiteMesh . Mi equipo lo ha utilizado con éxito en un par de aplicaciones web internacionalizadas.
Si está utilizando Spring MVC, le recomendaría usar Portlets. En Spring, los portlets son controladores livianos, ya que solo son responsables de un fragmento de toda la página y son muy fáciles de escribir. Si está utilizando Spring 2.5, puede disfrutar de todos los beneficios del nuevo soporte de anotación, y se ajustan muy bien en toda la aplicación de Spring con la inyección de dependencia y los otros beneficios de usar Spring.
Un controlador de portlet es prácticamente lo mismo que un controlador de servlet, aquí hay un ejemplo simple:
@RequestMapping("VIEW")
@Controller
public class NewsPortlet {
private NewsService newsService;
@Autowired
public NewsPortlet(NewsService newsService) {
this.newsService = newsService;
}
@RequestMapping(method = RequestMethod.GET)
public String view(Model model) {
model.addAttribute(newsService.getLatests(10));
return "news";
}
}
Aquí, un NewsService se inyectará automáticamente en el controlador. El método view agrega un objeto List al modelo, que estará disponible como $ {newsList} en el JSP. Spring buscará una vista llamada news.jsp basada en el valor de retorno del método. RequestMapping le dice a Spring que este controlador es para el modo VIEW del portlet.
La configuración XML solo necesita especificar dónde se encuentran la vista y los controladores:
<!-- look for controllers and services here -->
<context:component-scan base-package="com.example.news"/>
<!-- look for views here -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/news/"/>
<property name="suffix" value=".jsp"/>
</bean>
Si simplemente desea incrustar los portlets en su aplicación existente, puede agrupar un contenedor de portlet, como eXo , Sun o Apache . Si desea construir su aplicación como un conjunto de portlets, es posible que desee considerar una solución portlar completa, como Liferay Portal .
Tapestry es un marco de aplicación web de Java con énfasis en la creación de componentes reutilizables.
He usado sitemesh, y es bueno para envolver un conjunto de páginas en encabezados y pies de página estándar, pero Tapestry es mejor para crear componentes que se usan en muchas páginas, posiblemente muchas veces por página. Los componentes de tapiz pueden tomar otros componentes como parámetros, lo que permite el ajuste del estilo de Sitemesh.
No recomiendo usar Portlets a menos que su aplicación sea realmente un portal web .
Si solo quiere "componentes reutilizables", use los archivos de etiquetas JSP , son simples pero extremadamente potentes, ya que son los mismos que los JSP comunes.
He tenido experiencia en el uso de teselas y la complejidad involucrada simplemente no vale la pena.
Tenía mucha experiencia con los portlets junto con Ajax JSF (IceFaces) y Liferay Portal, y no los recomendaría a nadie: todo se ve bien cuando se lee un tutorial y se practica un verdadero infierno en la práctica. Por supuesto, creo que son mucho más convenientes y livianas con Spring MVC y JSP, pero de todos modos, los portlets no cuentan con la tecnología adecuada.