SSM基础篇
一. SSM面试题
1.Spring
spring是一个轻量级的,开源框架,核心有七大组件:
- spring context;
- spring core;
- spring aop;
- spring web;
- spring mvc;
- spring DAO;
- spring orm;
spring的优点是, 轻量级,对代码污染小,对各种框架组件的提供丰富的支持,提供的aop能够很方便的支持代码解耦.
spring的两大特性是IOC和AOP.
IOC即控制翻转, 意味着将Bean的创建和生命周期由之前的开发者管理, 转为现在由容器管理, 开发者只需要定义好Bean的元信息, 容器便会自动创建和管理Bean的生命周期, 开发者只需要依赖容器注入Bean, 然后使用即可. IOC的实现核心是工厂模式和反射.
AOP即面向切面编程, Java 中面向对象编程的(OOP)的思想, 方便我们定义纵向的关系, 但不利于定义横向的关系, 但在开发过程中, 许多对象之间, 往往又具有一定的共性, 需要一种横向的关系描述一些公共逻辑, 这个时候AOP便很好的提供了一种解决方式.
面向切面编程, 方便定义一些公共业务代码块, 在需要时候切入这些纵向的类中, 如: 事务, 缓存, 安全, 权限校验等.
AOP的实现方式包括静态代理和动态代理, spring AOP 的实现方式是动态代理, 包括 jdk 动态代理和 cglib 动态代理.
静态代理是在编译时, 即将增强逻辑织入字节码中, 实现增强.
动态代理, 则是在程序运行的时候, 动态的生成代理对象, 然后将切面织入目标对象.
jdk动态代理只支持接口的代理, 不支持类的代理, 需要类实现接口. jdk动态代理的核心是InvocationHandler接口和Proxy类, 在获取代理对象时, 使用 Proxy 类来动态创建目标类的代理类(即最终真正的代理类, 这个类继承自 Proxy 并实现了我们定义的接口), 当代理对象调用真实对象的方法时, InvocationHandler 通过 invoke() 方法反射来调用目标类中的代码, 动态的将横切逻辑和业务编织在一起.
如果被代理类没有实现接口, 那么Spring AOP 会选择使用 CGLIB 来动态代理目标类. CGLIB, 是一个代码生成的类库, 可以在运行时动态的生成指定类的一个子类对象, 并覆盖其中特定方法并添加增强代码, 从而实现 AOP, CGLIB是通过集成的方式做的动态代理, 因此如果某个类被标记为 final , 那么它是无法使用 CGLIB做动态代理的.
AOP 中的名词解释:
- 连接点: 每一个方法的执行都可以称之为连接点, 是增强代码的织入时机;
- 切点: 又称切点表达式, 通过表达式过滤连接点, 确定增强代码需要在哪里执行;
- 切面: 切点和通知的组合, 称为切面, 包含对连接点的过滤和增强方法;
- 目标对象: 由于 spring AOP 是借助代理实现的, 因此目标对象永远是代理对象;
- 通知: 前置通知, 后置通知, 返回通知, 环绕通知, 异常通知, 不同的通知执行时机不同, 通过通知中代码块的定义, 可以在想要的时机增强方法;
- 织入: 切面织入目标对象实现方法增强的过程;
- 引入: 添加额外的方法或者字段到被通知的类, spring 允许引入新的接口以及对应的实现, 到任何被代理的对象, 例如使用一个引入来使Bean实现IsModified接口, 以便简化缓存机制.
spring 容器的启动流程, 简要来说分为三个阶段:
- 注册内置的 BeanPostProcessor 和 BeanDefination 到容器;
- 注册其它 BeanDefination 到容器;
- refresh();
详细点来说, 第一阶段是注册 BeanFactory 和 BeanDefiantionReader, 以及ClassPathBeanDefinationScanner等; 第二阶段是需要结合Bean 的生命周期来讲的, BeanDefinationReader 读取元信息, 将所有的 BeanDefination 放入 BeanDefinationRegistry 中, 并由 BeanPostProcessor 根据元信息做一些修改; 第三阶段 refresh() 则完成了接下来的所有工作, 包括注册 BeanFactoryPostProcessor, BeanPostProcessor, 以及国际化组件, 事件监听器等, 最后再实例化所有的单例Bean, 然后调用 finishRefresh() 发布容器初始化刷新.
BeanFactory 和 ApplicationContext 都可以作为容器, ApplicationContext 是 BeanFactory 的子类, 在前者的基础上, 提供了一些功能上的扩展. 主要区别在于:
- BeanFactory需要手动注册, ApplicationContext 则是自动注册;
- ApplicationContext 支持国际化等组件;
- 两者主要通过编程的方式实现容器创建, 但ApplicationContext也支持声明式的创建, 如 ClassLoader ;
- ApplicationContext会在容器的初始化阶段创建所有的单例Bean, 而BeanFactory要等到使用的时候才第一次创建, 这样BeanFactory会导致一些编程上的失误不能被及时发现;
spring Bean 的生命周期, 简单来说分为四个阶段:
- 实例化;
- 属性赋值;
- 初始化;
- 销毁;
详细来说, Bean的生命周期需要经过以下9个阶段:
- 实例化;
- 属性赋值;
- aware接口检查;
- 前置处理器;
- initing bean;
- init-method;
- 后置处理器;
- disposable;
- destroy-method;
Bean的作用域主要分为:
- 单例;
- 原型;
- request;
- session;
- global-session;
单例Bean会在容器初始化阶段, 创建所有的单例Bean, 而原型Bean则每一次请求的时候, 都会创建一个新的Bean.
因此结合单例和多例来讲Spring Bean 的线程安全才有意义. 对于多例Bean来说, 每次请求, 容器都是创建的新的Bean, 因此不存在线程安全问题.
对于单例Bean来说, 具有线程安全问题. 但这里又需要区分 Bean 是否是有状态的. 有无状态, 是看Bean是否保存了可更改的变量, 若没有, 则成为无状态的Bean. 对于无状态的Bean, 是线程安全的. 对于有状态的Bean则不是线程安全的.
因此在SSM架构中, 对于Controller等Bean来说, 只要不保存变量, 而只是用来做地址映射和后端调用, 则是线程安全的.
基于xml注入Bean的方式有四种:
- setter注入;
- 构造器注入;
- 静态工厂;
- 实例工厂;
我们只需要知道前两者就行了.
结合Bean的注入方式, 再谈谈循环依赖问题. 循环依赖主要分为三类:
- 基于构造器的单例循环依赖;
- 基于setter的单例循环依赖;
- 多例循环依赖;
spring能自己解决的循环依赖只有第二种, 基于setter方式的单例循环依赖.
spring借助三级缓存, 在第二级缓存中, 提前暴露Bean的引用, 完成循环依赖的解决. 实际上解决循环依赖, 两级缓存就够了, 三级缓存的目的, 是为了某些情况下, 需要目标对象的代理对象, 不能直接暴露目标对象.
而对于基于构造器注入方式的单例循环依赖, 可以使用注解 @lazy 的方式, 进行解决.
spring中基于xml的自动装配方式有五种:
- no: 默认的方式是不进行自动装配, 通过手动设置ref属性来进行装配 Bean ;
- byName: 通过Bean的名称进行自动装配, 如果Bean的property与另一个Bean的name相同, 就进行自动装配;
- byType: 通过参数的数据类型进行自动装配;
- constructor: 利用构造函数进行装配, 并且构造函数的参数通过byType进行装配;
- autodetect: 自动探测, 如果有构造方法, 通过 construct的方式进行自动装配, 否则使用 byType的方式自动装配;
基于注解的自动装配, 主要注解有 @Autowired, @Resource, @Inject, 区别:
- @Autowired: 默认通过类型来装配, 若一个类型存在多个相同的, 则通过名称进行装配, 默认必须存在, 否则抛异常, 可以设置 required=false;
- @Resource: 默认是byName, 如果找不到则byType;
spring事务的实现方式是基于对数据库事务的支持, 事务的隔离级别分为五个:
- 默认;
- 读未提交;
- 读已提交;
- 可重复读;
- 串行化;
在MySQL中必须是InnoDB引擎才支持事务, MyIsym不支持事务.
spring 事务实现方式, 分为编程式事务和声明式事务.
编程式事务需要手动的开启事务, 回滚事务, 提交事务, 支持代码块级别的事务.
声明式事务最多只支持方法级别的事务.
声明式事务可以借助注解也可以借助xml来实现.
基于注解的事务, 则是借助 @Transaction注解来实现的. 通过设置 Propogation 的值来决定事务的传播机制, 通过设置 rollbackFor 的值, 来决定事务的回滚时机. propogation的值决定了外部事务对当前事务的影响.
spring 中的设计模式包括但不限于:
- 单例模式: Bean的管理;
- 工厂方法模式: 工厂化的生产Bean;
- 模板方法模式: 将公共代码逻辑抽取, 定义 Template, 由子类继承;
- 策略模式: 对于Resource的实现类, 基于不同的资源采取不同的资源获取策略;
- 桥接模式: 基于配置选择不同的数据源
- 观察者模式: spring 的事件驱动模型, 就用到了观察者模式;
- 适配器模式: AOP中的通知使用到了适配器模式, MVC中也使用到了适配器模式适配Handler
- 代理模式: 基于jdk动态代理和cglib实现的AOP
spring中的事件类型包括:
- 上下文开启事件;
- 上下文刷新事件;
- 上下文暂停事件;
- 上下文结束事件;
- 请求处理事件;
资料来源:
--Spring常见面试题
--https://blog.csdn.net/a745233700/article/details/80959716
------------------------
emh
1.spring是什么 E
2.spring的优点 E
3.IOC的理解 E
4.AOP的理解 H
5.AOP名词概念 H
6.Spring通知类型 H
7.Spring容器的启动流程 H
8.BeanFactory和ApplicationContext H
9.Spring Bean的生命周期 H
10.Spring Bean的作用域 H
11.Spring中Bean是线程安全的吗 E
12.Spring基于xml注入Bean的几种方式 E
13.Spring如何解决循环依赖问题的 H
14.Spring的自动装配 E
15.Spring事务的实现方式和原理 H
16.Spring框架中的设计模式 E
17.SPring框架中有哪些不同类型的事件 H
18.注解的原理 H
2.springMVC
--资料来源:
--https://blog.csdn.net/a745233700/article/details/80963758
-----------------------
1.什么是SpringMVC? 简单介绍一下你对SpringMVC的理解 E
2.SpringMVC的工作流程 E
3.SpringMVC的优点 E
4.SpringMVC怎么设置重定向和转发 E
5.SpringMVC常用的注解 E
6.SpringMVC中的控制器注解一般用哪些? E
7.SpringMVC和structs2的区别 E
8.如何解决POST请求中文乱码问题, Get请求呢? E
9.SpringMVC里面的拦截器是怎么写的 E
10.注解原理 H
11.SpringMVC怎么和AJAX相互调用的? H
12.SpringMVC的异常处理? H
13.SpringMVC的控制器是不是单例模式? 如果是, 有什么问题, 怎么解决? E
14.如果在拦截请求中, 我想拦截get方式 E
15.怎么在方法里面得到Request, 或者Session?
16.如果想在拦截的方法里面得到从前台传入的参数, 怎么得到? E
17.如果前端传入多个参数, 并且参数都是同个对象的, 如何快速得到这个对象? E
18.SpringMVC中函数的返回值是什么? E
19.SpringMVC用什么对象从后台向前台传递数据的? E
20.怎么样把ModelMap里面的数据放入Session里面? E
3.mybatis
--资料来源:
--https://blog.csdn.net/a745233700/article/details/80977133
-----------------------
1、什么是Mybatis? E
2、Mybaits的优缺点 E
3、#{}和${}的区别是什么? E
4、通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? E
5、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复? E
6、Mybatis是如何进行分页的?分页插件的原理是什么? E
7、简述Mybatis的插件运行原理,以及如何编写一个插件。 H
8、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? E
9、Mybatis的一级、二级缓存 E
10、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? H
11、Mybatis动态sql有什么用?执行原理?有哪些动态sql? H
12、Xml映射文件中,除了常见的select|insert|updae|delete标签外,还有哪些标签? E
13、使用MyBatis的mapper接口调用时有哪些要求? H
14、 模糊查询like语句该怎么写? E
15、当实体类中的属性名和表中的字段名不一样 ,怎么办 ? E
16、如何获取自动生成的(主)键值? E
17、在mapper中如何传递多个参数? E
18、 一对一、一对多的关联查询 ? H
19、MyBatis实现一对一有几种方式?具体怎么操作的? H
20、MyBatis实现一对多有几种方式,怎么操作的? H
21、Mapper编写有哪几种方式? E
22、什么是MyBatis的接口绑定?有哪些实现方式? E
23、MyBatis与Hibernate有哪些不同? E
4.其它
ServletContext和ApplicationContext的区别和联系
资料来源: https://blog.csdn.net/u010325193/article/details/84534861
总结:
1. ServletContext是Servlet规范中的概念, 是Servlet用来与容器(tomcat?)间进行交互的接口的组合, 对于应用程序来说,有且只有一个;
2. ApplicationContext是Spring框架中的核心接口, 它维护了应用运行所需的上下文, 通常来说, 在Spring中存在两个context, 一个是root context, 一个是Servlet applicationContext的意思;
3. 在ServletCOntext中存在ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的属性, 由此看出ApplicationContext是ServletContext中的属性值, 由于这个ApplicationContext是全局的应用上下文信息, 在spring中就称之为RootApplicationContext;
4. WebApplicationContext: 这是ApplicationContext的子接口, 在ApplicationContext的基础上, 添加了对ServletContext的应用, 即getServlet方法;
二. SSM基本使用
1. web.xml配置
ssm项目中web.xml配置及相关知识详解
资料来源: https://blog.csdn.net/qq_36638446/article/details/104615923
--------------
基本描述:
1. tomcat读取web.xml, 从中获取spring及springmvc相关配置文件信息, 再根据这些信息依次读取配置文件;
2. 读取spring配置文件, 根据xml配置和注解, 扫描包, 对有必要的Bean进行实例化;
3. 读取springmvc配置文件相关配置;
**web.xml 配置文件范例 **
<!-- 资料来源: https://how2j.cn/k/tmall_ssm/tmall_ssm-1487/1487.html -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- spring的配置文件-->
<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>
<!--中文过滤器-->
<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>
<!-- spring mvc核心:分发servlet -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring mvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2. 配置文件命名及指定规则
根据根据默认命名和自定义命名两种不同方式, 在web.xml中选择不同的方式进行相关配置文件的路径指定. (以spring为示例)
资料来源:
http://www.caotama.com/2001569.html
--------------------------------------------
如果在web.xml中不写任何参数配置信息,默认的路径是 /WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:
context-param
param-name contextConfigLocation /param-name
param-value
/WEB-INF/classes/applicationContext-*.xml
/param-value
/context-param
在 param-value /param-value 里指定相应的xml文件名,如果有多个xml文件,可以写在一起并一 , 号分隔。上面的applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。
applicationContext.xml的文件位置就可以有两种默认实现:
第一种:直接将之放到/WEB-INF下,只在web.xml中声明一个ContextLoaderListener
第二种:将之放到classpath下,但是此时要在web.xml中加入 context-param ,用它来指明你的applicationContext.xml的位置以供web容器来加载
-----------------
3. 常见配置文件说明
版权声明:本文为CSDN博主「蜗牛变涡流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kristabo/article/details/125722366
-----------------
1. applicationContext.xml: Spring下的配置文件:Spring-Config.xml 属于全局配置文件(配置文件名是自定义,作为Spring的核心配置文件,里面包括了:1-用Spring的数据源替换MyBatis的数据源,并且绑定mybatis配置文件以及注册mapper.xml映射器,即Spring整合MyBatis。2-注入sqlSessionFactory
2. mybatis-config.xml在用Spring整合了MyBatis后,其工作大部分已经被取代了(例如数据源的配置),里面的配置内容基本上可以说是空壳,但为了保留SSM的完整痕迹,还是需要将其保留下来,被Spring-config.xml扫描。
3. springmvc.xml: 这也是必不可少的一环。作用包括扫描并管理控制器Controller中的各种bean对象、配置视图解析器等,它是被web.xml读取的。
4. web.xml: 最核心的部分之一,其它配置文件像spring-config.xml以及springmvc.xml都将被它读取,同时它也是被tomcat以及其他类型服务器率先读取并打包部署的必备读取文件。除此之外,还包括配置字符过滤器、拦截器和静态资源的加载等等
5. mapper.xml: 该配置文件是用于编写sql语句的地方,便于pojo与SQL间的映射关系,常见的基本操作包括增删改查等等,一般是在Dao设置了映射接口后,具体的业务实现(sql语句)在mapper.xml中体现
6. mybatis-genneration.xml: 逆向工程就是通过数据库表来自动帮我妈构建相应的pojo类和mapper.xml的,让我们能更加集中在业务代码的编写上。可以说,MyBatis逆向工程是一种“懒人的必备配置”
4. spring配置文件示例
applicationContext.xml
<!-- 资料来源: https://how2j.cn/k/tmall_ssm/tmall_ssm-1487/1487.html -->
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="com.how2java.tmall.service" />
<!-- 导入数据库配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 1" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20" />
</bean>
<!--Mybatis的SessionFactory配置-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="typeAliasesPackage" value="com.how2java.tmall.pojo" />
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--Mybatis的Mapper文件识别-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.how2java.tmall.mapper"/>
</bean>
<!--事务管理-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
5. mybatis配置文件示例
mybatis基本使用和原理, 资料参考: https://how2j.cn/k/mybatis/mybatis-tutorial/1087.html#nowhere
---------------------
基本原理
1.应用程序找mybatis要数据;
2.mybatis从数据库中找来数据;
2.1 通过mybatis-config.xml定位数据库及配置信息(数据源);
2.2 通过Category.xml执行对应的SQL语句;
2.3 基于Category.xml把返回的数据库记录封装在Category对象中;
2.4 把多个Category对象封装在一个Category集合中;
3.返回一个Category集合;
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>
<!-- <environments default="development">-->
<!-- <environment id="development">-->
<!-- <transactionManager type="JDBC"></transactionManager>-->
<!-- <dataSource type="POOLED">-->
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="abc15976582078"/>-->
<!-- </dataSource>-->
<!-- </environment>-->
<!-- </environments>-->
<!-- <mappers>-->
<!-- <mapper resource="UserMapper.xml"/>-->
<!-- </mappers>-->
</configuration>
————————————————
版权声明:本文为CSDN博主「蜗牛变涡流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kristabo/article/details/125722366
6. springmvc配置文件示例
springmvc基本原理过程
springmvc基本使用及原理, 参考: https://how2j.cn/k/springmvc/springmvc-springmvc/615.html
-------------------
1.用户访问/index
2.根据web.xml中的配置,所有的反问都会经过DispatcherServlet;
3.根据配置文件springmvc-servlet.xml,访问路径/index会进入indexController类;
4.在indexController中指定跳转到页面index.jsp,并传递message数据;
5.在index.jsp中显示message信息;
springMVC.xml
<!-- 资料来源: https://how2j.cn/k/tmall_ssm/tmall_ssm-1487/1487.html -->
<?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-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!--启动注解识别-->
<context:annotation-config/>
<context:component-scan base-package="com.how2java.tmall.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<mvc:annotation-driven />
<!--开通静态资源的访问-->
<mvc:default-servlet-handler />
<!-- 视图定位 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 对上传文件的解析-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/fore*"/>
<bean class="com.how2java.tmall.interceptor.LoginInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/fore*"/>
<bean class="com.how2java.tmall.interceptor.OtherInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
7. mybatis逆向配置文件示例
mybatis-generation.xml
<!-- 资料来源: https://how2j.cn/k/tmall_ssm/tmall_ssm-1487/1487.html -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--避免生成重复代码的插件-->
<plugin type="com.how2java.tmall.util.OverIsMergeablePlugin" />
<!--是否在代码中显示注释-->
<commentGenerator>
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/tmall_ssm" userId="root" password="admin">
</jdbcConnection>
<!--不知道做什么用的。。。反正贴上来了~-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成pojo类存放位置-->
<javaModelGenerator targetPackage="com.how2java.tmall.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成xml映射文件存放位置-->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成mapper类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.how2java.tmall.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成对应表及类名-->
<table tableName="category" domainObjectName="Category" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="property" domainObjectName="Property" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="product" domainObjectName="Product" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="productImage" domainObjectName="ProductImage" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="order_" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="propertyValue" domainObjectName="PropertyValue" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="review" domainObjectName="Review" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<table tableName="orderItem" domainObjectName="OrderItem" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
<property name="my.isgen.usekeys" value="true"/>
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
8.过滤器-监听器-拦截器异同及配置详解
参考资料来源: https://blog.csdn.net/Edwin_Hu/article/details/87396981
9.关于spring和springmvc的整合配置文件详解
spirngmvc.xml配置文件示例( 重点注意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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 1.扫描Controller,并将其生命周期纳入Spring管理 -->
<context:annotation-config/>
<context:component-scan base-package="com.how2java.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 2.注解驱动,以使得访问路径与方法的匹配可以通过注解配置 -->
<mvc:annotation-driven />
<!-- 3.静态页面,如html,css,js,images可以访问 -->
<mvc:default-servlet-handler />
<!-- 4.视图定位到/WEB-INF/jsp这个目录下 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
标签:xml,入门,配置文件,--,spring,SSM,面试,Bean,Spring
From: https://www.cnblogs.com/wang-jifeng/p/16783683.html