一、SSM框架的思想
ssm框架根据Spring、SpringMVC、MyBatis三者各自的特性及应用场景对其操作的的业务进行分类处理,降低了耦合性。
- SpringMVC主要应用于用户界面处理,接收用户请求以及展示请求处理结果。
- Spring框架主要应用与请求的实际业务逻辑处理。
- MyBatis主要应用于数据处理层,根据请求的处理过程对数据库进行操作。
二、各框架应用场景
1.SpringMVC框架
SpringMVC框架位于Controller层,主要为接收用户发起的请求,在接收请求后可进行一定处理(如:通过拦截器的信息验证处理)。在通过处理后SpringMVC会根据请求的路径将请求分发到对应的Controller类中的处理方法。处理方法再调用Service层的业务处理逻辑。
2.Spring框架
Spring框架在SSM中充当类似与粘合剂的作用,利用其对象托管的特性将SpringMVC、MyBatis两个独立的框架有机的结合起来。 Spring可将SpringMVC中的Controller类和MyBatis中的SqlSession类进行托管,简化了人工管理过程。 Spring除了能对SpringMVC和MyBatis的核心类进行管理外,还可对主要的业务处理的类进行管理。
3.MyBatis框架
MyBatis框架应用于对数据库的操作,其中主要功能类SqlSession可对数据库进行具体操作。
三、SSM框架中的容器管理
- SpringMVC容器:主要对Controller控制器对象,视图等用户请求和请求结果进行管理。
- Spring容器:主要对Service、Dao、工具类等对象进行管理。
- 两个容器的关系:SpringMVC容器为Spring容器的子容器,进而两容器中的对象进行间接管理。
四、SMM框架的处理流程
- 用户发起请求,请求经过SpringMVC框架一定处理(如拦截)。
- SpringMVC框架根据不同请求,将请求分发给不同的业务处理类。
- Spring框架接收到对应请求后,进行业务逻辑处理,并根据需求调用Mybatis框架进行数据处理。
- Mybatis框架执行sql语句对数据库进行操作。
- 数据库执行完sql语句,返回执行结果。
- sql执行结果交由Spring框架进一步处理业务。
- Spring框架将业务处理结果返回给SpringMVC框架。
- SpringMVC框架根据业务处理结果,将对应的用户结果界面展示给用户。
五、案例演示
下面以登录为案例进行演示开发
1.在数据库中准备表格
2.创建模块
3.补充项目结构,准备好MVC模式下的主要目录
注意:要通过 Mark Directory as 将补充的目录进行设置,选择的参数说明:
- Sources Root:告诉idea这个文件夹及其子文件夹中包含源代码,是需要编译构建的一部分
- Test Sources Root:测试源文件夹允许您将与测试相关的代码与生产代码分开。通常,源和测试源的编译结果被放置在不同的文件夹中。
- Resources Root:用于应用程序中的资源文件(图像、各种配置XML和属性文件等)。
- 在构建过程中,资源文件夹的所有内容都复制到输出文件夹中,如下所示。
- 类似于源,您可以指定生成资源。您还可以指定输出文件夹中的文件夹,您的资源应该复制到
- Test Resources Root:测试的资源文件
- Exclued:不包括、排除
4.在pom.xml中导入依赖
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.augus</groupId> <artifactId>ssm</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- spring核心容器包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.18</version> </dependency> <!-- spring切面 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.18</version> </dependency> <!--aop联盟包--> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <!-- 德鲁伊连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <!--MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!-- spring jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.20</version> </dependency> <!-- MySQL事务包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.18</version> </dependency> <!-- spring-orm映射依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.18</version> </dependency> <!-- Apache Commons日志包 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- log4j2 日志 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.1</version> <scope>test</scope> </dependency> <!-- lombok包 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <!-- spring test测试支持包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.18</version> <scope>test</scope> </dependency> <!-- junit5单元测试 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <!-- springMVC支持包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.20</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.20</version> </dependency> <!-- JSON支持 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency> <!-- mybatis核心 jar包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- mybatis-spring整合包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <!--jsp 和Servlet 可选--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>6</source> <target>6</target> </configuration> </plugin> </plugins> </build> </project>
5.更新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"> </web-app>
6.在resource目录下准备配置文件
6.1.创建 log4j2.xml 内容如下
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="DEBUG"> <Appenders> <Console name="Console" target="SYSTEM_ERR"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> </Console> </Appenders> <Loggers> <Root level="DEBUG"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
6.2.创建 jdbc.properties 内容如下
jdbc_driver=com.mysql.cj.jdbc.Driver jdbc_url=jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai jdbc_username=test jdbc_password=123456
6.3.创建 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:mvc="http://www.springframework.org/schema/mvc" 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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!--扫描controller--> <context:component-scan base-package="com.augus.controller"></context:component-scan> <!--会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean 除此之外,我们还可以在 Spring MVC 的配置文件中使用以下配置,将静态资源交给 Tomcat 提供的默认的 Servlet 进行处理,这样也可以实现 Spring MVC 项目中静态资源的访问。 --> <mvc:annotation-driven></mvc:annotation-driven> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置前置解析器--> <property name="prefix" value="/WEB-INF/templates/"></property> <!--配置后置解析器--> <property name="suffix" value=".html"></property> </bean> <!-- 将DispatcherServlet请求映射配置为"/"时,会出现CSS、JS文件加载失败的情况,页面无效果显示。 这是因为Spring MVC会捕获Web容器所有的请求,包括静态资源的请求,Spring MVC会将它们当成一个普通请求处理,因此找不到对应处理器将导致错误。 解决方法 : 在spring-mvc.xml中插入当前代码。它会对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。 --> <mvc:default-servlet-handler></mvc:default-servlet-handler> </beans>
6.4.创建 applicationContext.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:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util" 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: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/util http://www.springframework.org/schema/util/spring-util.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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!--加载外部属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <!--扫描service层--> <context:component-scan base-package="com.augus.service"></context:component-scan> <!--配置德鲁伊连接池--> <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="username" value="${jdbc_username}"></property> <property name="password" value="${jdbc_password}"></property> <property name="url" value="${jdbc_url}"></property> <property name="driverClassName" value="${jdbc_driver}"></property> </bean> <!-- SqlSessionFactoryBean能在Spring IoC容器中以SqlSessionFactory的类型保存并被获取。就是继承了FactoryBean这个接口了,这是个支持泛型的接口: 当实现了这个接口的Bean在配置为被Spring接管时,存入IoC容器中的实例类型将会是实例化泛型的那个类型,从IoC容器中获取时也是实例化泛型的那个类型, 这种情况下,Spring 将会在应用启动时为你创建SqlSessionFactory对象,然后将它以 SqlSessionFactory为名来存储。当把这个bean注入到Spring中去了以后,IoC容器中的其他类型就可以拿到SqlSession实例了,就可以进行相关的SQL执行任务了。 --> <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--获取上面的数据源--> <property name="dataSource" ref="druidDataSource"></property> <property name="typeAliasesPackage" value="com.augus.pojo"></property> </bean> <!-- 配置MapperScanner 扫描mapper.xml接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--配置SQLSessionFactory--> <property name="sqlSessionFactoryBeanName" value="sessionFactoryBean"></property> <!--配置mapper扫描--> <property name="basePackage" value="com.augus.mapper"></property> </bean> <!--配置事务管理器--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="druidDataSource"></property> </bean> <!--开启事务注解--> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"></tx:annotation-driven> </beans>
7.在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"> <!--spring核心配置文件位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- ContextLoaderListener监听器 (1)ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。 (2)在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--编码过滤器--> <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> <!--配置DispatcherServlet--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
8.开发业务代码
8.1.在WEB-INF/templates下分别创建index.html、success.html、fail.html
- index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>欢迎来到ssm登录页面</title> </head> <body> <form action="login.do" method="post"> <table style="margin: auto;"> <tr> <td>用户名:</td> <td><input type="text" name="username" required><br></td> </tr> <tr> <td>密码:</td> <td><input type="text" name="password" required><br></td> </tr> <tr> <td colspan="2"> <input type="submit" value="提交" style="margin: auto;"> </td> </tr> </table> </form> </body> </html>
- success.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>登录成功</h1> </body> </html>
- fail.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>用户名或者密码错误</h1> </body> </html>
8.2.在java下创建包com.augusu,在分别创建四个包,如下
8.2.1.新建service包
在下面创建 接口UserService,同时在创建impl包里面创建 UserServiceImpl实现类,让UserServiceImpl实现UserService接口
- UserService
package com.augus.service; import com.augus.pojo.User; import java.util.List; public interface UserService { User findUser(String uname, String password); List<User> findAllUser(); }
- UserServiceImpl
package com.augus.service.impl; import com.augus.mapper.UserMapper; import com.augus.pojo.User; import com.augus.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User findUser(String uname, String password) { return userMapper.findUser(uname,password); } @Override public List<User> findAllUser() { return userMapper.findAllUser(); } }
8.2.2.新建pojo包
在下面创建 User实体类,代码如下
package com.augus.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @AllArgsConstructor @NoArgsConstructor @Data public class User implements Serializable { private Integer uid; private String username; private String password; }
8.2.3.新建controller包
在下面创建 UserController 类,代码如下
package com.augus.controller; import com.augus.pojo.User; import com.augus.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @Controller public class UserController { @Autowired private UserService userService; //打开登录页面 @RequestMapping("/index") public String index(){ return "index"; } //输入的登录信息提交到这个地址 @RequestMapping("/login.do") public String login(User user){ //创建一个变量,保存响应的文件名 String templar = null; //调用方法 User user1 = userService.findUser(user.getUsername(), user.getPassword()); if(user1==null){ templar = "/fail"; }else { templar = "/success"; } return templar; } //响应所有的用户信息 @ResponseBody @RequestMapping("findAllUser.do") public List<User> findAllUser(){ return userService.findAllUser(); } }
8.2.4.新建mapper包
在下面创建 UserMapper,代码如下
package com.augus.mapper; import com.augus.pojo.User; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper { //根据用户名和密码查询 User findUser(@Param("name") String uname, @Param("pwd") String password); //查询当前所有的用户信息 List<User> findAllUser(); }
在创建 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"> <mapper namespace="com.augus.mapper.UserMapper"> <!--User findUser(String uname, String password);--> <select id="findUser" resultType="user"> select * from user where username = #{name} and password =#{pwd} </select> <!--findAllUser--> <select id="findAllUser" resultType="user"> select * from user </select> </mapper>
8.3.重新部署项目,访问:http://localhost:8080/ssm_war_exploded/index 如下
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/253657.html