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 阅读(103) |
评论 (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 阅读(79) |
评论 (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 阅读(71) |
评论 (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 阅读(87) |
评论 (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 阅读(71) |
评论 (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 阅读(104) |
评论 (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 阅读(103) |
评论 (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 阅读(72) |
评论 (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 阅读(87) |
评论 (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 阅读(163) |
评论 (0) |
编辑 收藏