SpringMVC+Spring+Mybatis基础知识习题
1.请描述RTTI与反射的区别?
RTTI:在编译的时候可以获取类的所有信息
反射:程序在运行中,通过反射得到这个类的属性和方法,这个类的对象可以动态的获取属性和方法。
2.如何获取class对象
1. 通过 类.class
2. 通过 对象.getclass()
3.通过 class.forname()
3.如何通过反射来创建对象实例?有几种方法
1.newinstance() 创建对象
2. 构造方法创建对象
4.如何通过放射来调用对象的方法?
1.获取class对象 classforname();
2.获取对象实例 newinstance
3.通过反射获取method对象
4.通过method对象的invoke方法调用方法
//获取class对象 Class c1 = Class.forName("edu.etime.reflex.demo1.Animal"); //反射创建类的实例 Animal obj = (Animal) c1.newInstance(); obj.setName("人"); //通过反射获取到method对象 Method m = c1.getMethod("getName"); //通过method对象的invoke方法调用方法 Object o = m.invoke(obj); System.out.println(o); |
5.maven的远程仓库和本地仓库的区别是什么?在根据坐标去寻找组件的时候顺序是怎样的
远程仓库:共享的,需要下载到本地仓库才能使用。
本地仓库:私有的,仅供自己使用。
顺序:首先去本地仓库寻找,如果没有再到远程仓库下载。
6.在mybatis的Ognl表达式中#{}和${}的区别是什么?
#{}:表示一个占位符,防止sql注入,#{}可以接受简单类型值或pojo属性值,如果是简单的类型值,#{}一般能使用#{}就尽量使用#{}括号中可以是value或其它名称。
${}:用于字符串的拼接,不能防止sql语句注入。如果parameterType传输单个简单的类型值,${}括号中只能是value。
7.在mybatis中,parameterType和resultType,resultMap分别来干什么?
parameterType:用来传递指定的参数类型
resultType:用来返回对象指定的类型
resultMap:可以实现将查询的结果映射为复杂类型的pojo
8.在mybatis中selectOne和selectList方法的区别是什么?在使用时有没有需要注意的地方?
selectOne:只能用来查询一条记录
selectList:查询的是一条或多条记录
在使用的时候如果查询多条数据必须使用selectList,否则会报org.apache.ibatis.exceptions.TooManyResultsException:错。
9.请描述mybatis框架的执行顺序:(提示:sqlsessionfactory,sqlsession等组件)?
mybatis配置文件---->sqlSessionFactory---->sqlSession---->Executor----->Mapped Statement--->数据库
10.请描述MyBatis的缓存机制?
每次查询会先从缓存区域中找,如果找不到从数据库查询,查询到的数据写入到缓存。
一级缓存:作用域根据SqlSession为单位划分的。默认是打开的。
sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。
二级缓存:缓存区域根据mapper的namespace划分的。
Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
开启二级缓存:在核心配置文件mybatis-config.xml中加入<setting name="cacheEnabled" value="true"/>
11.如何理解spring框架的IOC和DI?
IOC:其思想是反转资源获取方向。IOC容器主动的将资源推送给它所管理的组件,组件所要做的是选择一种适合的方式来接受资源。
DI:IOC的另一种表现形式,相对于IOC而言,表述更直接。
12.Spring的依赖注入有几种注入方式?
1、属性注入
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值。属性注入是实际应用中最常用的注入方式
<bean id="hello1" class="edu.etime.springdemo.beans.HelloWorld"> <property name="name" value="李四"></property> </bean> |
在上例中:向hello1这个bean的name属性中注入值“李四”
- 构造方法注入
Bean的定义:
package edu.etime.springdemo.beans;
public class Car {
private String brand; private String corp; private Double price; //构造方法 public Car(String brand, String corp, Double price) { this.brand = brand; this.corp = corp; this.price = price; } //无参数构造方法 public Car(){} public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getCorp() { return corp; } public void setCorp(String corp) { this.corp = corp; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } }
|
示例一:
<!-- 使用构造方法注入值 --> <bean id="car" class="edu.etime.springdemo.beans.Car"> <constructor-arg value="Auto"></constructor-arg> <constructor-arg value="中国"></constructor-arg> <constructor-arg value="4"></constructor-arg> </bean> |
注意:在配置文件中的constructor-arg节点的顺序要和构造方法中参数的顺序一致(设置的参数个数与构造方法中的参数数量一致)
13.Spring框架的自动装配有几种方式?在使用时有什么注意事项?
Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式
byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用
14.IOC容器中的bean有几种作用域?分别解释
1.singleton :在springIOC容器中仅存在一个Bean实列,Bean以单例的方式存在
2.prototype:每次调用getBean()时都会返回一个新的实例
3.request:每次http请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
4.session:同一个Http Session共享一个bean,不同的http Session使用不同的bean。
<bean id="address2" class="edu.etime.springdemo2.beans.Address" parent="address1" scope="singleton"> <property name="street" value="林阴街"></property> </bean> |
15.Spring的AOP中,什么时切点,通知,连接点,切面,代理,目标?
AOP简介:面向切面编程,是一种新的方法论,是对传统的OOP(面向对象编程)的补充
AOP的好处:
每个事务逻辑位于一个位置,代码不分散,便于维护和升级。
业务逻辑更加简洁,只包含核心的业务代码。
AOP的术语:
1.切面(Aspect):横切关注点被模块化的特殊对象(加上注解:Aspect的类)
2. 通知(Advice):切面必须要完成的工作(在切面中加注解@Before;@After等方法)
3. 目标(Target):被通知的对象/目标对象(要使这个切面通知类。JoinPoint.getTarget()方法获取)
4.代理(Proxy):向目标对象应用通知之后创建的对象
5.连接点(Joinpoint):程序执行的某个特定位置(可以通知方法的参数JionPoint来获取)
6.切点(pointcut):AOP通过切点定位到特定的连接点。类比:连接点相当于数据库中的记录,切点相当于查询条件,一个切点可以匹配多个连接点。通过切点表达式所匹配到的方法。
16.Spring中Aop的通知有几种类型,分别在什么时候执行?
AspectJ支持5种类型的通知注解:
[email protected]:前置通知,在方法执行之前执行
[email protected]:后置通知,在方法执行之后执行
[email protected]:返回通知,在方法返回结果之后执行
[email protected]:异常通知,在方法抛出异常后通知
[email protected]:环绕通知,围绕着方法执行
17.在Spring框架中,你觉得使用过哪些设计模式?分别在什么地方?
1.简单工厂模式:spring中的BeanFactory就是简单工厂模式
2.单例模式:spring的作用域(Singleton)
3.适配器(Adapter):spring的AOP中,使用Advice来增强代理类的功能。
4.代理模式:spring的proxy模式在aop中有体现
5.观察者(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。spring中Observer模式常用的地方是listener的实现。如ApplicationListener(监听器)。
6.策略模式(Strategy):spring中在实例化对象的时候用到Strategy模式
总的有九种,这里说了六种。
18.Spring框架中的单例Bean是线程安全的么?
不是。
19.请描述spring中的事务,什么是事务的ACID属性?事务的传播行为有哪些?事务的隔离级别有哪些?什么是脏读,幻读,不可重复读?
事务的ACID属性:
原子性:事务一旦提交,要么成功,要么都失败
一致性:事务提交后,数据和资源保持一致
持久性:事务一但完成,将不会改变,即使系统出错
隔离性:一个事务的改变不会影响另一个事务
事务的传播行为:
required:如果有事务在运行,当前方法在这个事务中执行,否则开启新的事务
required_new:必须开启新的事务,如果有事务运行则将挂起
supports:如果有事务在运行,当这个方法在这个事务内运行,否则不运行
never:当前的方法不应该运行在事务中,如果有运行的事务,将抛出
事务的隔离级别:当同一个应用程序或者不同应用程序中多个事务在同一个数据集上并发执行时,可能会出现许多问题
1.脏读:一个事务读取到另一个事务的’脏‘数据
2.不可重复读:一个事务读取一个字段后,然后另一个事务更新了该字段,当再次读取时,值就不同了
3.幻读:一个事务从一个表中读取了一个字段,然后另一个事务在该表中插入新的行。再次读取的时候就会多出几行。
20.请描述springMVC的执行顺序?
21.在springMVC中,返回路径是如何找到视图资源的?如何进行请求转发和重定向?在请求转发和重定向的路径有什么区别?
1.通过RequestMapping注解可以定义不同的处理器映射规则
2.
通过绑定参数完成请求转发和重定向
//请求转发和重定向(使用绑定参数完成)--方法的返回值可以是void //与servelt中的操作 方式一样 @RequestMapping(value="/submit10",method=RequestMethod.POST) public void getparams10(HttpServletRequest request,HttpServletResponse response, GoodsType goodsType) throws ServletException, IOException{ System.out.println(goodsType.toString()); request.setAttribute("aaa", goodsType); //请求转发 //request.getRequestDispatcher("/WEB-INF/jsp/show.jsp").forward(request, response); //重定向 response.sendRedirect(request.getContextPath()+"/index.jsp"); } |
通过返回值完成请求转发和重定向
//请求转发和重定向(通过返回值的形式完成) @RequestMapping(value="/submit11",method=RequestMethod.POST) public String getparams11(Model model,GoodsType goodsType) { System.out.println(goodsType.toString()); model.addAttribute("aaa", goodsType); //请求转发 //return "forward:/WEB-INF/jsp/show.jsp"; //重定向 return "redirect:../index.jsp"; } |
3.返回视图名称和请求转发重定向的区别:
-1.返回视图和请求转发一样,都是在同一个request作用域下。
-2.请求转发是一个servlet将请求转发到另一个servlet--请求转发一次
-3.请求转发和返回试图的区别:请求转发使用了jsp渲染。而返回视图是通过了视图解析器来完成
-4.重定向:告诉客户端-->发起另一个请求。
路径问题:
1.返回视图,会通过视图解析器来加上视图的前缀和后缀。请求转发需要手动编写转发资源路径。
2.同样重定向,那么也需要手动编写完整的重定向路径。redirect:/index.jsp'' :springMVC和serlet的路径不一样。
22.在SpringMVC中,如何上传文件?
- 引用两个包:
Commons-io.jar
Commons-fileupload.jar
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> |
2.在配置文件中增加文件上传bean的配置
<!-- 配置多媒体文件解析器 --> <!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为10MB 1024*1024*10 --> <property name="maxUploadSize"> <value>10485760</value> </property> </bean> |
3.编写上传文件的JSP页面
<form action="${pageContext.request.contextPath}/ajax/upload.do" method="post" enctype="multipart/form-data"> <div>文件名称:<input type="text" name="filename" /></div> <div> <input type="file" name="file" /> <br> <input type="submit" value="上传" /> <c:if test="${!empty(img)}"> <img width="100px" height="100px" src="${pageContext.request.contextPath}/${img}"> </c:if> </div> </form> |
4.编写controller
//页面上传。接收非多媒体文件的属性,和前面获取页面参数的方法一致。 //文件使用参数MultipartFile @RequestMapping("/upload") public String fileupload(String filename,MultipartFile file,HttpServletRequest request) throws IllegalStateException, IOException{ //测试普通输入文本能够获取到。 System.out.println(filename); //获取文件名称(获取的是:文件名.后缀名) String oriName = file.getOriginalFilename(); System.out.println(oriName); //获取文件后缀名 String extName = oriName.substring(oriName.lastIndexOf(".")); System.out.println(extName); //获取文件名称(获取上传到服务器的文件名称和路径) //上传文件的时候,文件名称一般可以使用UUID;或者当前时间的long表示(这种做法不合适大并发的应用) String fileName="files/"+filename+extName; //获取文件上传路径(物理路径) //String uppath=request.getServletContext().getRealPath(fileName); String uppath=request.getServletContext().getRealPath("/")+fileName; System.out.println(uppath); // 保存文件 file.transferTo(new File(uppath)); request.setAttribute("img",fileName); return "forward:/WEB-INF/jsp/fileupload.jsp"; } |
注意:上传文件操作过程中,两个路径是非常重要的。
String fileName :文件在当前项目中的相对路径 ----用于在web应用中读取文件(路径存放到数据库,一般也是存放文件的相对路径)
String uppath: 文件保存的物理路径(绝对路径)----用于文件保存
23.在SpringMVC中如何使用resultFul风格的路径?
1、controller编写
//使用restful风格 @RequestMapping("/t3/{uname}") @ResponseBody public List<SysRole> ajaxtest3(@PathVariable("uname") String uname){ System.out.println(uname); List<SysRole> list = new ArrayList<>(); for(int i=0;i<10;i++){ SysRole role = new SysRole(); role.setRoleid(UUID.randomUUID().toString()); role.setRolename("批量用户"+i); role.setRolestate(1); list.add(role); } return list; } |
2.页面URL路径编写
<script type="text/javascript"> $(function() { $("#btnsave").click(function() { $.ajax({ type : "POST", url : "${pageContext.request.contextPath}/ajax/t3/"+$("#uname").val(), //data : "uname="+$("#uname").val(), dataType:"JSON", success : function(msg) { var obj = $("#role"); var str = ""; for(var i=0;i<msg.length;i++){ str += "<option value='"+msg[i].roleid+"'>"+msg[i].rolename+"</option>"; } obj.html(str); } }); }); }); </script> |
注意:前端控制器的访问路径配置应该配置成:”/”(不会拦截JSP请求);”/*”拦截所有的请求
24.在springMVC中,有几种响应数据到视图的方法?
1.controler返回ModelAndView
/* * 使用moderandview对象响应到试图 */ @RequestMapping("add") public ModelAndView add2(SysUser user){ ModelAndView mav = new ModelAndView(); mav.setViewName("user/show"); mav.addObject("user", user); return mav; } } |
2.绑定参数Model/ModelMap
@Controller @RequestMapping("/user") public class SysuserControler {
@RequestMapping("/toadd") public String toadd(){ return "user/add"; }
@RequestMapping("/add") public String add(SysUser user,Model model){ model.addAttribute("user", user); return "user/show"; } } |
3.绑定方法参数request对象
/* * 使用httpservletRequest响应到视图 */ @RequestMapping("/add") public String add3(SysUser user,HttpServletRequest request){ request.setAttribute("user", user); return "user/show"; } |
使用session和cookie
/* * 使用session */ @RequestMapping("/add") public String add4(SysUser user,HttpSession session){ session.setAttribute("user", user); return "user/show"; } |
/* * 使用cookie */ @RequestMapping(value="/add",method=RequestMethod.POST) public String add5(HttpServletRequest request,HttpServletResponse response,SysUser user){ System.out.println(user.toString()); //获取cookie Cookie[] cookies = request.getCookies(); //写cookies Cookie ck = new Cookie("user",user.getUsername()); response.addCookie(ck); return "user/show"; } |
25.拦截器,AOP,Fillter的区别是什么?
a. Filer过滤器:拦截web访问的url地址
b.拦截器:拦截controller的访问
c.SpringAOP拦截器:只能拦截Spring管理Bean的访问
Filter与Interceptor联系与区别:
a. 拦截器是基于java的反射机制,使用代理模式。而过滤器是基于函数回调
b.拦截器不依赖于servlet容器,过滤器依赖于servlet容器
c.拦截器只能对controller起作用,而过滤器可以对所有的请求起作用
d.拦截器可以访问controller上下文,堆栈里面的对象,而过滤器不可以
e.执行顺序:过滤器-->拦截前-->controller-->拦截后-->过滤后。
26.SpringMVC如何编写AJAX数据接口?
1、增加三个包的引用:
jackson-core.jar
jackson-annotations.jar
jackson-databind.jar
Pom.xml配置如下:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.6</version> </dependency> |
2.如果项目中开启了<mvc:annotation-driven></mvc:annotation-driven>,既开启springMVC的注解模式,则不用其他配置了。
3.配置好后编写controller程序
@RequestMapping("/t2") @ResponseBody public List<SysRole> ajaxtest2(String uname){ List<SysRole> list = new ArrayList<>(); for(int i=0;i<10;i++){ SysRole role = new SysRole(); role.setRoleid(UUID.randomUUID().toString()); role.setRolename("批量用户"+i); role.setRolestate(1); list.add(role); } return list; } |
4.页面URL路径编写
<script type="text/javascript"> $(function() { $("#btnsave").click(function() { $.ajax({ type : "POST", url : "${pageContext.request.contextPath}/ajax/t3/"+$("#uname").val(), //data : "uname="+$("#uname").val(), dataType:"JSON", success : function(msg) { var obj = $("#role"); var str = ""; for(var i=0;i<msg.length;i++){ str += "<option value='"+msg[i].roleid+"'>"+msg[i].rolename+"</option>"; } obj.html(str); } }); }); }); </script> |
27.SpringMVC如何设置controoler方法只能被post提交方式提交?
method=RequestMethod.POST