一、详述spring框架在SSM中起到的作用?
1、因为Spring使用了以下机制,通过容器控制所有Action对象和业务逻辑类的生命周期,由与上层不再控制下层的生命周期,层与层之间实现了完全脱耦,使程序运行起来效率更高,维护起来也方便。
(1)、IOC(inversion of control) 控制反转模式:控制反转是将组件间的依赖关系从程序内部提到外部来管理,由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。
(2)、DI(dependency injection)依赖注入是指将组件的依赖通过外部以参数或其他形式注入;即组件之间的依赖关系由容器在运行期决定,由容器动态的将某种依赖关系注入到组件之中。
2、spring封装了所有对事务处理的功能,包括异常时事务回滚,操作成功时数据提交等复杂业务功能。通过AOP机制(面向切面编程)管理事务,避免了每次对数据操作都要现获得Session实例来启动、提交、回滚事务,以及繁琐的try/Catch操作,通过该机制,一方面使业务逻辑更清晰,专业分工更加容易进行,另一方面降低了程序的耦合性,做低侵入式的开发。也使我们可以在不同的应用中将各个切面结合起来使用,大大节省了代码量,提高代码的重用性。
二、springMVC的工作流程:
用一张图说明,从1到11.
三、spring的配置文件中主要有哪些内容?
1、配置数据源,数据库连接池(加载数据库属性文件)
2、配置Mapper扫描器(配置扫描Dao接口包)
3、配置事务管理器(配置传播行为)
4、配置切面
5、配置文件解析器
6、配置全局异常(运行时异常)
7、配置视图解析器
8、配置扫描业务层注解
9、静态资源访问的配置
四、spring有哪些注解,作用是什么?
1、@Controller 用于标记在一个类头上,表示该类是一个Controller对象
2、@RequestMapping是一个处理请求地址映射的注解,用在类或者方法上,表示响应以该路径作为父路径。
3、@Resource和@Autowired一起来介绍,他们有许多共通之处,也有细微的差别。
(1)相同点,都可以为类的属性,构造器,方法注值。均可标注在字段或者属性setter方法上。
(2),不同点是:@Autowired注解要去寻找的是一个Bean,如果属性找不到,不想让Spring容器抛出异常,就将@Autowired注解的required属性设置为false即可,它是spring的注解。@Resource是j2ee的注解,默认按照byName进行bean匹配。实例:
@Resource(name="tiger",type="Monkey.class")
!!!如果实现类有多个,此时可以在@Autowired注解下使用@Qualifier注解来指定bean的名字。或者使用@Resource,比如ICar中有多个实现类(bmwCar,accCar),我们可以这样指定。
@Autowired @Qualifier("bmwCar") private ICar car;
4、@RequestParam用于将请求参数区数据映射到功能处理方法的参数上。
5、@ResponseBody用于返回不经过视图解析器,不是页面,而是其他格式的数据。
6、@RestController:为了避免重复的写@RequestMapping与@ResponseBod,在类上添加,与@Controller类似,只为服务于JSON,XML或其它自定义的类型内容。
7、@Service标注业务层组件。
五、什么是AOP,为什么要用AOP?
是面向切面编程,通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
六、springMVC是如何处理返回值的?
1、返回jsp的,经过视图解析器,跳转对应的页面。或者新建ModelAndView
2、返回json对象或者其他对象,在方法上加@RequestBody或者在该类上加@RestController,这样就不经过视图解析器。
七、springMVC如何操作session?
可以用HttpSession参数保存session数据。实例:
// 视图,官方推荐,这种可以把得到的list等带到前台,用el表达式表现出来,跟上面的差不多。 @RequestMapping("/model/{s}") // rest风格:数据量不大,不需要安全性。 public ModelAndView q(HttpServletRequest req, @PathVariable String s) { HttpSession session = req.getSession(); session.setAttribute("a", "aaa"); ModelAndView m = new ModelAndView(); // m.addObject("a","张22三");//可以把参数带到前台 m.setViewName("index");// 设置名字进入视图解析器 return m; }
八、mybities如何实现手动映射?
在mapping.xml中通过ResultMap自定义映射,在对应的sql中映射输出为ResultMap,要是只输出一个类或者字段,可以用resultType属性。
<resultMap type="RegRum" id="reg"> //调用时用的名字,唯一性 <id property="patientid" column="patientid" /> //主键用id <result property="patientname" column="patientname"></result> <result property="sex" column="sex" /> <result property="cardtype" column="cardtype" /> <result property="cardid" column="cardid" /> <result property="socalnum" column="socalnum" /> <result property="phone" column="phone" /> <result property="age" column="age" /> <result property="position" column="position" /> <result property="status" column="status" /> <result property="remark" column="remark" /> <result property="date" column="date" /> <association javaType="Doctor" property="doctor"> //连表 <id property="doctorid" column="doctorid"></id> //连表主键 <result property="dname" column="dname"></result> <result property="subroomname" column="subroomname"> </result> </association> </resultMap>
九、在ssm框架中,如何使用二级缓存?分三步操作:
1、在全局配置文件中加入如下代码:即有标签里面
<!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/>
2、在需要开启二级缓存的mapping.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.jiankang.dao.UserDao"> <cache></cache>
3、在需要二级缓存的sql语句标签上添加
useCache="true"。 <select id="login" resultType="User" useCache="true"> select * from user where username=#{username} </select>