一、前言
如果还不了解剧情,请返回第3集的剧情 Java归去来第3集:Eclipse中给动态模块升级
二、在Eclipse中创建Maven类型的SSM项目
2.1:SSM简介
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架。其中spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架
2.2:搭建maven类型的SSM项目的步骤
2.2.1:在pom.xml文件引入SSM所需要的包
<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>king.weixin</groupId> <artifactId>KingWeixin</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>KingWeixin Maven Webapp</name> <url>http://maven.apache.org</url> <!-- 公共版本号 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java-version>1.8</java-version> <org.springframework-version>4.3.5.RELEASE</org.springframework-version> <org.aspectj-version>1.7.2</org.aspectj-version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 公共版本号 end --> <dependencies> <!-- junit 开始 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- junit 结束 --> <!--spring mvc 开始--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <!--spring mvc 结束 --> <!-- mybatis & mysql 开始--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.31</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!-- mybatis & mysql 结束--> <!-- javax servlet 开始--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- javax servlet 结束--> <!--commons tools 开始 --> <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.5</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.2</version> </dependency> <!--commons tools 结束--> <!--log4j 开始--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.10.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.10.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jcl --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.10.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.10.0</version> </dependency> <!--log4j 结束--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <!--指定source和target编译版本开始 --> <build> <finalName>KingWeixin</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <!--指定source和target编译版本结束 --> </project>
2.2.2:修改web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!--项目名称 --> <display-name>KingWeixin</display-name> <!--项目编码过滤器开始--> <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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--项目编码过滤器结束--> <!-- 配置文件所在位置设置开始--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/config/spring-*.xml</param-value> </context-param> <!-- 配置文件所在位置设置结束--> <!-- Spring监听配置开始 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Spring监听配置结束 --> <!-- SpringMVC配置开始 --> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/config/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- SpringMVC配置结束--> </web-app>
2.2.2:新建SSM相关文件
首先,创建spring-mvc.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" 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-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 注解扫描包 --> <context:component-scan base-package="com.king.weixin"/> <!-- 开启注解 --> <mvc:annotation-driven/> <!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd --> <mvc:resources mapping="/img/**" location="/img/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/html/**" location="/html/" /> <mvc:resources mapping="/tinymce/**" location="/tinymce/" /> <mvc:resources mapping="/upload/**" location="/upload/" /> <!-- 定义跳转的文件的前后缀 ,视图模式配置--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 --> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
其次创建spring-common.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:p="http://www.springframework.org/schema/p" 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-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/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <!-- 1. 数据源 : DriverManagerDataSource --> <!-- <bean id="dataSource" --> <!-- class="org.springframework.jdbc.datasource.DriverManagerDataSource"> --> <!-- <property name="driverClassName" value="com.mysql.jdbc.Driver" /> --> <!-- <property name="url" value="jdbc:mysql://数据服务器IP:3306/king?useUnicode=true&characterEncoding=utf-8" /> --> <!-- <property name="username" value="root" /> --> <!-- <property name="password" value="密码" /> --> <!-- </bean> --> <!-- 2. 数据源 : 连接池 ProxoolDataSource --> <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="driver"> <value>com.mysql.jdbc.Driver</value> </property> <property name="driverUrl"> <value>jdbc:mysql://数据服务器IP:3306/king?user=root&password=密码&useUnicode=true&characterEncoding=utf-8 </value> </property> <property name="user" value="root" /> <property name="password" value="密码" /> <property name="alias" value="Pool_dbname" /> <!-- <property name="houseKeepingSleepTime" value="90000" /> --> <property name="prototypeCount" value="0" /> <property name="maximumConnectionCount" value="50" /> <property name="minimumConnectionCount" value="2" /> <property name="simultaneousBuildThrottle" value="50" /> <!-- <property name="maximumConnectionLifetime" value="14400000" /> --> <property name="houseKeepingTestSql" value="select CURRENT_DATE" /> </bean> <!-- 2. mybatis的SqlSession的工厂: SqlSessionFactoryBean dataSource:引用数据源 MyBatis定义数据源,同意加载配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:config/mybatis-config.xml" /> </bean> <!-- 3. mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory basePackage:指定sql映射文件/接口所在的包(自动扫描) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.king.weixin.mapper"></property> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> <!--4. 事务管理 : DataSourceTransactionManager dataSource:引用上面定义的数据源 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 5. 使用声明式事务 transaction-manager:引用上面定义的事务管理器 --> <tx:annotation-driven transaction-manager="txManager" /> </beans>
最后创建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> <!-- 实体类,简称 -设置别名 --> <typeAliases> <typeAlias alias="User" type="com.king.weixin.entity.User" /> </typeAliases> <!-- 实体接口映射资源 --> <!-- 说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml --> <mappers> <mapper resource="com/king/weixin/mapper/userMapper.xml" /> </mappers> </configuration>
关系,两个Spring文件会在web.xml中引入,mybatis-config文件会在sping定义数据源配置的spring-common.xml文件中引入,具体可以看代码,截止目前,项目搭建完毕,Maven-update project的话,系统会根据pom.xml自动下载相关jar包,这就是Maven的好处
2.3:SSM查询实例
(1)新建entity类User.java
package com.king.weixin.entity; /** * @author KING * 2018-6-8 16:00:06 */ public class User { private int id; private String age; private String userName; public User(){ 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 User(int id, String age, String userName) { super(); this.id = id; this.age = age; this.userName = userName; } }
(2)新建UserMapper.java接口类
package com.king.weixin.mapper; import java.util.List; import com.king.weixin.entity.User; public interface UserMapper { void save(User user); boolean update(User user); boolean delete(int id); User findById(int id); List<User> findAll(); }
(3)新建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"> <!-- namespace:必须与对应的接口全类名一致 id:必须与对应接口的某个对应的方法名一致 --> <mapper namespace="com.king.weixin.mapper.UserMapper"> <insert id="save" parameterType="User"> insert into t_user(user_name,user_age) values(#{userName},#{age}) </insert> <update id="update" parameterType="User"> update t_user set user_name=#{userName},user_age=#{age} where user_id=#{id} </update> <delete id="delete" parameterType="int"> delete from t_user where user_id=#{id} </delete> <!-- mybsits_config中配置的alias类别名,也可直接配置resultType为类路径 --> <select id="findById" parameterType="int" resultType="User"> select user_id id,user_name userName,user_age age from t_user where user_id=#{id} </select> <select id="findAll" resultType="User"> select user_id id,user_name userName,user_age age from t_user </select> </mapper>
(4)新建UserService.java接口类
package com.king.weixin.service; import java.util.List; import com.king.weixin.entity.User; public interface UserService { void save(User user); boolean update(User user); boolean delete(int id); User findById(int id); List<User> findAll(); }
(5)新建UserServiceImpl.java实现类
package com.king.weixin.service; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.king.weixin.mapper.UserMapper; import com.king.weixin.entity.User; import com.king.weixin.service.UserService; @Service @Transactional //此处不再进行创建SqlSession和提交事务,都已交由spring去管理了 public class UserServiceImpl implements UserService { @Resource private UserMapper mapper; public boolean delete(int id) { return mapper.delete(id); } public List<User> findAll() { List<User> findAllList = mapper.findAll(); return findAllList; } public User findById(int id) { User user = mapper.findById(id); return user; } public void save(User user) { mapper.save(user); } public boolean update(User user) { return mapper.update(user); } }
(6)新建UserController.java控制类
package com.king.weixin.controller; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.king.weixin.entity.User; import com.king.weixin.service.UserService; @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; /** * 获取所有用户列表 * @param request * @return */ @RequestMapping("/getAllUser") public String getAllUser(HttpServletRequest request){ System.out.println("访问的是我"); List<User> findAll = userService.findAll(); request.setAttribute("userList", findAll); return "/index"; } /** * 跳转到添加用户界面 * @param request * @return */ @RequestMapping("/toAddUser") public String toAddUser(HttpServletRequest request){ return "/addUser"; } /** * 添加用户并重定向 * @param user * @param request * @return */ @RequestMapping("/addUser") public String addUser(User user,HttpServletRequest request){ userService.save(user); return "redirect:/user/getAllUser"; } /** *编辑用户 * @param user * @param request * @return */ @RequestMapping("/updateUser") public String updateUser(User user,HttpServletRequest request){ if(userService.update(user)){ user = userService.findById(user.getId()); request.setAttribute("user", user); return "redirect:/user/getAllUser"; }else{ return "/error"; } } /** * 根据id查询单个用户 * @param id * @param request * @return */ @RequestMapping("/getUser") public String getUser(int id,HttpServletRequest request){ request.setAttribute("user", userService.findById(id)); return "/editUser"; } /** * 删除用户 * @param id * @param request * @param response */ @RequestMapping("/delUser") public void delUser(int id,HttpServletRequest request,HttpServletResponse response){ String result = "{\"result\":\"error\"}"; if(userService.delete(id)){ result = "{\"result\":\"success\"}"; } response.setContentType("application/json"); try { PrintWriter out = response.getWriter(); out.write(result); } catch (IOException e) { e.printStackTrace(); } } @RequestMapping("/GoLogin") public String GoLogin(HttpServletRequest request,HttpServletResponse response) { return "/login"; } @RequestMapping("/CheckLogin") public void CheckLogin(HttpServletRequest request,HttpServletResponse response) throws IOException { String sysusername="king"; String syspassword="123456"; String username=request.getParameter("userName"); String password=request.getParameter("passWord"); System.out.println("用户名:"+username); System.out.println("密码:"+password); HttpSession session=request.getSession(); if(username.equals(sysusername)&&password.equals(syspassword)) { session.setAttribute("username",username ); response.getWriter().write("success"); } else { response.getWriter().write("err"); } } }
后台的类已创建完成,下面我们新建一个index.jsp页面做测试,页面内容如下,这里我引入了jstl标签,具体代码请看下面的代码
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <meta http-equiv="Content-Type" content="text/html; charset=utf8"> <title>SpringMvc测试页</title> </head> <script type="text/javascript"> function queryuser() { window.location.href="<%=request.getContextPath()%>/user/getAllUser"; } </script> <body> <h3>Hello,world</h3><br> <button onclick="queryuser()">查询所有用户</button> <table border="1"> <tr> <td>用户编号</td><td>年龄</td><td>姓名</td> </tr> <c:forEach items="${userList}" var="user" varStatus="vs"> <tr> <td align = "center">${user.id}</td> <td align = "center">${user.age}</td> <td align = "center">${user.userName}</td> </tr> </c:forEach> </table> </body> </html>
启动项目,访问如下图所示,访问到首页
点击查询所有用户按钮
后台我在UserController里面的getAllUser方法做了打印,可以看到请求已经到了Controller里面,实战结束