介绍SSM框架<原理>
一、什么是SSM框架?
SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎。
1)持久层:dao层(mapper)层
作用:主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。
Dao层首先设计的是接口,然后再Spring的配置文件中定义接口的实现类。
然后可以在模块中进行接口的调用来进行数据业务的处理。(不在关心接口的实现类是哪个类)
数据源的配置以及有关数据库连接的参数都在Spring的配置文件中进行配置。
2)业务层:Service层
作用:Service层主要负责业务模块的逻辑应用设计。
先设计接口然后再设计实类,然后再在Spring的配置文件中配置其实现的关联。(业务逻辑层的实现具体要调用到自己已经定义好的Dao的接口上)这样就可以在应用中调用Service接口来进行业务处理。
建立好Dao之后再建立service层,service层又要在controller层之下,因为既要调用Dao层的接口又要提供接口给controller层。每个模型都有一个service接口,每个接口分别封装各自的业务处理的方法。
3)表现层:Controller层(Handler层)
作用:负责具体的业务模块流程的控制。
配置也同样是在Spring的配置文件里面进行,
调用Service层提供的接口来控制业务流程。
业务流程的不同会有不同的控制器,在具体的开发中可以将我们的流程进行抽象的归纳,设计出可以重复利用的子单元流程模块。
4)View层
作用:主要和控制层紧密结合,主要负责前台jsp页面的表示。
各层之间的联系
这里是引用
DAO层,Service层这两个层次都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势,Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单。
1.Spring
Spring里面的IOC容器和AOP是我们平时使用最多的。
1)IOC(控制反转)
它可以装载bean,也是一种降低对象之间耦合关系的设计思想。(比如租房子。以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个房屋中介,把你需要的房型告诉中介,就可以直接选到需要的房子,中介就相当于spring容器。)
2)AOP(面向切面)
是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求,如:动态的增加日志、安全或异常处理等。AOP使业务逻辑各部分间的耦合度降低,提高程序可重用性,提高开发效率。
1.横切关注点:从每个方法中抽取出来的同一类非核心业务代码。
2.切面:封装横切信息点的类,每个关注点体现为一个通知方法。
3.通知:切面必须要完成的各个具体工作,也就是切面里的一个个方法。
4.目标:被通知的对象,也就是被通知方法所作用的对象。
5.代理:像目标对象应用通知之后所创建的代理对象。
6.连接点:横切关注点在程序代码中的具体体现,对应用程序执行的某个特定位置。(通俗来讲就是一个个的方法)
7.切入点:切入点就是定位连接点的方式。每个通知上的切入点表达式找到对应的连接点,执行通知之后连接点也就变成了切入点。
2.Spring MVC
<复杂版>
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
<简单版>
1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端
3.Mybatis (核心是SqlSession)
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
二、代码实战
创建实体类User
package com.bdqn.pojo;
public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
创建UserMapper接口
package com.bdqn.dao;
import com.bdqn.pojo.User;
import java.util.List;
public interface UserMapper {
//查询全部的方法
List<User> getAll();
}
配置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">
<!--定义到UserMapper接口-->
<mapper namespace="com.bdqn.dao.UserMapper">
<!--id我们接口面的方法-->
<!--resultType我们返回的是user实体类-->
<select id="getAll" resultType="user">
select * from user
</select>
</mapper>
创建service层 userService接口
package com.bdqn.service;
import com.bdqn.pojo.User;
import java.util.List;
public interface UserService {
//查询全部的方法
List<User> getAll();
}
创建UserServiceimpl实体类继承UserServoice接口
package com.bdqn.service;
import com.bdqn.dao.UserMapper;
import com.bdqn.pojo.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
//注解
@Service
public class UserServiceimpl implements UserService {
//创建UserMapper接口并生成 get set方法 和注解
@Resource
private UserMapper userMapper;
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
//查询全部的方法
@Override
public List<User> getAll() {
return userMapper.getAll();
}
}
创建UserController
package com.bdqn.controller;
import com.bdqn.pojo.User;
import com.bdqn.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import java.util.List;
//注解
@Controller
//定义前缀
@RequestMapping(value = "/record")
public class UserController {
//创建UserService生成 get set 方法
@Resource
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
//定义前缀
@GetMapping("/getAll")
public String getAll(Model model){
//定义查询全部的实例
List<User> all = userService.getAll();
//addAttribute进行传值
model.addAttribute("all",all);
//返回页面
return "user/add";
}
}
配置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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:contest="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--引用数据库文件-->
<contest:property-placeholder location="classpath:database.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
<property name="minIdle" value="${minIdle}"/>
<property name="maxIdle" value="${maxIdle}"/>
<property name="maxWait" value="${maxWait}"/>
<property name="initialSize" value="${initialSize}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="removeAbandoned" value="${removeAbandoned}"/>
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
<!--sql心跳-->
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="testOnReturn" value="false"/>
<property name="testOnBorrow" value="false"/>
<property name="validationQuery" value="select 1"/>
<property name="numTestsPerEvictionRun" value="${maxActive}"/>
</bean>
<!--事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--aop-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true">
<aop:pointcut id="transService" expression="execution(* *com.bdqn.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transService"/>
</aop:config>
<!--SqlsessionFactoryBean-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--MapperScanner-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bdqn.dao"/>
</bean>
<!--扫包-->
<context:component-scan base-package="com.bdqn.dao"/>
<context:component-scan base-package="com.bdqn.service"/>
<mvc:annotation-driven/>
<context:component-scan base-package="com.bdqn.controller"/>
<!--试图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--静态资源文件-->
<mvc:resources mapping="/statics" location="/statics/"/>
</beans>
配置database.properties连接数据库
driver=com.mysql.cj.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,字符集设置为utf-8,并根据需要设置时区
url=jdbc:mysql://127.0.0.1:3306/text?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
user=root
password=123.com
minIdle=45
maxIdle=50
initialSize=5
maxActive=100
maxWait=100
removeAbandonedTimeout=180
removeAbandoned=true
配置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>
<!--扫描实体类,起别名-->
<typeAliases>
<package name="com.bdqn.pojo"/>
</typeAliases>
</configuration>
创建add.jsp展示页面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: 89800
Date: 2022/8/31
Time: 10:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:forEach items="${all}" var="ss">
${ss.name}
${ss.password}
</c:forEach>
</body>
</html>
测试
配置tomcat进行测试
输入路径查询全部
使用框架进行增删该查,模糊查询
创建Dao层EmpMapper接口
package com.bdqn.dao;
import com.bdqn.pojo.Emp;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface EmpMapper {
//查询全部的方法
List<Emp> getEmpList();
//删除的方法
int deleteEmpById( int id);
//增加的方法
int addEmp( Emp emp);
//修改的方法
int updateEmpById( Emp emp);
//根据id查询
Emp getEmpById( int id);
//根据昵称模糊查询
List<Emp> getEmpListByName(String userName);
}
创建配置EmpMapper.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.bdqn.dao.EmpMapper">
<!--连表查询全部-->
<select id="getEmpList" resultType="emp">
select * from emp,dept where emp.did=dept.id
</select>
<!--添加的方法-->
<insert id="addEmp" parameterType="emp">
insert into `emp`
(`username`,`password`,`age`,`birthday`,`address`,`did`,`idPicPath`)
values
(#{username},#{password},#{age},#{birthday},#{address},#{did},#{idPicPath})
</insert>
<!--修改的方法-->
<update id="updateEmpById" parameterType="emp">
update emp set
userName=#{username},
password=#{password},
age=#{age},
birthday=#{birthday},
address=#{address},
did=#{did},
idPIcPath=#{idPicPath}
<where>
eid=#{eid}
</where>
</update>
<!--删除的方法-->
<delete id="deleteEmpById" parameterType="int">
delete from emp
<where>
eid=#{eid}
</where>
</delete>
<!--根据id进行查询-->
<select id="getEmpById" parameterType="int" resultType="emp">
select * from emp where eid=#{eid}
</select>
<!--根据姓名进行查询-->
<select id="getEmpListByName" resultType="emp" parameterType="string">
SELECT * FROM emp,dept WHERE emp.did=dept.id and username LIKE CONCAT('%',#{username},'%')
</select>
</mapper>
创建实体类
package com.bdqn.pojo;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class Emp {
private int eid;
private String username;
private String password;
private int age;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private String address;
private int did;
private String idPicPath;
private String depName;
public String getDepName() {
return depName;
}
public void setDepName(String depName) {
this.depName = depName;
}
@Override
public String toString() {
return "Emp{" +
"eid=" + eid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", birthday=" + birthday +
", address='" + address + '\'' +
", did=" + did +
", idPicPath='" + idPicPath + '\'' +
'}';
}
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getDid() {
return did;
}
public void setDid(int did) {
this.did = did;
}
public String getIdPicPath() {
return idPicPath;
}
public void setIdPicPath(String idPicPath) {
this.idPicPath = idPicPath;
}
}
创建service层EmpService接口
package com.bdqn.service;
import com.bdqn.pojo.Emp;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface EmpService {
//查询全部的方法
List<Emp> getEmpList();
//删除的方法
boolean deleteEmpById(@Param("id") int id);
//增加的方法
boolean addEmp(@Param("emp") Emp emp);
//修改的方法
boolean updateEmpById(@Param("emp") Emp emp);
//根据id查询
Emp getEmpById(@Param("id") int id);
//根据昵称模糊查询
List<Emp> getEmpListByName(String userName);
}
创建EmpServiceImpl实体类
package com.bdqn.service;
import com.bdqn.dao.EmpMapper;
import com.bdqn.pojo.Emp;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
//定义注解
@Service(value = "empService")
public class EmpServiceImpl implements EmpService {
@Resource
private EmpMapper empMapper;
@Override
public List<Emp> getEmpList() {
return empMapper.getEmpList();
}
//删除的方法
@Override
public boolean deleteEmpById(int id) {
if(empMapper.deleteEmpById(id)>0){
return true;
}
return false;
}
//添加的方法
@Override
public boolean addEmp(Emp emp) {
if(empMapper.addEmp(emp)>0){
return true;
}
return false;
}
//修改的方法
@Override
public boolean updateEmpById(Emp emp) {
if(empMapper.updateEmpById(emp)>0){
return true;
}
return false;
}
//根据id进行查询
@Override
public Emp getEmpById(int id) {
return empMapper.getEmpById(id);
}
//根据姓名进行查询
@Override
public List<Emp> getEmpListByName(String userName) {
return empMapper.getEmpListByName(userName);
}
}
配置resources层,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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" 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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--引用数据库文件-->
<context:property-placeholder location="classpath:database.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
<property name="minIdle" value="${minIdle}"/>
<property name="maxIdle" value="${maxIdle}"/>
<property name="maxWait" value="${maxWait}"/>
<property name="initialSize" value="${initialSize}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="removeAbandoned" value="${removeAbandoned}"/>
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
<!--sql心跳-->
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="testOnReturn" value="false"/>
<property name="testOnBorrow" value="false"/>
<property name="validationQuery" value="select 1"/>
<property name="numTestsPerEvictionRun" value="${maxActive}"/>
</bean>
<!--事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--aop处理事务-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true">
<aop:pointcut id="transService" expression="execution(* *com.bqdn.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transService"/>
</aop:config>
<!--SqlSessionFactoryBean-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--MapperScanner-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bdqn.dao"/>
</bean>
<!--扫包-->
<context:component-scan base-package="com.bdqn.dao"/>
<context:component-scan base-package="com.bdqn.service"/>
<mvc:annotation-driven/>
<context:component-scan base-package="com.bdqn.controller"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--静态资源文件-->
<mvc:resources mapping="/statics/**" location="/statics/"/>
</beans>
配置database.properties
driver=com.mysql.cj.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,字符集设置为utf-8,并根据需要设置时区
url=jdbc:mysql://127.0.0.1:3306/text?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
user=root
password=123.com
minIdle=45
maxIdle=50
initialSize=5
maxActive=100
maxWait=100
removeAbandonedTimeout=180
removeAbandoned=true
配置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>
<!--扫描实体类,起别名-->
<typeAliases>
<package name="com.bdqn.pojo"/>
</typeAliases>
</configuration>
配置WED.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">
<!--servlet-->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--过滤器-->
<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>
<!--监听器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
创建jsp页面
编写addjsp
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<%--
Created by IntelliJ IDEA.
User: win10
Date: 2022/9/3
Time: 9:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加人员 </title>
</head>
<body>
<div align="center">
<fm:form method="post" modelAttribute="emp">
<table>
<tr>
<td><lable>昵称:</lable></td>
<td><fm:input path="username" /></td>
</tr>
<tr>
<td> <lable>密码:</lable> </td>
<td><fm:password path="password"/></td>
</tr>
<tr>
<td> <lable>年龄:</lable> </td>
<td><fm:input path="age"/></td>
</tr>
<tr>
<td> <lable>生日:</lable> </td>
<td><fm:input path="birthday"/></td>
</tr>
<tr>
<td> <lable>地址:</lable> </td>
<td><fm:input path="address"/></td>
</tr>
<tr>
<td><lable>部门:</lable></td>
<td>
<fm:radiobutton path="did" value="1"/>开发部
<fm:radiobutton path="did" value="2"/>测试部
<fm:radiobutton path="did" value="3"/>市场部
</td>
</tr>
<tr>
<td><lable>图片地址:</lable></td>
<td><fm:input path="idPicPath"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit"></td>
</tr>
</table>
</fm:form>
</div>
</body>
</html>
编写list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--
Created by IntelliJ IDEA.
User: win10
Date: 2022/9/2
Time: 15:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/emp/getEmpByName" method="post">
<table align="center" width="1000">
<tr>
<td align="right"><a href="${pageContext.request.contextPath}/emp/add" style="text-decoration: none;color: cadetblue">添加用户</a> </td>
</tr>
<tr>
<td align="center">
昵称: <input type="text" name="username"> <input type="submit" value="搜索">
</td>
</tr>
</table>
</form>
<table border="1" align="center">
<tr>
<th>编号</th>
<th>昵称</th>
<th>密码</th>
<th>年龄</th>
<th>生日</th>
<th>地址</th>
<th>部门</th>
<th>证件</th>
<th>操作</th>
</tr>
<c:forEach items="${empList}" var="emp">
<tr>
<td>${emp.eid}</td>
<td>${emp.username}</td>
<td>${emp.password}</td>
<td>${emp.age}</td>
<td><fmt:formatDate value="${emp.birthday}" pattern="yyyy-MM-dd"/></td>
<td>${emp.address}</td>
<td>${emp.depName}</td>
<td><img src="${pageContext.request.contextPath}/statics/images/${emp.idPicPath}" width="30px" height="30px"></td>
<td><a href="${pageContext.request.contextPath}/emp/delete?id=${emp.eid}">删除</a>
<a href="${pageContext.request.contextPath}/emp/toUpdate?id=${emp.eid}">修改</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
编写update.jsp
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--
Created by IntelliJ IDEA.
User: win10
Date: 2022/9/3
Time: 9:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改人员信息 </title>
</head>
<body>
<div align="center">
<form action="${pageContext.request.contextPath}/emp/update" method="post">
<table>
<input type="hidden" name="eid" value="${emp.eid}">
<tr>
<td><lable>昵称:</lable></td>
<td><input type="text" name="username" value="${emp.username}"></td>
</tr>
<tr>
<td> <lable>密码:</lable> </td>
<td><input type="password" name="password" value="${emp.password}"></td>
</tr>
<tr>
<td> <lable>年龄:</lable> </td>
<td><input type="text" name="age" value="${emp.age}"></td>
</tr>
<tr>
<td> <lable>生日:</lable> </td>
<td><input type="text" name="birthday" value="<fmt:formatDate value="${emp.birthday}" pattern="yyyy-MM-dd"/> "></td>
</tr>
<tr>
<td> <lable>地址:</lable> </td>
<td><input type="text" name="address" value="${emp.address}"></td>
</tr>
<tr>
<td><lable>部门:</lable></td>
<td>
<input type="radio" name="did" value="1" <c:if test="${emp.did==1}">checked</c:if> > 开发部
<input type="radio" name="did" value="2" <c:if test="${emp.did==2}">checked</c:if>>测试部
<input type="radio" name="did" value="3" <c:if test="${emp.did==3}">checked</c:if>>市场部
</td>
</tr>
<tr>
<td><lable>图片地址:</lable></td>
<td><input type="text" name="idPicPath" value="${emp.idPicPath}"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit"></td>
</tr>
</table>
</form>
</div>
</body>
</html>