二gradle创建SSM项目——Hello word
一创建gradle web项目
1.以下是我的项目结构web工程+工具module,mapper用来存放mybatis-plus自动生成类,通过 MpGenerator.class 生成。

2.刚创建的web项目webapp下没有web.xml文件,生成方式如下所示


二spring配置 在resources文件夹下面新建以下文件(1~4)
1.jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/tobi_fresh? useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=root
2.logo4j.properties
log4j.rootLogger=error, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.org.apache=error log4j.logger.java.sql.ResultSet=error log4j.logger.java.sql.Connection=error log4j.logger.java.sql.Statement=error log4j.logger.java.sql.PreparedStatement=error log4j.logger.org.springframework=error log4j.logger.org.springframework.jdbc.support=error log4j.logger.org.springframework.scheduling=error
3.applicationContext.xml 省略头尾<beans>
<context:component-scan base-package="com.tobi.*.services"/> <context:property-placeholder location="classpath:jdbc.properties"/> <!--数据源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1"/> <property name="minIdle" value="1"/> <property name="maxActive" value="20"/> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/> <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 --> <property name="filters" value="stat"/> </bean> <!-- 定义 MP 全局策略 --> <bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- 主键策略配置 --> <!-- 可选参数 AUTO->`0`("数据库ID自增") INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID") --> <property name="idType" value="2"/> <!-- 数据库类型配置 --> <!-- 可选参数(默认mysql) MYSQL->`mysql` ORACLE->`oracle` DB2->`db2` H2->`h2` HSQL->`hsql` SQLITE->`sqlite` POSTGRE->`postgresql` SQLSERVER2005->`sqlserver2005` SQLSERVER->`sqlserver` --> <property name="dbType" value="MYSQL"/> <!-- 全局表为下划线命名设置 true --> <!-- <property name="dbColumnUnderline" value="true"/>--> <!--逻辑未删除全局值--> <!--<property name="logicNotDeleteValue" value="1"/>--> <!--逻辑删除全局值 逻辑删除的字段需要注解 @TableLogic--> <!-- <property name="logicDeleteValue" value="2"/>--> </bean> <!-- 会话工厂 完美整合 mybatis, 不需要mybatis配置文件--> <bean name="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations"> <array> <value>classpath:com/tobi/sqlxml/*.xml</value> </array> </property> <!-- 配置包别名 --> <property name="typeAliasesPackage" value="com.tobi.entity"/> <!-- 插件配置 --> <property name="plugins"> <array> <!-- 分页插件配置 --> <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"> <!-- 指定数据库方言 --> <property name="dialectType" value="mysql"/> </bean> <!-- SQL 执行分析拦截器 stopProceed 发现全表执行 delete update 是否停止运行 --> <bean id="sqlExplainInterceptor" class="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor"> <property name="stopProceed" value="false"/> </bean> </array> </property> <!-- MP 全局配置注入 --> <property name="globalConfig" ref="globalConfig"/> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.tobi.mapper"/> </bean> <!--声明式事物管理器--> <!-- 配置spring的PlatformTransactionManager,名字为默认值 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 配置基于注解的声明式事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>
4.spring-mvc.xml
<!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射 --> <mvc:default-servlet-handler/> <!--自动生成文档--> <mvc:resources location="classpath:/META-INF/resources/" mapping="swagger-ui.html"/> <mvc:resources location="classpath:/META-INF/resources/webjars/" mapping="/webjars/**"/> <!-- controller 扫描 --> <context:component-scan base-package="com.tobi.*.controller"/> <bean class="com.tobi.config.SwaggerConfig"/> <!-- handler(controller)映射器 用来寻找 controller 就是查找 对应的 @controller注解的类- 3.2以前是 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> <!-- handler(controller)适配器 用来执行controller 3.2以前是 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <!-- 消息解析 --> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html; charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 用来配置 返回json对象的参数, 默认 会出现 乱码 需要导入 jackson-annotations.jar,jackson-core.jar,jackson-databind.jar --> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html; charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </list> </property> <!-- 定义自己的绑定器 --> <property name="webBindingInitializer" ref="binder"/> </bean> <bean id="binder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <!-- 使用自己的绑定 解析器 比如 这里 用来 对 日期类型进行参数绑定 --> <property name="conversionService" ref="timeConversionService"/> <!-- 加 校验器 --> <!-- <property name="validator" --> </bean> <bean id="timeConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <!-- 定义自己的转换器 --> <property name="converters"> <set> </set> </property> </bean> <!-- 视图解析器 配置解析JSP jstl 的解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置前缀和后缀 , controller层 return modelandview 返回文件时 不用写前面的路径和后面的文件后缀名 --> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
5.web.xml
<!--加载 spring 容器 的配置文件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--加载 spring 容器 的配置文件--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!--springMvc前端控制器--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!--springMvc前端控制器--> <!--阿里巴巴监控配置--> <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/mysql/*</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>/log.html</welcome-file> </welcome-file-list> <session-config> <session-timeout>30</session-timeout> </session-config>
三mapper自动生成 mapper、entity、mapperXml
1.在module的build.gradle中添加依赖
//MyBatis-plus
compile "com.baomidou:mybatis-plus:2.1.4"
compile group: 'org.apache.velocity', name: 'velocity', version: '1.7'
//数据库驱动
compile "mysql:mysql-connector-java:5.1.23"
2.在 Java 文件夹建一个main方法(仅供参考,生成规则,数据库地址需要自己配置)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); gc.setOutputDir( "D:\\ProjectHub\\tobi\\mapper\\src\\main\\java" ); gc.setFileOverride( true ); gc.setActiveRecord( true ); gc.setEnableCache( false ); // XML 二级缓存 gc.setBaseResultMap( true ); // XML ResultMap gc.setBaseColumnList( false ); // XML columList gc.setAuthor( "tobi" ); // 自定义文件命名,注意 %s 会自动填充表实体属性! // dev.setMapperName("%sDao"); // dev.setXmlName("%sDao"); // dev.setServiceName("MP%sService"); // dev.setServiceImplName("%sServiceDiy"); mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setDbType(DbType.MYSQL); dsc.setTypeConvert( new MySqlTypeConvert(){ // 自定义数据库表字段类型转换【可选】 @Override public DbColumnType processTypeConvert(String fieldType) { return super.processTypeConvert(fieldType); } }); dsc.setDriverName( "com.mysql.jdbc.Driver" ); dsc.setUsername( "root" ); dsc.setPassword( "root" ); dsc.setUrl( "jdbc:mysql://127.0.0.1:3306/tobi_fresh?characterEncoding=utf8" ); mpg.setDataSource(dsc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意 strategy.setTablePrefix( new String[] { "b_" , "c_" , "m_" , "p_" , "s_" , "t_" }); // 此处可以修改为您的表前缀 strategy.setNaming(NamingStrategy.underline_to_camel); // 表名生成策略 // strategy.setInclude(new String[] { "user" }); // 需要生成的表 // strategy.setExclude(new String[]{"test"}); // 排除生成的表 // 自定义实体父类 // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity"); // 自定义实体,公共字段 // strategy.setSuperEntityColumns(new String[] { "test_id", "age" }); // 自定义 mapper 父类 // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper"); // 自定义 service 父类 // strategy.setSuperServiceClass("com.baomidou.demo.TestService"); // 自定义 service 实现类父类 // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl"); // 自定义 controller 父类 // strategy.setSuperControllerClass("com.baomidou.demo.TestController"); // 【实体】是否生成字段常量(默认 false) // public static final String ID = "test_id"; // strategy.setEntityColumnConstant(true); // 【实体】是否为构建者模型(默认 false) // public User setName(String name) {this.name = name; return this;} // strategy.setEntityBuliderModel(true); mpg.setStrategy(strategy); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent( "com" ); pc.setModuleName( "tobi" ); pc.setMapper( "mapper" ); pc.setXml( "sqlxml" ); mpg.setPackageInfo(pc); // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/template 下面内容修改, // 放置自己项目的 src/main/resources/template 目录下, 默认名称一下可以不配置,也可以自定义模板名称 TemplateConfig tc = new TemplateConfig(); tc.setController( null ); //tc.setEntity("/templates/entity.java.vm");//模版自定义添加了逻辑删除注解。 //tc.setMapper(null); //tc.setXml(null); tc.setService( null ); tc.setServiceImpl( null ); //如上任何一个模块如果设置 空 OR Null 将不生成该模块。 mpg.setTemplate(tc); // 执行生成 mpg.execute(); // 打印注入设置 // System.err.println(mpg.getCfg().getMap().get("abc")); } |

四 创建 controller, services
回到web项目,创建controller 和 services 包 类使用 @Controller @Services 注解

@Controller public class LogController { @RequestMapping("log") @ResponseBody public AjaxMsg log(){ Map<String,Object> map=new HashMap<>(); map.put("title","hello word"); map.put("content","a"); AjaxMsg ajaxMsg=new AjaxMsg(); ajaxMsg.setCode(200); ajaxMsg.setMsg("a"); ajaxMsg.setObject(map); return ajaxMsg; } private class AjaxMsg{ ``````` } @RequestMapping("indexJsp") public String indexJsp(Model model){ model.addAttribute("a","a"); return "index"; } }
里面有个@ResponseBody注解用于浏览器直接返回 json 需要用到
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: jackson_version
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: jackson_version
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: jackson_version
~ 对应spring-mvc,xml 中映射器适配器配置
五Hello word
添加一个Tomcat server 并部署 war(exploded) 运行后 输了localhost:8080/index.html

最后
报错406,检查spring-mvc.xml 映射器适配器;jackson的三个包有没有添加,
报错404,检查web.xml过滤器
作者:罗宾船长
链接:https://www.jianshu.com/p/92f77158d29f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库