posts - 495,  comments - 11,  trackbacks - 0
           

          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 閱讀(108) | 評論 (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 閱讀(85) | 評論 (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 閱讀(78) | 評論 (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 閱讀(91) | 評論 (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 閱讀(74) | 評論 (0)編輯 收藏
          在web應用開發中,為了使視圖與數據邏輯分離,需要使用標簽,jstl就是其中之一。
          一、用法配置

          JSTL的版本和servlet規范的版本不同時,配置方式是不同的,以下以servlet2.4和jstl1.1為例。

          核心標簽c:
          1、web.xml中的配置如下(其實ide已經幫你配置好了)
          <web-app version="2.4"
          xmlns="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
          http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
          </web-app>
          2、在jsp頁面導入聲明
          <%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core%>
          二、常用標簽
          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 閱讀(109) | 評論 (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的分布式事務,只需簡單地將JtaTransactionManagerLocalSessionFactoryBean的定義結合起來就可以了,其中每個DAO通過bean屬性得到各自的SessionFactory引用。

          說明:如果所有底層數據源都是支持事務的容器,那么只需要對一個業務對象應用JtaTransactionManager策略,該對象就可以橫跨多個DAO和多個Session Factory來劃分事務了。使用Spring的最大好處就是,可通過配置來聲明式地管理事務,無需對應用代碼作任何改動。

          posted @ 2009-07-27 01:52 jadmin 閱讀(108) | 評論 (0)編輯 收藏

          2聲明式管理Hibernate本地事務

          Spring提供了一種統一的IoC方式來管理Hibernate事務(本地或者分布式事務)。從Spring接手hibernate.cfg.xmlHibernate的基本配置文件)起,Hibernate事務便輕易交由Spring拖管了。

          說明:在上一章介紹IBatisDAO的時候,曾經針對事務和DAO的關系簡單的進行了探討。通常DAO的粒度應該都是比較細的,即它們只是一些單步的CRUD操作,所以就需要引入一個業務對象來包裹DAO,這樣,就可以在業務對象的基礎上,提供更粗粒度的事務劃分了(比如跨越多個DAO的方法調用進行事務管理)。

          為了能對DAO進行更粗粒度的事務控制,需要為其增加一個業務對象。下面給出了該業務對象的接口和實現,如代碼10.25~10.26所示。

          代碼10.25 StockFacade.java

          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 閱讀(76) | 評論 (0)編輯 收藏

          1Spring上下文中配置SessionFactory

          通過上文的描述,可以知道,Spring使用JdbcTemplate時必須和特定的數據源進行綁定。而在Hibernate中,數據源是對用戶屏蔽的,它使用一個稱為“Session”的強勁武器。

          Session具有建立或取消對象的持久關聯、同步對象狀態和數據庫以及事務管理等等復雜功能。SessionHibernate的核心概念,就如同SqlMap與之IBatis一樣。Session的創建依賴于HibernateSessionFactorySessionFactorySession一樣,也是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抽離出的數據源,現在換成了ApacheDBCP連接池。當然,也可以換作其他實現,比如從一個JNDI上獲取的數據源:

          <bean id="dataSource"

          class="org.springframework.jndi.JndiObjectFactoryBean">

          ??? <property name="jndiName" value="java:comp/env/jdbc/myds"/>

          </bean>

          Spring提供了LocalSessionFactoryBean來創建本地的Hibernate SessionFactory,這就類似于上節中介紹的SqlMapClientFactoryBean(它用以創建IBatisSqlMap)。當然也可以創建綁定在JNDI上的SessionFactory,不過這通常只在EJB環境下使用。

          注意:代碼10.20中被注釋掉的部分,如果不使用LocalSessionFactoryBeanconfigLocations屬性讀取Hibernate的原生配置文件,可由SpringLocalSessionFactoryBean負責配置Hibernate,它和hibernate.cfg.xml的作用完全一致,這時候就不需要Hibernate的原生配置了。

          posted @ 2009-07-27 01:50 jadmin 閱讀(92) | 評論 (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 閱讀(165) | 評論 (0)編輯 收藏
          僅列出標題
          共50頁: First 上一頁 9 10 11 12 13 14 15 16 17 下一頁 Last 
          主站蜘蛛池模板: 崇文区| 苍南县| 房产| 双柏县| 谷城县| 乌兰浩特市| 邮箱| 鹤岗市| 新兴县| 新宾| 凤台县| 钦州市| 金堂县| 哈巴河县| 通化县| 扎鲁特旗| 衡南县| 柘城县| 七台河市| 潍坊市| 高雄县| 永平县| 菏泽市| 成安县| 台江县| 耒阳市| 英超| 翁源县| 嘉荫县| 南江县| 万源市| 胶州市| 安多县| 汾西县| 黔江区| 巴青县| 报价| 亳州市| 高州市| 晋宁县| 龙里县|