最近把j2e的基礎(chǔ)學(xué)了绎秒,不敢說精通辕漂,但我想盡快摸清java開發(fā)的套路呢灶,接觸更多東西,故選擇學(xué)習(xí)ssm框架钉嘹。通過不斷實踐的方式來掌握更多知識鸯乃。
聲明:本系列文章全都是在什么都不懂的前提下不斷摸索踩坑。本人一般看不下那些巨厚的教程書跋涣,我選擇通過實踐操作缨睡,再結(jié)合書籍、前人博客等資料來深入學(xué)習(xí)陈辱。但網(wǎng)絡(luò)上無論有多少教程奖年,自己操作時一定一定會遇到各種問題,還是要記錄一下性置。
ssm框架是spring+springMVC+myBatis拾并,一套近來很火的java互聯(lián)網(wǎng)輕量級開發(fā)框架,有取代ssh的趨勢鹏浅。構(gòu)建ssm項目的第一步是搭建開發(fā)框架嗅义,各種導(dǎo)包、配置文件隐砸。本次我使用工具有:idea2018.1.4之碗,maven,tomcat9.07季希,jdk8褪那,操作系統(tǒng)為manjaroKDE(一種linux,不重要)式塌。主要參考了這個博客博敬。
補充更新
- 在IDEA中添加tomcat時沒有tomcat可選。解決方法:打開File-setting-搜索tomcat-在Plugins右邊勾選tomcat峰尝。
- 在IDEA中運行tomcat的時提示沒有權(quán)限偏窝。解決方法:打開終端,進入tomcat\bin目錄,然后執(zhí)行chmod 777 *.sh
新建maven項目
首先創(chuàng)建maven項目:選擇Maven項目祭往,更方便管理伦意。勾選Create form archetype,選擇下方帶webapp的硼补,next驮肉。注意觀察圖片。
填寫GroupId已骇,一般是網(wǎng)站的倒寫离钝,這里我填com.ssm.learn。ArtifactId為項目名稱疾捍,這里我起名webssm奈辰。Version為本項目版本栏妖,一般不需要改乱豆。這些都會在下面的配置文件中體現(xiàn)。圖沒截到吊趾。
這里添加一行宛裕,name=archetypeCatalog,value=internal论泛。防止maven更新揩尸,加載速度更快。文件結(jié)構(gòu)及代碼,注意修改以對應(yīng)自己的項目
目錄main下新建文件夾java诚镰、resources(貌似以前resources自動生成奕坟,但idea2018沒有,要自己建)清笨。目錄src下新建文件夾test月杉,test下新建文件夾java。結(jié)構(gòu)如圖:打開File-Project Structure-Modules首懈,可以看到右邊有4個標(biāo)記結(jié)構(gòu)目錄绊率。
修改pom.xml滤否,maven會根據(jù)這個配置文件自動下載所需的jar包,包括spring包最仑,mabatis等藐俺。這里給出的我的代碼也是拿別人的,記住要經(jīng)過仔細修改才能對應(yīng)與自己的項目泥彤。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ssm.learn</groupId> <!--改成自己的groupId-->
<artifactId>webssm</artifactId> <!--改成自己的項目名-->
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>webssm Maven Webapp</name> <!--前面改成自己的groupId-->
<url>http://maven.apache.org</url>
<properties>
<!-- 設(shè)置項目編碼編碼 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- spring版本號 -->
<spring.version>4.3.5.RELEASE</spring.version>
<!-- mybatis版本號 -->
<mybatis.version>3.4.1</mybatis.version>
</properties>
<dependencies>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- 實現(xiàn)slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<!-- 數(shù)據(jù)庫 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
<scope>runtime</scope>
</dependency>
<!-- 數(shù)據(jù)庫連接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<!--改這里欲芹,項目名-->
<finalName>webssm</finalName>
</build>
</project>
接下來各種新建包,class吟吝,xml菱父,properties文件。與圖片中的目錄結(jié)構(gòu)對應(yīng)剑逃,缺就建浙宜。注意再建spring-mvc.xml和spring-mybatis.xml文件時,idea的上面有提示配置蛹磺,點擊進去按照默認(rèn)點ok就行粟瞬。如圖:
接下來打代碼,過程中按照自己的項目修改import的包名萤捆,如有出錯可以等全部代碼打完再看錯誤點裙品。記得根據(jù)提示引入javaEE 6的包,不然servlet報錯:
UserController.java
package com.ssm.learn.controller;
import javax.servlet.http.HttpServletRequest;
import com.ssm.learn.pojo.User;
import com.ssm.learn.service.IUserService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
private IUserService userService;
@RequestMapping("/showUser.do")
public void selectUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
long userId = Long.parseLong(request.getParameter("id"));
User user = this.userService.selectUser(userId);
ObjectMapper mapper = new ObjectMapper();
response.getWriter().write(mapper.writeValueAsString(user));
response.getWriter().close();
}
}
UserDao.xml(再dao.mapper目錄下俗或,是mybatis框架配合IUserDao的接口通過xml中的sql語句操作數(shù)據(jù)庫市怎,具體使用請了解mybatis)
<?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">
<!-- 設(shè)置為IUserDao接口方法提供sql語句配置,這個xml是mybatis的使用方式 -->
<mapper namespace="com.ssm.learn.dao.IUserDao">
<select id="selectUser" resultType="User" parameterType="long">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
IUserDao.java
package com.ssm.learn.dao;
import com.ssm.learn.pojo.User;
//mybatis框架,interface配合xml
public interface IUserDao {
User selectUser(long id);
}
User.java(簡單java類蕴侣,包含getter和setter)
package com.ssm.learn.pojo;
public class User {
private long id;
private String password;
private String username;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
UserServiceImpl.java(在service.impl目錄下)
package com.ssm.learn.service.impl;
import com.ssm.learn.dao.IUserDao;
import com.ssm.learn.pojo.User;
import com.ssm.learn.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("userService")
public class UserServiceImpl implements IUserService {
@Resource
private IUserDao userDao;
public User selectUser(long userId) {
return this.userDao.selectUser(userId);
}
}
IUserService.java
package com.ssm.learn.service;
import com.ssm.learn.pojo.User;
public interface IUserService {
public User selectUser(long userId);
}
先在mysql命令行中建立一個測試數(shù)據(jù)庫ssmtest
create database ssmtest;
使用idea的數(shù)據(jù)庫工具連接數(shù)據(jù)庫焰轻。
編寫測試用ssmtest.sql文件。
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
`password` varchar(255) NOT NULL COMMENT '用戶密碼',
`username` varchar(255) NOT NULL COMMENT '用戶昵稱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '123', 'test');
SET FOREIGN_KEY_CHECKS=1;
jdbc.properties(數(shù)據(jù)庫配置文件昆雀,填寫數(shù)據(jù)庫名辱志,用戶名,密碼)
jdbc.driver=com.mysql.jdbc.Driver
#數(shù)據(jù)庫地址(下面的ssmtest是我的測試用數(shù)據(jù)庫狞膘,自行修改)
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssmtest?useUnicode=true&characterEncoding=utf8
#用戶名
jdbc.username=自己數(shù)據(jù)庫用戶名揩懒,一般為root
#密碼
jdbc.password=自己數(shù)據(jù)庫密碼
#最大連接數(shù)
c3p0.maxPoolSize=30
#最小連接數(shù)
c3p0.minPoolSize=10
#關(guān)閉連接后不自動commit
c3p0.autoCommitOnClose=false
#獲取連接超時時間
c3p0.checkoutTimeout=10000
#當(dāng)獲取連接失敗重試次數(shù)
c3p0.acquireRetryAttempts=2
配置文件spring-mvc.xml,仔細修改適應(yīng)自己的項目挽封。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 掃描web相關(guān)的bean -->
<context:component-scan base-package="com.ssm.learn.controller"/>
<!-- 開啟SpringMVC注解模式 -->
<mvc:annotation-driven/>
<!-- 靜態(tài)資源默認(rèn)servlet配置 -->
<mvc:default-servlet-handler/>
<!-- 配置jsp 顯示ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
配置文件spring-mybatis.xml已球,自行修改,這兩個文件仔細修改會有很多收獲,智亮。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 掃描service包下所有使用注解的類型 -->
<context:component-scan base-package="com.ssm.learn"/>
<!-- 配置數(shù)據(jù)庫相關(guān)參數(shù)properties的屬性:${url} -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 數(shù)據(jù)庫連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
<property name="minPoolSize" value="${c3p0.minPoolSize}"/>
<property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
<property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
<property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
</bean>
<!-- 配置SqlSessionFactory對象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入數(shù)據(jù)庫連接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 掃描model包 使用別名 -->
<property name="typeAliasesPackage" value="com.ssm.learn.pojo"/>
<!-- 掃描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:com/ssm/learn/dao/mapper/*.xml"/>
</bean>
<!-- 配置掃描Dao接口包忆某,動態(tài)實現(xiàn)Dao接口,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 給出需要掃描Dao接口包 -->
<property name="basePackage" value="com.ssm.learn.dao"/>
</bean>
<!-- 配置事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入數(shù)據(jù)庫連接池 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置基于注解的聲明式事務(wù) -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
web.xml文件(在webapp.WEB-INF下)
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>ChatRobot</display-name>
<description>ChatRobot_Alpha_0.0.1</description>
<!-- 編碼過濾器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<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>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC需要加載的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<!--<servlet>-->
<!--<servlet-name>UserController</servlet-name>-->
<!--<servlet-class>com.ssm.learn.controller.UserController</servlet-class>-->
<!--</servlet>-->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 匹配所有請求阔蛉,此處也可以配置成 *.do 形式 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
index.html(先用一個html測試一下)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<script>
function selectUser() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("test").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("POST", "user/showUser.do", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("id=1");
}
</script>
<body>
<p id="test">Hello World!</p>
<button type="button" onclick="selectUser()">onclick test</button>
</body>
</html>
配置tomcat服務(wù)器
添加tomcat服務(wù)器弃舒,點擊:
運行效果
運行效果1:結(jié)束語
搭建ssm框架是項目的第一步饲宿。我在搭這個時找了很多博客,資料胆描,每個人的博客或多或少有不知瘫想。我希望通過這次記錄一下搭建框架的流程,給后來者幫助昌讲。
參考資料
http://www.reibang.com/p/8e307939dd67
https://blog.csdn.net/u010740881/article/details/79480500
https://blog.csdn.net/qq598535550/article/details/51703190