以下操作基于
2020.3企业版
Java Enterprise项目![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lii6FyNy-1669548886654)(assets/image-20221109105434-y39cakk.png)]](https://img.pic99.top/hhfamen/202402/43cd077701501de.png)
直接默认即可
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y35MWx5Y-1669548886654)(assets/image-20221109105622-fcd9xfy.png)]](https://img.pic99.top/hhfamen/202402/862a9447e3bf2a.png)
输入项目相关信息
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5JGlWUW-1669548886655)(assets/image-20221109105713-igwb7w3.png)]](https://img.pic99.top/hhfamen/202402/3d331f9e12a3c57.png)
点击完成后,得到以下目录结构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l4reuygh-1669548886655)(assets/image-20221109105757-r4cn7bg.png)]](https://img.pic99.top/hhfamen/202402/30e952777508681.png)
java目录下
controller:实现控制转发,基本参数校验,不复杂的简单业务处理
config:配置类存放的地方
service:业务逻辑层
dao:数据持久层
entitry:实体类
resources
webapp
WEB-INF
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dw9KBSKj-1669548886655)(assets/image-20221116105439-d9bmup8.png)]](https://img.pic99.top/hhfamen/202402/ad4a4c2f45118a5.png)
在pom.xml文件中导入SSM框架相关依赖
	org.springframework spring-jdbc 5.3.23 org.springframework spring-tx 5.3.23 org.springframework spring-test 5.3.23 test org.springframework spring-webmvc 5.3.23 javax.servlet jstl 1.2 javax.servlet.jsp.jstl jstl-api 1.2 mysql mysql-connector-java 8.0.30 org.mybatis mybatis 3.5.11 org.mybatis mybatis-spring 2.0.7 导入完成后,点击右上角的更新
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WVSPDK7-1669548886655)(assets/image-20221109113134-v5rg43v.png)]](https://img.pic99.top/hhfamen/202402/bf165662de38635.png)
如果没有出现
Spring Config,则检查一下是否正确安装了依赖了
在config目录下创建类App
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7mDx5B8v-1669548886656)(assets/image-20221116103236-ee5zteu.png)]](https://img.pic99.top/hhfamen/202402/8951db01a7b9dee.png)
@Configuration——表示为配置类![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQz0ylJl-1669548886656)(assets/image-20221116103406-j9ofhna.png)]](https://img.pic99.top/hhfamen/202402/fa6b7dcdc9a3545.png)
ComponentScan——扫描service@ComponentScan(basePackages = "com.leo.SSM.service")注意:
- basePackages 配置:查看下图位置
这里扫描的包对应位置也需要添加注解
例如这里,我扫描了service,那与之对应的就需要在service的各个类中添加注解
@Service
为防止后面忘记,先在service目录下创建一个service接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPnsGNDR-1669548886656)(assets/image-20221116105603-c5nohb4.png)]](https://img.pic99.top/hhfamen/202402/0a9e6aed4510512.png)
在service->impl下创建对应的实现类
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bf5QETjB-1669548886657)(assets/image-20221116111944-erw6ogu.png)]](https://img.pic99.top/hhfamen/202402/7c1f347f5697d93.png)
在实现类中添加@Service注解
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VE2eecME-1669548886657)(assets/image-20221116112009-ew2qlnc.png)]](https://img.pic99.top/hhfamen/202402/7c46470694f90b4.png)
实现接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gU8skaxY-1669548886657)(assets/image-20221127115912-1bh4wjr.png)]](https://img.pic99.top/hhfamen/202402/673164c3ede447.png)
@MapperScan——扫描dao@MapperScan(basePackages = "com.leo.SSM.dao")
创建UserDao接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dsc9LnT-1669548886657)(assets/image-20221012115126-rd0ld4f.png)]](https://img.pic99.top/hhfamen/202402/b15bf3bcb45226b.png)
添加注解@Mapper
package com.leo.SSM.dao;import org.apache.ibatis.annotations.Mapper;@Mapper
public class UserDao {
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvSUgtBS-1669548886658)(assets/image-20221116105945-36gqupw.png)]](https://img.pic99.top/hhfamen/202402/599ff6588aca67b.png)
直接直接复制下列代码进入项目即可
@PropertySource("classpath:jdbc.properties")
在resources下创建jdbc.properties
选择Resource Bundle
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zw5gzdFY-1669548886658)(assets/image-20221116110150-t8atbxh.png)]](https://img.pic99.top/hhfamen/202402/6f26dc5b3e29503.png)
仅输入名称即可
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YBnSqObt-1669548886658)(assets/image-20221116110226-v8001zd.png)]](https://img.pic99.top/hhfamen/202402/8df96b156aa4bd.png)
创建完成
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwvCLEiz-1669548886658)(assets/image-20221116110240-8mktok3.png)]](https://img.pic99.top/hhfamen/202402/67956ae670a6e3f.png)
进行配置
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql:///studb?useSSL=false
jdbc.username=你SQL的用户名
jdbc.password=SQL的密码
在App类中继续添加@EnableTransactionManagement注解,表示开启事务
创建于jdbc对应的属性
    private String driver;private String url;private String userName;private String password;
@Value("${jdbc.driver}")
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-he7WJPUf-1669548886658)(assets/image-20221116110655-wlypjiq.png)]](https://img.pic99.top/hhfamen/202402/f67adac42d08bd4.png)
属性的最终配置
@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String userName;@Value("${jdbc.password}")private String password;
@Bean注解——往IOC容器中放东西@Beanpublic DataSource dataSource(){}
DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(userName);dataSource.setPassword(password);return dataSource;
@Beanpublic SqlSessionFactory sqlSessionFactory(){}
配置mybatis相关属性
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource());
//        映射包名sqlSessionFactoryBean.setTypeAliasesPackage("com.leo.SSM.entity");PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:mappers/*.xml"));org.apache.ibatis.session.Configuration configuration = Objects.requireNonNull(sqlSessionFactoryBean.getObject()).getConfiguration();configuration.setMapUnderscoreToCamelCase(true);return sqlSessionFactoryBean.getObject();
@Beanpublic PlatformTransactionManager transactionManager(){DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource());return transactionManager;}
在config文件夹下创建类WebMvcConfig
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQ60y3Lh-1669548886659)(assets/image-20221116114030-qjbnc65.png)]](https://img.pic99.top/hhfamen/202402/8643d6f35e48868.png)
@Configuration,声明配置类import org.springframework.context.annotation.Configuration;@Configuration
@EnableWebMvc——启动webMvcimport org.springframework.web.servlet.config.annotation.EnableWebMvc;@EnableWebMvc
import org.springframework.context.annotation.ComponentScan;@ComponentScan(basePack
ages = "com.leo.SSM.controller")实现WebMvcConfigurer
public class WebMvcConfig implements WebMvcConfigurer {}
选择重写方法
按ctrl+o选择以下方法进行重写
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FjVchqPS-1669548886659)(assets/image-20221116115146-61ipcs8.png)]](https://img.pic99.top/hhfamen/202402/23370000e32a61.png)
添加视图解析器
private ViewResolver viewResolver(){InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/views/");viewResolver.setSuffix(".jsp");viewResolver.setViewClass(JstlView.class);return viewResolver;}
注册视图解析器
在configureViewResolvers方法中,进行视图解析器的注册
@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {
//        注册视图解析器registry.viewResolver(viewResolver());}
添加view的控制
在spring中,很可能出现很多仅需要页面跳转而没有具体业务逻辑的代码比如
@GetMapping('/login')public String login(){return "login";}这样长久以往就会生成很多这样的空方法,因此我们需要通过SprIngMVC中的
addViewControllers简化实现上述逻辑
/对应的页面为login@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("login");}在controller目录下创建UserController类,添加注解@Controller
package com.leo.SSM.controller;import org.springframework.stereotype.Controller;@Controller
public class UserController {
}
在config目录下创建AppInit类,并继承AbstractAnnotationConfigDispatcherServletInitializer
继承的类用于DispatcherServlet 初始化
DispatcherServlet:Spring MVC的核心组件,它是request首先到达的地方,负责在各个组件间传递加工
- 完成servlet容器功能
- 完成配置MVC基础功能
- 完成配置
DispatcherServlet和ContextLoaderListenerContextLoaderListener——Spring实现了Tomcat提供的ServletContextListener接口,写了一个监听器来监听项目启动。一旦项目启动,会触发ContextLoaderListener中的特定方法
实现其方法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDA4UB8k-1669548886659)(assets/image-20221126230419-xfoxiwo.png)]](https://img.pic99.top/hhfamen/202402/c3070866b9cd6b6.png)
**getRootConfigClasses——**配置root上下文(数据源等)
这里直接从我们的APP中获取即可
@Overrideprotected Class>[] getRootConfigClasses() {return new Class[]{App.class};}
**getServletConfigClasses——**配置dispatcher servlet(视图解析器)
这里从
WebMvcConfig中获取
@Overrideprotected Class>[] getServletConfigClasses() {return new Class[]{WebMvcConfig.class};}
getServletMappings——指定开始被servlet处理的url(默认设置为 /)
@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
在WebMvcConfig.java文件配置下的prefix目录下创建文件,名称为login
<%--Created by IntelliJ IDEA.User: LeoDate: 2022/11/6Time: 15:37To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title 
在UserController 添加方法
@PostMapping("/login")public String login(){return "index";}
因为在form表单中
- action = login ----> (“/login”)
- method=“post” —>@PostMapping
我们运行测试一下

当我们点击登录时,返回的页面就是index.jsp
当然,现在没有进行逻辑判断,但是实际上对于webmvc的配置已经成功
在entity文件目录下创建与数据库对应的类
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZqxqhbH-1669548886659)(assets/image-20221127114905-gkmig8l.png)]](https://img.pic99.top/hhfamen/202402/7a9fc7f6fd02bf3.png)
定义接口
首先我们需要实现登录接口,因此在UserDao中定义获取用户信息的接口
    UserInfo getUserInfo(@Param("userNumber") String userNumber , @Param("passwd") String passwd);实现SQL
在resources->mappers创建UserMapper.xml文件
selectpk_user_id,u_number,u_name,u_passwdfrom user_infowhere u_number = #{userNumber} and u_passwd = #{passwd} 在UserService接口出定义方法
package com.leo.SSM.service;import javax.servlet.http.HttpSession;
import java.util.List;public interface UserService {Boolean login(String userNumber , String passwd, HttpSession session, Model model);
}
定义属性
使用注解
@Resource将userDAO交给Spring进行管理
@Resourceprivate UserDAO userDAO;
实现方法
@Overridepublic Boolean login(String userNumber, String passwd, HttpSession session) {UserInfo userInfo = null;userInfo = userDAO.getUserInfo(userNumber , passwd);if(null != userInfo){session.setAttribute("user",userInfo);return true;}else{model.addAttribute("msg","用户名或密码错误");return false;}}
添加属性——UserService
    @Resourceprivate UserService userService;
修改函数参数
与login.jsp中的name对应
login(String userName , String password , HttpSession session)
修改逻辑
直接调用UserService,判断返回值
boolean isSuccess = userService.login(userName , password,session);if(isSuccess){return "index";}else{return "login";}
@PostMapping("/logout")public String logout(HttpSession session, Model model){session.invalidate();model.addAttribute("msg","退出成功");return "login";}