1. springmvc的工作原理
2. springmvc常用的注解有哪些
@requestMapping 用于请求 url 映射
@RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象
@ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户
3. 如何开启注解处理器和适配器
4. 如何解决get和post乱码问题
post乱码:在web.xml里配置一个characterEncodingFilter过滤器。设置为utf-8
encoding-filter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encoding-filter
/*
get乱码:
修改 tomcat 配置文件添加编码与工程编码一致
另外一种方法对参数进行重新编码
String userName = new String(Request.getParameter("userName").getBytes("ISO8859-1"),"UTF-8");
5. springmvc实现细节
1) mvc:model、view、controller
2)
DispatcherServlet:拦截请求发送给 Spring MVC 控制器
dispatcher
org.springframework.web.servlet.DispatcherServlet
1
dispatcher
/
HandlerMapping:处理映射器
helloController
----------------------------------------
// 因此使用注解配置极大地简化了代码
@RequestMapping(value="/hello")
控制器:后端代码
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
// 处理逻辑
....
// 返回给DipatcherServlet
return mav;
}
视图解析器--相关配置
3) springmvc的web.xml和springmvc.xml配置
web.xml
spring
org.springframework.web.servlet.DispatcherServlet
1
spring
*.do
springmvc.xml
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
1. spring理解
Spring是一个IOC和AOP容器框架
1) 控制反转(IOC),传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者 getInstance 等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用 spring 提供的对象就可以了,这是控制反转的思想。
2) 依赖注入(DI),spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想
3) 面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用CGLIB 方式实现动态代理
2. Spring中的设计模式
1) 单例模式和多例模式
https://blog.csdn.net/zt13258579889/article/details/79558922 作者:云雨寒冰
singleton:对象在整个系统中只有一份,所有的请求都用一个对象来处理,如service和dao层的对象一般是单例的
prototype:对象在整个系统中可以有多个实例,每个请求用一个新的对象来处理,如action。为什么使用多例:防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象的状态改变导致了对象对另一个请求做了错误的处理
package a_helloword.entity;
public class User {
private String id;
private String name;
private String password;
public void destroy(){
System.out.println("我销毁了");
}
public void init(){
//this.name="给不";
System.out.println("已经调用了初始化方法");
}
public String getId() {
return id;
}
public void setId(String 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 password1) {
this.password = password1;
}
}
package a_helloword.test;
import a_helloword.entity.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
@Test
public void fun(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("a_helloword/applicationContext.xml");
User user = (User) ac.getBean("user");
User user1 = (User) ac.getBean("user");
System.out.println(user);
// 单例模式运行结果
// 已经调用了初始化方法
// a_helloword.entity.User@51c8530f
// a_helloword.entity.User@51c8530f
// 多例模式
// 已经调用了初始化方法
// 已经调用了初始化方法
// a_helloword.entity.User@5891e32e
// a_helloword.entity.User@cb0ed20
}
}
2) 模板模式-JDBCTemplate:封装了(获得数据库连接,处理事务,处理异常,关闭资源等通用方法)
https://www.cnblogs.com/caoyc/p/5630622.html 作者:JustDo
JDBCTemplate:
jdbc.properties
mysql数据库
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
spring.xml
测试
//启动IoC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取IoC容器中JdbcTemplate实例
JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
String sql="insert into user (name,deptid) values (?,?)";
int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3});
System.out.println(count);
3. Spring常用的注解
@Required:该注解应用于设值方法
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量
@Qualifier:该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义
4. 简单介绍spring bean的生命周期
1) bean定义:在配置文件
2) 初始化
在配置文件中通过指定 init-method 属性来完成
实现 org.springframwork.beans.factory.InitializingBean 接口
3) 调用
4) 销毁
5. spring结构图
6. spring作用
Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系
Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制
Spring 能非常简单的帮我们管理数据库事务
Spring 还能与第三方数据库访问框架(如 Hibernate、JPA)无缝集成,而且自己也提供了一套 JDBC访问模板,来方便数据库访问
Spring 还能与第三方 Web(如 Struts、JSF)框架无缝集成,而且自己也提供了一套 Spring MVC框架,来方便 web 层搭建
Spring 能方便的与 Java EE(如 Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)
7. 描述spring的事物
https://blog.csdn.net/jiadajing267/article/details/81056057 作者:mandy@i
声明式事务管理的定义:用spring配置文件中声明式事务来代替代码式事务
配置
注解
8. BeanFactory常用的实现类有哪些
9. Spring JDBC、Spring DAO、Spring ORM
Spring-JDBC:提供了 Jdbc 模板类,它移除了连接代码以帮你专注于 SQL 查询和相关参数
Spring-DAO:并非 Spring 的一个模块,它实际上是指示你写 DAO 操作、写好 DAO 操作的一些规范。因此, 对于访问你的数据它既没有提供接口也没有提供实现更没有提供模板
Spring-ORM:是一个囊括了很多持久层技术(JPA,JDO,Hibernate,iBatis)的总括模块
10. spring web模块
https://www.cnblogs.com/davidwang456/p/4443942.html 作者: 一天不进步,就是退步
11. spring配置文件有什么作用
Spring 配置文件是个 XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用
https://www.cnblogs.com/Sunnor/p/5688967.html 作者:Sunor
12. IOC优点
IOC 控制反转:Spring IOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC 容器支持加载服务时的饿汉式初始化和懒加载
13. ApplicationContext的实现类有哪些
ClassPathXmlApplicationContext:此容器也从一个 XML 文件中加载 beans 的定义,这里,你需要正确设置classpath 因为这个容器将在 classpath 里找 bean 配置
WebXmlApplicationContext:此容器加载一个 XML 文件,此文件定义了一个 WEB 应用的所有 bean
14. BeanFactory与ApplicationContext
BeanFactory:基础类型的 IOC 容器,提供完成的 IOC 服务支持。如果没有特殊指定,默认采用延迟初始化策略。相对来说,容器启动初期速度较快,所需资源有限
ApplicationContext:ApplicationContext 是在 BeanFactory 的基础上构建,是相对比较高级的容器实现,除了 BeanFactory 的所有支持外,ApplicationContext 还提供了事件发布、国际化支持等功能。ApplicationContext 管理的对象,在容器启动 后默认全部初始化并且绑定完成
15. 什么是Spring的依赖注入
通常某个类依赖某个类时,使用new的方法调用某个类的实例,但是容易发生并发问题;spring提出依赖注入的思想,则依赖类不用由程序员实例化。通俗的理解是:平常我们 new 一个实例,这个实例的控制权是我们程序员,而控制反转是指 new 实例工作不由我们程序员来做而是交给 spring 容器来做
16. spring注入方式
https://www.cnblogs.com/doudou618/p/4325995.html 作者:骚年轻狂
17. 什么是spring beans
1) Spring beans 是那些形成 Spring 应用的主干的 java 对象。它们被 Spring IOC 容器初始化,装配,和管理。这些 beans 通过容器中配置的元数据创建。比如,以 XML 文件中
2) 定义:一个 Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个 bean,它的生命周期详情及它的依赖
3) 定义类的作用域:scope
18. 内部bean
内部bean:当一个大对象包含一个小对象
19. spring中注入一个java集合
20. 自动装配
定义:无须在spring配置文件描述javabean之间的依赖关系,IOC会自动建立javabean之间的关联关系
装配方式:
constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常
autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式 --spring3.0之后不在支持
21. spring通知
1. Mybatis
1) 定义:MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) 作用:
2. Mybatis中#和$的区别
#相当于对数据 加上 双引号--order by #user_id# --> order by "111" #方式能够很大程度防止 sql 注入
$相当于直接显示数据--order by $user_id$ --> order by 111 $方式无法防止 Sql 注入 $方式一般用于传入数据库对象,例如传入表名
3. Mybatis的编程步骤
调用 session.close()关闭会话
3. JDBC不足之处以及Mybatis如何解决这些问题
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在 SqlMapConfig.xml 中配置数据连接池,使用连接池管理数据库链接
Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离
向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。解决:Mybatis 自动将 java 对象映射至 sql 语句
对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。解决:Mybatis 自动将 sql 执行结果映射至 java 对象
4. 使用Mybatis的mapper接口调用时有哪些要求
Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同
Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同
Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径
5. Mybatis中一级缓存与二级缓存
默认该作用域下所有 select 中的缓存将被 clear
6. Mybatis在insert插入操作时返回主键ID
8. Mybatis-generator(逆向工程)
https://blog.csdn.net/qq_28400629/article/details/98474152
7. SSM:spring、springMVC、Mybatis融合
https://blog.csdn.net/yanmiao0715/article/details/82502694 作者:Roobtyan
https://blog.csdn.net/yanmiao0715/article/details/82562268 (重点)
1. shiro概念图
shiro作用:认证、授权、加密、会话管理、与 Web 集成、缓存等
三大组件:
2. Shiro主要的四个组件
SecurityManager:Shiro 通过它对外提供安全管理的各种服务
Authenticator:涉及用户名和密码,这个组件负责收集principals(身份)和credentials(证明),并将他们提交到应用系统,如果提交的 credentials 跟应用系统中提供的 credentials 吻合,就能够继续访问,否则需要重新提交 principals 和 credentials, 或者直接终止访问。
Authorizer:身份份验证通过后,由这个组件对登录人员进行访问控制的筛查,比如“who can do what”, 或者“who can do which actions”。 Shiro 采用“基于 Realm”的方法,即用户(又称 Subject)、 用户组、角色和permission 的聚合体
session manager:这个组件保证了异构客户端的访问,配置简单。它是基于 POJO/J2SE 的,不跟任何的客户 端或者协议绑定
3. shiro运行原理
Application Code:应用程序代码,就是我们自己的编码,如果在程序中需要进行权限控制,需要调用Subject 的 API
Subject:主体,代表的了当前用户。所有的 Subject 都绑定到 SecurityManager, 与 Subject 的所有交互都会委托给 SecurityManager,可以将 Subject 当成一个门面,而真正执行者是 SecurityManager
SecurityManage:安全管理器,所有与安全有关的操作都会与 SecurityManager 交互,并且它管理所有的 Subject
Realm:域 shiro 是从 Realm 来获取安全数据(用户,角色,权限)。就是说SecurityManager要验证用户身份, 那么它需要从Realm获取相应的用户进行比较以确定用户 身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否 能进行操作; 可以把 Realm 看成 DataSource,即安全数据源
4. shiro的四种权限控制方式
url 级别权限控制
方法注解权限控制
代码级别权限控制
页面标签权限控制
5. 授权实现的流程
1) 粗颗粒和细颗粒
户管理的权限,具有导出订单明细的权限 针对 url 链接的控制
细颗粒:对资源实例的控制称为细颗粒度权限管理,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细 针对数据级别的控制
2) 粗颗粒和细颗粒如何授权
粗颗粒权限:可以使用过虑器统一拦截 url
细颗粒权限:在 service 中控制,在程序级别来控制,个性化编程
6. shiro与SSM
https://www.jianshu.com/p/a956006bceee 作者:司鑫
https://blog.csdn.net/qq_29410905/article/details/80364305 作者:HansScopion
https://www.jianshu.com/p/984ac86f5fc9 作者:TyCoding 重点
这两种技术好像不在流行