首先附上maven项目架构图(代码中标红的全部是要换成自己项目里相对应的名字)
1:在pom里写上ssm整合需要的jar包
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring.version>4.3.14.RELEASE</spring.version> <mybatis.version>3.4.1</mybatis.version> </properties> <dependencies> <!--spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <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-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-aop</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-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.6</version> </dependency> <!--mybati--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.5</version> </dependency> <!-- 数据库链接 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency> <!-- apache工具类包 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <!-- 引入Mybatis分页插件 --> <!-- 引入5.0版本在测试的时候会报错 4.2版本也会报错 4.2版本总是出现String无法转换为某个对象的错误 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.1</version> </dependency> <!-- json解析jar包 --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <!-- servlet组件支持jar --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
2:配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 初始化文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:spring/applicationContext.xml </param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <!-- web容器初始化装载applicationContext配置文件 --> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <!-- web容器初始化装载applicationContext配置文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 定期清理没有实用的bean实例, 避免出现内存溢出问题 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- 配置Log4j监听器 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</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/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>DruidWebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--拦截所有请求,并进行编码处理--> <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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 默认打开的页面 --> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app>
3:配置spring-mvc.xml
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --> <context:component-scan base-package="com.ytsd.modules" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> </context:component-scan> <!-- 开启SpringMVC注解模式 --> <mvc:annotation-driven/> <!-- 定义跳转的文件的前后缀 ,视图模式配置--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="contentType" value="text/jsp;charset=UTF-8"/> <property name="prefix" value="/view/modules/" /> <property name="suffix" value=".jsp" /> </bean>
4:配置与mybatis整合,名字自取我这里叫(applicationContext.xml)
注意:数据库连接池的value一定要与jdbc.properties一样
<!-- 自动扫描 --> <context:component-scan base-package="com.ytsd"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- 配置数据库相关参数properties的属性:${url} --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="dbType" value="${db.Type}"/> <property name="driverClassName" value="${db.driverClassName}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property> <!-- 自动扫描mapping.xml文件 --> <!-- <property name="mapperLocations" value="classpath:com/ytsd/west/modules/**/*Dao.xml" />--> </bean> <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入sqlSessionFactory --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!-- 给出需要扫描Dao接口包 --> <property name="basePackage" value="com.ytsd.modules.*.dao"/> </bean> <!-- 配置事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="txManager"/>
5:数据库连接配置:jdbc.properties(park为数据库名称)
#mysql db.Type=mysql db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/park?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT db.username=fu db.password=123456
6:日志配置:log4j.properties
log4j.rootLogger=DEBUG,console,file #-----------------------------------# #1 定义日志输出目的地为控制台 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold=DEBUG ####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ### #%c: 输出日志信息所属的类目,通常就是所在类的全名 #%m: 输出代码中指定的消息,产生的日志具体信息 #%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行 log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #-----------------------------------# #2 文件大小到达指定尺寸的时候产生一个新的文件 log4j.appender.file = org.apache.log4j.RollingFileAppender #日志文件输出目录 log4j.appender.file.File=log/tibet.log #定义文件最大大小 log4j.appender.file.MaxFileSize=10mb ###输出日志信息### #最低级别 log4j.appender.file.Threshold=ERROR log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #4 mybatis 显示SQL语句部分 log4j.logger.org.mybatis=DEBUG #log4j.logger.cn.tibet.cas.dao=DEBUG #log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG# #log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG# #log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG# #log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
7:配置mybatis的映射资源文件mybatis-config.xml
<configuration> <!-- 实体接口映射资源,简称 -设置别名 --> <!-- 说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml --> <typeAliases> <typeAlias alias="User" type="com.ytsd.modules.test.entity.UserEntity" /> </typeAliases> <!--分页配置--> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> </plugin> </plugins> </configuration>
8:配置结束了,接下来看方法和实体
userEntity
public class UserEntity { private int id; private String userName; private String age; @Override public String toString() { return "User [id=" + id + ", age=" + age + ", userName=" + userName + "]"; } public UserEntity(){ super(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public UserEntity(int id, String age, String userName) { super(); this.id = id; this.age = age; this.userName = userName; }
UserService
@Service public class UserService{ @Autowired private UserDao userDao; public void save(UserEntity user){ userDao.insert(user); } public boolean edit(UserEntity user){ return userDao.edit(user); } public boolean deleteUser(int id){ return userDao.deleteUser(id); } public UserEntity findById(int id){ return userDao.findById(id); } public List<UserEntity> findAll(){ return userDao.findAll(); } }userDao
@Repository public interface UserDao{ int insert(UserEntity user); boolean edit(UserEntity user); boolean deleteUser(int id); UserEntity findById(int id); List<UserEntity> findAll(); }
userDao.xml类(如果dao.xml与dao在同一层包目录下则applicationContext.xml里不用配置自动扫描mapping.xml文件)
!-- namespace:必须与对应的接口全类名一致 UserMapper.java id :必须与对应接口的某个对应的方法名一致即必须要和UserMapper.java接口中的方法同名。 --> <mapper namespace="com.ytsd.modules.test.dao.UserDao"> <insert id="insert" parameterType="User"> insert into t_user(userName,age) values(#{userName},#{age}) </insert> <update id="edit" parameterType="User"> update t_user set userName=#{userName},age=#{age} where id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from t_user where id=#{id} </delete> <!-- mybsits_config中配置的alias类别名,也可直接配置resultType为类路径 --> <select id="findById" parameterType="int" resultType="User"> select id,userName,age from t_user where id=#{id} </select> <select id="findAll" resultType="User"> select id,userName,age from t_user </select> </mapper>
@Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; /** * 获取所有用户列表 * @param request * @return */ @RequestMapping("/getAllUser") public String getAllUser(@RequestParam(required = false, defaultValue = "1") Integer page, HttpServletRequest request, Model model){ PageHelper.startPage(page,2); List<UserEntity> user = userService.findAll(); PageInfo<UserEntity> p = new PageInfo<UserEntity>(user); model.addAttribute("page",p); model.addAttribute("userList", user); request.setAttribute("userList", user); return "test/allUser"; } /** * 跳转到添加用户界面 * @param * @return */ @RequestMapping("/toAddUser") public String toAddUser(){ return "test/addUser"; } /** * 添加用户并重定向 * @param user * @param * @return */ @RequestMapping("/addUser") public String addUser(UserEntity user){ userService.save(user); return "redirect:/user/getAllUser"; } /** *编辑用户 * @param user * @param request * @return */ @RequestMapping("/updateUser") public String updateUser(UserEntity user, HttpServletRequest request, Model model){ if(userService.edit(user)){ user = userService.findById(user.getId()); request.setAttribute("user", user); model.addAttribute("user", user); return "redirect:/user/getAllUser"; }else{ return "/error"; } } /** * 根据id查询单个用户 * @param id * @param request * @return */ @RequestMapping("/getUser") public String getUser(int id,HttpServletRequest request,Model model){ request.setAttribute("user", userService.findById(id)); model.addAttribute("user", userService.findById(id)); return "test/editUser"; } /** * 删除用户 * @param id * @param * @param */ @RequestMapping("/delUser") public String delUser(int id){ userService.deleteUser(id); return "redirect:/user/getAllUser"; } }
9:方法结束了,接下来看页面(index.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>首页</title> </head> <body> <h5> <a href="<%=basePath%>/user/getAllUser">进入用户管理页</a> </h5> </body> </html>
allUser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <script type="text/javascript" src="js/jquery-1.7.1.js"></script> <title>用户列表</title> <script type="text/javascript"> function del(id){ $.get("<%=basePath%>user/delUser.do?id=" + id,function(data){ if("success" == data.result){ alert("删除成功"); window.location.reload(); }else{ alert("删除失败"); } }); } </script> </head> <body> <h6><a href="<%=basePath%>user/toAddUser">添加用户</a></h6> <table border="1"> <tbody> <tr> <th>姓名</th> <th>年龄</th> <th>操作</th> </tr> <c:if test="${!empty userList }"> <c:forEach items="${userList}" var="user"> <tr> <td>${user.userName }</td> <td>${user.age }</td> <td> <a href="<%=basePath%>user/getUser.do?id=${user.id}">编辑</a> <a href="<%=basePath%>user/delUser.do?id=${user.id}">删除</a> </td> </tr> </c:forEach> </c:if> </tbody> </table> <p> 每页${page.pageSize}条 当前页${page.size}条 ${page.pageNum}/${page.pages}页 总条数${page.total} </p> <c:if test="${page.isFirstPage==true}"><a>首页</a></c:if> <c:if test="${page.isFirstPage==false}"> <a href="<%=basePath%>user/getAllUser.do?page=${page.firstPage}">首页</a> </c:if> <c:if test="${page.hasPreviousPage==true}"> <a href="<%=basePath%>user/getAllUser.do?page=${page.prePage}">上一页</a> </c:if> <c:if test="${page.hasPreviousPage==false}"><a>上一页</a></c:if> <c:if test="${page.hasNextPage==true}"> <a href="<%=basePath%>user/getAllUser.do?page=${page.nextPage}">下一页</a> </c:if> <c:if test="${page.hasNextPage==false}"><a>下一页</a></c:if> <c:if test="${page.isLastPage==true}"><a>末页</a></c:if> <c:if test="${page.isLastPage==false}"> <a href="<%=basePath%>user/getAllUser.do?page=${page.lastPage}">末页</a> </c:if> </body> </html>
addUser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>添加用户</title> <script type="text/javascript"> function addUser(){ var form = document.forms[0]; form.action = "<%=basePath%>user/addUser"; form.method="post"; form.submit(); } </script> </head> <body> <h1>添加用户</h1> <form action="" name="userForm"> 姓名:<input type="text" name="userName"> 年龄:<input type="text" name="age"> <input type="button" value="添加" onclick="addUser()"> </form> </body> </html>
editUser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>编辑用户</title> <script type="text/javascript"> function updateUser(){ var form = document.forms[0]; form.action = "<%=basePath%>user/updateUser"; form.method="post"; form.submit(); } </script> </head> <body> <h1>添加用户</h1> <form action="" name="userForm"> <input type="hidden" name="id" value="${user.id }"/> 姓名:<input type="text" name="userName" value="${user.userName }"/> 年龄:<input type="text" name="age" value="${user.age }"/> <input type="button" value="编辑" onclick="updateUser()"/> </form> </body> </html>
接下来效果图
项目就到这结束了,有问题可以留言,项目源码点击打开链接