要求:
掌握Spring框架容器的使用;掌握Spring框架的IOC特性的使用;
掌握Spring框架AOP特性的使用;掌握Spring如何整合JDBC,Hibernate技术;
掌握Spring如何整合Struts2框架;掌握Spring如何进行事务管理
企业级开发要考虑到不断变更
描述SSH在系统中的作用hibernate访问数据库struts2前端控制器(核心) spring整合
对象耗费资源很多时,使用单例模式
Spring更注重程序代码的结构
1.Spring框架的作用和优点相当于一个大的开发平台,"技术组合"SSH(struts2+spring_hibernate)基于Spring再选择其他技术
作用:主要负责技术整合,该框架提供了IOC和AOP机制,基于这些特性整合,可以降低系统组件之间的耦合度,便于系统组件的维护、扩展和替换。在SSH中,主要利用Spring容器管理程序中的Action,DAO等组件。通过容器的IOC特性降低Action和DAO之间的关联,利用AOP进行事务管理等共通部分处理
*2.Spring框架的容器
Spring通过BeanFactory管理和配置bean ,在Spring里,任何的java对象、java组件都被当成bean处理。
BeanFactory创建并负责管理Spring bean的上下文的生命周期。并建立对象之间的依赖性,org.springframework.beans.factory.xml.XmlBeanFactory 是BeanFactory实现类,在XMLBeanFactory中,以xml结构方式描述对象及对象之间的依赖关系。创建BeanFactory实例时,必须提供Spring容器管理bean的详细配置信息,相应的XML文件作为参数传入。
(1)Spring框架的核心是提供了一个容器,该容器类型是BeanFactory或ApplicationContext(BeanFactory的子类),该容器具有以下功能:
a.容器可以创建和销毁组件对象(可以承担起组件工厂的作用,等价于DAOFactory);
b.容器可以采用不同模式创建对象;
c.容器具有IOC机制实现;
d.容器具有AOP机制实现
(2)Spring容器基本应用
1)如何将一个Bean组件(普通java类)交给Spring容器方法:在applicationContext.xml中添加以下定义
2)如何获取Spring容器对象
//实例化容器ApplicationContext ac = new ClassPathXmlApplicationCOntext("/applicationContext.xml");
//利用ac.getBean("标识符")方法获取容器中的Bean对象
3)如何控制对象创建的模式支持singletion(单例)和prototype(原型,非单例的)两种模式;默认情况下为singletion模式。
但是使用单例模式有风险,风险在于多线程并发访问时会有一些状况。
可以通过
//测试对象创建模式--实例化容器;--获取bean;--创建两个对象,判断对象是否相等(不同的模式结果不同,为true,则表明两次获取的是同一个对象,是单例模式);
4)Bean对象的创建时机单例:在容器实例化的时候创建;非单例:在调用getBean()方法时创建;
//测试方法--增加构造方法
//单例模式修改实例化时机在bean中增加lazy-init属性将对象创建工作推迟到getBean()方法。
5)为Bean对象指定初始化和销毁方法可以利用bean元素的init-method属性指定初始化方法,利用destory-method指定销毁方法,指定的初始化方法是在构造方法调用后自动执行。指定的销毁方法是在容器close时触发,而且只适用于singletion模式的组件
//--自定义初始化方法public void myinit(){} --在
//--自定义销毁方法public void mydestory(){}--在
//容器中声明定义Action
//利用spring的IOC机制使用CostDAO组件对象在Action中创建CostDAO属性利用setCostDAO方法接收JDBCCostDAO
*3.Spring框架的IOC特性
(1)IOC概念Inverser of Controller被称为控制反转或反向控制(控制转移)。控制逻辑提取出来(从action中),交给第三方(框架)处理。依赖注入组件定位
所谓的控制指的是对象关系的指定、对象创建、初始化和销毁等逻辑。
IOC指的是将控制逻辑交给第三方框架或容器负责,当两个组件之间的关系发送改变时,只需要修改框架或容器配置即可。
IOC主要解决的是两个组件对象调用问题。可以以低耦合方式建立使用关系。
(2)DI概念:Dependency Injection依赖注入。Spring框架采用DI技术实现了IOC控制思想。Spring提供了两种形式的注入方法:
a.setter方式注入依靠的set方法,将组件对象传入--首先添加属性变量和setter方法--在
//新建HibernateCostDAO extends CostDAO //将其交给spring容器
组件转换时,只需要修改配置即可;
b.构造方式注入依靠构造方法,将组件对象传入
private CostDAO costDao; 构造方法public DeleteAction(CostDAO costDao){this.costDao = costDao}
4.Spring各种类型数据的注入:Spring可以为对象注入以下类型的数据将各种组件(Bean)纳入到Spring的管理
(1)Bean对象注入 (2)基本类型数据的注入:eg:字符串数字等 (3)集合数据的注入:List,Set,Map,properties list集合: set集合: map集合: properties集合: 5.AOP概念 (1)概念:Aspect Oriented Programming 面向方面编程OOP是面向对象编程,AOP是以OOP为基础。OOP主要关注的是对象,如何抽象和封装对象。AOP主要关注的是方面,方面组件可以以低耦合的方式切入到其他某一批目标对象方法。AOP 主要是解决共通处理和目标组件之间解耦问题。 //增加一个记录操作日志的功能目标作用在action或dao 上面 (2)AOP相关概念: *a.方面(Aspect 切面) 封装了共通处理的功能组件,该组件可以作用到某一批目标(多个目标对象)组件的方法上。 *b.切入点(PointCut) 用于指定目标组件的表达式。指的是方面组件和哪一批目标组件方法有关系。 c.连接点(JoinPoint) 切入点是连接点的集合。指的是方面组件和具体哪一个目标组件的方法有关系(作用的位置)。 *d.通知(Advice) 用于指定方面组件和目标组件方法之间的作用时机。eg:先执行方面组件再执行目标方法,或先执行目标方法再执行方面组件。 e.目标(Target) 利用切入点指定的组件和方法 f.动态代理(AutoProxy) Spring采用了动态代理技术实现了AOP机制。当使用AOP之后,从容器getBean()获取的目标组件,返回的是一个动态生成的代理类。然后,通过代理类执行业务方法,代理类负责调用方面组件功能和原目标组件功能。目标对象有接口采用JDK代理,没有接口采用CGLIB代理. Spring提供了下面两种动态代理技术实现: --采用CGLIB技术实现:目标组件没有接口采用此方法public class 代理类extends 原目标类型{} CostAction costAction = new 代理类(); --采用JDK Proxy API实现:目标对象有接口采用此方法public class 代理类implements 原目标接口{} CostDAO AOP CostAction<---getBean<---CostAction<---loggerBean 代理类<--| ^| |____________________| (3)实例 //配置切面id属性ref用于关联切面的bean (4)通知类型 a.前置通知 b.后置通知 c.最终通知 *d.异常通知 e.环绕通知 (5)5种通知在内部调用时的顺序: try{ 前置通知执行时机 环绕前置处理 执行目标对象方法 环绕后置处理 后置通知执行时机 }catch(Exception e){ 异常通知执行时机 }finally{ 调用最终通知 } (6)切入点:用于指定目标组件和方法。Spring提供了多种表达式写法以下表达式可以利用&& ||运算符连接使用 a.方法限定表达式指定哪些方法启用方面组件。execution(修饰符? 返回类型方法名(参数列表) throws 异常?); 修饰符和throws可有可无 eg:1)execution(public * *(..)) //参数没有要求使用".." 方法名和返回类型不做要求时使用"*"号//匹配容器中所有public修饰的方法 2)execution(* set*(..))//返回类型不要求方法名以set开头 3)execution(* org.tarena.dao.*.*(..)) //返回类型不要求匹配包名下的所有类所有方法 4)exection(* org.tarena.dao..*.*(..))//匹配dao包及其子包中所有类所有方法 *b类型限定表达式指定哪些类型的组件所有方法启用方面组件within(类型) eg:1)within(com.xyz.service.*) //匹配service包下的所有类所有方法包名.* 2)within(com.xyz.service..*)//匹配service包及其子包中所有类所有方法 c.Bean名称限定按 1)bean(costDAO)//匹配id=costDAO的bean对象 2)bean(*DAO)//匹配所有id值以DAO结尾的bean对象 d.args参数限定表达式按方法参数类型限定匹配 1)args(java.io.Serializable) //匹配方法只有一个参数并且类型符合Serializable的方法public void f1(String s) (7)采用AOP添加操作日志功能 (8)利用AOP实现异常处理将异常信息写入文件 方面:将异常写入文件 切入点:作用到所有action业务方法上面within(action..*) 通知:异常通知 (9)log4j日志记录工具用于日志信息的输出,可以是调试信息跟踪信息异常信息。可以将信息分级别,按照不同方式和格式输出。 1)log4j主要有三部分组件构成通过以下三部分生成不同的日志信息 a.日志器(Logger) 负责消息输出,提供了各种不同级别的输出方法。 b.输出器(appender) 负责控制消息输出的方式,eg:输出到控制台、文件输出等。 c.布局器(layout) 负责控制消息的输出格式。级别-消息内容 2)使用方法a.引入log4j.jar b.在src下添加log4j.properties(定义了消息输出级别、采用哪种输出器、布局器) c.java 代码中利用日志器不同的方法输出消息 #level log4j.rootLogger=debug,myconsole #appender log4j.appender.myconsole=org.apache.log4j.ConsoleAppender #layout https://www.wendangku.net/doc/3b16584217.html,yout=org.apache.log4j.SimpleLayout 6.Spring注解配置(注解是特殊的标识符) 注解技术从JDK5.0推出,之后很多框架开始提供注解配置形式。注解只能用在类定义前、方法定义前、变量前。Spring 框架从2.5版本开始支持注解配置。注解配置的优点是简单、快捷。 (1)组件扫描功能 Spring可以按指定的包路径扫描内部的组件,当发现组件类定义之前有以下的注解标记,会将该组件纳入Spring容器中。 a.@Component 其他组件AOP b.@Controller Action组件调用Service的某个方法 c.@Service Service组件封装原有action中的具体逻辑,调用若干DAO d.@Repository DAO组件 组件扫描使用方法如下: a.在applicationContext.xml中开启组件扫描配置 上述标记将组件扫描到容器后,id属性默认是类名首字母小写。如果需要自定义id值,可以使用@Repository("自定义id值") 默认采用singletion模式创建Bean对象,如果需要改变,可以使用@Scope("prototype")定义。@PostConstruct //等价于init-method属性定义。@PreDestroy //等价于destory-method @Resource|| @Autowired //等价于将costDao注入两者都可以按类型匹配注入@Resource(name="hibernateCostDAO")//指定将某一个名称的bean对象按照name注入 (2)如果容器中两个Bean对象之间具有注入关系,可以采用下面注解标记: a.@Resource 默认按类型匹配注入,需要指定名称可以使用@Resource(name="需要注入的bean对象id值") 使用时可以省略set方法和构造方法; b.@Autowired 默认按类型匹配注入,需指定名称注入使用下面格式@Autowired @Qualifier("注入的bean对象id值") (3)AOP注解 a.在applicationContext.xml中启用AOP注解 b.在组件中使用下面注解标记 --先使用@Component将组件扫描到Spring容器;--使用@Aspect将组件定义为方面组件; --定义一个空方法,在方法前使用@Pointcut定义切入点表达式; --在方面组件的处理方法前使用@Around,@Before,@AfterReturning,@AfterThrowing,@After 7.Spring对数据访问技术的支持 (2)Spring提供了编写DAO的支持类 DaoSupport类提供了获取Template对象的方法JdbcDaoSupport(父类,自身写的dao继承该类),HibernateDaoSupport Template类JdbcTemplate HibernateTemplate (3)Spring提供了声明式事务管理方法(基于AOP配置实现) 8.Spring框架如何使用JDBC技术 (1)新建一个工程,引入Spring开发包和配置文件(applicationContext.xml) (2)引入JDBC技术相关的开发包(驱动包) (3)根据要操作的表,编写对应的实体类 (4)编写DAO接口和实现类(实现类继承DaoSupport,使用其提供的Template对象实现增删改查操作) dbcCostDAO extends JdbcDaoSupport implements CostDAO //编写类CostRowMapper implements RowMapper将一条记录转换成一个Cost对象 public Object mapRow(Result rs,int index) //rs结果集index当前记录的索引object返回实体对象 update():实现增删改 query():实现查询多行记录 queryForObject(sql,id,mapper)//只针对查询结果为1行的实现查询单行记录 queryForInt():实现查询单个int值//返回记录数 (5)将DAO组件交给Spring容器,进行相关配置配置文件中 --定义DAO组件的 --dataSource对象采用一个连接池构建(dbcp连接池),先引入dbcp连接池开发包,再定义dataSource对象的 连接池组件中管理的单元就是我们之前使用的Connection对象,在连接池中可以管理Connection对象的创建和销毁,除此之外,连接池还可以控制和管理Connection对象的初始数量、最大数量,以及根据请求情况,连接数量的自动增减。 9.Spring框架如何使用Hibernate技术 (1)新建一个工程,引入Spring开发包和配置文件(applicationContext.xml) (2)引入Hibernate相关的开发包(hibernate开发包+驱动) (3)编写实体类和hbm.xml映射描述文件 (4)编写DAO接口和实现类(实现类继承HibernateDaoSupport,利用DaoSupport提供的HibernateTemplate实现增删改查) (5)将DAO组件交给Spring容器管理 DAO组件配置时采用下面注入关系: DAO<--注入SessionFactory对象<--注入DataSource对象(dbcp连接池) 10.Spring+Hibernate 如何使用Session、Query等对象 (1)利用DaoSupport提供的getSession()方法。 Session session = getSession();//获取session //利用session操作 session.close();//释放session (2)利用HibernateTemplate的execute()方法,以回调函数方式使用 getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { // 使用session对象 String hql = "from Cost"; Query query = session.createQuery(hql); int begin = (page - 1) * rowsPerPage; query.setFirstResult(begin);// 设置抓取记录起点 query.setMaxResults(rowsPerPage); return query.list(); } }); (3)注解方式扫描到Spring容器 //使用组件扫描 //注入连接参数 11.Spring框架和Struts2整合应用 (1)将Action、DAO等组件交给Spring容器 (2)引入Struts2和Spring整合的开发包struts-spring-plugin.jar包 (当struts请求过来时,Action对象将交给整合包去Spring容器获取) (3)修改struts.xml中的 (4)web.xml中添加ContextLoaderListener组件配置(可以在启动服务器时,实例化Spring容器对象) //引入jar包配置web.xml(启动服务器后,该文件中的对象都会被创建)前端控制器struts.xml //编写Action //将action交给spring容器applicationContext.xml //引入一个新的jar包用来整合Sping和Struts --struts提供的 利用引入的struts-spring-plugin.jar去Spring容器寻找Bean对象利用class属性当作id值去Spring容器获取 //Spring提供的整合MVC的组件在web.xml中配置 //在服务器启动时,实例化该Spring容器对象 //指定Spring配置文件位置和名称 12.采用SSH结构重构资费管理模块 追加以下步骤: 原功能采用Struts2+Hibernate结构利用OpenSessionInViewInterceptor (1)引入Spring开发包和配置文件 ------------重构Spring+Hibernate---------------- (2)编写DAO组件,采用Spring+Hibernate方式实现 (3)在Spring容器中定义组件 使用注解方式 ——-将DAO扫描到Spring容器 将SessionFactory给DAO注入 -----引入DBCP开发包,定义DataSource (4)测试DAO组件 ---重构Spring+Struts2------ (5)将Action定义到Spring容器如果使用了DAO 采用注入方式使用 (6)引入struts-spring-plugin.jar包 (7)修改Action的struts配置将class属性修改为容器中Action组件的id值 (8)在web.xml中配置ContextLoaderListener配置,实例化Spring容器 (9)测试SSH (10)为了支持Hibernate延迟加载的使用,在web.xml中可以配置Spring提供的OpenSessionInViewFilter。将Session关闭推迟到jsp解析之后。 (该Filter需要在Struts控制器Filter之前配置才能生效) --注意1:Spring容器中SessionFactory组件的id值必须为sessionFactory --注意2:默认将session操作置成realOnly状态,需要添加AOP事务才能执行增删改 13.Spring事务管理 Spring提供了以下两种方式管理事务 (1)声明式事务管理(基于配置方式实现事务控制) a.注解事务配置 --定义HibernateTransactionManager事务管理Bean组件 --开启事务的注解配置 --业务组件和方法中使用@Transactional注解即可如果将Action当作目标,需要在 (2)编程式事务管理(基于java编程实现事务控制) 主要是利用transactionTemplate.execute()方法以回调方式将多个操作封装在一个事务中 服务器启动实例化Spring容器() 客户端发送请求--容器中的action 调用处理返回 Struts-->ObjectFactory-->StrutsObjectFactory struts-spring-plugin.jar StrutsSpringObjectFactory struts-plugin.xml try{ Object action = ac.getBean(class属性); }catch(){ //利用反射机制生成Action Class class = Class.forName(class属性); Object action = class.newInstance(); //访问容器将容器中id名与action中属性匹配的Bean对象注入。 注入规则:默认是名称匹配,即属性名和id值一致才可以。 如果添加了@Resource,可以按类型匹配注入 } ***********************Spring MVC************************** (1)了解Spring MVC体系结构 控制器:DispatcherServlet -------struts中的filter Controller -------struts中的action 映射处理器:HandlerMapping ------struts中的ActionMapper 模型和视图组件:ModelAndView ------struts中的result 需要传递和显示的数据和视图名 视图解析器:ViewResolver 视图:JSP (2)了解Spring MVC工作流程 a.客户端发送请求,请求到达DispatcherServlet主控制器; b.DispatcherServlet控制器调用HandlerMapping处理; c.HandlerMapping维护请求和Controller组件对应关系,根据请求调用对应的Controller组件处理; d.执行Controller组件的业务处理方法,需要访问数据库可以调用DAO等组件; e.Controller业务方法处理完毕后,会返回一个ModelAndView对象,该组件封装了模型数据和视图标识; f.Servlet主控制器调用ViewResolver组件处理ModelAndView信息处理,定位视图资源,生成视图响应信息; g.控制器将响应信息为客户端输出 (3)入门示例 a.基于xml配置 toLogin.do -->ToLoginController -->login.jsp login.do -->LoginController -->login.jsp(失败)/ok.jsp(成功) //新建工程引入Spring开发框架(ioc+spring-webmvc.jar包) applicationContext.xml配置文件 //新建WEB-INF/jsp/login.jsp //web.xml定义 //编写一个ToLoginController implements Controller 实现默认执行的业务处理方法,调用jsp new一个对象 指定视图名称ModelInView mv = new ...("login") //配置文件中定义tologinController 定义HandlerMapping及属性定义请求及视图解析器组件及属性注入 b.注解配置 --HandlerMapping组件选用AnnotationMethodHandlerAdapter,该组件支持@RequestMapping注解的使用。value属性指定请求,method指定请求提交方式。 --使用组件扫描,在Controller组件中使用@Controller注解,将组件扫描到Spring容器。 Controller中业务方法可以定义成以下格式: public String f1(); public ModelAndView f1(); public String f1( HttpServeltRequest request) public String f1( HttpServeltRequest request, HttpServletResponse response) public String f1(User user); public String f1(Model model); public String f1(User user, Model model); //新建工程引入Spring开发框架(ioc+spring-webmvc.jar包) applicationContext.xml配置文件 //web.xml定义 //applicationContext.xml配置文件 //开启组件扫描 //定义视图解析器 //定义映射处理器 //编写一个ToLoginController //业务方法前增加注解标记@RequestMapping(value="/toLogin.do",method=RequestMethod.GET) public String execute(){return "login"} //Model往外界传值 //定义实体类封装表单public String login(User user,Model model){} 1.采用SSH重构原项目部分功能资费管理账务账号 重构步骤 (1)了解原功能的处理流程/cost/add.action-->AddCostAction.execute-->CostDAO.save--->list.action (2)重构CostDAO组件(Spring+Hibernate) --追加Spring开发包和配置文件--追加Cost类(已存在)和Cost.hbm.xml(加载该文件)---基于HibernateDaoSupport和HibernateTemplate编写CostDAO实现组件---测试DAO组件 (3)CostDAO的Spring配置--将CostDAO扫描到Spring容器---将容器中dataSource--->sessionFactory--->DAO组件 (4)修改AddCostAction --将Action扫描到Spring容器---采用注入方法使用DAO组件对象---在业务方法上定义@Transactional事务注解(配置中要打开) (5)修改AddCostAction的Struts配置--将class属性改成与扫描到Spring容器后的Action组件id的值 (6)检查共通的操作是否完成--是否引入struts-spring-plugin.jar---是否在web.xml中添加ContextLoaderListener --是否开启了组件扫描配置--是否开启了注解事务配置---是否配置dataSource,sessionFactory 2.项目权限控制 1)基础数据的维护管理员角色信息维护权限操作信息维护 2)权限操作的检查当用户登录系统后,进行任何一个操作之前,都要判断该操作URI是否具有权限,如果没有在分配的操作列表中,拦截器操作提示错误,如果分配权限,就允许继续执行; //检查是否登录,未登录定位到登录页面return "login" SessionValidateInterceptor.java //获取当前请求的URI //根据登录用户信息,获取他可以执行的操作列表此处从session获取即可 //检查当前请求的URI是否在获取的操作列表中存在,如果不存在,定位到没有权限页面return "nopower" //如果通过以上步骤,表明有操作权限,继续执行请求操作。in.invoke(); 3.数据库PL/SQL任务 数据库端PL/SQL主要完成以下三个任务: (1)触发器当DMS系统采集的数据插入到service_detail表时,会自动触发该触发器。根据采集过来的数据和业务收费标准,计算本次使用应该花费的费用COST字段值。 (2)存储过程更新业务资费在业务账号更新时,将更新的记录保存到service_update_detail表 该存储过程主要负责将表中的记录同步到Service表(每月底生成账单后,自动完成) (3)存储过程(用来生成账单) 根据DMS采集过来的service_detail_zdl中的数据进行分析统计生成帐单管理表 帐单信息表bill 帐单明细bill_item ----------- 触发器是自动触发 存储过程需要定时调度时间是每月月底24:00 面临问题: --Hibernate如何调用存储过程; --如何定时的调度java程序(采用Quartz组件,quartz-spring.zip) ProcedureBean //先生成帐单,再更新业务资费 private SessionFactory sf; public void execute(){ Session session = sf.openSession(); query.execute(); //继续调用 } 4.实现账单管理bill bill_item 负责账单查询和明细查看 包含三个界面: 账单搜索查看用户的账单信息 //数据分析和统计:页面出现的所有数据项 身份证account 账务账号account 姓名account 日期bill 账单ID bill 费用bill 支付方式bill 支付状态bill //寻找数据源所属的表-------------SQL------------ select b.id,a.real_name,a.idcard_no,a.login_name,b.cost,b.bill_month,b.payment_mode,b.pay_state from bill b,account a where b.account_id = a.id //根据条件项拼写查询条件 //重写一个实体类封装上面的字段BillLine ---HQL-------- //建立bill和account的单表映射 select b.id,a.real_name,a.idcard_no,a.login_name,b.cost,b.bill_month,b.payment_mode,b.pay_state from bill b,account a where b.account_id = a.id //无关联映射 select b.id,a.realName,a.idcardNo,a.loginName,b.cost,b.billMonth,b.paymentMode,b.payState from Bill b,Account a where b.account_id=a.id; //根据用户输入拼接查询条件 //有关联映射(关联条件不用写) bill-->account(many-to-one) 建立bill-->account(many-to-one)关系映射 (1)select ... from Bill b join b.account a where拼接条件 (2)select b.id,b.account.real_name,b.account.idcard_no,b.account.login_name,b.cost, b.bill_month,b.payment_mode,b.pay_state from Bill b (3)select .. from Bill b where 拼接条件(返回List (4)List 分页查询语句如果有join fetch会按假分页的形式获取 --假分页:当使用了join fetch语句后,再使用hibernate分页查询时,属于假分页机制实现。实际采用的可滚动ResultSet游标实现的数据抓取。 --真分页:select * from bill limit ?,? --假分页:select * from bill返回大量数据, 账单明细查看某个账单各项业务的消费情况 //数据项分析账单ID 账单明细ID OS账号服务器IP 服务账号ID 时长费用资费名 select s.id,bi.bill_id,bi.item_id,s.os_username,s.unix_host,s.account_id,sum (sd.duration),bi.cost,https://www.wendangku.net/doc/3b16584217.html, from BillItem bi, Service s,Cost c, Service_detail sd where bi.service_id = s.id and s.cost_id = c.id and s.id = sd.service_id group by s.id,bi.bill_id,bi.item_id,s.os_username,s.unix_host,s.account_id,bi.cost,https://www.wendangku.net/doc/3b16584217.html, 分组函数使用规则:如果select后面出现单个字段+分组函数,必须追加group by子句,然后将单个字段放在grout by后面业务明细查看某个业务具体的消费情况Service_detail 客户登录IP 登入时刻登出时刻时长(秒) 费用资费名 select sd.client_host,sd.login_time,sd.logout_time,sd.duration,sd.cost,https://www.wendangku.net/doc/3b16584217.html, from service_detail sd, cost c ,service s where sd.service_id = s.id and s.cost_id = c.id and sd.service_id=? and tochar(sd.logout_time,'YYYYMM')=? 由于上述SQL使用ORACLE特有函数,因此不能转成HQL,直接使用SQLQuery执行查询 5.实现报表 了解页面需求情况列出解决问题的关键点 用户量特别多时,服务器启动时使用缓存 Springmvc框架配置步骤 小弟是个新手,有不对的地方请tell me,一起研究探讨。谢谢。 1062140832@https://www.wendangku.net/doc/3b16584217.html, 配置springmvc框架其实不是很难,要现有一个总体的认识,确定要分几步,每一步主要是干什么,不要太盲目。 以为web.xml是项目的入口,所以所有的配置文件,都必须引入到wem.xml中,不然,配置了等于没用。所以,要先从入口入手。 配置web.xml 1、首先引入springmvc-servlet.xml文件 一、前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。 官方的下载网址是:https://www.wendangku.net/doc/3b16584217.html,/download(本文使用是的Spring 3.0.5版本) Struts2也是比较优秀的MVC构架,优点非常多比如良好的结构。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降。Struts2的多层拦截器、多实例action性能都很好。可以参考我写的一篇关于Spring MVC与Struts2与Servlet比较的文章https://www.wendangku.net/doc/3b16584217.html,/admin/blogs/698217 Spring3 MVC的优点: 1、Spring3 MVC的学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。 2、Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分) 3、Spring3 MVC的灵活是你无法想像的,Spring的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。 Struts2的众多优点:略... (呵呵,是不是不公平?) 众多文章开篇时总要吹些牛,吸引一下读者的眼球,把读者的胃口调起来,这样大家才有兴趣接着往后看。本文也没能例外。不过保证你看了之后不会后悔定有收获。 Spring mvc架构及执行流程一、请求处理流程图 二、执行流程说明 三、组件说明 说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc 的三大组件。 需要用户编写的组件有handler、view 四、Spring MVC配置 1、组件扫描器:使用组件扫描器省去在spring容器配置每个controller类,使用 2、RequestMappingHandlerMapping:注解处理器映射器,对类中标记@RequestMapping 的方法进行映射,根据RequestMapping定义的url匹配RequestMapping标记的方 法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装 注解描述: @RequestMapping:定义请求url到处理器功能方法的映射 3、RequestMappingHandlerAdapter:注解式处理器适配器,对标记@RequestMapping 的方法进行适配。 从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用 4、 牧涛 --<-<-<@态度决定一切→_→。。。 ?博客园 ?首页 ?新闻 ?新随笔 ?联系 ?管理 ?订阅 随笔- 171 文章- 3 评论- 79 spring MVC配置详解 现在主流的Web MVC框架除了Struts这个主力外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。 一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib -nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、a ntlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.G A.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar 包 SpringMVC是一个基于DispatcherServlet(分发器)的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。 DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherSe rvlet的,那么我们先来配置一下DispatcherServlet,好让它能够管理我们希望它管理的内容。HttpServlet是在web.xml文件中声明的。 SpringMVC配置的基本步骤
SpringMVC深入总结
2.Spring-mvc框架结构及执行流程
spring MVC配置详解