文档库 最新最全的文档下载
当前位置:文档库 › java学习笔记_spring

java学习笔记_spring

java学习笔记_spring
java学习笔记_spring

要求:

掌握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模式。

但是使用单例模式有风险,风险在于多线程并发访问时会有一些状况。

可以通过的scope属性修改;以后在web程序中通过扩展可以使用request(表示bean对象生命周期和request生命周期相同),session等值

//测试对象创建模式--实例化容器;--获取bean;--创建两个对象,判断对象是否相等(不同的模式结果不同,为true,则表明两次获取的是同一个对象,是单例模式);

4)Bean对象的创建时机单例:在容器实例化的时候创建;非单例:在调用getBean()方法时创建;

//测试方法--增加构造方法

//单例模式修改实例化时机在bean中增加lazy-init属性将对象创建工作推迟到getBean()方法。 也可在中使用控制所有单例模式的创建时机

5)为Bean对象指定初始化和销毁方法可以利用bean元素的init-method属性指定初始化方法,利用destory-method指定销毁方法,指定的初始化方法是在构造方法调用后自动执行。指定的销毁方法是在容器close时触发,而且只适用于singletion模式的组件

//--自定义初始化方法public void myinit(){} --在的init-method属性指定该方法名

//--自定义销毁方法public void mydestory(){}--在的destory-method属性指定该方法名 销毁容器时(ac.close())触发该方法

//容器中声明定义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容器

多个属性时可以设置多个property

组件转换时,只需要修改配置即可;

b.构造方式注入依靠构造方法,将组件对象传入

private CostDAO costDao; 构造方法public DeleteAction(CostDAO costDao){this.costDao = costDao}

//index表示参数的索引,0表示第一个多个参数时继续添加--在需要注入的组件中,添加带参数的构造方法--在该组件的定义中,使用下面格式描述

4.Spring各种类型数据的注入:Spring可以为对象注入以下类型的数据将各种组件(Bean)纳入到Spring的管理

(1)Bean对象注入

(2)基本类型数据的注入:eg:字符串数字等

(3)集合数据的注入:List,Set,Map,properties

list集合:/org/tarena/entity/Cost.hbm.xml...

set集合:北京上海

map集合:

properties集合:true...

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名称限定按元素的id值进行匹配bean(id值)

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组件的元素--需要给DAO的Bean注入一个dataSource对象

--dataSource对象采用一个连接池构建(dbcp连接池),先引入dbcp连接池开发包,再定义dataSource对象的元素--连接池优点:--增强数据访问的稳定性;--连接池可以将连接数控制在某个范围内;--连接池中的连接对象始终与数据库保持联通状态。避免了重复的新建和释放连接的过程。

连接池组件中管理的单元就是我们之前使用的Connection对象,在连接池中可以管理Connection对象的创建和销毁,除此之外,连接池还可以控制和管理Connection对象的初始数量、最大数量,以及根据请求情况,连接数量的自动增减。

//在连接池中最大创建10个Connection

//表示连接池创建后,初始时有2个Connection

//最小的空闲数量,表示最小空闲数量不能低于2个

//表示最大的空闲数量,表示最大空闲数量不能超过3个

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中的配置,将class属性与spring容器中元素的id属性保持一致(整合包利用class值当作id 标识去Spring容器获取Bean对象)

(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配置文件位置和名称

contextConfigLocation

classpath:applicationContext.xml

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当作目标,需要在中添加proxy-target-class="true"属性,表示采用CGLIB方式

(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定义 *.do

//编写一个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定义 *.do

//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 from Bill b join fetch b.account where 拼接条件此处不需定义另外的实体类

分页查询语句如果有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配置的基本步骤

Springmvc框架配置步骤 小弟是个新手,有不对的地方请tell me,一起研究探讨。谢谢。 1062140832@https://www.wendangku.net/doc/3b16584217.html, 配置springmvc框架其实不是很难,要现有一个总体的认识,确定要分几步,每一步主要是干什么,不要太盲目。 以为web.xml是项目的入口,所以所有的配置文件,都必须引入到wem.xml中,不然,配置了等于没用。所以,要先从入口入手。 配置web.xml 1、首先引入springmvc-servlet.xml文件 springMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/mvc/springmvc-servlet.xml 1 2、将spring加载到web.xml中 org.springframework.web.context.ContextLoaderListener 3、配置上下文路径 contextConfigLocation /WEB-INF/spring/spring.xml,/WEB-INF/spring/spring-*.xml 说明:如果有很多的关于spring的配置文件,建议分开写,比如事务一个文件(spring-transaction.xml),springmvc-hibernate.xml一个配置文件,这样方便读写。

SpringMVC深入总结

一、前言: 大家好,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的众多优点:略... (呵呵,是不是不公平?) 众多文章开篇时总要吹些牛,吸引一下读者的眼球,把读者的胃口调起来,这样大家才有兴趣接着往后看。本文也没能例外。不过保证你看了之后不会后悔定有收获。

2.Spring-mvc框架结构及执行流程

Spring mvc架构及执行流程一、请求处理流程图 二、执行流程说明 三、组件说明

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc 的三大组件。 需要用户编写的组件有handler、view 四、Spring MVC配置 1、组件扫描器:使用组件扫描器省去在spring容器配置每个controller类,使用 自动扫描标记@controller的配置如下:

2、RequestMappingHandlerMapping:注解处理器映射器,对类中标记@RequestMapping 的方法进行映射,根据RequestMapping定义的url匹配RequestMapping标记的方 法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装 注解描述: @RequestMapping:定义请求url到处理器功能方法的映射 3、RequestMappingHandlerAdapter:注解式处理器适配器,对标记@RequestMapping 的方法进行适配。 从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用 4、:spring mvc 使用自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在spring-mvc.xml 配置文件总使用替代注解处理器和适配器的配置。 5、视图解析器 InternalResourceViewResolver:支持JSP视图解析 viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl 的相关jar 包。此属性可以不设置,默认为JstlView。 prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:

spring MVC配置详解

牧涛 --<-<-<@态度决定一切→_→。。。 ?博客园 ?首页 ?新闻 ?新随笔 ?联系 ?管理 ?订阅 随笔- 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文件中声明的。 spring org.springframework.web.servlet.DispatcherServlet< /servlet-class> contextConfigLocation classpath:springMvc.xml 1 dispatcher / CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 CharacterEncodingFilter /* 3.配置SpringMvc主配置文件