B041-SSM集成_拦截器

news2025/1/17 13:59:06

目录

      • SSM整合简介
      • 整合步骤
        • 先准备spring环境
          • 核心配置文件
        • Spring整合Mybatis
          • 准备数据库和表
          • Spring管理数据库连接属性文件
          • Spring管理连接池
          • 实体类、mapper接口和映射文件
          • Spring管理SqlSessionFactory
          • Spring管理Mapper接口
          • Spring管理Servive层
        • Spring整合SpringMVC
          • 准备web.xml
          • 准备SpringMVC.xml
          • 新建包和EmpController
          • web.xml配置监听器
      • CRUD练习
        • 准备部门表
        • 实体类
        • controller
        • service
        • mapper
        • index.jsp
        • save.jsp
      • 拦截器
        • 流程图
        • 自定义拦截器
        • 配置拦截器

SSM整合简介

SpringMVC本身是Spring的组件,Spring整合Mybatis即把Mybatis框架的核心类交给Spring管理(IOC)
如Mybatis的SqlsessionFactory、Sqlsession和核心配置文件(四大金刚)

整合步骤

新建dynamic web project,修改默认输出的class路径,修改content directory名,勾选生成web.xml
部署Tomcat
导包:Spring、Spring测试、Servlet和jsp、数据库、Mybatis、Spring和Mybatis的整合包

先准备spring环境
核心配置文件

resources下创建核心配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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
">

	<!-- 测试spring环境是否正常 -->
	<bean id="date" class="java.util.Date"></bean>

</beans>

测试能否正常使用核心配置文件中的bean

@ContextConfiguration("classpath:applicationContext.xml") // 加载核心配置文件
@RunWith(SpringJUnit4ClassRunner.class)// 使用spring的测试
public class SpringTest{

	@Autowired
	private Date date;
	
	@Test
	public void testName() throws Exception {
		System.out.println(date);
	}
}
Spring整合Mybatis
准备数据库和表

数据库1112下创建dept表

Spring管理数据库连接属性文件

准备属性文件,并交给Spring管理 - (原来是放在mybatis-config中然后由Resources读取)
db.properties

db.username=root
db.password=root
db.url=jdbc:mysql:///1112
db.dirverClassName=com.mysql.jdbc.Driver

applicationContext.xml

	<!-- 把db.properties交给spring去管理 
	system-properties-mode="NEVER":如果有重名优先使用db.properties文件中的key -->
	<context:property-placeholder location="classpath:db.properties"
		system-properties-mode="NEVER" />
Spring管理连接池

通过连接池获取DataSource数据源

applicationContext.xml

	<!-- spring管理连接池 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="username" value="${db.username}"></property>
		<property name="password" value="${db.password}"></property>
		<property name="url" value="${db.url}"></property>
		<property name="driverClassName" value="${db.dirverClassName}"></property>
	</bean>

测试:SpringTest

	@Autowired
	private BasicDataSource dataSource;

	@Test
	public void testName() throws Exception {
		System.out.println(dataSource.getConnection());
	}
实体类、mapper接口和映射文件

domain下新建Emp
代码略

mapper包下新建接口和映射文件
EmpMapper

public interface EmpMapper {

	/**
	 * 查询所有
	*/
	List<Emp> findAll();
}

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">
 <!-- namespace:名称空间:接口的全路径 -->
<mapper namespace="cn.ming.mapper.EmpMapper">
	<select id="findAll" resultType="cn.ming.domain.Emp">
		select *from emp
	</select>
</mapper>
Spring管理SqlSessionFactory

applicationContext.xml

	<!-- 将SqlSessionFactory交给Spring去管理 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 注入数据源,因为获取连接之后,才能打开会话 -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 配置别名 -->
		<property name="typeAliasesPackage" value="cn.ming.domain"></property>
		<!-- 加载所有的mapper文件 -->
		<property name="mapperLocations" value="classpath:cn/ming/mapper/*Mapper.xml"></property>
	</bean>

测试:SpringTest

	@Autowired
	private SqlSessionFactory factory;

	@Test
	public void testName() throws Exception {
		System.out.println(factory);
	}
Spring管理Mapper接口

applicationContext.xml

	<!-- 将Mapper接口交给Spring去管理,MapperScannerConfigurer:生成Mapper代理对象-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 指定mapper接口的包路径 -->
		<property name="basePackage" value="cn.ming.mapper"></property>
	</bean>

测试:SpringTest

	@Autowired
	private EmpMapper mapper;// 代理对象

	@Test
	public void testName() throws Exception {
		List<Emp> list = mapper.findAll();
		list.forEach(System.out::println);
	}
Spring管理Servive层

service包下新建IEmpService

public interface IEmpService {
	
	List<Emp> findAll();
}

service.impl包下新建EmpServiceImpl,加上Service注解

@Service
public class EmpServiceImpl implements IEmpService {

	@Autowired
	private EmpMapper mapper;
	
	@Override
	public List<Emp> findAll() {
		// TODO Auto-generated method stub
		return mapper.findAll();
	}

}

applicationContext.xml

	<!-- 开启扫描包路径   service层 -->
	<context:component-scan base-package="cn.ming.service"></context:component-scan>

测试:SpringTest

	@Autowired
	private IEmpService service;

	@Test
	public void testName() throws Exception {
		List<Emp> list = service.findAll();
		list.forEach(System.out::println);
	}
Spring整合SpringMVC
准备web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>day41_ssm</display-name>
  
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 前端控制器 人家写好的servlet -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 加载SpringMVC的核心配置文件 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <!-- Tomcat启动就初始化servlet -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 请求路径 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <!-- 我们用框架提供的支持UTF-8编码的过滤器 -->
  <filter>
    <filter-name>characterEncoding</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>
    <!--强制指定字符编码,即使request或response设置了字符编码,也会强制使用当前设置的,任何情况下强制使用此编码-->
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
准备SpringMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
">
	
	<!-- 开启扫描包路径 -->
	<context:component-scan base-package="cn.ming.controller" />
	
	<!-- 放行静态资源 -->
	<mvc:default-servlet-handler/>
	
	<!-- 使spring注解生效 @RequestMapping-->
 	<mvc:annotation-driven />
 	
 	<!-- 视图解析器  prefix+return+suffix = /WEB-INF/views/data.jsp -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>	
	</bean>
	
	<!-- 上传解析器 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置上传文件的最大尺寸为1MB -->
		<property name="maxUploadSize">
			<!-- spring el写法:1MB -->
			<value>#{1024*1024*20}</value>
		</property>
		<!-- 效果同上 -->
		<!-- <property name="maxUploadSize" value="1048576" /> -->
	</bean>
	
</beans>
新建包和EmpController
@Controller
public class EmpController {

	@Autowired
	private IEmpService service;
	
	@RequestMapping("/findAll")
	@ResponseBody // 返回json格式数据  不走视图解析器
	public List<Emp> findAll(){
		return service.findAll();
	}
}
web.xml配置监听器

原因:web容器启动时只加载了spring-mvc.xml,并没有加载applicationContext.xml

  <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>

CRUD练习

见工程

准备部门表

实体类

controller

查询所有:查询所有后把数据放到request域中,jsp页面取值展示
删除:删除后重定向到查询所有
添加:跳往后端goSave,如果id为空跳转save页面,填值后跳往后端save,对象接收参数,如果没有隐藏域id就添加然后重定向到查询所有
修改:跳往后端goSave,如果id有值,查询此条数据,向request域传值并跳转save页面,save页面取值回显,改数据后跳往后端save,有隐藏域id就修改然后重定向到查询所有

service

mapper

mapper.xml文件可以放到resources同路径目录下,编译后是一样的

index.jsp

相对路径与绝对路径

<a href="del?id=${dept.id }">删除</a>
<a href="/dept/del?id=${dept.id }">删除</a>

A标签都往后端跳,后端跳转页面
添加与修改都是跳往后端同一个接口,然后跳转页面

save.jsp

拦截器

流程图

在这里插入图片描述

自定义拦截器

interceptor包下新建MyInterceptor

public class MyInterceptor implements HandlerInterceptor {

	// 到达处理器之前执行
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("进入拦截器了....");
		return false;
	}

	// 处理器处理之后执行
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		
	}

	// 响应到浏览器之前执行
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		
	}

}
配置拦截器

springMVC.xml

	<!-- 配置拦截器组 -->
	<mvc:interceptors>
		<!-- 拦截器 -->
		<mvc:interceptor>
			<!-- 要拦截的配置,该配置必须写在不拦截的上面,/*拦截一级请求,/**拦截多级请求 -->
			<mvc:mapping path="/**"  />
			<!-- 设置不拦截的配置 -->
			<mvc:exclude-mapping path="/dept/*"/>
			<!-- 配置拦截器 -->
			<bean class="cn.ming.interceptor.MyInterceptor" />  
		</mvc:interceptor>
	</mvc:interceptors>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1331397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PromptNER: Prompt Locating and Typing for Named Entity Recognition

原文链接&#xff1a; https://aclanthology.org/2023.acl-long.698.pdf ACL 2023 介绍 问题 目前将prompt方法应用在ner中主要有两种方法&#xff1a;对枚举的span类型进行预测&#xff0c;或者通过构建特殊的prompt来对实体进行定位。但作者认为这些方法存在以下问题&#xf…

最小二乘法简介

最小二乘法简介 1、背景描述2、最小二乘法2.1、最小二乘准则2.2、最小二乘法 3、最小二乘法与线性回归3.1、最小二乘法与线性回归3.2、最小二乘法与最大似然估计 4、正态分布&#xff08;高斯分布&#xff09; 1、背景描述 在工程应用中&#xff0c;我们通常会用一组观测数据去…

(Mac上)使用Python进行matplotlib 画图时,中文显示不出来

【问题描述】 ①报错确缺失字体&#xff1a; ②使用matplotlib画图&#xff0c;中文字体显示不出来 【问题思考】 在网上搜了好多&#xff0c;关于使用python进行matplotlib画图字体显示不出来的&#xff0c;但是我试用了下&#xff0c;对我来说都没有。有些仅使用于windows系…

中心性算法归纳

中心性算法不仅是在我所学习的计算机网络当中起很重要的作用&#xff0c;在交通网络、社交网络、信息网络、神经网络当中也有很多的应用例子。今天我在这里总结一下场景的几种中心性算法。 参考文献 Python NetworkX库 偏心中心性&#xff08;Eccentricity Centrality&#x…

在Linux下探索MinIO存储服务如何远程上传文件

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 创建Buckets和Access Keys二. Linux 安装Cpolar三. 创建连接MinIO服务公网地…

python时间处理方法和模块

在 Python 中&#xff0c;有一些内置的模块和库&#xff0c;可以帮助我们处理日期和时间的表示、计算和转换。 1. 时间模块&#xff08;time&#xff09; Python 的 time 模块提供了一系列函数来处理时间相关的操作。通过这个模块&#xff0c;可以获取当前时间、睡眠指定时间…

BIT-6-指针(C语言初阶学习)

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址平时口语中说的指针&#xff0c;通常…

向量投影:如何将一个向量投影到矩阵的行向量生成子空间?

向量投影&#xff1a;如何将一个向量投影到矩阵的行向量生成子空间&#xff1f; 前言 本问题是在学习Rosen梯度投影优化方法的时候遇到的问题&#xff0c;主要是对于正交投影矩阵(NT(NNT)-1N)的不理解&#xff0c;因此经过查阅资料&#xff0c;学习了关于向量投影的知识&…

MySQL——复合查询

目录 一.基本查询回顾 二. 多表查询 三.自连接 四.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 一.基本查询回顾 准备数据库&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

欠采样对二维相位展开的影响

1.前言 如前所述&#xff0c;相位展开器通过计算两个连续样本之间的差来检测图像中包裹的存在。如果这个差值大于π或小于-π&#xff0c;则相位展开器认为在这个位置存在包裹。这可能是真正的相位包络&#xff0c;也可能是由噪声或采样不足引起的伪包络。 对欠采样的相位图像…

Flink面试题与详解

Flink面试题目合集 从牛客网上找到的一些面试题&#xff0c;如果还有其他的&#xff0c;欢迎大家补充。 1、能否详细描述下Apache Flink的架构组件和其工作原理&#xff1f;请介绍一下Flink on YARN部署模式的工作原理。 官网图&#xff1a; 由两个部分组成&#xff0c;JM&am…

使用Velero备份、恢复k8s集群上的资源

一、Velero简介 Velero提供备份和恢复 Kubernetes 集群资源和持久卷的工具。 Velero功能&#xff1a; 对群集进行备份&#xff0c;并在丢失时进行还原。将集群资源迁移到其他集群。 Velero 包括&#xff1a; 在群集上运行的服务器在本地运行的命令行客户端 开源地址&…

CAD制图

CAD制图 二维到三维 文章目录 CAD制图前言一、CAD制图二、机械设计三、二维图纸四、三维图纸总结前言 CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。 一、CAD制图 CAD(Computer-Aided Design)是利用计算机技术辅助进行设计…

DoIP学习笔记系列:(七)doipclient测试工具安装使用说明

文章目录 优点doipclient简介安装部署环境准备安装doipclient安装python-uds测试传送门 DoIP学习笔记系列:导航篇 在DoIP的开发测试过程中,一般是用CANoe+VN5620+cdd的方式测试,此种方式对熟悉CANoe使用的小伙伴非常友好,调试方便,稳定性也不错,那有没有其他的方式呢?比…

ubuntu保存分辨率失效解决办法

在VM虚拟机中&#xff0c;遇到修改ubuntu分辨率后&#xff0c;重启后又重置的解决办法。 目前我的ubuntu版本是&#xff1a;ubuntu 18.04.6 版本。 1.首先&#xff0c;在你喜欢的目录建立一个.sh 脚本文件。 终端执行命令&#xff1a;sudo vim xrandr.sh 2.按 i 进入编辑状…

ARM 点灯

.text .global _start _start: led1设置GPIOE时钟使能 RCC_MP_AHB4ENSETR[4]->1 0X50000A28LDR R0,0X50000A28 指定寄存器地址LDR R1,[R0] 将寄存器数值取出来放在R1中ORR R1,R1,#(0x1<<4) 将第4位设置为1STR R1,[R0] 将修改后的值写回去设置PE10为输出 GPIOE…

Prometheus API 使用介绍|收藏

​ &#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试…

Microsoft edge浏览器对比谷歌浏览器 edge浏览器好用吗 edge浏览器怎么更换主页

近年来&#xff0c;由于谷歌浏览器的垄断&#xff0c;许多人都已经习惯于使用谷歌浏览器。随着互联网的普及&#xff0c;浏览器成为了人们上网必备的工具之一。而近年来&#xff0c;微软公司推出的 Microsoft Edge 浏览器备受关注。那么&#xff0c;Microsoft Edge 浏览器真的好…

2. 结构型模式 - 桥接模式

亦称&#xff1a; Bridge 意图 桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用 问题 抽象&#xff1f; 实现&#xff1f; 听上去挺吓人&#xff1f; 让我们慢慢来&#x…

PyQt5设计一个简单的抽奖系统

PyQt5抽奖系统 程序运行截图 抽奖系统代码 该系统使用PyQt5模块以及openpyxl模块开发&#xff0c;需要使用pip安装导入PyQt5模块和openpyxl模块 import random, sys from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QVBoxLayout, QApplication, QPushButton,…