【问题标题】:Configure wicket with spring without xml使用没有 xml 的 spring 配置检票口
【发布时间】:2014-11-09 18:51:58
【问题描述】:

是否可以在不使用 web.xml 之类的任何 xml 文件的情况下使用 spring 配置检票口???

这是我已经为 spring+hibernate 制作和工作的配置。我想朝着这个方向前进,完全摆脱 xml 配置文件。请帮忙。

package com.rerp.common.init;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.DispatcherServlet;

public class Initializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(WebAppConfig.class);
        servletContext.addListener(new ContextLoaderListener(ctx));

        ctx.setServletContext(servletContext);

        Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
        // Allow to use Put and Delete method for REST architecture
        registerHiddenFieldFilter(servletContext);
    }

    private void registerHiddenFieldFilter(ServletContext aContext) {
        aContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null ,true, "/*"); 
    }
}

和 WebAppConfig 文件

package com.rerp.common.init;

import java.util.Properties;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

@Configuration
@ComponentScan("com.rerp")
@EnableWebMvc
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
public class WebAppConfig {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_SERVICES = "services.entitymanager.packages.to.scan";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_COMMON = "common.entitymanager.packages.to.scan";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_CMS = "cms.entitymanager.packages.to.scan";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource());
        //sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
        sessionFactoryBean.setPackagesToScan(new String[] {
                env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_SERVICES),
                env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_COMMON),
                env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_CMS)
                });
        sessionFactoryBean.setHibernateProperties(hibProperties());
        return sessionFactoryBean;
    }

    private Properties hibProperties() {
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        properties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
        return properties;  
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }

    @Bean
    public UrlBasedViewResolver setupViewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

}

【问题讨论】:

    标签: spring hibernate wicket spring-java-config


    【解决方案1】:

    如果您使用的是 servlet 3 或更新版本,则可以删除 web.xml。请参阅http://wicket.apache.org/guide/guide/single.html#helloWorld_2 的用户指南。

    要了解如何使用 Spring 作为依赖注入器,请参阅示例项目 https://github.com/bitstorm/Wicket-tutorial-examples/tree/master/SpringInjectionExample

    【讨论】:

    • 看起来很有希望。我会试一试的。
    • 通过 servlet 3 你的意思是:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> ???
    • 是的,没错。然后你必须使用支持这个 servlet 标准的 web servlet(例如:Tomcat 7)
    • 此链接已损坏:wicket.apache.org/guide/guide/single.html#helloWorld_2。这就是为什么仅链接答案不是一个好主意...
    【解决方案2】:

    是否可以在不使用 web.xml 之类的任何 xml 文件的情况下使用 spring 配置检票口???

    是的,这是可能的。

    Wicket 使用名为 org.apache.wicket.protocol.http.WicketFilterjavax.servlet.Filter 来引导 Wicket,而 Spring MVC 使用 Servlet 而不是过滤器。因为 Wicket 使用过滤器,所以它能够在 Spring 的 DispatcherServlet 之前处理请求。 WicketFilter 将在它们与 Wicket 无关时传递请求,以便 DispatcherServlet 有机会处理请求。

    这是代码中的解决方案:

    将 wicket-spring 模块添加到自动装配 bean

    <dependency>
      <groupId>org.apache.wicket</groupId>
      <artifactId>wicket-spring</artifactId>
      <version>8.5.0</version>
    </dependency>
    

    将 DispatcherServlet 和 WicketFilter 添加到 WebApplicationInitializer 中的 ServletContext

        public class Initializer implements WebApplicationInitializer {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                // Add WicketFilter
                FilterRegistration.Dynamic wicketFilterRegistration = servletContext.addFilter("wicketFilter", WicketFilter.class);
                wicketFilterRegistration.setInitParameter("applicationClassName", "springwickettest.MyWicketApplication");
                wicketFilterRegistration.setInitParameter("filterMappingUrlPattern", "/*");
                wicketFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
    
                // Create Spring context
                AnnotationConfigWebApplicationContext springContext = new AnnotationConfigWebApplicationContext();
                springContext.register(WebAppConfig.class);
    
                // Add Spring Context to ServletContext
                servletContext.addListener(new ContextLoaderListener(springContext));
                springContext.setServletContext(servletContext);
    
                // Create Spring Dispatcher servlet
                ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(springContext));
                servlet.addMapping("/*");
                servlet.setLoadOnStartup(1);
    
                // Allow to use Put and Delete method for REST architecture
                registerHiddenFieldFilter(servletContext);
            }
    
    
            private void registerHiddenFieldFilter(ServletContext aContext) {
                aContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null ,true, "/*");
            }
        }
    

    将 Spring 注入器添加到 Wicket

    public class MyWicketApplication extends WebApplication {
        @Override
        public Class<? extends WebPage> getHomePage() {
            return HomePage.class;
        }
    
        @Override
        public void init() {
            super.init();
    
            // Get the SpringContext from the servletContext
            WebApplicationContext springContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
            getComponentInstantiationListeners().add(new SpringComponentInjector(this, springContext));
    
            // Mount your pages
            mountPage("/test", TestPage.class);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2015-05-24
      • 2014-01-20
      相关资源
      最近更新 更多