ssm框架整合,超详细!!


前言

  • 之前学ssm整合没学太懂,再来复习一下框架的整合

  • 整合springmvc与mybatis(没用maven)

  • 软件是idea

  • 只写了简单的登录,增删改查

  • 注释很详细噢,很适合新手


一、配置文件

1.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_4_0.xsd"
         version="4.0">
    <display-name>springmvc_mybatis</display-name>

    <!--Spring核心监听器  -->
    <!--在服务器启动时加载Spring容器,且只会加载一次  -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 此处contextConfigLocation的值是你spring配置文件的名称,我的是applicationContext.xml-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!--配置Springmvc核心控制器  -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 此处contextConfigLocation的值是你springmvc配置文件的名称,我的是springmvc.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <!--让DispatcherServlet拦截所有URL,这里也可以拦截.do请求-->
        <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>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

2.application.xml(spring配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--加载配置文件 读取db.properties-->
    <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"></context:property-placeholder>

    <!--spring整合mybatis的配置-->
    <!--配置数据源 数据库连接信息,单独写在db.properties,修改很方便,也可以直接写在value里-->
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          id="dataSource">
        <property name="driverClassName" value="${driver}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${username}"></property>
        <property name="password" value="${password}"></property>
    </bean>

    <!--配置SqlSessionFactory-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean"
          id="sqlSessionFactory">
        <property name="dataSource" ref="dataSource"></property>
        <property name="typeAliasesPackage" value="com.entity"></property>
        <!--配置Mapper映射文件的位置,我这里没放在文件夹下面,如果放在某个文件夹下面不要忘了写上-->
        <property name="mapperLocations" value="classpath:*Mapper.xml"></property>
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    </bean>

    <!--配置Mapper接口的扫描器  还可以使用mybatis scan -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          id="scannerConfigurer">
        <!-- 配置mapper接口所在的包 -->
        <property name="basePackage" value="com.mapper"></property>
        <!--注入会话工厂-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!--spring中基于XML的声明式事务控制的配置-->
    <!--事务配置-->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
          id="transactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 启用注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

3.mybatis-config.xml(mybatis配置文件)

其实整合以后mybatis配置文件里没什么基本东西了
先来看一下单独用mybatis时的配置文件:

但整合后,数据库连接信息和事务管理,数据源这些基本都整合到了spring的配置文件里。所以简单点的整合是可以不写这个配置文件的。但是我这里,数据库是这样的:
在这里插入图片描述
所以我在mybatis-config里开启了驼峰命名(就是把user_id换成userId这样的形式); 或者写sql语句的时候起个别名。
整合以后的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="mapUnderscoreToCamelCase" value="true"/>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

4.springmvc.xml(springmvc配置文件)

这里还可以添加很多其他东西,比如拦截器,文件上传解析器,但是我只写了最简单的

<?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:mvc="http://www.springframework.org/schema/mvc" 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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--指定需要扫描的包-->
    <context:component-scan base-package="com"></context:component-scan>
    <!--2. 开启注解 springmvc注解支持-->
    <mvc:annotation-driven />
    <!--3.配置视图解析器 加前缀后缀 最终解析出的jsp文件路径是:前缀+逻辑视图名+后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    
    <!--4.文件上传解析器-->
    
</beans>

5.db.properties(数据库配置文件)

#数据库连接信息文件:连接数据库的4个信息
#驱动类
driver=com.mysql.jdbc.Driver
#url地址
url=jdbc:mysql://localhost:3306/mybatis
#用户名
username=root
#密码
password=sasa

6.log4j.properties(log4j日志)

log4j.rootLogger=DEBUG,TEST,FILE

log4j.appender.TEST=org.apache.log4j.ConsoleAppender 
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout 
log4j.appender.TEST.layout.ConversionPattern=[%d] [%p] [%l] [%m] %n

log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=d:/log.txt
log4j.appender.FILE.MaxFileSize=100KB
log4j.appender.FILE.MaxBackupIndex=2
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d] [%p] [%l] [%m] %n

加入这个控制台可以看到超详细日志,就像这样
在这里插入图片描述

二、数据库,jar包

1.数据库

主键id自动增长,不为空
在这里插入图片描述

2.jar包

除了基础的spring包以外,还要导入jstl包
maven仓库搜索,挑一个最多人下的下载 ,

在这里插入图片描述在这里插入图片描述
如果用maven更简单,直接复制到pom文件里
在这里插入图片描述

三、java文件

他们之间的关系参考(5)

1.bean(实体类)

package com.entity;

import java.io.Serializable;

//实现序列化接口
public class Userinfo implements Serializable {
    //属性
    private Integer userId;
    private String userName;
    private String userPassword;
    private Integer userAge;
    private String userSex;
    //构造函数
    public Userinfo() {
    }
    public Userinfo(Integer userId, String userName, String userPassword, Integer userAge, String userSex) {
        this.userId = userId;
        this.userName = userName;
        this.userPassword = userPassword;
        this.userAge = userAge;
        this.userSex = userSex;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public Integer getUserAge() {
        return userAge;
    }

    public void setUserAge(Integer userAge) {
        this.userAge = userAge;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    @Override
    public String toString() {
        return "Userinfo{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                ", userAge=" + userAge +
                ", userSex='" + userSex + '\'' +
                '}';
    }
}

2.mapper(对象持久化映射层)

(1) mapper接口
package com.mapper;

import com.entity.Userinfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
//mapper对应的注解是@Repository
@Repository
public interface UserinfoMapper {
    //添加
    public void addUserinfo(Userinfo userinfo);
    //修改
    public void updateUserinfo(Userinfo userinfo);
   //删除
   public void deleteUserByUserid(Integer userId);
    //查询所有
    public List<Userinfo> selectAll();
    //登录
    public Userinfo login(Userinfo userinfo);
}

(2) mapper.xml

在mapper.xml写sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--对应的mapper接口-->
    <mapper namespace="com.mapper.UserinfoMapper">
   <!--登录-->
    <!--parameterType是传入的类型,resultType是返回的类型 这个id要和-->
    <select id="login"  parameterType="com.entity.Userinfo"  resultType="com.entity.Userinfo">
		select user_id, user_name, user_age,user_sex from userinfo where user_name=#{userName} and user_password=#{userPassword}
	</select>
    <!--查询所有-->
    <select id="selectAll"   resultType="com.entity.Userinfo" >
		select user_id, user_name, user_age,user_sex from userinfo
	</select>
    <!--删除-->
    <delete id="deleteUserByUserid" parameterType="int" >
         delete from userinfo where user_id=#{userId}
    </delete>
    <!--添加-->
    <insert id="addUserinfo" parameterType="com.entity.Userinfo">
        insert into userinfo values(null,#{userName},#{userPassword},#{userAge},#{userSex})
    </insert>
    <!--修改-->
    <update id="updateUserinfo" parameterType="com.entity.Userinfo">
        update userinfo set user_name=#{userName},user_password=#{userPassword},
        user_age=#{userAge},user_sex=#{userSex} where user_id=#{userId}
     </update>

</mapper>

3.service(业务层:业务逻辑处理)

(1) service接口
package com.service;

import com.entity.Userinfo;

import java.util.List;

public interface UserinfoService {
    //登录
   public Userinfo login(Userinfo userinfo);
   //查询所有
    public List<Userinfo> selectAll();
    //删除
    public void deleteUserByUserid(int userId);
    //添加
    public void adduserinfo(Userinfo userinfo);
    //修改
    public void updateuserinfo(Userinfo userinfo);
}

(2) service实现类
package com.service.impl;

import com.entity.Userinfo;
import com.mapper.UserinfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.service.UserinfoService;

import java.util.List;

//Service对应的注解是@Service
@Service
public class UserinfoServiceImpl implements UserinfoService {
    //要把mapper注入service 自动注入
    @Autowired
    private UserinfoMapper userinfoMapper;
    //登录
    @Override
    public Userinfo login(Userinfo userinfo) {
        return userinfoMapper.login(userinfo);
    }
    //查询所有  是集合形式
    @Override
    public List<Userinfo> selectAll() {
        List<Userinfo> userinfo=userinfoMapper.selectAll();
        return userinfo;
    }
    //删除
    @Override
    public void deleteUserByUserid(int userId) {
        userinfoMapper.deleteUserByUserid(userId);
    }
    //添加
    @Override
    public void adduserinfo(Userinfo userinfo) {
        userinfoMapper.addUserinfo(userinfo);
    }
    //修改
    @Override
    public void updateuserinfo(Userinfo userinfo) {
         userinfoMapper.updateUserinfo(userinfo);
    }


}

4.controller(控制层)

package com.controller;
import com.entity.Userinfo;
import com.sun.deploy.net.HttpResponse;
import org.omg.CORBA.Request;
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 com.service.UserinfoService;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.ws.Response;
import java.io.IOException;
import java.util.List;

//Controller对应的注解是@Controller
@Controller
@RequestMapping("user")
public class FirstController {

    //要把service注入到controller中 自动注入
    @Autowired
    private UserinfoService userinfoService;

    @RequestMapping("/login")
    public ModelAndView login(Userinfo userinfo, ModelAndView modelAndView, HttpSession httpSession) throws IOException {
        Userinfo u=userinfoService.login(userinfo);
        System.out.println("用户登录:");
          if(u!=null){//如果用户不为空,说明此用户在数据库中存在,登陆成功
              //msg success都是要传递的信息,在index.jsp页面中用${msg}来获取
              modelAndView.addObject("msg", u.getUserName());
              modelAndView.addObject("success", "您好,登陆成功,欢迎来到查询界面");
              //用户对象存入session
              httpSession.setAttribute("nowuser", u);
              //我这里是登录就立马查询所有信息,也可以搞一个超链接,href="/user/select"来访问
              List users=userinfoService.selectAll();
              //把数据users传到selectpage.jsp
              modelAndView.addObject("users",users);
              modelAndView.setViewName("selectpage");
          }else{
              //response.sendRedirect("../login.jsp?islogin="+false);
              //如果有重定向,那么视图解析器不再起作用,需要写完整路径
              modelAndView.setViewName("redirect:../login.jsp?islogin=false");
          }

          return modelAndView;
    }
     //我这里是登录就立马查询所有信息,也可以搞一个超链接,href="/user/select"来访问
//    @RequestMapping("/select")
//    public ModelAndView select( ModelAndView modelAndView) {
//        List users=userinfoService.selectAll();
//        modelAndView.addObject("users",users);
//        modelAndView.setViewName("selectpage");
//        return modelAndView;
//    }

    @RequestMapping("/add")
    public ModelAndView add(Userinfo userinfo,ModelAndView modelAndView) {
        System.out.println("进入添加方法");
        userinfoService.adduserinfo(userinfo);
        //添加完后返回查询页面
        List users=userinfoService.selectAll();
        modelAndView.addObject("users",users);
        modelAndView.setViewName("selectpage");
        return modelAndView;
    }
    @RequestMapping("/update")
    public ModelAndView update(HttpServletRequest request,Userinfo userinfo,ModelAndView modelAndView) {
        System.out.println("进入修改方法");
        userinfoService.updateuserinfo(userinfo);
        List users=userinfoService.selectAll();
        modelAndView.addObject("users",users);
        modelAndView.setViewName("selectpage");
        return modelAndView;
    }
    @RequestMapping("/delete")
    public ModelAndView delete(HttpServletRequest request,ModelAndView modelAndView) {
        System.out.println("进入删除方法");
        int userId;
        //获取传入的id 通过id来删除
        userId=Integer.parseInt(request.getParameter("userId"));
        userinfoService.deleteUserByUserid(userId);
        //重新查询
        List<Userinfo> users= userinfoService.selectAll();
        modelAndView.addObject("users",users);
        modelAndView.setViewName("selectpage");
        return modelAndView;
    }
}




5.关系

SSM是sping+springMVC+mybatis集成的框架。 MVC即model view controller。

model层=bean=entity层。存放我们的实体类,与数据库中的属性值基本保持一致。

service层。存放业务逻辑处理,也是一些关于数据库处理的操作,但不是直接和数据库打交道,他有接口还有接口的实现方法,在接口的实现方法中需要导入mapper层,mapper层是直接跟数据库打交道的,他也是个接口,只有方法名字,具体实现在mapper.xml文件里,service是供我们使用的方法。

mapper层=dao层,现在用mybatis逆向工程生成的mapper层,其实就是dao层。对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,而service层是针对我们controller,也就是针对我们使用者。service的impl是把mapper和service进行整合的文件。数据持久化操作就是指,把数据放到持久化的介质中,同时提供增删改查操作,比如数据通过hibernate插入到数据库中

controller层。控制器,导入service层,因为service中的方法是我们使用到的,controller通过接收前端传过来的参数进行业务操作,在返回一个指定的路径或者数据表。

上面的解释原文,很清晰

mapper对应的注解是@Repository;Service对应的注解是@Service;Controller对应的注解是@Controller

在service中自动注入mapper:
在这里插入图片描述

在controller中自动注入service:
在这里插入图片描述


四、jsp文件

很丑,最基本的页面,主要看功能吧

1.login.jsp(登陆页面)

<%--
  Created by IntelliJ IDEA.
  User: syh
  Date: 2021/3/16
  Time: 15:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <h1>登陆页面</h1>
    <h2 style="color: red">
        <%--判断用户名密码是否正确--%>
        ${param.islogin=="false" ? "用户名或密码错误!":"" }
    </h2>
    <form action="user/login" method="post">
        请输入用户名:<input type="text" name="userName">
        请输入密码:<input type="password" name="userPassword">
        <input type="submit" value="提交">
    </form>
</head>
<body>
</body>
</html>

在这里插入图片描述

2.selectpage.jsp(登陆成功以后查询)

用了c标签循环查找和el表达式

<%--
  Created by IntelliJ IDEA.
  User: syh
  Date: 2021/3/30
  Time: 16:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入c标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>用户信息查询</title>
</head>
<style>
    td{
        width:250px;
    }
</style>
<body>
<center>
     <%-- 控制器传来的参数--%>
    <h2> ${msg} ${success}</h2>
    <hr>
    <h1>用户信息查询</h1>
    <a href="../add.jsp">添加用户</a>
 <table width="50%"  border="1" cellpadding="1" cellspacing="1"><tr>
     <tr>
         <th>用户id</th>
         <th>姓名</th>
         <th>年龄</th>
         <th>性别</th>
         <th>操作</th>
     </tr>
    <c:forEach items="${requestScope.users}" var="u" >
        <tr>
            <th>${u.userId}</th>
            <th>${u.userName}</th>
            <th>${u.userAge}</th>
            <th>${u.userSex}</th>
            <%--修改和删除都要带参数过去,删除还要弹出是否确定的框,以免误删--%>
            <th><a href="../update.jsp?userId=${u.userId} ">修改</a>/<a href="/springmvc/user/delete?userId=${u.userId}" onclick="return confirm('是否确定删除?')">删除</a></th>
        </tr>
    </c:forEach>
 </table>
</center>
</body>
</html>

在这里插入图片描述

3.add.jsp(添加页面)

<%--
  Created by IntelliJ IDEA.
  User: syh
  Date: 2021/4/4
  Time: 5:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加用户</title>
</head>
<body>
     <h1>请添加用户</h1>
     <form action="/springmvc/user/add" method="post">
         用户名: <input type="text" name="userName" ><br>
         密码:<input type="password" name="userPassword"><br>
         年龄:<input type="text" name="userAge"><br>
         性别:<input type="text" name="userSex"><br>
         <input type="submit" value="提交">
     </form>
</body>
</html>

添加页面没id这个框,因为数据库里面设置的自动增长

4.update.jsp(修改页面)

<%--
  Created by IntelliJ IDEA.
  User: syh
  Date: 2021/4/4
  Time: 5:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>修改用户</title>
</head>
<body>
<h1>请修改用户</h1>
<form action="/springmvc/user/update" method="post">
    <%--传入的id用 value="<%=request.getParameter("userId")%>"来获取--%>
    Id:<input type="text" name="userId"  readonly="true"  value="<%=request.getParameter("userId")%>">
    用户名: <input type="text" name="userName"><br>
    密码:<input type="password" name="userPassword"><br>
    年龄:<input type="text" name="userAge"><br>
    性别:<input type="text" name="userSex"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

在这里插入图片描述
这个地方id文本框要设置成只读,还可以把其他的信息也获取到,但是可修改,就方便很多

五、结尾

1. 项目结构

在这里插入图片描述
在这里插入图片描述

2.总结

比较简单的一个ssm框架整合,希望能学到更多来完善,加油,进步!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值