由于期末需要用到java的后台框架ssm做设计,所以临时学习了ssm,这个是搭ssm的教程,写在这里便于以后查看
书写于2019/06/18 15:13
1 搭建开发环境
这里使用
maven
+eclipse
+tomcat
+jdk1.8
进行搭建教程里的是
tomcat8
+jkd1.8
+maven3.3.9
进行搭建
-
配置tomcat
tomcat下载地址
windows->preferences->server->runtime->add一个新的tomcat就行了
-
配置maven
maven下载地址Maven – Download Apache Maven
windows ->preferences->Maven->installations->add一个新的maven就行
-
创建maven工程
file->new->others->搜索maven->选择maven project->next->选择下图的选项
点击finish就行,接下来会maven会下载相关的配置文件,如果觉得下不动,可能就要科学上网了
-
修复错误
-
修复第一个error,需要将tomcat的一个包导入
右击项目->Properties->java build path->library->add library->server runtime->选择tomcat版本->finish
-
修复warning
Description Resource Path Location Type Build path specifies execution environment J2SE-1.5. There are no JREs installed in the workspace that are strictly compatible with this environment. o2o Build path JRE System Library Problem
-
1 |
|
-
新建java resources文件夹
src/tests/resources
-
右击项目->properties->java build path->source->选择我们新建的文件夹->输入target/classes->apply
-
-
补充
javaweb主要分为静态和动态两种,动态的页面包括动态的信息,jsp之类的,静态的页面是直接写死的,这里我们的是动态的,有一个选项是dynamic web module,如果选择的版本越高,解析的速度就越快
-
选择properities->project->facets里面选择dynamic web module,由于在里面直接改的话是不行的,所以需要修改他的一个配置文件
-
修改项目目录/.setting/org.eclipse.wst.common.project.facet.core.xml
1
2
3
4
5
6
7<?xml version="1.0" encoding="UTF-8"?> <faceted-project> <fixed facet="wst.jsdt.web"/> <installed facet="jst.web" version="3.1"/><!--修改为这个的版本--> <installed facet="wst.jsdt.web" version="1.0"/> <installed facet="java" version="1.8"/> </faceted-project>
-
然后refresh一下项目,看一下properities->project->facets里面选择dynamic web module,看看是不是最新的版本
-
修改src/main/webapp/web.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> </web-app> <!--修改为--> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <display-name>Archetype Created Web Application</display-name> </web-app>
-
2 开始学习前
项目目录结构
- source folder里面的src/main/java主要放置的是业务的java代码
- src/main/resources主要放置的是项目的资源文件,比如各种spring、mybasics、日志配置文件
- src/test/java主要放置的是单元测试所涉及的java代码
- src/test/resources这个没什么,只是maven项目的话加这个比较符合规范
- src/main/webapp目录下用与放html之类的
新建source folder和package
- 新建source folder
src/main/resoures/spring
用于放spring的配置信息和src/main/resources/mapper
用于放dao的实现类之类的 - 新建名为web的
package
,用于放置controller层的,存放控制器 - 新建名为service的
package
,用于放置业务逻辑层的 - 新建名为service.impl的
package
,用于实习业务逻辑层的 - 新建名为dao的
package
,用于与数据打交道的 - 新建名为dto的
package
,用于扩展entity的功能 - 新建名为enums的
package
,枚举类型存放位置 - 新建名为interceptor的
package
,拦截器 - 新建名为util的
package
,通用工具类
引入工程所需要jar包
原来的porm.xml
1 |
|
修改后
1 |
|
配置数据库连接
在src/main/resources
里新建jdbc.properties,里面这么写
1 |
|
在src/main/resources
里新建mybatis-config.xml
里面配置
1 |
|
配置spring-dao
在src/main/resources/spring
里新建spring-dao.xml
里面配置
1 |
|
配置spring-service
在src/main/resources/spring
里新建spring-service.xml
里面配置
1 |
|
配置spring-web
在src/main/resources/spring
里新建spring-web.xml
里面配置
1 |
|
将上面的配置整合到web.xml
里面
1 |
|
3 验证之前的配置是否成功
验证DAO
这里的话是通过单元测试的方法来测试是否连接成功,小步骤如下
- 新建dao层的接口
- 在mapper里面建立与数据库的连接
- 新建test进程
-
新建
AreaDao
接口,在com.iaoe.jwExp.dao
包下,写入查询接口queryArea()
方法1
2
3
4
5
6
7
8
9
10
11
12package com.iaoe.jwExp.dao; import java.util.List; import com.iaoe.jwExp.entity.Area; public interface AreaDao { /** * 列出区域列表 * @return areaList */ List<Area> queryArea(); }
-
在src/main/resources/mapper里面添加我们与数据库之间的映射
AreaDao.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<?xml version="1.0" encoding="UTF-8"?> <!--这里用于做规范--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--1.命名空间namespace代表Dao层所在的位置--> <!--2.id为查询的方法名,resultType说明返回的是Area类--> <!--3.中间的是查询语句--> <mapper namespace="com.iaoe.jwExp.dao.AreaDao"> <select id="qureyArea" resultType="com.iaoe.jwExp.entity.Area"> SELECT area_id,area_name,priority,create_time,last_edit_time FROM tb_area ORDER BY priority DESC </select> </mapper>
-
在
src/test/java
里面新建包com.iaoe.jwExp
,并新建BaseTest.java
程序1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package com.iaoe.jwExp; import org.junit.runner.RunWith; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.ContextConfiguration; /** * 配置spring和junit整合,junit启动时加载springIOC容器 * @author iAoe * */ //使用哪个junit @RunWith(SpringJUnit4ClassRunner.class) //告诉junit spring配置文件 @ContextConfiguration({ "classpath:spring/spring-dao.xml" }) public class BaseTest { }
-
在
src/test/java
里面新建包com.iaoe.jwExp.iaoe
,并新建AreaDaoTest.java
程序1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package com.iaoe.jwExp.dao; import java.util.List; import static org.junit.Assert.assertEquals; import org.springframework.beans.factory.annotation.Autowired; import org.junit.Test; import com.iaoe.jwExp.BaseTest; import com.iaoe.jwExp.entity.Area; public class AreaDaoTest extends BaseTest{ @Autowired private AreaDao areaDao; @Test public void testQueryArea() { List<Area> areaList = areaDao.queryArea(); assertEquals(2,areaList.size()); //断言,先在数据库建两条数据 } }
-
验证成功画面
验证service
验证service的方法和验证dao层的方式类似
创建service里的接口类
- 实现service的接口类
- 设置单元测试类
-
在
com.iaoe.jwExp.service
创建AreaService
接口类1
2
3
4
5
6
7
8
9package com.iaoe.jwExp.service; import java.util.List; import com.iaoe.jwExp.entity.Area; public interface AreaService { List<Area> getAreaList(); }
-
在
com.iaoe.jwExp.service.impl
创建AreaServiceImpl
实现类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.iaoe.jwExp.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.iaoe.jwExp.dao.AreaDao; import com.iaoe.jwExp.entity.Area; import com.iaoe.jwExp.service.AreaService; @Service public class AreaServiceImpl implements AreaService{ @Autowired private AreaDao areaDao; @Override public List<Area> getAreaList() { return areaDao.queryArea(); } }
-
修改
src/test/java
里的com.iaoe.jwExp
的BaseTest
类,将service.xml导入1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.iaoe.jwExp; import org.junit.runner.RunWith; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.ContextConfiguration; /** * 配置spring和junit整合,junit启动时加载springIOC容器 * @author iAoe * */ @RunWith(SpringJUnit4ClassRunner.class) //告诉junit spring配置文件 @ContextConfiguration({ "classpath:spring/spring-dao.xml","classpath:spring/spring-service.xml" }) //这里加入了srvice.xml public class BaseTest { }
-
在
src/test/java
里的com.iaoe.jwExp.service
里创建AreaServiceTest
类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.iaoe.jwExp.service; import static org.junit.Assert.assertEquals; import java.util.List; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.iaoe.jwExp.BaseTest; import com.iaoe.jwExp.entity.Area; public class AreaServiceTest extends BaseTest{ @Autowired private AreaService areaService; @Test public void testAreaList() { List<Area> areaList = areaService.getAreaList(); assertEquals("西方",areaList.get(0).getAreaName());//用于测试第一个数据库的结果是不是西方 } }
验证WEB
-
在
src/main/java
里com.iaoe.jwExp.web.superadmin
里新建AreaController
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
41package com.iaoe.jwExp.web.superadmin; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.iaoe.jwExp.entity.Area; import com.iaoe.jwExp.service.AreaService; @Controller @RequestMapping("/superadmin") public class AreaController { @Autowired private AreaService areaService; // 使用get方法 @RequestMapping(value = "/listarea", method = RequestMethod.GET) // 直接将对象转为json对象 @ResponseBody private Map<String, Object> listArea() { Map<String, Object> modelMap = new HashMap<String, Object>(); List<Area> list = new ArrayList<Area>(); try { list = areaService.getAreaList(); modelMap.put("rows", list); modelMap.put("total", list.size()); } catch (Exception e) { e.printStackTrace(); modelMap.put("success", false); // 返回错误信息 modelMap.put("errMsg", e.toString()); } return modelMap; } }
4 logback
logback主件的作用主要作用两个,一个是错误追踪,一个是显示程序状态
logback介绍
logback的主要模块
-
logback-access
第三方软件可以通过这个模块来获取logback日志
-
logback-classic
可以方便切换其他日志系统
-
logback-core
为前面两个提供基础支持
logback主要标签
-
logger
存放日志对象,可以定义日志类型和级别
-
appender
指定日志输出的目的地/媒介,如控制台,文件
-
layout
格式化日志信息
logback配置
在src/main/resources
里面建立一个logback.xml
1 |
|
验证logback
修改我们之前的AreaController
文件
1 |
|
控制台输出的信息如下
日志文件输出如下
web.xml
1. 修改默认启动页面
1 |
|
小问题
Eclipse文字大小不一
Window –> Preferences –> General –> Appearance –> Colors and Fonts,在“Colors and Fonts”中选择“Basic”–>”Text Font”,然后点“Edit”,把右下角脚本改为中欧字符即可。
小知识
datetime和timestamp的区别
datetime支持从0000年到9999年,而timestamp支持从1970年开始,而timestamp是全球统一时间,如果你的系统是跨区域的话,使用timestamp就比较好
mysql引擎engine之间的区别
MYISAM
表检索,读表的性能高,但当更新某个键值的时候,就会锁掉这个表,如果有其他线程修改这个表的某行数据,那么是需要等待的,如果需要达99%的稳定性,方便扩展性和高可用性的话,读多写少
,就选择MYISAM
InnoDB
行检索,更新某个表的某行时,给某行加锁,可以更新其他行,读少写多
,选择InnoDB
unique key的用处
使用unique key类似于建立一个索引,查询速率会变快,但是不要建立太多的索引,添加一个唯一索引的方法
1 |
|
id) ```