ssm实现的功能
- 实现javaWeb开发。但是现在已经是不那么热门了。现在是2021年6月。现在流行spring boot could
- 实现功能:前端输入网址,通过springmvc 调用逻辑类 最终mvc返回前端response。其中spring是基础支撑。
开始整合
整合之前必读喔:
所谓整合实际上是spring整合mybatis。因为springmvc是spring子框架,她们之间容易整合,就好比在java类文件里调用其他类
第一步spring和springmvc整合
-
打开IDEA软件,新建项目工程,步骤一选择maven项目,其他步骤默认。
-
进入主界面后右击项目名称-添加框架支持-选择web工程,记得选择web.xml4.0
-
在maven引入ssm项目所需依赖。 所包涵的依赖
-
新建java包ssx
-
在resources文件夹里面新建两个xml配置文件。spring.xml和springmvc.xml配置文件。
-
在springmvc.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"
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">
<context:component-scan base-package="ssx">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 4.配置springmvc视图解析器 视图解析器解析的视频路径为:前缀 + 后缀 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp" />
</bean>
</beans>
- 在spring.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"
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">
<context:component-scan base-package="ssx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
- 找到webapp目录的WEB-INF目录下的web.xml文件打开。添加4个标签:
加载spring的配置文件
加载spring的监听类
加载springmvc的控制器类文件Dispatcher
加载utf8编码过滤器防止中文乱码
<?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">
<!--加载Spring 开始-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--设置配置文件路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!--加载Spring 结束-->
<!--加载spring mvc-->
<!--配置前端控制器-->
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc.xml配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--启动服务器时,创建该servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<url-pattern>*.do</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>
- 在webapp目录下新建first.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>fisrtJSP</title>
</head>
<body>
控制层跳转成功!
${pageContext.request.contextPath } <%--这是项目url根目录名称--%>
</body>
</html>
- 差不多已经配置好了,接下来开始写java代码了喔
- 新建类ssx.service.ServiceA。使用@Service注解。定义方法serviceFunA()
package ssx.service;
@org.springframework.stereotype.Service
public class ServiceA {
public void serviceFun(){
System.out.println("serviceFun");
}
}
- 新建类ssx.controller.ControllerA。使用@AutoWrite注解。 定义成员变量ServiceA a。使用@Controller注解。使用@RequestMapping注解。定义方法controllerFunA()
package ssx.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import ssx.service.ServiceA;
@Controller
public class ControllerA {
@Autowired
ServiceA serviceA;
@RequestMapping("one/one.do")
public String controllorFun(){
serviceA.serviceFun();
return "first";
}
}
- 在webapp目录下新建index.html文件(如果没有的话)。添加跳转标签<a>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--http://localhost:8080/ThirdSSMDemo_war/one/one.do-->
<a href="one/one.do">测试跳转链接one/one.do</a> <!--这种最前面没有/ 在运行的时候他会自动补全前面的 “${pageContext.request.contextPath }”-->
<!--http://localhost:8080/one/one.do-->
<a href="/one/one.do">测试跳转链接/one/one.do</a> <!--这种最前面有/ 在运行的时候不会补-->
</body>
</html>
- 最后一步 在IDEA里面启动方式添加tomcat容器。并启动。
- spring和springmvc整合完毕!
第二步spring和mybatis整合
- 在数据库mysql8准备数据库环境:
创建表third_ssm_tab(id int,name varchar(100))
- 新增java接口
ssx.dao.Idao
package ssx.dao;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface Idao {
@Insert(" insert into third_ssm_tab(name) values(#{name}) ")
void add(String name);
@Select("select * from third_ssm_tab") //返回的结果集是多行多列
List<Map<Object ,Object>> queryAll();
}
- 修改实体类ServiceA
package ssx.service;
import org.springframework.beans.factory.annotation.Autowired;
import ssx.dao.Idao;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@org.springframework.stereotype.Service
public class ServiceA {
@Autowired
Idao idao;
public List<Map<Object, Object>> serviceFun(String string){
idao.add(string);
return idao.queryAll();
}
}
- 修改实体类ControllerA
package ssx.controller;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import ssx.service.ServiceA;
import java.util.List;
import java.util.Map;
@Controller
public class ControllerA {
@Autowired //Spring的注解:仅当ServiceA的javabean唯一时,自动依赖注入
ServiceA serviceA;
@RequestMapping(value = "one/{action}.do")
public String controllorFun(Model model/*session全局上下文*/, @PathVariable(value = "action")String pram){
Logger logger = Logger.getLogger(ControllerA.class);//执行日志记录
logger.info("开始执行后台逻辑");
List<Map<Object, Object>> maps = serviceA.serviceFun(pram);//调用逻辑层方法
model.addAttribute("mo1",maps.get(maps.size()-1).toString());//session添加K-V数据
return "first";//根据返回值寻找对应的页面
}
}
- 在resources目录下新增文件db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/ssxbase?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
- 在resources目录下新增文件log4j.properties
log4j.rootLogger=DEBUG,CONSOLE,logFile,logTestFile
log4j.additivity.org.apache=true
# console
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=ALL
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[MyconsoleLog] %-5p %d{yyyy-MM-dd HH\:mm\:ss} - %C.%M(%L)[%t] - %m%n
# 日志文件(logFile)
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=false
log4j.appender.logFile.File=D:/IDEWork/log4j_log/run.log
log4j.appender.logFile.layout=org.apache.log4j.TTCCLayout
# 测试使用日志文件(logTestFile)
# 日志文件(logFile)
log4j.appender.logTestFile=org.apache.log4j.FileAppender
log4j.appender.logTestFile.Threshold=INFO
log4j.appender.logTestFile.ImmediateFlush=true
log4j.appender.logTestFile.Encoding=UTF-8
log4j.appender.logTestFile.Append=false
log4j.appender.logTestFile.File=D:/IDEWork/log4j_log/test.log
log4j.appender.logTestFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logTestFile.layout.ConversionPattern=[Test-Log] %-5p %d{yyyy-MM-dd HH\:mm\:ss} - %C.%M(%L)[%t] - %m%n
- 在resources目录下新增配置文件文件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>
<mappers>
<!--<!– <mapper resource="/dao/StudentDao.xml"></mapper>–> 适合mapper.xml方式开发-->
<!--<!– <mapper class="ssx.service"></mapper>–>适合注解开发-->
<package name="ssx.dao"/><!-- 适合xml+注解开发-->
</mappers>
</configuration>
- 修改resources目录下文件spring.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"
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">
<context:component-scan base-package="ssx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:property-placeholder location="classpath:db.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="initialPoolSize" value="10"/>
<!-- 连接池中连接最小个数 -->
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="20"/>
</bean>
<!-- 配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--配置dao所在的包-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="ssx.dao"/>
</bean>
</beans>
- 修改webapp目录下first.jsp文件
<%--
Created by IntelliJ IDEA.
User: Shenshuxin
Date: 2021/6/3
Time: 19:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>fisrtJSP</title>
</head>
<body>
控制层跳转成功!
${pageContext.request.contextPath } <%--这是项目url根目录名称--%>
<br>
结果:${mo1}
</body>
</html>
- 修改webapp目录下index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f() {
var elementById = document.getElementById("inputid").value;
// alert(elementById);
if (elementById == ""){
alert("输入值哦");
return;
}
var presuf = (("one/"+elementById)+".do");
window.location.href = presuf;
}
</script>
<!--http://localhost:8080/ThirdSSMDemo_war/one/one.do-->
<!-- <a href="one/a.do">测试跳转链接one/one.do</a> <!–这种最前面没有/ 在运行的时候他会自动补全前面的 “${pageContext.request.contextPath }”–>-->
<br>
<!--http://localhost:8080/one/one.do-->
<!-- <a href="/one/one.do">测试跳转链接/one/one.do</a> <!–这种最前面有/ 在运行的时候不会补–>-->
name:<input type="text" id="inputid" >
<input type="button" value="buttonn" onclick="f()">
</body>
</html>
至此,ssm整合完毕
最终结构:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/239261dd0159139a830697808861b56c.png)
项目源码:https://github.com/shenshuxin01/newMyGitHubPractice/tree/main/ThirdSSMDemo
下面是个人笔记:
- 控制层和接口层等之间是通过spring连接在一起,具体是通过依赖注入实现的,@AutoWired注解。