• SpringMVC全注解


    SpringMVC全注解不是你们那么玩的

    前言:忙了段时间,忙得要死要活,累了一段时间,累得死去活来。

    偶尔看到很多零注解配置SpringMVC,其实没有根本的零注解。

    1)工程图一张:

    web.xml在servlet3.0里面已经被注解完全替代,但是spring里面的DispatcherServlet并没有被使用,本打算修改下源码弄成3.0的,奈何没啥时间。

    这是一个标准的SpringMVC,重点是AppConfig与DBConfig,在Web.xml里面申明两个类的配置路径:

    复制代码
    <servlet>
            <servlet-name>spring</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>com.test.commom.AppConfig</param-value>
            </init-param>
            <!-- use annotation replace xml configuration. @Configuration class is required. -->
            <init-param>
                <param-name>contextClass</param-name>
                <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>spring</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    复制代码

    AppConfig:

    复制代码
    @Configuration
    @ComponentScan(basePackageClasses = AppConfig.class)
    @EnableTransactionManagement //The code equals aop config or provider annotation transaction.
    @EnableAspectJAutoProxy
    @PropertySource({"classpath:site-jdbc.properties"})
    public class AppConfig extends DBConfig {
        
        /**
        * 国际化
        * @return
        */
       @Bean
       @Qualifier("messageSource")
       public ResourceBundleMessageSource messageSource() {
           ResourceBundleMessageSource bundleMessageSource = new ResourceBundleMessageSource();
           bundleMessageSource.setBasename("i18n.u1wan-i18n");
           bundleMessageSource.setUseCodeAsDefaultMessage(true);
           return bundleMessageSource;
       }
       
       /**
        * file upload
        * @return
        */
       @Bean
       public CommonsMultipartResolver getCommonsMultipartResolver() {
           return new CommonsMultipartResolver();
       }
       
       
       @Bean
       public SessionLocaleResolver localeResolver() {
           SessionLocaleResolver localeResolver = new SessionLocaleResolver();
           return localeResolver;
       }
       
       @Bean
       public HessianProxyFactory loadHessianProxyFactory() {
           HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
           return hessianProxyFactory;
       }
       /**
        * 定义spring MVC返回显示视图
        * @return
        */
       @Bean
       public TilesViewResolver viewResolver() {
           return new TilesViewResolver();
       }
       
       @Bean
       public LoginInterceptor loginInterceptor() {
           return new LoginInterceptor();
       }
       
       @Bean
       public SystemInterceptor systemInterceptor() {
           return new SystemInterceptor();
       }
       
       @Bean
       public PermissionsInterceptor permissionsInterceptor() {
           return new PermissionsInterceptor();
       }
       
       @Override
       public void addInterceptors(InterceptorRegistry registry) {
           registry.addInterceptor(loginInterceptor());
           registry.addInterceptor(systemInterceptor());
           registry.addInterceptor(permissionsInterceptor());
       }
       
       /**
        * 定义xml显示位置
        * @return
        */
       @Bean
       public TilesConfigurer tilesConfigurer() {
           TilesConfigurer tilesConfigurer = new TilesConfigurer();
           tilesConfigurer.setDefinitions(new String[] { "classpath*:config/tiles/page-tiles.xml", "classpath*:config/tiles/common-tiles.xml" });
           return tilesConfigurer;
       }
       
       /**
        * 定义Spring MVC显示
        * @return
        */
       @Bean
       public CommonsMultipartResolver multipartResolver() {
           CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
           return multipartResolver;
       }
    
    }
    复制代码

    DBConfig:

    复制代码
    public class DBConfig extends DefaultWebConfig {
        
    
        @Inject
        Environment env;
        
        /**
         * 数据源
         * @return
         */
        @Bean(destroyMethod = "close")
        public DataSource dataSource() {
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setDriverClassName(env.getRequiredProperty("jdbc.driver.name"));
            dataSource.setUrl(env.getRequiredProperty("jdbc.writedb.proxy.url"));
            dataSource.setUsername(env.getRequiredProperty("jdbc.username"));
            dataSource.setPassword(env.getRequiredProperty("jdbc.password"));
            dataSource.setTestOnBorrow(true);
            dataSource.setValidationQuery("select 1");
            return dataSource;
        }
    
        @Bean
        public SessionFactory sessionFactory() {
            LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource())
                    .scanPackages(AppConfig.class.getPackage().getName());
            builder.setProperty(org.hibernate.cfg.Environment.DIALECT, MySQL5Dialect.class.getName());
            return builder.buildSessionFactory();
        }
        
        
        @Bean
        public MongoDBAccess mongoDBAccess() {
            MongoDBAccess mongoDBAccess = new MongoDBAccess();
            mongoDBAccess.setMongoServerIpAddress(env.getRequiredProperty("mongodb.ip"));
            mongoDBAccess.setCollectionName(env.getRequiredProperty("mongodb.collection"));
            mongoDBAccess.setMongoServerPort(Integer.parseInt(env.getRequiredProperty("mongodb.port")));
            mongoDBAccess.setDbName(env.getRequiredProperty("mongodb.db"));
            mongoDBAccess.initDB();
            return mongoDBAccess;
        }
        
        @Bean
        public SessionLocaleResolver localeResolver() {
            SessionLocaleResolver localeResolver = new SessionLocaleResolver();
            return localeResolver;
        }
    
    
       /**
        * hibernate事物
        * @return
        */
        @Bean
        public HibernateTransactionManager transactionManager() {
            HibernateTransactionManager transactionManager = new HibernateTransactionManager();
            transactionManager.setSessionFactory(sessionFactory());
            return transactionManager;
        }
        
        /**
         * ORM 映射--hibernate
         * @return
         */
        @Bean
        public HibernateAccess hibernateAccess() {
            HibernateAccess hibernateAccess = new HibernateAccess();
            hibernateAccess.setSessionFactory(sessionFactory());
            return hibernateAccess;
        }
        
        /**
         * JDBC--性能要求高场合
         * @return
         */
        @Bean
        public JDBCAccess jdbcAccess() {
            JDBCAccess jDBCAccess = new JDBCAccess();
            jDBCAccess.setDataSource(dataSource());
            return jDBCAccess;
        }
        
        @Bean(name = "hibernateTransaction")
        public HibernateTransactionManager hibernateTransactionManager() {
            HibernateTransactionManager transactionManager = new HibernateTransactionManager();
            transactionManager.setSessionFactory(sessionFactory());
            return transactionManager;
        }
    }
    复制代码

    通过类的配置,完全替代spring的配置文件,基本上不用配置文件,个人比较喜欢no配置文件的东西。

    举例一个Controler:

    复制代码
    @Controller
    public class WebsiteController {
        
        @Inject
        private WebsiteServer websiteServer;
        
        @RequestMapping(value = "/website/test", method = RequestMethod.GET)
        public String test(Map<String, Object> map, WebsiteRequest request) {
            map.put("test", "test");
            return "test_page";
        }
        
        @RequestMapping(value = "/website/testbody", method = RequestMethod.GET)
        @ResponseBody
        public String testBody(Map<String, Object> map) {
            try {
                websiteServer.test();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "test";
        }
    
    }
    复制代码

    在第一个方法中,会去找test_page这个配置试图,该试图对应一个页面

    第二个方法,直接返回到body中。

    在page-tiles.xml与common-tiles.xml中设置对应视图位置:

    复制代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE tiles-definitions PUBLIC
        "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
        "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
    
    <tiles-definitions>
        
        <definition name="cookie-error" template="/WEB-INF/common/error/cookie-error.jsp"></definition>
    
        <definition name="default-403" extends="intranet-template">
            <put-attribute name="main-content1" value="/WEB-INF/common/error/default-403.jsp" />
            <put-attribute name="title" value="Forbidden" />
        </definition>
    
        <definition name="default-404" template="/WEB-INF/common/error/default-404.jsp"></definition>
    
        <definition name="default-error" extends="intranet-template">
            <put-attribute name="main-content1" value="/WEB-INF/common/error/default-500.jsp" />
            <put-attribute name="title" value="Server Error" />
        </definition>
        
    </tiles-definitions>
    复制代码
  • 相关阅读:
    约瑟夫环问题(Joseph)
    Java变量及运算符
    浅谈 Hooks
    如何使用DBUtils
    mac webstrom 安装less
    字符流-缓冲区-自定义myBufferedReader
    跨平台换行符
    329.-io流(字符-练习-复制文本文件二)
    328.io流(字符串-练习-复制文本文件一)
    LockDemo 锁对象
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3820987.html
Copyright © 2020-2023  润新知