maven管理SSM的整合

使用SSM(Spring、SpringMVC和Mybatis)已经有一个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方。之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些。以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下。

1、基本概念

1.1、Spring

 

        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

1.2、SpringMVC

      Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

1.3、MyBatis

       MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

2、开发环境搭建

我用的idea,当然ecilpse也是可以的,我比较喜欢用idea。

3、Maven Web项目创建

Maven Web项目创建网上有很多教学,这里就不说了

4、SSM整合

 

      下面主要介绍三大框架的整合,至于环境的搭建以及项目的创建。这次整合我分了2个配置文件,分别是spring-mybatis.xml,spring-mvc.xml包含spring和mybatis的配置文件,还有个是spring-mvc的配置文件,此外有2个资源文件:jdbc.propertis和log4j.properties。完整目录结构如下:

使用框架都是较新的版本:

       Spring 5.0.3 RELEASE

 Springmvc 5.0.3 RELEASE

       MyBatis 3.4.1

4.1、Maven引入需要的JAR包

         为了方便后面说的时候不需要引入JAR包,我这里直接给出所有需要的JAR包,这都是基本的JAR包,每个包的是干什么的都有注释,就不再多说了。

pom.xml


<properties>
    <!-- 设置项目编码编码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- spring版本号 -->
    <spring.version>5.0.3.RELEASE</spring.version>
    <!-- mybatis版本号 -->
    <mybatis.version>3.4.1</mybatis.version>
</properties>

<dependencies>

    <!-- java ee -->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>

    <!-- 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

    <!-- 实现slf4j接口并整合 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

    <!-- JSON -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
    </dependency>


    <!-- 数据库 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.41</version>
        <scope>runtime</scope>
    </dependency>

    <!-- 数据库连接池 -->
    <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>
    <dependency>
        <groupId>com.googlecode.rapid-framework</groupId>
        <artifactId>rapid-core</artifactId>
        <version>4.0.5</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

4.2、Spring与MyBatis的整合

 

 

所有需要的JAR包都引入以后,首先进行Spring与MyBatis的整合,先看一个项目结构图:

4.2.1、建立JDBC属性文件

jdbc.properties(文件编码修改为utf-8)
jdbc.driver=com.mysql.jdbc.Driver
#数据库地址
jdbc.url=jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=utf8
#用户名
jdbc.username=root
#密码
jdbc.password=root
#最大连接数
c3p0.maxPoolSize=30
#最小连接数
c3p0.minPoolSize=10
#关闭连接后不自动commit
c3p0.autoCommitOnClose=false
#获取连接超时时间
c3p0.checkoutTimeout=10000
#当获取连接失败重试次数
c3p0.acquireRetryAttempts=2

4.2.2、建立spring-mybatis.xml配置文件

        这个文件就是用来完成spring和mybatis的整合的。这里面也没多少行配置,主要的就是自动扫描,自动注入,配置数据库。注释也很详细,大家看看就明白了。

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.hp.service"/>

    <!-- 配置数据库相关参数properties的属性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 数据库连接池 -->
    <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">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 扫描model包 使用别名 -->
        <property name="typeAliasesPackage" value="com.hp.model"/>
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value="com.hp.dao"/>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置基于注解的声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

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.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- 扫描web相关的bean -->
    <context:component-scan base-package="com.hp.controller"/>

    <!-- 开启SpringMVC注解模式 -->
    <mvc:annotation-driven/>

    <!-- 静态资源默认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>

4.2.3、Log4j的配置

 

      为了方便调试,一般都会使用日志来输出信息,Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

# Configure logging for testing: optionally with log file
log4j.rootLogger=WARN, stdout
# log4j.rootLogger=WARN, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

###显示SQL语句部分
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.Java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

4.2.4、建立数据库

/*
Navicat MySQL Data Transfer

Source Server         : mysql
Source Server Version : 50556
Source Host           : localhost:3306
Source Database       : house

Target Server Type    : MYSQL
Target Server Version : 50556
File Encoding         : 65001

Date: 2018-03-28 22:57:50
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `houseinfo`
-- ----------------------------
DROP TABLE IF EXISTS `houseinfo`;
CREATE TABLE `houseinfo` (
  `hid` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `harea` varchar(255) COLLATE utf8_bin DEFAULT '',
  `hname` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hfx` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hmj` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hzx` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hlc` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hzj` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hfd` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hfdtel` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `hqk` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`hid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
-- Records of houseinfo
-- ----------------------------
INSERT INTO `houseinfo` VALUES ('1', '1', '洪山区', '保利花园', '1室1厅', '50', '精装', '5/12', '1800', '李大庆', '13995668335', '未出租');
INSERT INTO `houseinfo` VALUES ('2', '1', '武昌区', '关山村晓', '一室一厅', '60', '精装', '6/12', '1500', '李大婷', '13990440003', '已经出租');
INSERT INTO `houseinfo` VALUES ('3', '1', '高新区', '洪山校区', '一室一厅', '80', '精装', '6/12', '1800', '李大婷', '13990440003', '未出租');
INSERT INTO `houseinfo` VALUES ('4', '1', '洪山区', '保利花园', '1室1厅', '50', '精装', '5/12', '1800', '李大庆', '13995668335', '已经出租');

-- ----------------------------
-- Table structure for `userinfo`
-- ----------------------------
DROP TABLE IF EXISTS `userinfo`;
CREATE TABLE `userinfo` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `uame` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `upsw` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `urealname` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
-- Records of userinfo
-- ----------------------------
INSERT INTO `userinfo` VALUES ('1', 'admin', 'admin', '张三');

4.2.5、建立Controller,Model,Dao接口Service接口和实现类,和其它的资源文件

目录结构:


下面给出具体的内容

4.2.5.1、建立HouseModel.java实体类和UserModel.java实体类

HouseModel.java
package com.hp.model;

public class HouseModel {
    private Integer hid;
    private Integer uid;
    private String harea;
    private String hname;
    private String hfx;
    private String hmj;
    private String hzx;
    private String hlc;
    private String hzj;
    private String hfd;
    private String hfdtel;
    private String hqk;

    @Override
    public String toString() {
        return "HouseModel{" +
                "hid=" + hid +
                ", uid=" + uid +
                ", harea='" + harea + '\'' +
                ", hname='" + hname + '\'' +
                ", hfx='" + hfx + '\'' +
                ", hmj='" + hmj + '\'' +
                ", hzx='" + hzx + '\'' +
                ", hlc='" + hlc + '\'' +
                ", hzj='" + hzj + '\'' +
                ", hfd='" + hfd + '\'' +
                ", hfdtel='" + hfdtel + '\'' +
                ", hqk='" + hqk + '\'' +
                '}';
    }

    public Integer getHid() {
        return hid;
    }

    public void setHid(Integer hid) {
        this.hid = hid;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getHarea() {
        return harea;
    }

    public void setHarea(String harea) {
        this.harea = harea;
    }

    public String getHname() {
        return hname;
    }

    public void setHname(String hname) {
        this.hname = hname;
    }

    public String getHfx() {
        return hfx;
    }

    public void setHfx(String hfx) {
        this.hfx = hfx;
    }

    public String getHmj() {
        return hmj;
    }

    public void setHmj(String hmj) {
        this.hmj = hmj;
    }

    public String getHzx() {
        return hzx;
    }

    public void setHzx(String hzx) {
        this.hzx = hzx;
    }

    public String getHlc() {
        return hlc;
    }

    public void setHlc(String hlc) {
        this.hlc = hlc;
    }

    public String getHzj() {
        return hzj;
    }

    public void setHzj(String hzj) {
        this.hzj = hzj;
    }

    public String getHfd() {
        return hfd;
    }

    public void setHfd(String hfd) {
        this.hfd = hfd;
    }

    public String getHfdtel() {
        return hfdtel;
    }

    public void setHfdtel(String hfdtel) {
        this.hfdtel = hfdtel;
    }

    public String getHqk() {
        return hqk;
    }

    public void setHqk(String hqk) {
        this.hqk = hqk;
    }
}
UserModel.java
package com.hp.model;

public class UserModel{
    private  Integer uid;
    private  String uame;
    private  String upsw;
    private  String urealname;

    @Override
    public String toString() {
        return "UserModel{" +
                "uid=" + uid +
                ", uame='" + uame + '\'' +
                ", upsw='" + upsw + '\'' +
                ", urealname='" + urealname + '\'' +
                '}';
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUame() {
        return uame;
    }

    public void setUame(String uame) {
        this.uame = uame;
    }

    public String getUpsw() {
        return upsw;
    }

    public void setUpsw(String upsw) {
        this.upsw = upsw;
    }

    public String getUrealname() {
        return urealname;
    }

    public void setUrealname(String urealname) {
        this.urealname = urealname;
    }

    public UserModel() {
        super();
    }
}
4.2.5.2、建立HouseDao.java和UserDao.java

HouseDao.java
package com.hp.dao;

import com.hp.model.HouseModel;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface HouseDao {
    List<HouseModel> ListHouse();
    HouseModel HouseById(@Param("hid") String hid);
    void InsertHouse(HouseModel houseModel);
    void UpdateHouse(HouseModel houseModel);
}
UserDao.java
package com.hp.dao;

import com.hp.model.UserModel;
import org.apache.ibatis.annotations.Param;

public interface UserDao {
    UserModel Login(@Param("uame") String uame, @Param("upsw") String upsw);
    UserModel Login2(@Param("uame") String  uame);
}
4.2.5.3、建立HouseDao.xml和UserDao.xml

HouseDao.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.hp.dao.HouseDao">

    <resultMap type="com.hp.model.HouseModel" id="houseModel">
        <result column="hid" property="hid" />
        <result column="uid" property="uid"/>
        <result column="harea" property="harea"/>
        <result column="hname" property="hname"/>
        <result column="hfx" property="hfx"/>
        <result column="hmj" property="hmj"/>
        <result column="hzx" property="hzx"/>
        <result column="hlc" property="hlc"/>
        <result column="hzj" property="hzj"/>
        <result column="hfd" property="hfd"/>
        <result column="hfdtel" property="hfdtel"/>
        <result column="hqk" property="hqk"/>
    </resultMap>
    <select id="ListHouse" resultMap="houseModel">
        SELECT * FROM houseinfo
    </select>
    <select id="HouseById" resultMap="houseModel"  parameterType="com.hp.model.UserModel">
        SELECT * FROM houseinfo WHERE hid=#{hid}
    </select>
    <insert id="InsertHouse" parameterType="HouseModel" useGeneratedKeys="true" keyProperty="hid" keyColumn="hid">
        INSERT INTO houseinfo(uid  ,harea  ,hname  ,hfx ,hmj ,hzx ,hlc ,hzj ,hfd ,hfdtel ,hqk )
        VALUES (#{uid},#{harea},#{hname},#{hfx},#{hmj},#{hzx},#{hlc},#{hzj},#{hfd},#{hfdtel},#{hqk})
    </insert>
    <update id="UpdateHouse"  parameterType="com.hp.model.UserModel">
        update houseinfo set uid=#{uid},harea=#{harea},hname=#{hname},hfx=#{hfx}
        ,hmj=#{hmj},hzx=#{hzx},hlc=#{hlc},hzj=#{hzj},hfd=#{hfd},hfdtel=#{hfdtel},hqk=#{hqk}
        where hid=#{hid}
    </update>
</mapper>
UserDao.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.hp.dao.UserDao">

    <resultMap type="com.hp.model.UserModel" id="userModel">
        <result column="uid" property="uid" />
        <result column="uame" property="uame"/>
        <result column="upsw" property="upsw"/>
        <result column="urealname" property="urealname"/>
    </resultMap>
    <select id="Login" resultMap="userModel" parameterType="com.hp.model.UserModel">
        SELECT * FROM userinfo WHERE  uame=#{uame}  AND upsw=#{upsw}
    </select>

    <select id="Login2" resultMap="userModel" parameterType="com.hp.model.UserModel">
        SELECT * FROM userinfo WHERE uame=#{uame}
    </select>
</mapper>

4.2.5.4、建立HouseService接口和HouseServiceImpl实现类
HouseService.java

package com.hp.service;

import com.hp.model.HouseModel;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface HouseService {
    List<HouseModel> ListHouse();
    HouseModel HouseById(String hid);
    void InsertHouse(HouseModel houseModel);
    void UpdateHouse(HouseModel houseModel);
}
HouseServiceImpl.java

package com.hp.service.impl;


import com.hp.dao.HouseDao;
import com.hp.model.HouseModel;
import com.hp.service.HouseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class HouseServiceImpl implements HouseService {

    @Autowired
    private HouseDao houseDao;

    @Override
    public List<HouseModel> ListHouse() {
        return houseDao.ListHouse();
    }

    @Override
    public HouseModel HouseById(String hid) {
        return houseDao.HouseById(hid);
    }

    @Override
    public void InsertHouse(HouseModel houseModel) {
        houseDao.InsertHouse(houseModel);
    }

    @Override
    public void UpdateHouse(HouseModel houseModel) {
        houseDao.UpdateHouse(houseModel);
    }
}
4.2.5.5、建立UserService接口和UserServiceImpl实现类

UserService.java
package com.hp.service;


import com.hp.model.UserModel;

public interface UserService {
    Boolean Login(String uame);
    UserModel Login2(String uame, String upsw);
}
UserServiceImpl.java

package com.hp.service.impl;

import com.hp.dao.UserDao;
import com.hp.model.UserModel;
import com.hp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDao userDao;

    @Override
    public Boolean Login(String uame) {
        UserModel login = userDao.Login2(uame);
        if (login != null)
        {
            return true;
        }else {
            return false;
        }
    }

    @Override
    public UserModel Login2(String uame, String upsw) {
        UserModel login = userDao.Login(uame,upsw);
        if (login != null)
        {
            return login;
        }else {
            return null;
        }
    }
}

4.2.5.6、建立UserController类
HouseController.java

package com.hp.controller;

import com.hp.model.HouseModel;
import com.hp.service.HouseService;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
@SessionAttributes(value={"houselist","houseModel"})
public class HouseController {

    @Resource
    private HouseService houseService;

    @RequestMapping("HouseHello.do")
    public String HouseHello() {
        return "HouseInsert";
    }

    @RequestMapping("HouseList.do")
    public String HouseList(ModelMap modelMap, HttpSession session) {
        List<HouseModel> Houselist = houseService.ListHouse();
        modelMap.addAttribute("houselist", Houselist);
        System.out.println(Houselist);
        return "HouseInfo";
    }

    @RequestMapping("InsertHouse.do")
    public String InsertHouse(@Param("houseModel") HouseModel houseModel,HttpSession session) {
        Integer uid= (Integer) session.getAttribute("Uid");
        houseModel.setUid(uid);
        houseService.InsertHouse(houseModel);
        System.out.println(houseModel);
        return "forward:/HouseList.do";
    }

    @RequestMapping("UpdateHouse.do")
    public String UpdateHouse(@RequestParam("hid") String hid,ModelMap modelMap, HttpSession session) {
        HouseModel houseModel=houseService.HouseById(hid);
        modelMap.addAttribute("houseModel", houseModel);
        return "HouseUpdate";
    }
    @RequestMapping("UpdateHouseInfo.do")
    public String UpdateHouseInfo(@Param("houseModel") HouseModel houseModel, HttpSession session) {
        Integer uid= (Integer) session.getAttribute("Uid");
        houseModel.setUid(uid);
        houseService.UpdateHouse(houseModel);
        System.out.println(houseModel);
        return "forward:/HouseList.do";
    }

}
UserController.java

package com.hp.controller;

import com.hp.model.UserModel;
import com.hp.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

@Controller
@SessionAttributes(value={"Userid","Uid"})
public class UserController {
    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @Resource
    private UserService userService;

    @RequestMapping("login.do")
    public String login(){
        return "login";
    }

    @RequestMapping(value="uameCheck.do",method= RequestMethod.POST)
    public void uameCheck(@RequestParam("userid")String userid, HttpServletResponse response, HttpServletRequest request, HttpSession session, Model model) throws IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        Boolean login=userService.Login(userid);
        if(login){
            out.println("账号正确");
        }else{
            out.println("账号错误");
        }

        out.flush();
        out.close();

    }



    @RequestMapping(value="loginCheck.do",method= RequestMethod.POST)
    @ResponseBody
    public Map<String,String> loginCheck(@RequestParam("userid")String userid, @RequestParam("userpass")String userpass ,ModelMap modelMap,HttpSession session) throws IOException {
        Map<String,String> map=new HashMap<String,String>();
       UserModel login=userService.Login2(userid,userpass);
        if (login !=null){
            modelMap.addAttribute("Userid",login.getUrealname());
            modelMap.addAttribute("Uid",login.getUid());
            System.out.println(session.getAttribute("Userid")+"==================loginCheck");
            map.put("msg","1");
        }else{
            map.put("msg","0");
        }
        return  map;
    }



}

4.2.6、配置web.xml文件


<?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>houseSSM_20180327</display-name>
<!--<description>SSM_Demo_0.0.1</description>-->
 <!-- &lt;!&ndash;全局配置 &ndash;&gt;-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>

 <!-- &lt;!&ndash; 该监听器主要作用是随tomcat的启动,而加载context中的全局配置文件 &ndash;&gt;-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!--&lt;!&ndash; 该过滤器主要作用是处理字符乱码 ,可拦截所有请求,处理所有乱码&ndash;&gt;-->
  <filter>
    <filter-name>CharacterEncoding</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>CharacterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>



  <servlet>
    <servlet-name>springmvc</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>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
    <!--&lt;!&ndash;-->
    <!--*.do拦截所有带do的请求,对静态资源放行-->
    <!--/ 拦截所有带.jsp的请求,同时对静态资源拦截-->
    <!--/* 拦截所有-->
     <!--&ndash;&gt;-->
  </servlet-mapping>



  <!--欢迎页面-->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>


</web-app>

4.2.7、写jsp页面

附上目录

4.2.7.1、建立index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%--<%@ taglib prefix="c"--%>
<%--uri="http://java.sun.com/jsp/jstl/core" %>--%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <title>Hello World!</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <script src="${pageContext.request.contextPath}/static/js/jquery-3.3.1.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script type="text/javascript">
        $(function() {
            setTimeout( $("#hello").submit(),4000);
        });
    </script>
</head>
<body>
<h2>Hello World!</h2>
Hello World!   即将跳转登陆页面。。。。。。。
<form action="${pageContext.request.contextPath}/login.do" id="hello"></form>
</body>
</html>
4.2.7.2、建立login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%--<%@ taglib prefix="c"--%>
           <%--uri="http://java.sun.com/jsp/jstl/core" %>--%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <title>登录</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <%--<script src="${pageContext.request.contextPath}/static/layui.all.js"></script>--%>
    <script src="${pageContext.request.contextPath}/static/js/jquery-3.3.1.js"></script>
    <style type="text/css">
        table {
            border: 1px solid mediumpurple;
            text-align: center;
        }
        table tr td {
            border: 1px solid mediumpurple;
            text-align: center;
            width: 60px;
            height: 28px;
        }
    </style>
</head>
<body>
<div>
    <center>
        <table cellspacing="0">
            <form id="contact" action="<%=basePath%>/HouseList.do" method="post">
                <tr>

                    <h4>管理员登录</h4>

                </tr>
                <tr>
                    <td>账号:</td>
                    <td style="width: 200px">
                        <input placeholder="账号" type="text" name="userid" id="userid" style="width: 230px"
                               οnblur="m1()">
                        <span id="nameDiv1" style="color: red; font-size: 15px;"></span>
                    </td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td style="width: 200px">

                        <input placeholder="密码" type="password" name="userpass" id="userpass" style="width: 230px"
                               maxlength="5" οnblur="m2()">
                        <span id="nameDiv2" style="color: red; font-size: 15px;"></span>
                    </td>
                </tr>
                <tr><td colspan="2">
                    <input name="sub" type="button" οnclick="tijiao()" value="登录"/>
                </td>
                </tr>
                </fieldset>
            </form>
        </table>
    </center>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        function m1() {

            $(document).ready(function () {

                var userid = $("#userid").val();

                if (userid == null || userid == "") {
                    $("#nameDiv1").html("账号不能为空");

                } else {
                    $.post("uameCheck.do", {
                        "userid": userid
                    }, function (data) {
                        $("#nameDiv1").html(data);
                    }, "text");

                }

            });

        }


        function m2() {
            $(document).ready(function () {
                var userpass = $("#userpass").val();
                if (userpass == null || userpass == "") {
                    $("#nameDiv2").html("密码不能为空");
                } else if (userpass.length < 3) {
                    $("#nameDiv2").html("密码长度不能小于三位");
                }else if (userpass.length > 6) {
                    $("#nameDiv2").html("密码长度不能大于六位");
                } else if(userpass.length > 3 && userpass.length<6){
                    $("#nameDiv2").hide();
                }

            });
        }

        function tijiao() {

            var da = {
                'userid': $("#userid").val(),
                'userpass': $("#userpass").val()
            };
            $.ajax({
                type: "post",
                url: 'loginCheck.do',
                data: da,
                success: function (data) {
                    if (data.msg == 1) {

                        setTimeout(yoursubmit() ,2000);
                        function yoursubmit() {
                            alert('登陆成功!即将跳转');
                                setTimeout( $("#contact").submit(),3000);
                            // setTimeout( window.location.href("http://localhost:8080/houseSSM_20180327/HouseList.do"),6000);
                        }
                    } else if (data.msg ==  0) {
                        alert('提示信息!!!!     登陆失败!');
                        $("#userid").val('');
                        $("#userpass").val('');
                    }
                },
                error:function () {
                  alert("wwwwwwwwww")
                }
            })
        }

    </script>
</div>
</body>
</html>

4.2.7.3、建立HouseInfo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <title>Hello World!</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <script src="${pageContext.request.contextPath}/static/js/jquery-3.3.1.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <style type="text/css">
        table {
            border: 1px solid mediumpurple;
            text-align: center;
        }

        table tr td {
            border: 1px solid mediumpurple;
            text-align: center;
            width: 40px;
            height: 28px;
        }

        a {
            color: rebeccapurple;
        }
    </style>
</head>
<body>
<center>
    <table cellspacing="0">
        <tr>
            <td colspan="8"><b>房屋出租管理信息</b></td>
            <td colspan="6"><b><a href="<%=basePath%>/HouseHello.do">发布信息</a></b></td>
        </tr>

        <tr>
            <td><b>编号</b></td>
            <td><b>所在区域</b></td>
            <td><b>小区名称</b></td>
            <td><b>房型</b></td>
            <td><b>房屋面积(/m*m)</b></td>
            <td><b>装修情况</b></td>
            <td><b>楼层</b></td>
            <td><b>租金(¥)</b></td>
            <td><b>房东</b></td>
            <td><b>房东电话</b></td>
            <td><b>出租情况</b></td>
            <td><b>发布人</b></td>
            <td><b>修改</b></td>
        </tr>

        <c:forEach items="${houselist}" var="houselist">
            <tr>
                <td>${houselist.hid}</td>
                <td>${houselist.harea}</td>
                <td>${houselist.hname}</td>
                <td>${houselist.hfx}</td>
                <td>${houselist.hmj}</td>
                <td>${houselist.hzx}</td>
                <td>${houselist.hlc}</td>
                <td>${houselist.hzj}</td>
                <td>${houselist.hfd}</td>
                <td>${houselist.hfdtel}</td>
                <td ${houselist.hqk=='未出租'? "style='color: crimson'":"style='color: black'"}>
                    <span>${houselist.hqk}</span>
                </td>

                <td>${Userid}</td>
                <td><a href="<%=basePath%>/UpdateHouse.do?hid=${houselist.hid}">修改</a></td>
            </tr>
        </c:forEach>
    </table>
</center>
</body>
</html>
4.2.7.4、建立HouseInsert.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <title>Hello World!</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <script src="${pageContext.request.contextPath}/static/js/jquery-3.3.1.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <style type="text/css">
        table {
            border: 1px solid mediumpurple;
            text-align: center;
        }

        table tr td {
            border: 1px solid mediumpurple;
            text-align: center;
            width: 220px;
            height: 30px;
        }

        a {
            color: rebeccapurple;
        }
    </style>
</head>
<body>
<center>
    <form  action="<%=basePath%>InsertHouse.do" method="post">
        <table cellspacing="0">
            <tr>
                <td colspan="2"><b>房屋出租管理信息</b></td>
            </tr>
            <tr>
                <td><b>所在区域</b></td>
                <td><select name="harea">
                    <option value="武昌区">武昌区</option>
                    <option value="洪山区">洪山区</option>
                    <option value="高新区">高新区</option>
                </select></td>
            </tr>
            <tr>
                <td><b>小区名称</b></td>
                <td><input type="text" name="hname"></td>
            </tr>
            <tr>
                <td><b>房型</b></td>
                <td><input type="text" name="hfx"></td>
            </tr>
            <tr>
                <td><b>房屋面积(/m*m)</b></td>
                <td><input type="text" name="hmj"></td>
            </tr>
            <tr>
                <td><b>装修情况</b></td>
                <td><input type="radio" name="hzx" value="简装" />简装
                    <input type="radio" name="hzx" value="精装" />精装
                    <input type="radio" name="hzx" value="毛坯" />毛坯</td>
            </tr>
            <tr>
                <td><b>楼层</b></td>
                <td><input type="text" name="hlc"></td>
            </tr>
            <tr>
                <td><b>租金(¥)</b></td>
                <td><input type="text" name="hzj"></td>
            </tr>
            <tr>
                <td><b>房东</b></td>
                <td><input type="text" name="hfd"></td>
            </tr>
            <tr>
                <td><b>房东电话</b></td>
                <td><input type="text" name="hfdtel"></td>
            </tr>
            <tr>
                <td><b>出租情况</b></td>
                <td><input type="radio" name="hqk" value="未出租" />未出租
                    <input type="radio" name="hqk" value="已经出租" />已经出租</td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交"></td>
            </tr>

        </table>
    </form>
</center>
</body>
</html>
4.2.7.5、建立HouseUpdate.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <title>Hello World!</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <script src="${pageContext.request.contextPath}/static/js/jquery-3.3.1.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <style type="text/css">
        table {
            border: 1px solid mediumpurple;
            text-align: center;
        }

        table tr td {
            border: 1px solid mediumpurple;
            text-align: center;
            width: 220px;
            height: 30px;
        }

        a {
            color: rebeccapurple;
        }
    </style>
    <script type="text/javascript">
        $(function(){
            var harea = $("#harea").val();
            var hzx = $("#hzx").val();
            var hqk = $("#hqk").val();
            $("#selectHarea").find("option[value = '"+harea+"']").attr("selected","selected");
            $('input:radio').eq(hzx).attr('checked','true');
            $('input:radio').eq(hqk).attr('checked','true');
            $("input:radio[value="+ hzx+"]").attr('checked','true');
            $("input:radio[value="+ hqk+"]").attr('checked','true');
        });
    </script>
</head>
<body>
<center>
    <form  action="<%=basePath%>UpdateHouseInfo.do?hid=${houseModel.hid}" method="post">
        <table cellspacing="0">
            <tr>
                <td colspan="2"><b>房屋出租管理信息</b></td>
            </tr>
            <tr>
                <input type="hidden" value="${houseModel.harea}" id="harea">
                <td><b>所在区域</b></td>
                <td><select name="harea" id="selectHarea">
                    <option value="武昌区">武昌区</option>
                    <option value="洪山区">洪山区</option>
                    <option value="高新区">高新区</option>
                </select></td>
            </tr>
            <tr>
                <td><b>小区名称</b></td>
                <td><input type="text" name="hname" value="${houseModel.hname}" ></td>
            </tr>
            <tr>
                <td><b>房型</b></td>
                <td><input type="text" name="hfx" value="${houseModel.hfx}" ></td>
            </tr>
            <tr>
                <td><b>房屋面积(/m*m)</b></td>
                <td><input type="text" name="hmj" value="${houseModel.hmj}" ></td>
            </tr>
            <tr>
                <td><b>装修情况</b></td>
                <td><input type="hidden" value="${houseModel.hzx}" id="hzx">
                    <input type="radio" name="hzx" value="简装" />简装
                    <input type="radio" name="hzx" value="精装" />精装
                    <input type="radio" name="hzx" value="毛坯" />毛坯</td>
            </tr>
            <tr>
                <td><b>楼层</b></td>
                <td><input type="text" name="hlc" value="${houseModel.hlc}" ></td>
            </tr>
            <tr>
                <td><b>租金(¥)</b></td>
                <td><input type="text" name="hzj" value="${houseModel.hzj}" ></td>
            </tr>
            <tr>
                <td><b>房东</b></td>
                <td><input type="text" name="hfd"  value="${houseModel.hfd}" ></td>
            </tr>
            <tr>
                <td><b>房东电话</b></td>
                <td><input type="text" name="hfdtel"  value="${houseModel.hfdtel}" ></td>
            </tr>
            <tr>
                <td><b>出租情况</b></td>
                <td><input type="hidden" value="${houseModel.hqk}" id="hqk">
                    <input type="radio" name="hqk" value="未出租" />未出租
                    <input type="radio" name="hqk" value="已经出租" />已经出租</td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交"></td>
            </tr>

        </table>
    </form>
</center>
</body>
</html>
4.2.8、部署项目

 

输入地址:http://localhost:8080/houseSSM_20180327/

至此,SSM三大框架的整合就完成了,在此基础上可再添加其他功能。

4.2.8、项目截图




4.2.8、项目截图

4.2.8、作者的话,项目总结,和一些感言

不知不觉来在这个行业学习了两年了,刚开始的时候什么都不懂,学习什么都是一脸懵逼,java基础学了俩月,

虽然现在觉得java基础很简单,但是吧,当时的确是学的怀疑整个人生,但是现在一步步也熬过来了,在这里

留给学弟学妹们一点话,路需要一步一步走过来,不要怀疑自己的决定,坚持就好,在坚持的路上付出的艰辛

一切都是值得的,大家一起加油学习,作者qq2215152092,有兴趣的朋友们可以加一下,一起互相学习交流。







评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值