• Spring MVC的简单代码配置以及启动在Tomcat上


    1.pom文件导入依赖,如果设置了<packing>war<packing>并想使用war包,那么在tomcat中的Deployment中请通过+选择External Source再选中这个war包;如果没有设置,那么请通过+选择Artifact再选择对应的“模块名+Web exploded”的,修改好Application Context后请通过“编辑”的一支笔一样的图标按钮,将右侧的jar文件放入左侧的lib目录下。

    如果是war方式,请注意修改代码后及时clear和compile;如果选择的是tomcat热部署,请记得把jar文件放入lib文件夹下。配置图片放在本文最后

    我个人比较喜欢测试代码时不打包,因为tomcat选择打包的war需要每次修改后重新clear和compile。而选择添加jar文件则可以热部署,修改后测试效果更快更省时间。

    2.写一个类继承

    AbstractAnnotationConfigDispatcherServletInitializer
    /**
     * 相当于配置了一个DispatcherServlet
     * 如果是父子容器,就在getRootConfigClasses中写父容器,getServletConfigClasses中写子容器
     * 但如果只有一个容器,就写在getRootConfigClasses中
     * 这个类需要servlet的依赖
     */
    public class WebMvcConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
        /**
         * 添加真正的配置类,可以有多个,
         * 例如WebSocketConfig需要实现两个接口,但是它们有相同的方法需要重写
         * 那么可以在WebSocketConfig中写一个内部类A,再把内部类A也配置进去
         * @return
         */
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{WebSocketConfig.class};
            // return new Class[]{WebSocketConfig.class, A.class};
        }
    
        /**
         * 如果你配置了父子容器,那么这里也需要配置
         * 我个人觉得父子容器没必要,从来不用
         * 正常来讲就选择配置getRootConfigClasses方法就可以
         * @return
         */
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[0];
        }
    
        /**
         * 一般都写“/”,如果有特殊需要也可以自己改
         * @return
         */
        @Override
        protected String[] getServletMappings() {
            return new String[] {"/"};
        }
    }

    3.配置类:

    /**
     * 实现WebMvcConfigurer接口可以重写该接口中的一些较为好用的方法,比较方便
     */
    // 声明该类是配置类
    @Configuration
    // 打开MVC的注解驱动
    @EnableWebMvc
    // mapper文件所扫描的dao包
    @MapperScan("com.nf.supermarket.dao")
    // 组件扫描,主要是controller和service的实现类所在的包
    @ComponentScan({"com.nf.supermarket.controller", "com.nf.supermarket.service.impl", "com.nf.supermarket.util", "com.nf.supermarket.aop"})
    // 数据库连接所需数据文件获取
    @PropertySource("classpath:sql/db.properties")
    // 打开事务管理
    @EnableTransactionManagement
    // 切面代理
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    
    public class xxxConfig implements WebMvcConfigurer {
    
        @Value("${mysql.url}")
        private String url;
    
        @Value("${mysql.username}")
        private String username;
    
        @Value("${mysql.password}")
        private String password;
    
        /**
         * 配置druid的连接池
         * 本来是需要同一个连接的,但连接池内部有其实现方法,只需要保证是同一个连接池即可
         * 如果存在driverClassName,就可以根据url找到driverClassName,因此无需再配置
         *
         * @return 一个被spring管理的连接池
         */
        @Bean
        public DataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    
        /**
         * 生成dao的代理类
         *
         * @return 返回一个被spring管理的sqlSessionFactory
         * @throws Exception mapper文件未找到及getObject方法调用出错
         */
        @Bean
        public SqlSessionFactory sqlSessionFactory() throws Exception {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource());
            // 设置哪里找到mapper文件
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/**/*.xml"));
            // 设置配置
            sqlSessionFactoryBean.setConfiguration(configuration());
            // 设置插件
            sqlSessionFactoryBean.setPlugins(pageInterceptor());
            return sqlSessionFactoryBean.getObject();
        }
    
        /**
         * 注入事务驱动
         *
         * @return 数据源事务管理
         */
        @Bean
        public DataSourceTransactionManager dataSourceTransactionManager() {
            DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
            dataSourceTransactionManager.setDataSource(dataSource());
            return dataSourceTransactionManager;
        }
    
        /**
         * mybatis的配置
         *
         * @return SqlSessionFactoryBean对象所需设置的配置
         */
        private org.apache.ibatis.session.Configuration configuration() {
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            // 输出执行的sql语句,日志某些类似的效果,更清晰了解做了什么
            configuration.setLogImpl(StdOutImpl.class);
            // 下划线转驼峰形式
            configuration.setMapUnderscoreToCamelCase(true);
            return configuration;
        }
    
        /**
         * 分页插件,但项目中用了layui,因此只是借用了它的组合分页SQL语句功能
         *
         * @return 一个分页拦截器对象
         */
        private PageInterceptor pageInterceptor() {
            PageInterceptor pageInterceptor = new PageInterceptor();
            Properties properties = new Properties();
            // 支持方法参数
            properties.setProperty("supportMethodsArguments", "true");
            // 参数合理化,使页数正确
            properties.setProperty("reasonable", "true");
            pageInterceptor.setProperties(properties);
            return pageInterceptor;
        }
    
        /**
         * 凡是/static路径开头的文件,一律到resouces文件下的static包下找
         *
         * @param registry 登记资源解析器
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            ResourceHandlerRegistration resourceHandlerRegistration = registry.addResourceHandler("/static/**");
            resourceHandlerRegistration.addResourceLocations("classpath:/static/");
        }
    
        /**
         * 视图解析
         *
         * @param registry 登记视图解析
         */
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            // WEB-INF前加/表示相对路径,如果不加在某些情况下会出错
            registry.jsp("/WEB-INF/views/", ".jsp");
        }
    
        /**
         * 添加拦截器,保证权限能够正常启用
         *
         * @param registry 登记拦截器
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            InterceptorRegistration interceptorRegistration = registry.addInterceptor(new UserInterceptor());
            interceptorRegistration.addPathPatterns("/**");
            interceptorRegistration.excludePathPatterns("/login");
            // "/"是LoginController的默认,即启动时的界面
            interceptorRegistration.excludePathPatterns("/");
            interceptorRegistration.excludePathPatterns("/retrievePassword");
            interceptorRegistration.excludePathPatterns("/getVerificationCode");
            interceptorRegistration.excludePathPatterns("/updatePassword");
    
            // static后面要加/**
            interceptorRegistration.excludePathPatterns("/static/**");
    
            InterceptorRegistration interceptorRegistration1 = registry.addInterceptor(new PowerInterceptor());
            interceptorRegistration1.addPathPatterns("/unit/**");
            interceptorRegistration1.addPathPatterns("/wholesaler/**");
    
            interceptorRegistration1.addPathPatterns("/employee/**");
            interceptorRegistration1.addPathPatterns("/userInfo/**");
            interceptorRegistration1.addPathPatterns("/commodity/**");
        }
    
        /**
         * 配合apache的commons依赖上传文件
         *
         * @return 文件上传处理
         */
        @Bean
        public CommonsMultipartResolver multipartResolver() {
            CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
            commonsMultipartResolver.setMaxUploadSize(1024 * 1024 * 1024L);
            return commonsMultipartResolver;
        }
    
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setDateFormat(sdf);
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
            //通过设置索引,让自己的转换器放在最前面,否则默认的jackson转换器会在前面,用不上我们设置的转换器.
            converters.add(0, converter);
        }
    
    }

    其实也就是实现

    WebMvcConfigurer

    里面可以重写一些有用的方法,根据需要来写,例如:我需要能够直接在浏览器地址访问web目录下和WEB-INF同级的html页面

    @Configuration
    @EnableWebSocketMessageBroker
    @EnableWebMvc
    @ComponentScan("com.test")
    public class StompConfig implements WebSocketMessageBrokerConfigurer {
    
        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            registry.enableSimpleBroker("/topic");
            registry.setApplicationDestinationPrefixes("app");
        }
    
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("chat");
            registry.addEndpoint("chat").withSockJS();
        }
    
        /**
         * 因为不能同时实现WebSocketMessageBrokerConfigurer和WebMvcConfigurer
         * 所以写一个内部类分别实现
         */
        class SssConfig implements WebMvcConfigurer {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                ResourceHandlerRegistration resourceHandlerRegistration = registry.addResourceHandler("/*.html");
                resourceHandlerRegistration.addResourceLocations("/");
                ResourceHandlerRegistration resourceHandlerRegistration1 = registry.addResourceHandler("/*.js");
                resourceHandlerRegistration1.addResourceLocations("/");
            }
        }
    }

    4.直接启动tomcat就可以了

    tomcat配置图片:

  • 相关阅读:
    时间格式
    分页1
    vs2010 VS2008 VS2005 快捷键大全
    css 常用标签
    JS Array数组操作
    CSS属性
    jquery 选择器大全
    @fontface
    以前写过的ajax基础案例(王欢huanhuan)
    Jquery操作下拉框(DropDownList)的取值赋值实现代码(王欢)
  • 原文地址:https://www.cnblogs.com/woyujiezhen/p/12771412.html
Copyright © 2020-2023  润新知