【计理01组08号】SSM框架整合

数据库准备

本次课程使用 MySQL 数据库。首先启动 mysql :

sudo service mysql start

然后在终端下输入以下命令,进入到 MySQL 数据库(-u 表示用户名,比如这里的 root,-p 表示密码,这里没有密码就省略了):

mysql -u root

为了实验方便,我们在这里新建一个数据库并取名 ssm 用作实验。

create database ssm;

在数据库 ssm 下创建表 user ,代码如下:

use ssm;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
sex varchar(10),
age int
);

我们先往 user 表插入一条测试数据:

insert into user(username,password,sex,age) value('shiyanlou','123456','male',22);

新建工程项目

首先打开 WEB IDE,选择 File->Open New Terminal,在终端中输入:

mvn archetype:generate -DgroupId=com.shiyanlou -DartifactId=SSMTest -DarchetypeArtifactId=maven-archetype-webapp

参数说明:

  • Group Id:项目的组织机构,也是包的目录结构,一般都是域名的倒序,比如 com.shiyanlou;
  • Atifact Id :项目实际的名字,比如 SSMTest;
  • archetype Artifact Id :使用的 maven 骨架名称

输入命令之后,maven 会提示我们输入版本号,这里可以直接定义版本号也可以直接回车,接着 maven 会提示当前要创建项目的基本信息,输入 y 然后回车确认,接着在 src/main/ 目录中创建 java 目录。

在 src/main/java 下新建各层的包,如图:

  • model 下是一系列 POJO,即各种实体类
  • mapper 相当于 DAO 层,由于这里采用 MyBatis,所以把它称为 Mapper,其下包括 Mapper 接口和 Mapper 配置文件,通过 SQL 语句的映射完成 CRUD 操作
  • service 由一系列业务逻辑对象组成,放置各种 service 接口
  • service.impl 是 service 的具体实现
  • controller 由一系列控制器组成,处理用户请求并作出响应

接下来添加相关依赖包,如 spring、mybatis 等。打开 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.shiyanlou</groupId>
<artifactId>SSMTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <properties>
<jdbc.driver.version>5.1.47</jdbc.driver.version>
<mybatis.version>3.3.0</mybatis.version>
<mybatis-spring.version>1.2.2</mybatis-spring.version>
<spring.version>5.1.1.RELEASE</spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency> <!-- commons 包依赖 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- 数据库包依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${jdbc.driver.version}</version>
<scope>runtime</scope>
</dependency>
<!-- 日志包依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency> <!-- aspectj 包依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency> <!-- Spring 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</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>
</dependencies>
<build>
<plugins>
<plugin>
<!--jetty maven插件,为maven提供运行web程序的能力-->
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.12.v20180830</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
</project>

model层实体类User

在包 com.shiyanlou.model 下新建类 User.java, 一个用户具有:id、username、password、sex、age 五个属性,代码如下:

package com.shiyanlou.model;

public class User {
private Integer id; // 用户 id
private String username; // 用户名
private String password; // 密码
private String sex; // 性别
private Integer age; // 年龄 public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} // 重写了 toString 方法,方便后面的测试
public String toString() {
return "id:" + id + ",username:" + username + ",password:" + password
+ ",sex:" + sex + ",age:" + age; }
}

mapper(dao)层实现

在包 com.shiyanlou.mapper 下建一个 UserMapper.java

UserMapper 接口的代码如下:

package com.shiyanlou.mapper;

import com.shiyanlou.model.User;

import java.util.List;

public interface UserMapper {

    /**
* 用户登录查询
*
* @param user
* @return User
**/
User selectLogin(User user); /**
* 查询全部用户
*
* @return List<User>
**/
List<User> selectAllUser(); /**
* 新增用户
*
* @param user
**/
void addUser(User user); /**
* 更新用户
*
* @param user
**/
void updateUser(User user); /**
* 删除用户
*
* @param id
**/
void deleteUser(Integer id);
}

接着在 src/main/resources 下建立一个 mappers 文件夹,并在其中建立 UserMapper.xml,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.shiyanlou.mapper.UserMapper">
<!-- 自定义结果集 -->
<resultMap type="User" id="userResultMap">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
</resultMap>
<!-- 登录查询 -->
<select id="selectLogin" parameterType="User" resultMap="userResultMap">
select *
from user
where username = #{username}
and password = #{password}
</select>
<!-- 查询所有用户 -->
<select id="selectAllUser" resultMap="userResultMap">
select *
from user
</select>
<!-- 新增用户 -->
<insert id="addUser" useGeneratedKeys="true" keyProperty="id">
insert into user (username, password, sex, age)
values (#{username}, #{password}, #{sex}, #{age})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="User">
update user
set username = #{username},
password = #{password},
sex = #{sex},
age = #{age}
where id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete
from user
where id = #{id}
</delete> </mapper>

到这里, DAO 层的代码就写完了,接下来我们来实现 Service 层的代码。

注:MyBatis 的配置文件放在整合时在进行处理。

service层实现

Service 层接口

在包 com.shiyanlou.service 下建一个 UserService.java 接口文件,添加如下代码:

package com.shiyanlou.service;

import com.shiyanlou.model.User;

import java.util.List;

public interface UserService {

    /**
* 用户登录
*
* @param user
* @return 登录成功返回 User 对象,失败返回 null
**/
User login(User user); /**
* 查询所有用户
*
* @return 查询到的所有 User 对象的 list
**/
List<User> selectAllUser(); /**
* 新增用户
*
* @param user
**/
void addUser(User user); /**
* 更新用户
*
* @param user
**/
void updateUser(User user); /**
* 删除用户
*
* @param id(用户 id)
**/
void deleteUser(Integer id);
}

Service 层接口实现类

在包 com.shiyanlou.service.impl 下建一个类 UserServiceImpl.java ,用来实现 UserService 接口中的方法,添加如下代码:

package com.shiyanlou.service.impl;

import com.shiyanlou.mapper.UserMapper;
import com.shiyanlou.model.User;
import com.shiyanlou.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import java.util.List; /**
* 将当前类注释为一个 Spring 的 bean
*
* @author shiyanlou
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
/**
* 自动注入 UserMapper
**/
@Autowired
public UserMapper userMapper; // 下面是 UserService 接口所有方法的具体实现
public User login(User user) {
return userMapper.selectLogin(user);
} public List<User> selectAllUser() {
return userMapper.selectAllUser();
} public void addUser(User user) {
userMapper.addUser(user);
} public void updateUser(User user) {
userMapper.updateUser(user);
} public void deleteUser(Integer id) {
userMapper.deleteUser(id);
}
}

到这里, Service 层的代码就写完了,接下来将 Spring 和 MyBatis 进行整合。

Spring和MyBatis整合

MyBatis 配置文件

在目录 src/main/resources 下新建 MyBatis 配置文件 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>
<!-- 为JavaBean起类别名 -->
<typeAliases>
<package name="com.shiyanlou.model" />
</typeAliases>
<!-- 通过 mapper 接口包加载整个包的映射文件 -->
<mappers>
<package name="com.shiyanlou.mapper" />
</mappers>
</configuration>

注:在这里,我们没有配置 MyBatis 的运行环境、数据源等,那是因为我们要将这些交给 Spring 进行配置管理。

applicationContext.xml

在目录 src/main/resources 下新建文件 applicationContext.xml,该文件用来完成 Spring 和 MyBatis 的整合,主要包括了自动扫描,自动注入,配置数据库等,内容如下:

<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"> <!-- 自动扫描有 Spring 相关注解的类,并把这些类注册为 bean -->
<context:component-scan base-package="com.shiyanlou" />
<!-- 配置数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<!-- MyBatis 的 SqlSession 的工厂,并引用数据源,扫描 MyBatis 的配置文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="mapperLocations" value="classpath*:mappers/**"/>
</bean> <!-- MyBatis 自动扫描加载 Sql 映射文件/接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.shiyanlou.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- JDBC 事务管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 启用支持 annotation 注解方式事务管理 -->
<tx:annotation-driven transaction-manager="txManager" /> </beans>

在这里,我们将数据源配置信息写死在 applicationContext.xml 中的,也可以新建 jdbc.properties 文件,然后进行引入。

log4j.properties 配置日志

在目录 src/main/resources 下新建日志文件 log4j.properties ,在里面添加如下内容:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

到这里,Spring 和 MyBatis 就整合完成,下面我们通过一个测试类测试整合是否成功。

Spring、MyBatis 整合测试

在目录 src/test/java 下新建测试类 SpringMybatisTest,添加如下代码:

import com.shiyanlou.model.User;
import com.shiyanlou.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; /**
* 配置spring和junit整合,junit启动时加载springIOC容器 spring-test,junit
**/
@RunWith(SpringJUnit4ClassRunner.class)
// 告诉junit spring配置文件
@ContextConfiguration({"classpath:applicationContext.xml"})
public class SpringMybatisTest {
@Autowired
private UserService userService; /* @Autowired
private User user;*/ /* @Test
public void testLogin() {
//User user = new User();
user.setUsername("shiyanlou");
user.setPassword("123456");
System.out.println(userService.login(user).toString()); }*/ @Test
public void testSelectAllUser() {
List<User> users = userService.selectAllUser();
for (User us : users) {
System.out.println(us.toString());
}
} /* @Test
public void testAdd() {
//User user = new User();
user.setUsername("user2");
user.setPassword("123456");
user.setSex("female");
user.setAge(25);
userService.addUser(user);
} @Test
public void testUpdate() {
//User user = new User();
user.setId(3);
user.setUsername("user2");
user.setPassword("123");
user.setSex("female");
user.setAge(30);
userService.updateUser(user);
} @Test
public void testUpdate() {
int id = 3;
userService.deleteUser(id);
}*/ }

在这里,我们采用 Junit 进行单元测试,分别测试五个方法,这里只演示查询所有用户 testSelectAllUser() 方法,打开终端输入 mvn test 命令,结果如下:

我们 user 表中只有一条数据,可以看到 Spring 和 MyBatis 已经整合成功。

如果想要在测试类中注入 User 对象,需要做两点:

  • 在测试类中添加代码
@Autowired
private User user;
  • 在 model 层的 User 类中添加 @Component 注解
@Component
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private Integer age;
......
}

注:但是一般实体类的对象不进行注入,而是由外部传入,这里是为了方便测试。

整合完 Spring 和 MyBatis 后,我们要完成 Spring MVC 的整合。

Controller层实现

在包 com.shiyanlou.controller 下建一个 Controller 类 UserController.java,代码如下:

package com.shiyanlou.controller;

import com.shiyanlou.model.User;
import com.shiyanlou.service.UserService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List; /**
* 处理用户请求 Controller
**/
@Controller
public class UserController { /**
* 自动注入 UserService
**/
@Autowired
private UserService userService; // 登录
@RequestMapping("/login")
public String login(User user, Model model, HttpSession session) {
User loginUser = userService.login(user); if (loginUser != null) {
session.setAttribute("user", loginUser);
return "redirect:alluser";
} else {
session.setAttribute("message", "username or password is wrong!");
return "redirect:loginform.jsp";
}
} // 退出
@RequestMapping(value = "/loginout")
public String loginout(HttpSession session) {
session.invalidate();
return "redirect:loginform.jsp";
} // 查询所有用户
@RequestMapping("/alluser")
public String selectAllUser(HttpServletRequest request) {
List<User> listUser = userService.selectAllUser();
request.setAttribute("listUser", listUser);
return "userlist";
} // 跳转至新增用户页面
@RequestMapping("/toadduser")
public String toAddUserPage() {
return "adduser";
} // 新增用户
@RequestMapping("/adduser")
public String addUser(User user, HttpServletRequest request) {
userService.addUser(user);
List<User> listUser = userService.selectAllUser();
request.setAttribute("listUser", listUser);
return "userlist";
} // 跳转至更新用户页面
@RequestMapping("/toupdateuser")
public String toUpdateUser(@Param("id") Integer id,
HttpServletRequest request, Model model) {
model.addAttribute("user_id", id);
return "updateuser";
} // 更新用户
@RequestMapping("/updateuser")
public String updateUser(User user, HttpServletRequest request) {
userService.updateUser(user);
List<User> listUser = userService.selectAllUser();
request.setAttribute("listUser", listUser);
return "userlist";
} // 删除用户
@RequestMapping("/deleteuser")
public String deleteUser(@Param("id") Integer id, HttpServletRequest request) {
userService.deleteUser(id);
List<User> listUser = userService.selectAllUser();
request.setAttribute("listUser", listUser);
return "userlist";
}
}

JSP页面

loginform.jsp

在 src/main/webapp 目录下新建一个 JSP 页面命名为 loginform.jsp,作为登录页面,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login Page</title>
</head>
<body>
<h4>Login Page</h4>
<form action="login" method="post">
<font color="red">${sessionScope.message}</font>
<table>
<tr>
<td><label>username:</label></td>
<td><input type="text" id="username" name="username" />
</tr>
<tr>
<td><label>password:</label></td>
<td><input type="password" id="password" name="password" />
</tr>
<tr>
<td><input type="submit" value="login" />
</tr>
</table>
</form>
</body>
</html>

userlist.jsp

在 webapp/WEB-INF/ 目录下新建一个目录 jsp,并且在其中新建一个 JSP 页面命名为 userlist.jsp,作为主页面,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ssm</title>
<style type="text/css">
td {
text-align: center;
width: 100px;
}
</style>
</head> <body>
<div align="right">
Welcome,[<font color=red>${sessionScope.user.username}</font>] | <a
href="loginout">Exit</a>
</div>
<br>
<center>
<table border="1">
<tbody>
<tr>
<th>id</th>
<th>username</th>
<th>password</th>
<th>sex</th>
<th>age</th>
<th colspan="2" style="">Options</th>
</tr>
<c:if test="${!empty listUser }">
<c:forEach items="${listUser}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td>${user.sex}</td>
<td>${user.age}</td>
<td><a href="toupdateuser?id=${user.id}">modify</a></td>
<td><a href="deleteuser?id=${user.id}">delete</a></td>
</tr>
</c:forEach>
</c:if>
</tbody>
</table>
<br>
<a href="toadduser">Add a new user</a>
</center>
</body>
</html>

adduser.jsp

在 webapp/WEB-INF/jsp 目录下新建一个 JSP 页面命名为 adduser.jsp,作为新增用户页面,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Add Page</title>
</head>
<body>
<h4>AddUser Page</h4>
<form action="adduser" method="post">
<table>
<tr>
<td><label>username:</label></td>
<td><input type="text" id="username" name="username" />
</tr>
<tr>
<td><label>password:</label></td>
<td><input type="password" id="password" name="password" />
</tr>
<tr>
<td><label>sex:</label></td>
<td><input type="text" id="sex" name="sex" />
</tr>
<tr>
<td><label>age:</label></td>
<td><input type="text" id="age" name="age" />
</tr>
<tr>
<td><input type="submit" value="add" />
</tr>
</table>
</form>
</body>
</html>

updateuser.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Modify Page</title>
</head>
<body>
<h4>Modify Page</h4>
<form action="updateuser" method="post">
<table>
<tr>
<td><label>id:</label></td>
<td><input type="text" id="id" name="id" value="${user_id}" readonly="readonly"/>
</tr>
<tr>
<td><label>username:</label></td>
<td><input type="text" id="username" name="username" />
</tr>
<tr>
<td><label>password:</label></td>
<td><input type="password" id="password" name="password" />
</tr>
<tr>
<td><label>sex:</label></td>
<td><input type="text" id="sex" name="sex" />
</tr>
<tr>
<td><label>age:</label></td>
<td><input type="text" id="age" name="age" />
</tr>
<tr>
<td><input type="submit" value="modify" />
</tr>
</table>
</form>
</body>
</html>

配置spring-mvc.xml文件

在目录 Java Resources/src 下新建 Spring MVC 配置文件 spring-mvc.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"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:mvn="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/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"> <mvn:default-servlet-handler/>
<!-- 自动扫描该包,Spring MVC 会将包下用 @Controller 注解的类注册为 Spring 的 controller -->
<context:component-scan base-package="com.shiyanlou.controller" />
<!-- 设置默认配置方案 -->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>

配置web.xml文件

现在我们来到整合的最后一步,配置 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">
<display-name>SSMTest</display-name> <!-- 配置 Spring 核心监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- 指定 Spring 的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param> <!-- 定义 Spring MVC 前端控制器 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <!-- 为 DispatcherServlet 建立映射 -->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener> <!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 设置首页 -->
<welcome-file-list>
<welcome-file>loginform.jsp</welcome-file>
</welcome-file-list>
</web-app>

到这里,SSM 框架就全部整合完毕,接下来我们要进行测试。

运行测试

打开终端 File -> Open New Terminal
输入 mvn jetty:run 运行程序,点击工具-- web 服务按钮,访问 web 服务。

注意:目前实验楼只支持 8080 端口启动服务,如果使用其他端口,将无法访问到服务,这里 jetty 默认就是 8080 端口,所以不用更改。

输入错误的用户名或密码(我们最开始的数据是 username:shiyanlou,password:123456)。

当用户名和密码都正确的时候进入首页。

在这里一共只有一条数据。

点击下面的 Add a new user 链接,进入新增用户页面,并填写新增用户的信息。

点击 add 按钮,完整用户的新增操作,可以看到用户新增成功。

点击 id 为 2 的用户记录行的 modify 链接,进入更新用户页面,并填写更新信息。

点击 modify 按钮,完整用户的更新操作,可以看到用户信息更新成功。

点击 id 为 2 的用户记录行的 delete 链接,删除该用户。

点击右上角的 Exit 链接,退出主页到登录页面。

【计理01组08号】SSM框架整合的更多相关文章

  1. 【计理01组03号】Java基础知识

    简单数据类型的取值范围 byte:8 位,1 字节,最大数据存储量是 255,数值范围是 −128 ~ 127. short:16 位,2 字节,最大数据存储量是 65536,数值范围是 −32768 ...

  2. 【计理01组04号】JDK基础入门

    java.lang包 java.lang包装类 我们都知道 java 是一门面向对象的语言,类将方法和属性封装起来,这样就可以创建和处理相同方法和属性的对象了.但是 java 中的基本数据类型却不是面 ...

  3. 【计理01组30号】Java 实现日记写作软件

    项目分析 代码设计 com.shiyanlou.entity User.java package com.shiyanlou.entity; public class User { private S ...

  4. JAVAEE——宜立方商城01:电商行业的背景、商城系统架构、后台工程搭建、SSM框架整合

    1. 学习计划 第一天: 1.电商行业的背景. 2.宜立方商城的系统架构 a) 功能介绍 b) 架构讲解 3.工程搭建-后台工程 a) 使用maven搭建工程 b) 使用maven的tomcat插件启 ...

  5. SpringMVC札集(10)——SSM框架整合

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  6. SSM框架整合项目 :租房管理系统

    使用ssm框架整合,oracle数据库 框架: Spring SpringMVC MyBatis 导包: 1, spring 2, MyBatis 3, mybatis-spring 4, fastj ...

  7. JavaWeb之ssm框架整合,用户角色权限管理

    SSM框架整合 Spring SpringMVC MyBatis 导包: 1, spring 2, MyBatis 3, mybatis-spring 4, fastjson 5, aspectwea ...

  8. springmvc(二) ssm框架整合的各种配置

    ssm:springmvc.spring.mybatis这三个框架的整合,有耐心一步步走. --WH 一.SSM框架整合 1.1.整合思路 从底层整合起,也就是先整合mybatis与spring,然后 ...

  9. SSM框架整合搭建教程

    自己配置了一个SSM框架,打算做个小网站,这里把SSM的配置流程详细的写了出来,方便很少接触这个框架的朋友使用,文中各个资源均免费提供! 一. 创建web项目(eclipse) File-->n ...

随机推荐

  1. markdownFormat

      对文档编辑主要还是用wps,因为以前毕业论文都是用的它来编排(刚开始用wps毕业论文的时候真的是用的想吐,感觉非常不好用,而且功能太多但对于自己需要的功能又偏偏找不到),用过几次后还觉得用它编辑文 ...

  2. MRCTF2020 套娃

    MRCTF2020套娃 打开网页查看源代码 关于$_SERVER['QUERY_STRING']取值,例如: http://localhost/aaa/?p=222 $_SERVER['QUERY_S ...

  3. 🏆【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(上)

    官方资源 https://nacos.io/zh-cn/docs/quick-start.html Nacos之配置中心 动态配置管理是 Nacos的三大功能之一,通过动态配置服务,可以在所有环境中以 ...

  4. gin框架中的路由

    基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...

  5. MIME类型说明(HTTP协议中数据类型)

    MIME(HTTP协议中数据类型) MIME:多功能Internet邮件扩充服务.MIME类型的格式是"大类型/小类型",并与某一种文件的扩展名相对应. 常见的MIME类型: RT ...

  6. logrotate 日志切割

    logrotate是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用. 配置文件 Linux系统默认安装logrotate工具,它默认 ...

  7. 聊聊HTTPS和SSL协议

    本文为转载,原文链接http://www.techug.com/https-ssl-tls,作者不详. 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(H ...

  8. jenkins pipeline设置

    转:https://mp.weixin.qq.com/s/MwyBsUWUQASGMr_erGfzZA

  9. How to check in Windows if you are using UEFI

    You might be wondering if Windows is using UEFI or the legacy BIOS, it's easy to check. Just fire up ...

  10. SpringBoot集成MongoDB之导入导出和模板下载

    前言 自己很对自己在项目中集成MongoDb做的导入导出以及模板下载的方法总结如下,有不到之处敬请批评指正! 1.pom.xml依赖引入 <!-- excel导入导出 --> <de ...