Spring MVC还是Wicket?

use*_*320 10 wicket spring-mvc

我对Spring MVC有很长的(并且很满意)经验,但最近我对Wicket感兴趣.

我的问题还在于如何处理(使用Wicket)DI,事务管理,JDBC连接以及所有这些内容?可以将Springsource套件的某些部分与Wicket混合使用吗?Wicket&Weld?Wicket&Guice?

tet*_*suo 17

Wicket是一个表示层框架.它不会处理DI,交易或连接.

但它可以很容易地与许多框架集成,包括Spring,Guice(官方Wicket模块,wicket-springwicket-guice)和CDI/Weld(wicket- cdi,来自Igor Vaynberg,Wicket提交者之一的副项目)).

Wicket Wiki:集成指南

下面是一个简单的Wicket应用程序与Spring.事务位是普通的旧Spring配置,所以我没有打扰包括它们.

HelloWorldService.java

public class HelloWorldService {
    private String message;
    public void setMessage(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}
Run Code Online (Sandbox Code Playgroud)

applicationContext.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

  <bean id="helloWorldService" class="minimal.wicketspring.HelloWorldService">
    <property name="message" value="Hello, World!" />
  </bean>
</beans>
Run Code Online (Sandbox Code Playgroud)

WicketApplication.java

public class WicketApplication extends WebApplication {
    @Override
    public void init() {
        super.init();
        getComponentInstantiationListeners().add(new SpringComponentInjector(this));
    }
    @Override
    public Class<HomePage> getHomePage() {
        return HomePage.class;
    }
}
Run Code Online (Sandbox Code Playgroud)

HomePage.java

public class HomePage extends WebPage {
    @SpringBean
    private HelloWorldService helloWorldService;

    public HomePage() {
        add(new FeedbackPanel("feedback"));
        add(new Link<Void>("link") {
            @Override
            public void onClick() {
                info(helloWorldService.getMessage());
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

HomePage.html

<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<body>
  <div wicket:id="feedback"></div>
  <a wicket:id="link">Show Message</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

web.xml中

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <filter>
    <filter-name>wicket.wicket-spring</filter-name>
    <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
    <init-param>
      <param-name>applicationClassName</param-name>
      <param-value>minimal.wicketspring.WicketApplication</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>wicket.wicket-spring</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 12

Wicket有效地取代了Spring MVC,而不是Spring容器本身.Wicket通过@SpringBean注释轻松地与Spring集成,允许您将Spring bean(服务,DAO等)直接注入页面.你无法以相反的方式执行DI - 这是有充分理由的.

将Spring和Wicket结合使用是一个明智的选择.但是据我所知,Wicket页面和组件不是由Spring容器管理的,所以你不能@Transactional在它们上使用注释(无论如何这都是一个坏主意 - 事务属于更深层次).

其他一切工作完全相同 - AOP,JDBC等.


Ond*_*žka 7

我建议完全离开Spring并尝试Java EE 6 + Wicket 6.x. 我在Java EE 5时代使用的是Spring MVC,然后是Spring + Wicket,而Java EE 6作为中间件层只是简单地击败了Spring解决方案.

2017年更新: 随着Java 7和8中的新功能(lambdas,方法参考,默认接口方法实现......),Java EE 7 + Wicket 8组合更具吸引力.虽然Spring MVC很受欢迎,并且可能有更好的学习曲线,但是一旦你尝试Wicket,当你进入"下一个很酷的东西"(在我的情况下是Angular2)时你会想念它.

注意:我是由Red Hat支付的,但以上是我的诚实意见.在2011年,我会告诉你去春天.