搭建这个项目的时候的版本:DK8、tomcat 9、Maven3.6.1、Idea2021.1.3、MySQL8
创建Maven下的webapp项目。先导入依赖,一般在网上搜SSM的依赖,一大堆,找个顺眼的copy就好,一般都要有spring相关、mysql相关、mybatis相关、jstl相关,别问我为什么随便找,因为我菜不会细看。另外可以加一个lombok依赖,这仅代表我个人习惯。这些都写在pom.xml文件里
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>compile</scope>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Servlet - JSP -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>
<!--Mybatis generator-->
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- Ajax-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<!-- JSR303数据校验 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!-- alibaba数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
然后建自己的数据库,我是这样的,名字叫ssm_demo,里面有id,username,password,salt
create database ssm_demo;
create table ssm_demo.user
(
id Integer auto_increment
primary key,
username varchar(20) not null,
password varchar(20) not null,
salt varchar(20) not null
);
左边的是刚建好项目时的样子,右边是把必有的包和类先创好的样子
这里要注意的是你的bean里的实体类名字和属性及其数据类型要和数据库里的那个一样。下边的代码依次是User、UserMapper、UserService、UserServiceImpl、UserController。基础用法也就是增删查改。
//User
//这四个都是lombok依赖来的。第一个是自动生成getter/setter方法,第二个三个是无参和有参的构造,最后一个是输出的格式化。
//你也可以不要他们去写getter/setter啥的,但是我觉得那样不如这样看的舒服。
//其中数据库的varchar和类里边的String是对应的
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private Integer id;
private String username;
private String password;
private String salt;
}
//UserMapper
// 格式:返回类型 自定义的名字 (参入的参数)
public interface UserMapper {
//增
@Select("insert into ssm_demo.user(username, password, salt) values (#{username}, #{password}, #{salt})\n")
void insert(User user);
//删
@Delete("delete from ssm_demo.user where id = #{is}")
void delete(int id);
//查
@Select("select * from ssm_demo.user")
List<User> findAll();
//改
@Update("update ssm_demo.user set username=#{username},password=#{password},salt=#{salt} where id = #{id}")
void update(User user);
}
//UserService
// 这里的方法和UserMapper的一毛一样,copy来就行
public interface UserService {
//增
int insert(User user);
//删
int delete(int id);
//查
List<User> findAll();
//改
int update(User user);
}
//UserServiceImpl
//他要去实现(implements)UserService里的方法,之后报红线,alt+回车,实现方法,确定。
//@Service注解就是说这个类归于Spring去管理。@Resource或者@Autowired是帮你创建对象的。
//我们要去调用UserMapper里边的方法,所以我们要用注解的方式去把UserMapper引入进来。
@Service
public class UserServiceImpl implements UserService {
@Autowired private UserMapper userMapper;
//增
@Override
public int insert(User user) {
return userMapper.insert(user);
}
//删
@Override
public int delete(int id) {
return userMapper.delete(id);
}
//查
@Override
public List<User> findAll() {
return userMapper.findAll();
}
//改
@Override
public int update(User user) {
return userMapper.update(user);
}
}
//UserController
//我们要用UserService的方法,所以我们要@Autowired
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired private UserService userService;
@GetMapping("/insert")
public String insert(User user,HttpServletResponse response,HttpServletRequest request) throws IOException {
response.sendRedirect(request.getContextPath()+"/user/findAll");
userService.insert(user);
return "list";
}
//删
@PostMapping("/delete")
public String delete(int id,HttpServletResponse response,HttpServletRequest request) throws IOException {
response.sendRedirect(request.getContextPath()+"/user/findAll");
userService.delete(id);
return "list";
}
//查
@RequestMapping("/findAll")
public ModelAndView findAll(ModelAndView modelAndView){
modelAndView.setViewName("list");
modelAndView.addObject("list",userService.findAll());
return modelAndView;
}
//改
@RequestMapping("/update")
public String update(User user,HttpServletResponse response,HttpServletRequest request) throws IOException {
response.sendRedirect(request.getContextPath()+"/user/findAll");
userService.update(user);
return "list";
}
}
然后去资源根resources去创建配置文件,依次是applicationContext,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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 开启注解扫描,只需要对service和mapper进行扫描即可,不需要扫描controller,和上一个一样。include是包含,exclude就是不包含。上面只扫描controller,所以include;这个不包含,所以exclude-->
<context:component-scan base-package="my">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- spring整合MyBatis框架-->
<!-- 配置连接处-->
<!-- -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ssm_demo?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&"/>
<property name="user" value="root"/>
<property name="password" value="lx9871.."/>
</bean>
<!-- 配置工厂对象SQLSessionFactory,大概意思就是有了工厂才能去加工SQL语句,class也是直接SqlSessionFactoryBean
name 和 ref 就都写 dataSource-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置接口所在包,就是你去扫描哪个包。class搜MapperScannerConfigurer,name就是basePackage,value就是mapper包-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="my.mapper"/>
</bean>
</beans>
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 开启注解扫描,只扫描controller-->
<!-- 第一行是说你需要扫描哪个包,这个包就是你自己定义的那个。一般都是bean包的上一级软件包。
这里的第二行和第三行是在一行内,type的意思就是用什么类型去解析,我们用注解annotation。
expression的意思是表示你这个是什么注解,我们去摁ctrl+N,搜controller,
点有注解图标@的那个然后去copy它的包,然后写点,controller-->
<context:component-scan base-package="my">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 配置视图解析器对象-->
<!-- id是自己取得名字,class是说你要用什么东西我们用到的是视图解析器,直接写InternalResourceviewResolve就出来了
prefix和suffix分别是前后缀,就是你在打开网页的时候,路径的前后缀,因为我的jsp文件放到了/WEB-INF/pages下-->
<bean id="nternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 过滤静态资源,这个可写可不写了,爆红也没事,就是以后你正儿八经做项目的时候,这些就可以过滤掉不被识别-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/css/**"/>
<!-- 开启SpringMVC注解在支持 相当重要,必须要写!-->
<mvc:annotation-driven/>
</beans>
webapp下的WEB-INF里有个web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 设置配置文件的路径,就是说你要去扫描你已经写好的那个文件,classpath:配置文件名-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置前段控制器-->
<servlet>
<servlet-name>dispatcherServlet</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>dispatcherServlet</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>
在下面的webapp里创建个pages包,然后建一个list的jsp文件 ,下面分别的index和list
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>增</h3>
<form action="/user/insert" method="get">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
密盐:<input type="text" name="salt"/><br/>
<input type="submit" value="save">
</form>
<h3>删</h3>
<form action="/user/delete" method="post">
删除:<input type="text" name="id"/><br/>
<input type="submit" value="del">
</form>
<h3>查</h3>
<a href="/user/findAll">查询全部</a>
<h4>改</h4>
<form action="/user/update" method="post">
编号:<input type="text" name="id"><br>
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
密盐:<input type="text" name="salt"/><br/>
<input type="submit" value="update">
</form>
</body>
</html>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<td>编号</td>
<td>用户</td>
<td>密码</td>
<td>密盐</td>
</tr>
<c:forEach items="${list}" var="list">
<tr>
<td>${list.id}</td>
<td>${list.username}</td>
<td>${list.password}</td>
<td>${list.salt}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
一般来说,增删查改的功能就已经OK了,虽然丑了点,但还是那句话,因为我菜。但是另外一个操蛋的事儿就是我报错了。
我弄了好久之后,才有个大概的猜测,我的tomcat版本不支持。我朋友的8.5就可以,我的9.0就不行。what's up!!!!!!! 看他的文章就OK。再不行就去网上搜下。
https://blog.csdn.net/robert789654/article/details/106338060/
然后我就多了好多个文件,放在了WEB-INF里面。md。
最后我简单复习一下SSM各种类的调用,可能不是很恰当,但是这个顺序很好记。
创建类正着来的顺序:
1.首先创建了一个实体类bean,为其他类提供了一个属性;
2.创建一个mapper类去存放方法,然后让他去用SQL语句去查结果。SQL语句查询到的结果会给方法去接收,然后方法把查到的东西先暂时性的攥到手里。
3.创建了service类,他也要去拿结果,但是程序员都知道接口是不能new对象的,所以他需要一个实现类impl,这个impl继承了接口并实现了他的方法,就要去创建mapper的对象,才能够与mapper去交接,拿到mapper拿到的数据。既然impl拿到数据了,就相当于service也拿到数据了。
4.最后创建controller类,他是与页面关系最近的,controller需要service拿到的数据,输出给页面,所以我们就去创建了service对象并与他交接,然后拿到数据,展现给前端。
反着来的顺序:
1.controller需要数据,要去找service
2.service需要数据,就让impl找mapper
3.mapper想办法,就用sql的办法去拿到数据
4.数据有什么,有的是 实体类bean里的东西
打比方其实就相当于四层,皇上找大臣,大臣找小臣,小臣找平民,平民拿东西。
最后的最后,这个文章是我自己复习记的笔记,如果可以的话也希望大佬们纠错,就是不要太暴力,谢谢各位。。。