jsp文件
1.index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
??? <title>Index Page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">???
</head>
<body>
??? <jsp:forward page="login.jsp"></jsp:forward>
</body>
</html>
2.login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
??? <title>Index Page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">???
</head>
<body>
<s:fielderror></s:fielderror>
<s:form action="login">
??? <s:textfield name="user.username" label="用 戶"></s:textfield>
??? <s:password name="user.password" label="密 碼"></s:password>
??? <s:submit value="登錄"></s:submit>
</s:form>
</body>
</html>
3.login_success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
??? <title>Index Page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">???
</head>
<body>
<c:choose>
?? <c:when test="${empty user}">您還沒有登錄哦。。。</c:when>
?? <c:otherwise>${user.username},歡迎登錄</c:otherwise>
</c:choose>
</body>
</html>
附圖

注意:運行本項目需要jstl標簽庫的支持,如果你使用的是java ee 5的話就不需要另外引入了
posted @
2009-07-29 16:33 jadmin 閱讀(105) |
評論 (0) |
編輯 收藏
1.準備工作
建好一個Web項目,加入必要的jar包(見本文末的附圖),本文將演示一個用戶登錄的例子,使用的是struts2.1.6,java ee 5
2.代碼
User.java
/*
* @(#)User.java 2009-7-29
*
* Copyright (c) 2009 by jadmin. All Rights Reserved.
*/
package com.jsoft.domain;
/**
* 用戶實體類
*
* @author <a href="mailto:jadmin@126.com">jadmin</a>
* @version $Id: User.java 2009-7-29 下午12:47:16$
* @see <a href="http://hi.baidu.com/jadmin">myblog</a>
*/
public class User {
private String username;
private String password;
public String getUsername() {
?? return username;
}
public void setUsername(String username) {
?? this.username = username;
}
public String getPassword() {
?? return password;
}
public void setPassword(String password) {
?? this.password = password;
}
@Override
public String toString() {
?? return super.toString() + "[" + username + ", " + password + "]";
}
}
UserAction.java
/*
* @(#)UserAction.java 2009-7-29
*
* Copyright (c) 2009 by jadmin. All Rights Reserved.
*/
package com.jsoft.web.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import com.jsoft.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* Action
*
* @author <a href="mailto:jadmin@126.com">jadmin</a>
* @version $Id: UserAction.java 2009-7-29 下午12:24:33$
* @see <a href="http://hi.baidu.com/jadmin">myblog</a>
*/
public class UserAction extends ActionSupport {
private static final long serialVersionUID = 6488865641880260892L;
private User user;
@Action(value = "login",
??? results = {
???? @Result(name = "success", location = "/login_success.jsp", type = "redirect"),
???? @Result(name = "input", location = "/login.jsp", type = "dispatcher")
??? })
public String execute() throws Exception {
?? System.out.println(user);
?? ActionContext.getContext().getSession().put("user", user);
?? return SUCCESS;
}
@Override
public void validate() {
?? if (!"admin".equals(user.getUsername())) {
??? addFieldError("user.username", "登錄名不正確!");
?? } else if (!"admin".equals(user.getPassword())) {
??? addFieldError("user.password", "密碼不正確!");
?? }
}
public User getUser() {
?? return user;
}
public void setUser(User user) {
?? this.user = user;
}
}
web.xml文件
<filter>
?? <filter-name>struts2</filter-name>
?? <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
?? <filter-name>struts2</filter-name>
?? <url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
?? <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
posted @
2009-07-29 16:25 jadmin 閱讀(81) |
評論 (0) |
編輯 收藏
驗證Email地址是否合法
<script language="javascript">
function isEmail(email) {
??if (email.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) {
return true;
}
???else {
?? return false;
}
}
</script>
驗證IP地址
IPV4_PATTERN = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
IPV6_PATTERN = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}";
待續。。。
posted @
2009-07-29 00:51 jadmin 閱讀(75) |
評論 (0) |
編輯 收藏
1.準備工作
除了必要spring的支持外,還需要引入兩個jar包,分別是activation.jar和mail.jar
2.代碼
SimpleHtmlMailSender.java
/*
* @(#)SimpleHtmlMailSender.java 2009-7-28
*
* Copyright (c) 2009 by jadmin. All Rights Reserved.
*/
package com.jsoft.s2sh.util.mail;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
/**
* 用于發送簡單的HTML文本郵件
*
* @author <a href="mailto:jadmin ON 126.com">jadmin</a>
* @version $Id: SimpleHtmlMailSender.java 2009-7-28 上午01:15:35$
* @see <a href="http://hi.baidu.com/jadmin">myblog</a>
*/
public class SimpleHtmlMailSender {
protected JavaMailSender sender;
public void setSender(JavaMailSender sender) {
?? this.sender = sender;
}
public void sendMessage(String message,String to, String from, String subject, String encoding) throws MessagingException {
?? MimeMessage msg = sender.createMimeMessage();
?? MimeMessageHelper helper = new MimeMessageHelper(msg, true, encoding);
?? helper.setTo(to);
?? helper.setFrom(from);
?? helper.setSubject(subject);
?? helper.setText(message, true);
?? sender.send(msg);
}
public static void main(String[] args) throws MessagingException {
?? ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-mail.xml");
?? String to = "etxp on?? qq.com";
?? String from = "etxp on 163.com";
?? String subject = "感謝您對本站的關注,請激活您的帳號";
??
?? String message = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\"></head><body><h1><a href='#'>哈哈!"
??? + "</a></h1></body></html>";
?? SimpleHtmlMailSender sender = (SimpleHtmlMailSender) ctx.getBean("mailSender");
?? sender.sendMessage(message, to, from, subject, "GB2312");
}
}
3.配置
applicationContext.xml(將此文件之余classpath下)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
?? <property name="host">
??? <value>smtp.163.com</value>
?? </property>
?? <property name="username">
??? <value>etxp</value>
?? </property>
?? <property name="password">
??? <value>**********</value>
?? </property>
?? <property name="javaMailProperties">
??? <props>
???? <prop key="mail.smtp.auth">true</prop>
??? </props>
?? </property>
</bean>
<bean id="mailSender" class="com.jsoft.s2sh.util.mail.SimpleHtmlMailSender">
?? <property name="sender">
??? <ref bean="javaMailSender" />
?? </property>
</bean>
</beans>
4.運行
posted @
2009-07-28 04:29 jadmin 閱讀(89) |
評論 (0) |
編輯 收藏
Spring在TransactionDefinition接口中7種類型的事務傳播行為,它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
1.PROPAGATION_REQUIRED
如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
2.PROPAGATION_SUPPORTS
支持當前事務,如果當前沒有事務,就以非事務方式執行。
3.PROPAGATION_MANDATORY
使用當前的事務,如果當前沒有事務,就拋出異常。
4.PROPAGATION_REQUIRES_NEW
新建事務,如果當前存在事務,把當前事務掛起。
5.PROPAGATION_NOT_SUPPORTED
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
6.PROPAGATION_NEVER
以非事務方式執行,如果當前存在事務,則拋出異常。
7.PROPAGATION_NESTED
如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。
posted @
2009-07-27 18:33 jadmin 閱讀(73) |
評論 (0) |
編輯 收藏
在web應用開發中,為了使視圖與數據邏輯分離,需要使用標簽,jstl就是其中之一。
一、用法配置
JSTL的版本和servlet規范的版本不同時,配置方式是不同的,以下以servlet2.4和jstl1.1為例。
核心標簽c:
1、web.xml中的配置如下(其實ide已經幫你配置好了)
</web-app>
2、在jsp頁面導入聲明
二、常用標簽
1、<c:out/>
用于輸出內容
例子:<c:out value="abc"/><c:out value="${va}" ></c:out>
2、<c:set></c:set>
用于設置作用域變量
例子:<c:set value="Hello" var="sessionVar" scope="session"></c:set>
3、<c:remove />
用于清除作用域變量
<c:remove var="maxUser" scope="application"/>
4、<c:forEach/>
用于循環輸出變量
屬性:vars:循環體中可以引用的變量;begin:循環開始的下標;end:循環結束的下標;items:集合的名稱;
例如:<c:forEach begin="0" end="5" items="array" var="s" />
${s}<br>
</c:forEach>
將輸出array集合中的6個元素,array是作用域變量,可以是request,session,application作用域內屬性變量(調用setAttribute方法設置的)。如果array中存放的是對象如User(包含name,id屬性),如果想輸出name屬性的話
可以用${s.name},其等價于調用s.getName()方法。
5、<c:if/>
用于執行條件判斷
例如:<c:if test="${empty sessionScope.name }">
<c:redirect url="testJSTLlogin.jsp" />
</c:if>
個人覺得此功能不夠強大,還是腳本靈活
6、<c:choose><c:when></c:when>......<c:other></c:other>
用于執行條件判斷相當于if,else if,else if... else
用法:c:choose標簽用來選擇執行語句
當c:when的test中判斷結果為true時執行該標簽中的內容;
如果所有c:when的test中判斷結果都為false,則執行c:otherwise中的內容;
例子:
<c:choose>
<c:whentest="testCondition">
Content1
</c:when>
<c:whentest="testCondition">
Content2
</c:when>
<c:otherwise>
Content3
</c:otherwise>
</c:choose>
posted @
2009-07-27 18:28 jadmin 閱讀(106) |
評論 (0) |
編輯 收藏
3聲明式管理Hibernate分布式事務
通過Spring,還可以很方便地切換至另一種事務管理策略。比如需要提供分布式事務管理策略時,只要替換一下配置即可,如代碼10.29所示。
代碼10.29 appContext-jta.xml
<beans>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
??? <property name="sessionFactory" >
????? <ref bean="sessionFactory" />
??? </property>
</bean>
<bean id="myDataSource1"
class="org.springframework.jndi.JndiObjectFactoryBean">
????? <property name="jndiName">
????????? <value>java:comp/env/jdbc/myds1</value>
????? </property>
</bean>
<bean id="myDataSource2"
class="org.springframework.jndi.JndiObjectFactoryBean">
????? <property name="jndiName">
????????? <value>java:comp/env/jdbc/myds2</value>
????? </property>
</bean>
<bean id="sessionFactory1"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
??? <property name="dataSource" ref="myDataSource1"/>
??? <property name="configLocations">
????? <value>hibernate.cfg1.xml</value>
??? </property>
</bean>
<bean id="sessionFactory2"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
??? <property name="dataSource" ref="myDataSource2"/>
??? <property name="configLocations">
????? <value>hibernate.cfg2.xml</value>
??? </property>
</bean>
<bean id="dao1"
class="daopackage1.DaoImpl">
??? <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="dao2"
class="daopackage2.DaoImp2">
??? <property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
<bean id="business" class="businesspackage.BusinessFacadeImpl">
??? <property name="dao1">
????? <ref bean="dao1"/>
??? </property>
??? <property name="dao2">
????? <ref bean="dao2"/>
??? </property>
</bean>
<bean id="businessProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
??? <property name="transactionManager">
????? <ref bean="transactionManager" />
??? </property>
??? <property name="target">
????? <ref bean="business" />
??? </property>
??? <property name="transactionAttributes">
????? <props>
??????? <prop key="business*">PROPAGATION_REQUIRED</prop>
??????? <prop key="someOtherBusiness*">PROPAGATION_MANDATORY</prop>
????? </props>
??? </property>
</bean>
</beans>
可以看到,對于橫跨多個Hibernate SessionFacotry的分布式事務,只需簡單地將JtaTransactionManager和LocalSessionFactoryBean的定義結合起來就可以了,其中每個DAO通過bean屬性得到各自的SessionFactory引用。
說明:如果所有底層數據源都是支持事務的容器,那么只需要對一個業務對象應用JtaTransactionManager策略,該對象就可以橫跨多個DAO和多個Session Factory來劃分事務了。使用Spring的最大好處就是,可通過配置來聲明式地管理事務,無需對應用代碼作任何改動。
posted @
2009-07-27 01:52 jadmin 閱讀(105) |
評論 (0) |
編輯 收藏
2聲明式管理Hibernate本地事務
Spring提供了一種統一的IoC方式來管理Hibernate事務(本地或者分布式事務)。從Spring接手hibernate.cfg.xml(Hibernate的基本配置文件)起,Hibernate事務便輕易交由Spring拖管了。
說明:在上一章介紹IBatis和DAO的時候,曾經針對事務和DAO的關系簡單的進行了探討。通常DAO的粒度應該都是比較細的,即它們只是一些單步的CRUD操作,所以就需要引入一個業務對象來包裹DAO,這樣,就可以在業務對象的基礎上,提供更粗粒度的事務劃分了(比如跨越多個DAO的方法調用進行事務管理)。
為了能對DAO進行更粗粒度的事務控制,需要為其增加一個業務對象。下面給出了該業務對象的接口和實現,如代碼10.25~10.26所示。
package chapter10.spring.hibernate;
import chapter10.hibernate.domain.Category;
public interface StockFacade {
public void business1(Category category);
public void someOtherBusiness();
}
代碼10.26 BusinessFacadeImpl.java
public class BusinessFacadeImpl implements StockFacade {
private StockDao stockDao;
public void setStockDao(StockDao stockDao) {
??? this.stockDao = stockDao;
}
public void business1(Category category) {
??? stockDao.createCategoryCascade(category);
??? stockDao.retrieveProductBy(category);
??? stockDao.deleteCategoryCascade(category);
}
public void someOtherBusiness() {
??? //other implemention
}
}
接著給出關于事務策略的配置,其中使用了Spring針對Hibernate3給出的HibernateTransactionManager,它提供了Hibernate的本地事務管理策略,如代碼10.27所示。
代碼10.27 transaction-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">①
??? <property name="sessionFactory" >
????? <ref bean="sessionFactory" />
??? </property>
</bean>
<bean id="business"
class="chapter10.spring.hibernate.BusinessFacadeImpl">
??? <property name="stockDao">
????? <ref bean="stockDao"/>
??? </property>
</bean>
<bean id="businessProxy"
??? class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
??? <property name="transactionManager">
????? <ref bean="transactionManager" />
??? </property>
??? <property name="target">
??? ?? <ref bean="business" />
??? </property>
??? <property name="transactionAttributes">
????? <props>
??????? <!--運行在當前事務范圍內,如果當前沒有啟動事務,那么創建一個新的事務-->
??????? <prop key="business*">PROPAGATION_REQUIRED</prop>
??????? <!--運行在當前事務范圍內,如果當前沒有啟動事務,那么拋出異常-->
??? ???? <prop key="someOtherBusiness*">PROPAGATION_MANDATORY</prop>
????? </props>
??? </property>
</bean>
</beans>
代碼10.28 HibernateTransactionUsageTest.java
package chapter10.spring.hibernate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import chapter10.hibernate.domain.Category;
import junit.framework.TestCase;
public class HibernateTransactionUsageTest extends TestCase {
private StockFacade stockBusiness;
protected void setUp() throws Exception {
??? String path = "ch10/spring/hibernate/";
??? ApplicationContext ctx = new ClassPathXmlApplicationContext(
???????? new String[]{path+"dataAccessContext-support-local.xml",
???????????? path+"transaction-context.xml"});
??? stockBusiness = (StockFacade)ctx.getBean("businessProxy");
}
public void testTransctionUsage() {
??? Category category = new Category("RABBIT");
??? category.setName("Rabbit");
??? category.setDescn("Desciption of Rabbit");
??? stockBusiness.business1(category);
}
}
posted @
2009-07-27 01:51 jadmin 閱讀(74) |
評論 (0) |
編輯 收藏
1在Spring上下文中配置SessionFactory
通過上文的描述,可以知道,Spring使用JdbcTemplate時必須和特定的數據源進行綁定。而在Hibernate中,數據源是對用戶屏蔽的,它使用一個稱為“Session”的強勁武器。
Session具有建立或取消對象的持久關聯、同步對象狀態和數據庫以及事務管理等等復雜功能。Session是Hibernate的核心概念,就如同SqlMap與之IBatis一樣。Session的創建依賴于Hibernate的SessionFactory,SessionFactory和Session一樣,也是Hibernate的核心組件。
和IBatis的整合方式一樣,Spring會將Hibernate基本配置文件中的數據源屬性抽離到Spring自身的配置文件中,以提供統一的數據源管理和注射。
首先,給出Hibernate的配置文件,如代碼10.19所示。
代碼10.19 hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
??????? "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
??????? "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!--??? <property name="connection.driver_class">-->
<!--????? org.postgresql.Driver-->
<!--??? </property>-->
<!--??? <property name="connection.url">-->
<!--????? jdbc:postgresql://1210.0.0.1:5432/hibernate-->
<!--??? </property>-->
<!--??? <property name="connection.username">postgres</property>-->
<!--??? <property name="connection.password">1111</property>-->
??? <!-- SQL dialect -->
??? <property name="dialect">
????? org.hibernate.dialect.PostgreSQLDialect
?? </property>
??? <!-- Echo all executed SQL to stdout -->
??? <property name="show_sql">true</property>
??? <!-- Drop and re-create the database schema on startup -->
??? <property name="hbm2ddl.auto">create</property>
??? <mapping resource="chapter7/hibernate/domain/Category.hbm.xml" />
??? <mapping resource="chapter7/hibernate/domain/Product.hbm.xml" />
</session-factory>
</hibernate-configuration>
注意,代碼10.19中被注釋掉的部分,它將被抽離到了Spring的上下文配置文件,而其余部分則暫時保持不變。
下面給出Spring的配置文件,如代碼10.20所示。
代碼10.20 dataAccessContext-local.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
??? <property name="locations">
????? <list>
??????? <value>classpath:jdbc.properties</value>
????? </list>
??? </property>
</bean>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
??? <property name="driverClassName" value="${jdbc.driverClassName}"/>
??? <property name="url"
??? value="jdbc:postgresql://127.0.0.1:5432/hibernate"/>
??? <property name="username" value="${jdbc.username}"/>
??? <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
??? <property name="dataSource" ref="dataSource"/>
??? <property name="configLocations">
????? <value>chapter7/spring/hibernate/hibernate.cfg.xml</value>
??? </property>
<!--??? <property name="mappingResources">-->
<!--????? <list>-->
<!--??????? <value>chapter7/hibernate/domain/Category.hbm.xml</value>-->
<!--??????? <value>chapter7/hibernate/domain/Product.hbm.xml</value>-->
<!--????? </list>-->
<!--??? </property>-->
<!--??? <property name="hibernateProperties">-->
<!--????? <props>-->
<!--??????? <prop key="hibernate.dialect">
???????????????? org.hibernate.dialect.PostgreSQLDialect
?????????????? </prop>-->
<!--??????? <prop key="show_sql">true</prop>-->
<!--??????? <prop key="hbm2ddl.auto">create</prop>-->
<!--????? </props>-->
<!--??? </property>-->
</bean>
</beans>
可以發現,從代碼10.19抽離出的數據源,現在換成了Apache的DBCP連接池。當然,也可以換作其他實現,比如從一個JNDI上獲取的數據源:
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
??? <property name="jndiName" value="java:comp/env/jdbc/myds"/>
</bean>
Spring提供了LocalSessionFactoryBean來創建本地的Hibernate SessionFactory,這就類似于上節中介紹的SqlMapClientFactoryBean(它用以創建IBatis的SqlMap)。當然也可以創建綁定在JNDI上的SessionFactory,不過這通常只在EJB環境下使用。
注意:代碼10.20中被注釋掉的部分,如果不使用LocalSessionFactoryBean的configLocations屬性讀取Hibernate的原生配置文件,可由Spring的LocalSessionFactoryBean負責配置Hibernate,它和hibernate.cfg.xml的作用完全一致,這時候就不需要Hibernate的原生配置了。
posted @
2009-07-27 01:50 jadmin 閱讀(90) |
評論 (0) |
編輯 收藏
Spring提供了一個很實用的工具,可以讓Web應用靈活配置log4j,這個工具類是:
org.springframework.web.util.Log4jConfigListener
org.springframework.web.util.Log4jConfigServlet
由于:
Note that this class has been deprecated for containers implementing
Servlet API 2.4 or higher, in favor of{@linkLog4jConfigListener}.</i><br>
According to Servlet 2.4, listeners must be initialized before load-on-startup
servlets. Many Servlet 2.3 containers already enforce this behavior
(see ContextLoaderServlet javadocs for details). If you use such a container,
this servlet can be replaced with Log4jConfigListener.
建議使用org.springframework.web.util.Log4jConfigListener,而非org.springframework.web.util.Log4jConfigServlet,下面來說下Log4jConfigListener的用法:
其實很簡單,只要在web.xml文件中配置相關參數和注冊此監聽器即可,下面是相應的配置片段:
<!-- 配置log4j配置文件的路徑,可以是xml或 properties文件(此參數必須配)-->
<context-param>
?? <param-name>log4jConfigLocation</param-name>
?? <param-value>WEB-INF/log4j.properties</param-value>
</context-param>
<!-- 每隔多少毫秒掃描一下配置文件的變化(此參數可選配) -->
<context-param>
?? <param-name>log4jRefreshInterval</param-name>
?? <param-value>60000</param-value>
</context-param>
<!-- spring框架默認定義webAppRootKey的值為webapp.root,若不配此參數默認值就是webapp.root(因此,此參數可選配) -->
<context-param>
?? <param-name>webAppRootKey</param-name>
?? <param-value>home</param-value>
</context-param>
<listener>
?? <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
這樣就可以在log4j的配置中如下進行了:
log4j.appender.DailyLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DailyLog.File=${home}/WEB-INF/logs/log4j.log
log4j.appender.DailyLog.Append=false
log4j.appender.DailyLog.DatePattern='.'yyyy-MM-dd
log4j.appender.DailyLog.layout=org.apache.log4j.PatternLayout
log4j.appender.DailyLog.layout.ConversionPattern=%p %d [%l]%n??? - %m%n
posted @
2009-07-25 03:34 jadmin 閱讀(164) |
評論 (0) |
編輯 收藏