概述
源码:https://github.com/Thinkingcao/silence-xml-ssm
目录
一、前言
二、三层架构
三、概述
四、SSM框架搭建环境
4.1. 开发工具版本
4.2. 框架依赖版本
4.3.创建数据库和表结构语句脚本
4.4.IDEA创建Maven项目,导入依赖,pom.xml依赖如下
4.5 项目截图
4.6. 编写实体类
4.7. 编写dao层Mapper接口
4.8. 编写service接口和实现类
4.9. 编写mapper.xml
4.10. 编写Controller
五、定义基础配置文件信息
六、集成Spring框架配置文件编写
七、SpringMVC框架代码的编写
八、完整web.xml配置信息
九、加入log4j配置文件打印日志
十、新建页面测试
十一、启动项目
十二、项目源码
一、前言
当下到了2019年,SpringBoot经过前几年的实战,现在基本占领了Java主流框架的市场,SSM、SSH这些传统框架已经成为过去,SpringBoot框架已经全面铺开使用了,他的“约定大于配置”,将Java传统的在整合SSM、SSH框架时所需要的一些集成其他框架都封装的很完美,开发者门槛更低了,开发者可以不懂底层封装、配置,也可以上手开发Web项目了,究其底层封装,其实还是离不开像SSM框架哪些XML的配置类,只不过SpringBoot框架是使用new Bean和注解的形式来替代了传统的XML配置,理解了传统SSM框架使用XML配置更容易懂SpringBoot快速开发框架了,这里便记录一篇博客:Spring+SpringMVC+Mybatis完整详细搭建
二、三层架构理念
在生活中,饭店中员工根据工作岗位的不同会划分为很多个职位,比如服务员、厨师、采购员、收营员等等。我们可以想象一下如果在工作中岗位不清晰,一个员工一会扮演厨师、一会扮演服务员,此时工作不仅混乱且效率比较低。所以我们能发现职责分离非常重要。
类比饭店中的职位划分,在Web开发中的最佳实践就是根据每一层的功能职责的不同,划分为控制层、业务层、持久层。
控制层 :web/mvc: 负责处理与界面交互的相关操作 (Struts2/Spring MVC)
业务层 :service: 负责复杂的业务逻辑计算和判断 (Spring)
持久层 :dao/mapper: 负责将业务逻辑数据存储到数据库 (Hibernate/MyBatis)
在这里,大家耳熟能详的SSH (Struts1/2+Spring+Hibernate), SSM(SpringMVC+Spring+MyBatis)框架组合就出现了。
三、概述
在写代码之前我们先了解一下Spring、SpringMVC、Mybatis这三个框架分别是干什么的?
1. SpringMVC:
它用于web层,相当于controller(等价于传统的servlet和struts的action),用来处理用户请求。举个例子,用户在 地址栏输入 http://网站域名/login,那么springmvc就会拦截到这个请求,并且调用controller层中相应的方法,(中间可能包含验证用户名和密 码的业务逻辑,以及查询数据库操作,但这些都不是springmvc的职责),最终把结果返回给用户,并且返回相应的页面(当然也可以只返回json/xml等格式数据)。springmvc就是做前面和后面过程的活,与用户打交道!!
2. Spring:
太强大了,以至于我无法用一个词或一句话来概括它。但与我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们java中的类,当然也包括service dao里面的),有了这个机制,我们就不用在每次使用这个类的时候为它初始化,很少看到关键字new。另外spring的aop,事务管理等等都是我们经常用到的。
3. MyBatis:
持久层,如果你问我它跟鼎鼎大名的Hibernate有什么区别?我只想说,他更符合我的需求。第一,它能自由控制sql,这会让有 数据库经验的人(当然不是说我啦~捂脸~)编写的代码能搞提升数据库访问的效率。第二,它可以使用xml的方式来组织管理我们的sql,因为一般程序出错很多情况下是sql出错,别人接手代码后能快速找到出错地方,甚至可以优化原来写的sql。
四、SSM框架搭建环境
4.1. 开发工具版本
>开发工具: IDEA2018
>JDK: 1.8
>Maven:3.5
>Tomcat:8
4.2. 框架依赖版本
>MyBatis.Version:3.5.0
>Spring.Version:5.1.0.RELEASE
>SpringMVC.Version:5.1.0.RELEASE
4.3.创建数据库和表结构语句脚本
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `age` tinyint(4) DEFAULT NULL, `born_date` date DEFAULT NULL, `head_img` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ---------------------------- -- Records of t_user -- ---------------------------- INSERT INTO `t_user` VALUES ('1', '张三', '18', '2019-06-05', null); INSERT INTO `t_user` VALUES ('2', '曹', '19', '2019-06-06', null); INSERT INTO `t_user` VALUES ('3', '李四', '20', '2019-06-06', null); SET FOREIGN_KEY_CHECKS=1;
4.4.IDEA创建Maven项目,导入依赖,pom.xml依赖如下
具体的使用idea创建maven,请看这篇: 使用IDEA创建Maven项目
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<mybatis.version>3.5.0</mybatis.version>
<mybatis-spring.version>2.0.0</mybatis-spring.version>
<spring.version>5.1.0.RELEASE</spring.version>
</properties>
<dependencies>
<!--单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- 日志组件 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!-- Lombok 组件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<!-- Servlet-API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<!--MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
<!--<scope>rutime</scope>-->
</dependency>
<!--Druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</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>${mybatis-spring.version}</version>
</dependency>
<!--spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.0</version>
</dependency>
<!--spring-test -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.0.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
<build>
<finalName>silence-ssm</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
4.5 项目截图
4.6. 编写实体类
在entity包下编写实体类,这里没有生成Set/Get方法,是因为使用了Lombok插件,不了解lombok用的的请查看这篇博客:lombok 简化java代码注解
User如下
package com.thinkingcao.silence.ssm.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User {
private Long id;
private String name;
private Integer age;
private Date bornDate;
private String headImg;
}
4.7. 编写dao层Mapper接口
UserMapper如下
package com.thinkingcao.silence.ssm.mapper;
import com.thinkingcao.silence.ssm.entity.User;
import java.util.List;
public interface UserMapper {
int insert(User u);
int updateById(User u);
int deleteById(Long id);
User selectById(Long id);
List<User> selectAll();
}
4.8. 编写service接口和实现类
service接口:
package com.thinkingcao.silence.ssm.service;
import com.thinkingcao.silence.ssm.entity.User;
import java.util.List;
public interface IUserService {
void save(User u);
void update(User u);
void delete(Long id);
User get(Long id);
List<User> listAll();
}
service接口实现类:
package com.thinkingcao.silence.ssm.service.impl;
import com.thinkingcao.silence.ssm.entity.User;
import com.thinkingcao.silence.ssm.mapper.UserMapper;
import com.thinkingcao.silence.ssm.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
// 注释掉set方法注入,换成注解版本
/* public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}*/
//声明式事物
@Transactional(readOnly = true)
@Override
public void save(User u) {
userMapper.insert(u);
//int a = 1 / 0 ;//故意出错,演示是否会回滚
}
@Override
public void update(User u) {
userMapper.updateById(u);
}
@Override
public void delete(Long id) {
userMapper.deleteById(id);
}
@Override
public User get(Long id) {
return userMapper.selectById(id);
}
@Override
public List<User> listAll() {
return userMapper.selectAll();
}
}
4.9. 编写mapper.xml
在resources目录下新建mapper文件夹,然后在mapper目录下新建UserMapper.xml文件
<?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.thinkingcao.silence.ssm.mapper.UserMapper">
<resultMap id="BaseResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="bornDate" column="born_date"/>
<result property="headImg" column="head_img"/>
</resultMap>
<select id="selectAll" resultMap="BaseResultMap">
SELECT id,name,age,born_date,head_img FROM t_user
</select>
<select id="selectById" resultMap="BaseResultMap">
SELECT id,name,age,born_date,head_img FROM t_user WHERE id = #{id}
</select>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO t_user(name,age,born_date,head_img)
VALUES(#{name},#{age},#{bornDate},#{headImg})
</insert>
<update id="updateById">
UPDATE t_user SET name = #{name},age = #{age},born_date=#{bornDate},
head_img = #{headImg} WHERE id = #{id}
</update>
<delete id="deleteById">
DELETE FROM t_user WHERE id = #{id}
</delete>
</mapper>
4.10. 编写Controller
package com.thinkingcao.silence.ssm.web.controller;
import com.thinkingcao.silence.ssm.entity.User;
import com.thinkingcao.silence.ssm.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletContext;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private ServletContext servletContext;
@Autowired
private IUserService userService;
@RequestMapping("/list")
public String list(Model model) {
model.addAttribute("users", userService.listAll());
return "user/list";
}
@RequestMapping("/input")
public String input(Long id, Model model) {
if (id != null) {
model.addAttribute("user", userService.get(id));
}
return "user/input";
}
@RequestMapping("/delete")
public String delete(Long id) {
if (id != null) {
userService.delete(id);
}
return "redirect:/user/list";
}
@RequestMapping("/saveOrUpdate")
public String saveOrUpdate(User user) {
if (user.getId() == null) {
userService.save(user);
} else {
userService.update(user);
}
return "redirect:/user/list";
}
//项目启动从controller跳转到index欢迎页
@RequestMapping("/index")
public String index(){
return "index";
}
}
五、定义基础配置文件信息
5.1、在resources目录下新建db.properties配置文件,用于定义数据库链接信息
db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/silence_ssm
jdbc.username=root
jdbc.password=123456
5.2、在resources下新建MyBatis-config.xml全局配置文件
MyBatis-config.xml
<?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>
<settings>
<!--延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="lazyLoadTriggerMethods" value="clone"/>
</settings>
<!--
0: 属性配置(延迟加载,别名)
1:创建连接池
2:创建事物管理器
3:关联Mapper文件
这四步以及上面的lazyLoadingEnabled延迟加载等等属性配置都可以放到Spring里配置
-->
</configuration>
5.3、在resources下新建文件上传配置文件
silence.properties
#最大文件上传限制,单位字节. 10M=10*1024*1024(B)=10485760 bytes,需同步修改:ckfinder.xml upload.maxUploadSize=10485760 upload.maxInMemorySize=4096 upload.defaultEncoding=UTF-8
六、集成Spring框架配置文件编写
6.1、在resources目录下新建Spring的配置文件applicationContext.xml
applicationContext.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启DI注解解析器 -->
<context:annotation-config/>
<!-- 开启IOC注解解析器,扫描包 比如@Service-->
<context:component-scan base-package="com.thinkingcao.silence.ssm.service"/>
<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
<!-- 1.加载 db.properties 配置文件 -->
<!-- <context:property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>-->
<!--引入外部配置文件 由于后期可能会引入多个配置文件 所以采用list的形式 -->
<bean id="propertyPlaceholder"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db.properties</value>
<value>classpath:silence.properties</value>
</list>
</property>
</bean>
<!-- 2.创建 DataSource 对象,配置数据源属性连接 -->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 3.创建 SqlSessionFactory对象 -->
<bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--关联 dataSource 对象 -->
<property name="dataSource" ref="myDataSource"/>
<!--加载 MyBatis 全局配置文件 -->
<property name="configLocation" value="classpath:MyBatis-config.xml"/>
<!--为哪些包下的类起别名 -->
<property name="typeAliasesPackage" value="com.thinkingcao.silence.ssm.entity"/>
<!--加载 Mapper 映射配置文件 -->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
</bean>
<!-- 创建 Mapper接口的代理对象 -->
<!--<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
<!-- 关联 sqlSessionFactory -->
<!--<property name="sqlSessionFactory" ref="mySqlSessionFactory"/>-->
<!-- 根据哪一个接口创建代理对象 -->
<!--<property name="mapperInterface" value="com.thinkingcao.silence.ssm.mapper.UserMapper"/>-->
<!--</bean>-->
<!-- 创建 service 对象 -->
<!--<bean id="userService" class="com.thinkingcao.silence.ssm.service.impl.UserServiceImpl">-->
<!--<property name="userMapper" ref="userMapper"/>-->
<!--</bean>-->
<!-- 4. 创建 Mapper 接口扫描器 配置mapper接口扫描包-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描哪些包,并为该包下的接口创建代理对象 -->
<property name="basePackage" value="com.thinkingcao.silence.ssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="mySqlSessionFactory"></property>
</bean>
<!-- 5.事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
</beans>
6.2、在web.xml中配置加载Spring的配置文件
<!-- 配置加载 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>
6.3、在test包中新建一个app测试类,测试配置Spring是否成功
package com.thinkingcao.silence;
import com.thinkingcao.silence.ssm.mapper.UserMapper;
import com.thinkingcao.silence.ssm.service.IUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* <pre>
* @desc: 测试Spring整合Mybatis
* @title: App
* @author: cao_wencao
* @date: 2019-06-05 23:58
* @version: 1.0
* </pre>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class App {
@Autowired
private UserMapper userMapper;
@Autowired
private IUserService userService;
//使用userMapper测试
@Test
public void testSelectAll() throws Exception {
//JDK8新用法
userMapper.selectAll().forEach(System.out::println);
}
//使用userService测试
@Test
public void testListAll() throws Exception {
//JDK8新用法
userService.listAll().forEach(System.out::println);
}
}
6.4、运行效果如下:
七、SpringMVC框架代码的编写
7.1、在resources目录下新建SpringMVC的配置文件springMVC.xml
springMVC.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:mvc="http://www.springframework.org/schema/mvc" xmlns:utils="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd ">
<!-- 引入后台容器配置(连接池、数据源、mapper、service、事物) -->
<import resource="classpath:applicationContext.xml"/>
<!-- 组件扫描 -->
<context:component-scan base-package="com.thinkingcao.silence.ssm"/>
<!--MVC 注解解析器 -->
<mvc:annotation-driven/>
<!--对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理 -->
<mvc:default-servlet-handler/>
<!--<mvc:view-controller path="/" view-name="redirect:${web.view.index}"/>-->
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes -->
<property name="maxUploadSize" value="${upload.maxUploadSize}"/>
<!--设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240-->
<property name="maxInMemorySize" value="${upload.maxInMemorySize}"/>
<!-- 上传文件编码设置 -->
<property name="defaultEncoding" value="${upload.defaultEncoding}"/>
</bean>
</beans>
7.2、在web.xml中配置DispatcherServlet前端控制器加载springMVC.xml文件
<!-- 前端控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数,加载springMVC.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
7.3、 在web.xml中配置DispatcherServlet过滤器解决中文乱码
<!-- 字符编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7.4、设置项目启动欢迎页index.jsp
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
八、完整web.xml配置信息
web.xml如下:
<?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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!-- 项目启动欢迎页 -->
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置加载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>
<!-- 前端控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数,加载springMVC.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 字符编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
九、加入log4j配置文件打印日志
log4j.properties如下:
### 全局日志等级配置,输出位置配置### log4j.rootLogger = debug,console,log,error ### 输出信息到控制台Console ### log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern = %d %-5p [%c{5}] - %m%n ### 输出DEBUG 级别以上的日志到=E://logs/error.log ### log4j.appender.log = org.apache.log4j.DailyRollingFileAppender log4j.appender.log.File = E://logs/silence-log.log log4j.appender.log.Append = true log4j.appender.log.Threshold = DEBUG log4j.appender.log.DatePattern='.'yyyy-MM-dd log4j.appender.log.layout = org.apache.log4j.PatternLayout log4j.appender.log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 输出ERROR 级别以上的日志到=E://logs/silence_error.log ### log4j.appender.error = org.apache.log4j.DailyRollingFileAppender log4j.appender.error.File =E://logs/silence-error.log log4j.appender.error.Append = true log4j.appender.error.Threshold = ERROR log4j.appender.error.DatePattern='.'yyyy-MM-dd log4j.appender.error.layout = org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n #Project defalult level log4j.logger.com.thinkingcao.silence=DEBUG
十、新建页面测试
10.0、在webapp根目录下新建index.jsp,项目已启动就会访问到,当做一个欢迎页,前面web.xml已经设置了到改页面的路径
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
10.1、在webapp——>views——>user下新建input.jsp
input.jsp如下:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/user/saveOrUpdate" method="POST" enctype="multipart/form-data">
<input type="hidden" name="id" value="${user.id}">
名称:<input type="text" name="name" value="${user.name}"><br>
年龄:<input type="text" name="age" value="${user.age}"><br>
生日:<input type="text" name="bornDate" value="${user.bornDate}"><br>
头像:<input type="text" name="headImg"><br>
<input type="submit" value="保存"/>
</form>
</body>
</html>
10.2、在webapp——>views——>user下新建list.jsp
list.jsp如下:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellpadding="0" cellspacing="0" width="60%">
<tr>
<td>编号</td>
<td>头像</td>
<td>名称</td>
<td>年龄</td>
<td>操作</td>
</tr>
<c:forEach items="${users}" var="u">
<tr>
<td>${u.id}</td>
<td>${u.name}</td>
<td>${u.age}</td>
<td>
<a href="/user/input?id=${u.id}">编辑</a>
<a href="/user/delete?id=${u.id}">删除</a>
</td>
<td><fmt:formatDate value="${u.bornDate}" pattern="yyyy-MM-dd"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
10.3、页面存放路径
十一、启动项目
1、在IDEA中配置Tomcat,部署项目,启动成功后界面如下
2、启动成功后IDEA会自动打开欢迎页
3、访问list.jsp界面如下:
4、访问input.jsp如下:
输入表单信息即可新增用户到数据库user表成功
以上就是完整的很详细的SSM框架(Spring+SpringMVC+Mybatis)搭建,欢迎大家阅读,如果觉得好的话点个关注,谢谢!
附属优秀文章推荐: IDEA优雅整合Maven+SSM框架(详细思路+附带源码) ,大家也可以去阅读这篇,写得也很详细。
十二、项目源码
源码: https://github.com/Thinkingcao/silence-xml-ssm
最后
以上就是认真棒棒糖为你收集整理的使用IDEA整合Spring+SpringMVC+Mybatis框架完整教程的全部内容,希望文章能够帮你解决使用IDEA整合Spring+SpringMVC+Mybatis框架完整教程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复