花了一个多礼拜学习了SSM框架的内容,之前只知道这个名词或者只知道一些面经的内容,这次进行了实操,开发一个简单的SSM的步骤。简单说来SSM令人印象最深的还是XML文件的配置,相比SpringBoot繁琐很多,但是这是地基,它是整个开发的基础,之后的技术都是在这里扩展的。
一.开发的主要流程概括为三大部分:第一个是创建数据库;第二个是在开发环境中创建与数据库对应的接口,业务接口,web接口dao层,service层,controller层;第三是创建配置文件文件xml,properties等
创建数据库和对应的接口层
1.创建数据库,创建表比如account表 2.根据数据库中的表在IDEA中创建com.lzm.domain.account实体类 3.创建com.lzm.mapper.AccountMapper的Dao接口这里是与数据库打交道的接口,这里不用创建相应的实现类是因为可以使用代理的方式来实现,但是需要满足一些条件:后期的AccountMapper.xml文件中的mapper标签的namespace要为com.lzm.mapper.AccountMapper,service里调用的方法名参数也要与AccountMapper接口相同 4.创建com.lzm.service.AccountService接口及com.lzm.service.impl.AccountServiceImpl实现类,这里写业务代码 5.创建com.lzm.controller.AccountController类,主要是与web层对接,返回数据,页面跳转等。
创建xml和properties文件
1.applicationContext.xml---关于spring的bean对象管理的文件,一般用注解开发的话只需要配置包扫描
2.spring-mvc.xml---关于springmvc相关的配置:包扫描;mvc注解驱动;内部资源视图解析器resourceViewResolver;开放静态资源访问权限
前两个是关于spring和springmvc的配置,下面是关于mybatis的配置
3.accountMapper.xml---映射文件,数据库字段与java实体类映射关系,里面主要写sql语句
4.sqlMapConfig.xml---核心配置文件,主要配置别名,环境,加载mapper映射(accountMapper.xml)文件
5.jdbc.properties---数据库相关的配置driver,url,usename,password等
6.web.xml---web相关的配置,spring监听器,springmvc前端控制器,乱码过滤器等
================================================================
1.创建数据库,创建表比如account表
2.创建对应的controller层,service层,dao层,实体类,注意service和mapper交给spring的applicationContext.xml扫描,controll层交给spring-mvc扫描
3.创建对应的xml文件和properties文件
二.上述创建和配置的文件基本搭建好了框架,接下来就是在创建的部分编写对应的代码,这里为了突出重点,以简单的模块不涉及复杂业务,为了能更好理解。
1.数据库中的表创建id,name,money字段
2.Account实体类中的内容,根据数据库中的字段映射,然后生成getter和setter方法
package com.lzm.domain;
public class Account {
private Integer id;
private String name;
private Double money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
3.dao层的AccountMapper接口定义save和findAll方法
package com.lzm.mapper;
import com.lzm.domain.Account;
import java.util.List;
public interface AccoutMapper {
public void save(Account account);
public List<Account> findAll();
}
4.service层下的AccountService和AccountServiceImpl编写具体的逻辑代码,这里编写的是mybatis的具体步骤
AccountService接口
package com.lzm.service;
import com.lzm.domain.Account;
import java.util.List;
public interface AccountService {
public void save(Account account);
public List<Account> findAll();
}
AccountServiceImpl
package com.lzm.service.impl;
import com.lzm.domain.Account;
import com.lzm.mapper.AccoutMapper;
import com.lzm.service.AccountService;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Override
public void save(Account account) {
try{
InputStream resourseAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");//加载核心配置文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourseAsStream);//创建SqlSessionFactory
SqlSession sqlSession = sqlSessionFactory.openSession();//创建sqlsessionfactory
AccoutMapper mapper = sqlSession.getMapper(AccoutMapper.class);//使用代理的方式
mapper.save(account);//调用dao中mapper的save方法
sqlSession.commit();//事务提交 如果openSession(true)则可以自动提交
sqlSession.close();//关闭资源
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public List<Account> findAll() {
try{
InputStream resourseAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourseAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
AccoutMapper mapper = sqlSession.getMapper(AccoutMapper.class);
List<Account> accountList=mapper.findAll();
sqlSession.commit();
sqlSession.close();
return accountList;
}catch (IOException e){
e.printStackTrace();
}
return null;
}
}
5.编写controller层代码
package com.lzm.controller;
import com.lzm.domain.Account;
import com.lzm.service.AccountService;
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.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Controller//交给spring管理
@RequestMapping("/account")//与客户端的映射地址
public class AccountController {
@Autowired
private AccountService accountService;
//保存
@RequestMapping("/save")//页面跳转地址
@ResponseBody//表示只需要回显数据 不进行页面跳转
public String save(Account account){
accountService.save(account);
return "保持成功";
}
//查询
// @RequestMapping("/findAll")
public ModelAndView findAll(){
List<Account> accountList=accountService.findAll();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("accountList",accountList);
modelAndView.setViewName("accountList");
return modelAndView;
}
}
二.xml和properties配置文件
1.applicationContext.xml主要进行包扫描配置,管理service和mapper
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 组件扫描 扫描service和mapper-->
<context:component-scan base-package="com.lzm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
2.spring-mvc.xml文件主要配置组件扫描controller层,mvc注解注册驱动,内部视图资源解析器,开放静态资源
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 组件扫描 Controller-->
<context:component-scan base-package="com.lzm.controller"></context:component-scan>
<!-- 配置mvc注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 内部资源视图解析器-->
<bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 开放静态资源访问权限-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
3.accountMapper.xml,mybatis的映射文件,映射数据库中的字段和java实体类,编写sql语句
<?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">
<mapper namespace="com.lzm.mapper.AccoutMapper">
<insert id="save" parameterType="account">
insert into account values (#{id},#{name},#{money})
</insert>
<select id="findAll" resultType="account">
select * from account
</select>
</mapper>
4.sqlMapConfig.xml,mybatis核心配置文件,可以配置类别名,环境,mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载properties文件-->
<properties resource="jdbc.properties"></properties>
<!-- 定义别名-->
<typeAliases>
<!-- <typeAlias type="com.lzm.domain.Account" alias="account"></typeAlias>-->
<!-- 也可以使用扫包的方式 默认是Account或者account-->
<package name="com.lzm.domain"></package>
</typeAliases>
<!-- 环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射-->
<mappers>
<!-- <mapper resource="com/lzm/mapper/accountMapper.xml"></mapper>-->
<!-- 也可以使用扫包的方式-->
<package name="com.lzm.mapper"></package>
</mappers>
</configuration>
5.jdbc.properties文件数据库相关的配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=123456
6.web.xml文件配置spring监听器,springmvc前端控制器,乱码过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- spring监听器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springmvc前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 乱码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
7.log4j日志文件
#
# Hibernate, Relational Persistence for Idiomatic Java
#
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
#
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=all, stdout
到这里就不SSM开发的流程梳理完毕,可能有很多不足,但我这里总结的是一些核心的东西,还有很多细节或者其他功能举一反三就行。
总体来说开发的具体思路是:创建数据库,创建表,然后在开发环境中创建数据库对应的实体类进行映射,接下来就是创建controller层,service层,dao层,里面编写代码,最后创建各种xml配置文件。其实我创建文件的思路就是根据客户端从发出请求到收到响应的过程创建的,它是这么一个过程,客户端发送请求,通过tomcat服务器,在服务器中进行地址解析,生成request,response对象等操作,交给springmvc的前端控制器DispatchServlet,然后根据前端控制器找到各种handle,返回ModelAndView给DispatchServlet,最后通过视图解析器ViewResolver生成View返回给客户端。这个是spingmvc工作大致流程。
从另外的角度可以这样理解:客户端发送请求给服务器,在controller层接受请求,然后调用service层,service层具体代码会调用dao层的mapper方法,然后dao层访问数据库拿到数据返回,将其封装成java对象返回给service层,在返回给controller层,最后返回给客户端。
SSM开发比较麻烦,他需要配置很多文件,接下来就是需要使用SpringBoot开发,简化很多配置,大多是使用默认配置,约定大于配置。