阳光男孩

Never give up!

Entries Tagged ‘Spring’

三大框架配制(eclispe)

1顶一下在SSH中spring起着整合的作用,所以在这里,我重点讲一下spring的配制。 一、引用相关包,并配制 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 4 <beans> 5 <!-- 配置数据源 --> 6 <bean id="dataSource" 7 class=...[阅读全文]

1
顶一下

在SSH中spring起着整合的作用,所以在这里,我重点讲一下spring的配制。
一、引用相关包,并配制

1 <?xml version=”1.0″ encoding=”UTF-8″?>
2 <!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN”
3 “http://www.springframework.org/dtd/spring-beans-2.0.dtd”>
4 <beans>
5 <!– 配置数据源 –>
6 <bean id=”dataSource”
7 class=”org.apache.commons.dbcp.BasicDataSource”
8 destroy-method=”close”>
9 <property name=”driverClassName”>
10 <value>com.mysql.jdbc.Driver</value>
11 </property>
12 <property name=”url”>
13 <value>jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;characterEncoding=utf-8</value>
14 </property>
15 <property name=”username”>
16 <value>root</value>
17 </property>
18 <property name=”password”>
19 <value>123456</value>
20 </property>
21 </bean>
22 <!– 配置Hibernate –>
23 <bean id=”sessionFactory”
24 class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
25 <property name=”dataSource”>
26 <ref local=”dataSource” />
27 </property>
28 <property name=”mappingResources”>
29 <list>
30 <value>com/model/User.hbm.xml</value>
31 <value>com/model/Address.hbm.xml</value>
32 </list>
33 </property>
34 <property name=”hibernateProperties”>
35 <props>
36 <prop key=”hibernate.dialect”>
37 org.hibernate.dialect.MySQLDialect
38 </prop>
39 <prop key=”hibernate.show_sql”>true</prop>
40 </props>
41 </property>
42 </bean>
43 <!– 配置事务 –>
44 <bean id=”transactionManager”
45 class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>
46 <property name=”sessionFactory”>
47 <ref local=”sessionFactory” />
48 </property>
49 </bean>
50
51 <!– DAO –>
52 <bean id=”User_Dao” class=”com.dao.User_Dao”>
53 <property name=”sessionFactory”>
54 <ref local=”sessionFactory” />
55 </property>
56 </bean>
57
58
59 <!– 定义DAO代理 –>
60 <bean id=”UserDAOProxy”
61 class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>
62 <property name=”transactionManager”>
63 <ref bean=”transactionManager” />
64 </property>
65 <property name=”target”>
66 <ref local=”User_Dao” />
67 </property>
68 <property name=”transactionAttributes”>
69 <props>
70 <prop key=”insert*”>PROPAGATION_REQUIRED</prop>
71 <prop key=”*”>PROPAGATION_REQUIRED,readOnly</prop>
72 </props>
73 </property>
74 </bean>
75 <!– Action –>
76 <bean id=”User_Action” class=”com.action.User_Action”>
77 <property name=”user_dao”>
78 <ref local=”User_Dao” />
79 </property>
80 </bean>
81 </beans>

1.datasource数据源配制
2.配制hibernate   sessionfactory工厂的创建
3.配制事务操作
4.写一个DAO和一个DAO代理
5.写一个Action代理
二、web.xml配制

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:jsp=”http://java.sun.com/xml/ns/javaee/jsp” xmlns:web=”http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” id=”WebApp_ID” version=”2.5″>
<display-name>demo</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>struts</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

1.配制spring路径和struts路径
三、struts2文件配制
View Code

<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE struts PUBLIC “-//Apache Software Foundation//DTD Struts Configuration 2.1//EN” “http://struts.apache.org/dtds/struts-2.1.dtd”>
<struts>
<!– 编码 –>
<constant name=”struts.i18n.encoding” value=”utf-8″ />
<package name=”User_Struts” extends=”struts-default”>
<action name=”User_login” class=”User_Action”>
<result name=”success”>login.jsp</result>
<result name=”input”>login.jsp</result>
</action>
</package>
</struts>

struts.properties  属性配制   struts.action.extension=do   可以配制扩展名

Comments (9)

Spring中事务传播行为种类

1顶一下Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如 何进行传播: PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 使用当前的事务,如果当...[阅读全文]

1
顶一下

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如 何进行传播:

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

在使用过程中需要注意以下几点:

1)NESTED和NEW的区别

PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED是容易混淆的两个传播行为。PROPAGATION_REQUIRES_NEW 启动一个新的、和外层事务无关的“内部”事务。该事务拥有自己的独立隔离级别和锁,不依赖于外部事务,独立地提交和回滚。当内部事务开始执行时,外部事务 将被挂起,内务事务结束时,外部事务才继续执行。由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于:PROPAGATION_REQUIRES_NEW 将创建一个全新的事务,它和外层事务没有任何关系,而 PROPAGATION_NESTED 将创建一个依赖于外层事务的子事务,当外层事务提交或回滚时,子事务也会连带提交和回滚。嵌套事务不能够提交,它必须通过外层事务来完成提交的动作,外层 事务的回滚也会造成内部事务的回滚。

2) 当方法被设置为PROPAGATION_NOT_SUPPORTED时,外层业务方法的事务会被挂起,当内部方法运行完成后,外层方法的事务重新运行。如 果外层方法没有事务,直接运行,不需要做任何其它的事。

3) 当业务方法被设置为PROPAGATION_NEVER时,它将不能被拥有事务的其它业务方法调用。

4) 当业务方法被设置为PROPAGATION_MANDATORY时,它就不能被非事务的业务方法调用。

Comments (385)

Spring定时器的两种实现方式

1顶一下有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportTask extends TimerTask{ @Override public void run() { … } } 在Spring定义 … 配置Spring定时器 <bean id=”scheduleReportTask” class=”org.springframework.scheduling.timer...[阅读全文]

1
顶一下

有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。

1.Java Timer定时

首先继承java.util.TimerTask类实现run方法

import java.util.TimerTask;

public class EmailReportTask extends TimerTask{

@Override

public void run() {

}

}

在Spring定义

配置Spring定时器

<bean id=”scheduleReportTask” class=”org.springframework.scheduling.timer.ScheduledTimerTask”>

<property name=”timerTask” ref=”reportTimerTask” />

<property name=”period”>

<value>86400000value>

property>

bean>

timerTask属性告诉ScheduledTimerTask运行哪个。86400000代表24个小时

启动Spring定时器

Spring的TimerFactoryBean负责启动定时任务

<bean class=”org.springframework.scheduling.timer.TimerFactoryBean”>

<property name=”scheduledTimerTasks”>

<list><ref bean=”scheduleReportTask”/>list>

property>

bean>

scheduledTimerTasks里显示一个需要启动的定时器任务的列表。

可以通过设置delay属性延迟启动

<bean id=”scheduleReportTask” class=”org.springframework.scheduling.timer.ScheduledTimerTask”>

<property name=”timerTask” ref=”reportTimerTask” />

<property name=”period”>

<value>86400000value>

property>

<property name=”delay”>

<value>3600000value>

property>

bean>

这个任务我们只能规定每隔24小时运行一次,无法精确到某时启动

2.Quartz定时器

首先继承QuartzJobBean类实现executeInternal方法

import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean;

public class EmailReportJob extends QuartzJobBean{

protected void executeInternal(JobExecutionContext arg0)

throws JobExecutionException {

}

}
在Spring中定义

<bean id=”reportJob” class=”org.springframework.scheduling.quartz.JobDetailBean”>

<property name=”jobClass”>

<value>EmailReportJobvalue>

property>

<property name=”jobDataAsMap”>

<map>

<entry key=”courseService”>

<ref bean=”courseService”/>

entry>

map>

property>

bean>

在这里我们并没有直接声明一个EmailReportJob Bean,而是声明了一个JobDetailBean。这个是Quartz的特点。JobDetailBean是Quartz的 org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。

使用Quartz的JobDetail中的另一个特别之处是EmailReportJob的courseService属性是间接设置的。 JobDetail的jobDataAsMap属性接受一个Map,包括设置给jobClass的各种属性,当。JobDetailBean实例化时,它 会将courseService Bean注入到EmailReportJob 的courseService 属性中。

启动定时器

Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。Spring提供了两个触发器 SimpleTriggerBean和CronTriggerBean。

SimpleTriggerBean与scheduledTimerTasks类似。指定工作的执行频度,模仿scheduledTimerTasks配 置 .

<bean id=”simpleReportTrigger” class=”org.springframework.scheduling.quartz.SimpleTriggerBean”>

<property name=”jobDetail” ref=”reprotJob” />

<property name=”startDelay”>

<value>360000value>

property>

<property name=”repeatInterval”>

<value>86400000value>

property>

bean>

startDelay也是延迟1个小时启动

CronTriggerBean指定工作的准确运行时间

<bean id=”cronReportTrigger” class=”org.springframework.scheduling.quartz.CronTriggerBean”>

<property name=”jobDetail” ref=”reprotJob” />

<property name=”cronExpression”>

<value>0 0 6 * * ?value>

property>

bean>

属性cronExpression告诉何时触发。最神秘就是cron表达式:

Linux系统的计划任务通常有cron来承担。一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。从左到右:

1.秒2.分3.小时4.月份中的日期(1-31)5.月份(1-12或JAN-DEC)6.星期中的日期(1-7或SUN-SAT)7.年份 (1970-2099)

每个元素都显示的规定一个值(如6),一个区间(9-12),一个列表(9,11,13)或一个通配符(*)。因为4和6这两个元素是互斥的,因此应该通 过设置一个问号(?)来表明不想设置的那个字段,“/”如果值组合就表示重复次数(10/6表示每10秒重复6次)。

启动定时器

<bean class=”org.springframework.scheduling.quartz.SchedulerFactoryBean”>

<property name=”triggers”>

<list><ref bean=”cronReportTrigger”/>list>

property>

bean>

triggers属性接受一组触发器。

Comments (13)