首页 > 其他分享 >SSM项目整合思路以及代码

SSM项目整合思路以及代码

时间:2023-07-02 18:12:41浏览次数:48  
标签:web java 代码 springframework 如下 SSM org 思路 servlet

  当前真实的企业开发中,SpringBoot已经统一Java企业应用开发,很少有在使用SSM项目来进行项目开发的。

可是在教学阶段,还是很有必要给学生讲解Java开发中一套很经典的框架,SSM框架。作为一个过渡阶段讲解的

项目比较合适,之后在讲解SpringBoot项目,相对来说要好理解一些。如果以开始就直接讲解SpringBoot框架,

那新的学生不一定能够理解底层的一些东西,例如SpringBoot是如何封装所需要的项目依赖。

接下来就简单讲解一下整合的思路,步骤,最后使用一个简单的新增方法来测试整合是否正确实现。

开发环境:Mysql-5.7 + JDK-1.8 + Maven-3.6 + Tomcat-8.5.5

如果有不具备这些环境,则使用工具的版本微调即可。

第一步,需要依赖的maven 坐标

<dependencies>

<!--spring核心包-context-SSM三大框架之一-->

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-context</artifactId>

      <version>5.3.27</version>

</dependency>

<!--spring核心包-连接数据库使用-->

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-jdbc</artifactId>

      <version>5.3.27</version>

</dependency>

<!--druid-数据库连接池-->

    <dependency>

      <groupId>com.alibaba</groupId>

      <artifactId>druid</artifactId>

      <version>1.2.18</version>

</dependency>

<!--mybatis-操作数据库-SSM三大框架之一-->

    <dependency>

      <groupId>org.mybatis</groupId>

      <artifactId>mybatis</artifactId>

      <version>3.5.6</version>

</dependency>

<!--spring整合mybatis的依赖包-->

    <dependency>

      <groupId>org.mybatis</groupId>

      <artifactId>mybatis-spring</artifactId>

      <version>1.3.3</version>

</dependency>

<!--spring核心包web开发会使用到-->

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-web</artifactId>

      <version>5.3.27</version>

</dependency>

<!--springMVC-SSM三大框架之一-->

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-webmvc</artifactId>

      <version>5.3.27</version>

</dependency>

<!--连接mysql数据库会使用到的包-->

    <dependency>

      <groupId>mysql</groupId>

      <artifactId>mysql-connector-java</artifactId>

      <version>8.0.33</version>

    </dependency>

  </dependencies>

总结: 需要引入的包,Spring框架的核心包,SpringMvc框架的包,还有Mybatis相关的包,Spring整合mybatis的包。

 

第一步就是配置文件.

SpringMvc的配置文件

application-mvc.xml 需要保留,配置信息如下

    <!-- 注解驱动-->

    <mvc:annotation-driven/>

    <!--开起扫描包-->

    <context:component-scan base-package="com.ssm.controller"/>

 

    <!--配置 页面前缀和后缀-->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/page/"/>

        <property name="suffix" value=".jsp"/>

</bean>

Spring的配置文件

applicationContext.xml 需要保留,配置信息如下

 <!--开起事务注解-->

    <tx:annotation-driven/>

    <!--开起扫描包-->

    <context:component-scan base-package="com.ssm"/>

    <!--导入资源文件-->

    <context:property-placeholder location="classpath*:jdbc.properties"/>

    <!--数据源-->

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

        <property name="driverClassName" value="${jdbc.driver}"/>

        <property name="url" value="${jdbc.url}"/>

        <property name="username" value="${jdbc.username}"/>

        <property name="password" value="${jdbc.password}"/>

    </bean>

 

    <!--创建 sqlSessionFactoryBean-->

    <bean class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="dataSource" ref="dataSource"/>

        <property name="typeAliasesPackage" value="com.ssm.pojo"/>

    </bean>

 

    <!--创建映射 mapper-->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

        <property name="basePackage" value="com.ssm.dao"/>

</bean>

数据库配置信息

jdbc.properties 文件,配置信息如下

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://127.0.0.1:3306/test

jdbc.username=root

jdbc.password=root

创建的表语句如下

CREATE TABLE `user_info` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `user_name` varchar(20) DEFAULT NULL COMMENT '用户名字',

  `user_age` int(11)  COMMENT '用户名字',

  `is_delete` int(11) DEFAULT '0' COMMENT '是否删除',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

如果搭建项目这些步骤就直接省略。自己测试时使用的是IDEA,整个项目的结构如下

 

 

页面跳转Controller里面的代码如下

/**

 * @Author 一只爱阅读的程序员

 * @Description 首页跳转 控制器

 * @Date 2023/7/2 16:04

 * @Version 1.0

 */

@Controller

public class HtmlController {

    @RequestMapping("/")

    public String getIndex(){

        System.out.println("首页页面跳转控制");

        return "index";

    }

}

新增用户Controller里面的代码如下

/**

 * @Author 一只爱阅读的程序员

 * @Description 用户信息 控制器

 * @Date 2023/7/2 16:05

 * @Version 1.0

 */

 

@RestController

@RequestMapping("/user_info")

public class UserInfoController {

 

    @Resource

    UserInfoService userInfoService;

 

    /* @Description: 添加用户信息

     * @author: yilang

     * @date: 2023/7/2 16:43

     * @param: userinfo

     * @return: String

     */

    @RequestMapping(value = "/add", method = RequestMethod.POST)

    public String addUserInfo(UserInfo userinfo){

        boolean result = this.userInfoService.addUserInfo(userinfo);

        if(result){

            System.out.println("新增用户信息成功!");

        }

        return "success";

    }

}

Service实现类里面的代码如下

@Service

public class UserInfoServiceImpl implements UserInfoService {

 

    @Resource

    UserInfoDao userInfoDao;

 

    /* @Description: 新增用户信息

     * @author: yilang

     * @date: 2023/7/2 16:14

     * @param: userInfo

     * @return: int

     */

    public boolean addUserInfo(UserInfo userInfo) {

        int result = userInfoDao.addUserInfo(userInfo);

        return result == 1;

    }

}

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.ssm.dao.UserInfoDao">

    <insert id="addUserInfo" parameterType="com.ssm.pojo.UserInfo">

        insert into user_info(user_name, user_age)

        values

        (#{userName, jdbcType = VARCHAR},

        #{userAge, jdbcType = INTEGER})

    </insert>

</mapper>

 

JSP新增页面里面的代码如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>首页测试</title>

</head>

<body>

    <h1>测试首页</h1><hr/>

    <form action="user_info/add" method="post">

        用户姓名:<input type="text" name="userName"><br/>

        用户年龄:<input type="text" name="userAge"><br/>

            <input type="submit" value="新增">

    </form>

</body>

</html>

测试结果如下,项目正常启动。

 

 

首页信息如下

 

 

输入数据,点击新增按钮,新增成功如下,

 

 

然后查看数据库信息如下,

 

 

 

整合过程中遇到的问题,

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ssm.dao.UserInfoDao.addUserInfo

org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)

org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)

org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:115)

java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)

org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:102)

org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)

com.sun.proxy.$Proxy24.addUserInfo(Unknown Source)

com.ssm.service.impl.UserInfoServiceImpl.addUserInfo(UserInfoServiceImpl.java:31)

com.ssm.controller.UserInfoController.addUserInfo(UserInfoController.java:33)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

java.lang.reflect.Method.invoke(Method.java:498)

org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)

org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)

org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)

org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)

org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)

org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)

org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)

javax.servlet.http.HttpServlet.service(HttpServlet.java:652)

org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)

javax.servlet.http.HttpServlet.service(HttpServlet.java:733)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)

org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

):注意 主要问题的全部 stack 信息可以在 server logs 里查看

 

分析导致问题的原因,创建的dao接口类和对应的xml文件名称不一致才导致这个问题。

解决办法修改xml名称和dao接口类的名称一样即可。

拓展:如果想返回json数据信息,则需要添加一个新的依赖,

 

<!-- 返回JSON 数据的jar 包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>

在用户Controller中在新增一个方法,如下
@RequestMapping(value = "/test", method = RequestMethod.GET)
public Map test(){
Map<String, String> map = new HashMap();
map.put("userAge", "10");
map.put("userName", "萧炎");
return map;
}
测试结果如下

 

到此SSM项目整合完成,有其他建议的小伙伴欢迎留言讨论。

标签:web,java,代码,springframework,如下,SSM,org,思路,servlet
From: https://www.cnblogs.com/yilangcode/p/17521112.html

相关文章

  • 从代码整洁之道 看什么是好的代码
    整洁的代码只做好一件事:每个函数、每个类和每个模块都全身神贯注于一件事。这里结合自己之前代码设计和处理的时候想一下子把整体都思考完全,无论是思维还是代码设计都不是好的方法。方法减少重复代码提供表达力提早构建简单抽象有意义的命名函数函数应该做一件事,做好这件......
  • 6. SSM整合
    1.流程分析(1)创建工程创建一个Maven的web工程pom.xml添加SSM需要的依赖jar包编写Web项目的入口配置类,实现AbstractAnnotationConfigDispatcherServletInitializer​重写以下方法getRootConfigClasses():返回Spring的配置类->需要SpringConfig配置类......
  • OpenGL环境配置 和 测试代码(GLEW/GLFW VS2019)
    1.配置 2.测试代码:2.1 在黑板色的窗口上画一个三角形1#include<iostream>23//GLEW4#defineGLEW_STATIC5#include<GL/glew.h>67//GLFW8#include<GLFW/glfw3.h>91011//Functionprototypes12voidkey_callback(GLFWw......
  • [代码]如何在ASP.NET网页间传递数据
    重点总结目前为止在ASP.NET网页中传递数据的方式至少有5种:1、通过查询字符串传递数据。2、通过HTTPPOST传递数据。3、通过会话状态传递数据。4、通过源页的公共属性传递数据。5、通过源页中的控件值传递数据。到底使用哪种方式来进行数据的传递,这可能受到两方面的影响:1、页面重定......
  • N层研习中的测试代码01
    这是前文《N层研习记录01:试图通过Boolean参数控制并发冲突的检查方式(LINQtoSQL)》用到的测试代码。只是包含了其中最重要的部分,如果要想获取完整的代码,可以通过以下地址进行下载:下载地址2:http://u.115.com/file/f26716bcc2以上地址如果均不能下载,请留言通知我!测试代码的服务端使......
  • [代码]如何在ASP.NET网页间传递数据
    重点总结目前为止在ASP.NET网页中传递数据的方式至少有5种:1、通过查询字符串传递数据。2、通过HTTPPOST传递数据。3、通过会话状态传递数据。4、通过源页的公共属性传递数据。5、通过源页中的控件值传递数据。到底使用哪种方式来进行数据的传递,这可能受到两方面的影响:1、页面重定......
  • 【WALT】WALT入口 update_task_ravg() 代码详解
    目录【WALT】WALT入口update_task_ravg()代码详解代码展示代码逻辑⑴ 判断是否进入WALT算法⑵ 获取WALT算法中上一个窗口的开始时间⑶如果任务刚初始化结束⑷ 更新任务及CPU的cycles⑸ 更新任务及CPU的demand及pred_demand⑹ 更新CPU的busytime⑺ 更新任务的p......
  • 【WALT】update_window_start() 代码详解
    目录【WALT】update_window_start()代码详解代码展示代码逻辑【WALT】update_window_start()代码详解代码版本:Linux4.9android-msm-crosshatch-4.9-android12代码展示staticu64update_window_start(structrq*rq,u64wallclock,intevent){ s64delta; intnr_window......
  • 零代码编程:用ChatGPT自动输入账号密码来登陆网站
    现在很多网站都需要登陆账号和密码才能访问。如果要进行一些批量自动化操作,首先要做的就是模拟自动登陆。以萝卜投研网站为例:https://robo.datayes.com/v2/fastreport/industry打开网站后,默认出现这样一个登陆界面,要点击右上角,才会出现账号密码登陆按钮:<divclass="login-switch-bt......
  • 代码随想录|各种买卖股票问题
    121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III  188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费  总结121.买卖股票的最佳时机全程只能买卖一次贪心算法这个算法的写法也非......