随笔-295  评论-26  文章-1  trackbacks-0
 

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

<c:redirect url="home.htm"/>
<c:redirect url="b.jsp">
<c:param name="data" value="jsp_passdata中文傳值"></c:param>
</c:redirect>

他们两个作用相似
<jsp:forward page="/utils/errorReporter.jsp"/>

<jsp:forward page="/test4.jsp">
<jsp:param name="name" value="powerman"/>
<jsp:param name="address" value=" 北京西大街188号"/>
</jsp:forward>

<fmt:requestEncoding value="big5"/>
posted @ 2007-08-29 10:53 华梦行 阅读(214) | 评论 (0)编辑 收藏

Spring-mvc 的处理流程

关键字: Spring   mvc ioc     

请求的分发

请求首先到达DispatcherServlet,应用服务器会根据Web应用中web.xml文件定义的url映射将相应的请求分发到DispatcherServlet中

请求的处理

DispatcherServlet会查找相应的HandlerMapping接口的实现类,调用其中的方法:HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception,该方法会返回一个HandlerExecutionChain。返回的HandlerExecutionChain中包含了零个或者是多个Interceptor和一个处理请求的Handler。DispatcherServlet会调用Interceptor中的preHandle() 方法。然后处理Handler,这个Handler相当于Struts中Action,在SpringMVC中默认的实现是Controller接口,是具体处理请求的代码所驻留的地方。事实上HandlerExecutionChain中的getHandler()返回的是一个Object类型。DispatcherServlet不会直接调用getHandler()返回对象中的方法,DispatcherServlet会查找相应的HandlerAdapter,然后具体通过HandlerAdapter来调用getHandler()返回的handler对象中的方法。就是说我们可以实现自己的HandlerAdapter然后通过IoC注入到DispatcherServlet中,从而可以实现一套自定义的控制器。随后DispatcherServlet会调用Interceptor中的postHandle()方法。

视图的处理

DispatcherServlet会期望Hander返回一个ModelAndView,DispatcherServlet会根据所返回的ModelAndView对象所包含的信息进行视图的渲染。起具体出来流程如下:

首先DispatcherServlet会根据LocaleResolver来识别请求中的Locale,开发人员可以自己实现LocaleResolver接口,然后通过IoC注入到DispatcherServlet中,然后DispatcherServlet会判断ModelAndView中是否已经包含了接口View的具体实现,如果包含了,则直接调用View中的方法render(Map model, HttpServletRequest request, HttpServletResponse response)。如果不包含,则说明该ModelAndView只是包含了View的名称引用,DispatcherServlet会调用ViewResolver中的resolveViewName(String viewName, Locale locale)来解析其真正的视图。该方法会返回一个View的具体实现。

视图的渲染

Spring支持多种视图技术,其中比较常用的包括有Jstl视图,Veloctiy视图,FreeMarker视图等。对Jstl视图的渲染Spring是通过JstlView这个类具体实现的。事实上其最终的渲染是交给容器来做的,Spring只是通过RequestDispatcher实现了服务器内部请求的Forward。而对于模板视图,如Veloctiy和FreeMarker等,Spring会初始化其相应的模板引擎,由模板引擎生成最终的Html页面然后在合并到Response的输出流中。

异常的处理

如果在Hander中处理请求是抛出异常,DispatcherServlet会查找HandlerExceptionResolver接口的具体实现,该接口定义了一个方法:

ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex),实现类需要实现该方法以便对异常进行处理,最后该方法需要返回一个ModelAndView。

SpringMVC的一些总结
灵活的Interceptor,通过Interceptor我们可以在一个请求处理前和请求处理完成之后做相应的操作,通过Interceptor机制,我们可以做authentication, logging, and filtering等。
良好的表单支持,在SpringMVC的Controller继承体系结构中,其具体的子类对表单(Form)提供了良好的支持。能够很好的支持单个表单的显示、修改、提交操作。同时也提供了表单的分步提交。
可定制的数据绑定(Data Binding)。
多视图技术的支持,SpringMVC同时支持Jstl, Velocity 等多中视图技术,但是这同时也会引出一个问题,因为各种视图技术都有自己的一套方法来处理国际化,例如Jstl和Velocity处理国际化的方式就很不相同。因此在多个视图技术并存的应用中,国际化也是一个需要注意的问题。
其Handler(控制器)作为Bean定义在Spring容器中,因此能享受容器带来的服务。
Handler(控制器)具有良好的可测试性。

posted @ 2007-08-29 10:23 华梦行 阅读(2945) | 评论 (0)编辑 收藏
public abstract class HttpServletBean
extends HttpServlet
		

Simple extension of HttpServlet which treats its config parameters (init-param entries within the servlet tag in web.xml) as bean properties.

HttpServlet的简单扩展用来处理 (init-param)in the web.xml
A handy superclass for any type of servlet. Type conversion of config parameters is automatic, with the corresponding setter method getting invoked with the converted value. It is also possible for subclasses to specify required properties. Parameters without matching bean property setter will simply be ignored.

This servlet leaves request handling to subclasses, inheriting the default behavior of HttpServlet (doGet, doPost, etc).

This generic servlet base class has no dependency on the Spring ApplicationContext concept. Simple servlets usually don't load their own context but rather access service beans from the Spring root application context, accessible via the filter's ServletContext (see WebApplicationContextUtils).

The FrameworkServlet class is a more specific servlet base class which loads its own application context. FrameworkServlet serves as direct base class of Spring's full-fledged DispatcherServlet.

public abstract class FrameworkServlet
extends HttpServletBean
implements ApplicationListener
		

Base servlet for Spring's web framework. Provides integration with a Spring application context, in a JavaBean-based overall solution.

spring web Framework的基础 servlet  ,提供在以javabean为基础的整体解决方案已完成与spring应用上下文的集成
This class offers the following functionality:
1.管理一个servlet一个网络应用上下文实例,这个servlet的配置由servlet命名空间里的bean来决定
2.根据请求处理发布事件,是否请求成功的被处理了

  • Manages a WebApplicationContext instance per servlet. The servlet's configuration is determined by beans in the servlet's namespace.
  • Publishes events on request processing, whether or not a request is successfully handled.

Subclasses must implement doService(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) to handle requests. Because this extends HttpServletBean rather than HttpServlet directly, bean properties are automatically mapped onto it. Subclasses can override initFrameworkServlet() for custom initialization.

因为它继承自httpservletBean 所以bean的属性已经被自动的装配了,子类可以通过覆盖initFrameworkServlet来定制初始化bean

Detects a "contextClass" parameter at the servlet init-param level, falling back to the default context class, XmlWebApplicationContext, if not found. Note that, with the default FrameworkServlet, a custom context class needs to implement the ConfigurableWebApplicationContext SPI.

Passes a "contextConfigLocation" servlet init-param to the context instance, parsing it into potentially multiple file paths which can be separated by any number of commas and spaces, like "test-servlet.xml, myServlet.xml". If not explicitly specified, the context implementation is supposed to build a default location from the namespace of the servlet.

Note: In case of multiple config locations, later bean definitions will override ones defined in earlier loaded files, at least when using Spring's default ApplicationContext implementation. This can be leveraged to deliberately override certain bean definitions via an extra XML file.

The default namespace is "'servlet-name'-servlet", e.g. "test-servlet" for a servlet-name "test" (leading to a "/WEB-INF/test-servlet.xml" default location with XmlWebApplicationContext). The namespace can also be set explicitly via the "namespace" servlet init-param.

posted @ 2007-08-29 10:13 华梦行 阅读(664) | 评论 (0)编辑 收藏
HeidiSQL
posted @ 2007-08-28 15:54 华梦行 阅读(120) | 评论 (0)编辑 收藏
				
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="cleanup"/>

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
posted @ 2007-08-28 14:28 华梦行 阅读(164) | 评论 (0)编辑 收藏
Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:
BeanFactory的实现应该尽可能支持标准的bean生命周期,以下是所以的方法的顺序的依次列表
1. BeanNameAware's   setBeanName
2. BeanClassLoaderAware's  setBeanClassLoader
3. BeanFactoryAware's   setBeanFactory
4. ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
5. ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
6. MessageSourceAware's setMessageSource (only applicable when running in an application context)
7. ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
8. ServletContextAware's setServletContext (only applicable when running in a web application context)
9. postProcessBeforeInitialization methods of BeanPostProcessors
10. InitializingBean's afterPropertiesSet
11. a custom init-method definition
12. postProcessAfterInitialization methods of BeanPostProcessors
 当关闭一个bean的时候
On shutdown of a bean factory, the following lifecycle methods apply:
1. DisposableBean's destroy
2. a custom destroy-method definition

Method Summary
 booleancontainsBean(String name)
          Does this bean factory contain a bean with the given name?
 String[]getAliases(String name)
          Return the aliases for the given bean name, if any.
 ObjectgetBean(String name)
          Return an instance, which may be shared or independent, of the specified bean.
 ObjectgetBean(String name, Class requiredType)
          Return an instance, which may be shared or independent, of the specified bean.
 ClassgetType(String name)
          Determine the type of the bean with the given name.
 booleanisPrototype(String name)
          Is this bean a prototype?
 booleanisSingleton(String name)
          Is this bean a shared singleton?
 booleanisTypeMatch(String name, Class targetType)
          Check whether the bean with the given name matches the specified type.
 
posted @ 2007-08-28 14:09 华梦行 阅读(558) | 评论 (0)编辑 收藏
public interface Lifecycle
		

Interface defining methods for start/stop lifecycle control. The typical use case for this is to control asynchronous processing.

Can be implemented by both components (typically a Spring bean defined in a Spring BeanFactory) and containers (typically a Spring ApplicationContext). Containers will propagate start/stop signals to all components that apply.

Can be used for direct invocations or for management operations via JMX. In the latter case, the MBeanExporter will typically be defined with an InterfaceBasedMBeanInfoAssembler, restricting the visibility of activity-controlled components to the Lifecycle interface.

Since:
2.0
Author:
Juergen Hoeller
See Also:
ConfigurableApplicationContext , AbstractMessageListenerContainer, SchedulerFactoryBean

Method Summary
 boolean isRunning ()
          Check whether this component is currently running.
 void start ()
          Start this component.
 void stop ()
          Stop this component.
 
posted @ 2007-08-28 13:49 华梦行 阅读(145) | 评论 (0)编辑 收藏
Spring中Bean的生命周期
    在传统的Java应用中,Bean的生命周期非常简单。Java的关键词new用来实例化Bean(或许他是非序列化的)。这样就够用了。相反,Bean的生命周期在Spring容器中更加细致。理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程。


1. 容器寻找Bean的定义信息并且将其实例化。
2.受用依赖注入,Spring按照Bean定义信息配置Bean的所有属性。
3.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。
4.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
5.如果BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()方法将被调用。
6.如果Bean指定了init-method方法,它将被调用。
7.最后,如果有BeanPsotProcessor和Bean关联,那么它们的postProcessAfterInitialization()方法将被调用。
    到这个时候,Bean已经可以被应用系统使用了,并且将被保留在Bean Factory中知道它不再需要。有两种方法可以把它从Bean Factory中删除掉。
1.如果Bean实现了DisposableBean接口,destory()方法被调用。
2.如果指定了订制的销毁方法,就调用这个方法。
    Bean在Spring应用上下文的生命周期与在Bean工厂中的生命周期只有一点不同,唯一不同的是,如果Bean实现了ApplicationContextAwre接口,setApplicationContext()方法被调用。

posted @ 2007-08-28 12:56 华梦行 阅读(1840) | 评论 (0)编辑 收藏
INSTR方法的格式为
INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)

////匹配序号是从左边开始数起,而不管其实位置的正负。
///当起始位置为负数时,从右边数起来计算返回的结果
select  instr(' ',' ',1,1)返回的值为空

例如:INSTR('CORPORATE FLOOR','OR', 3, 2)中,源字符串为'CORPORATE FLOOR', 目标字符串为'OR',起始位置为3,取第2个匹配项的位置。

默认查找顺序为从左到右。当起始位置为负数的时候,从右边开始查找。

所以SELECT INSTR('CORPORATE FLOOR', 'OR', -1, 1) "Instring" FROM DUAL的显示结果是

Instring
——————
14
posted @ 2007-08-28 12:24 华梦行 阅读(325) | 评论 (0)编辑 收藏
 ApplicationContext ctx = new ClassPathXmlApplicationContext("knight.xml");
posted @ 2007-08-28 09:58 华梦行 阅读(1320) | 评论 (0)编辑 收藏

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%5p] %d{HH:mm:ss} %c{1} - %m%n

log4j.rootLogger=WARN, stdout

log4j.category.com.springinaction=DEBUG
log4j.category.org.springframework=WARN

posted @ 2007-08-27 17:29 华梦行 阅读(282) | 评论 (0)编辑 收藏

package com.springinaction.chapter01.knight;

import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;


public class MinstrelAdvice implements MethodBeforeAdvice {
  public void before(Method method, Object[] args, Object target)
      throws Throwable {

    Knight knight = (Knight) target;
   
    Logger song = Logger.getLogger(target.getClass());
   
    song.debug("Brave " + knight.getName() + " did " + method.getName());
  }
}

package com.springinaction.chapter01.knight;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.FileSystemResource;
public class KnightApp {
  private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
      .getLogger(KnightApp.class);
 
  public static void main(String[] args) throws Exception {
    LOGGER.debug("Running KnightApp");
    ApplicationContext m;
    BeanFactory factory =
        new XmlBeanFactory(new FileSystemResource("knight.xml"));

///有XmlBeanFactory来负责具体的实现     knight.xml必须要保存在项目的总目录下面
Knight knight =
        (Knight) factory.getBean("knight");

    knight.embarkOnQuest();
    System.out.println("ok");
    LOGGER.debug("KnightApp Finished");
  }
}

posted @ 2007-08-27 16:11 华梦行 阅读(545) | 评论 (0)编辑 收藏

 Spring中ApplicationContext加载机制。
          加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet。
         这两者在功能上完全等同,只是一个是基于Servlet2.3版本中新引入的Listener接口实现,而另一个基于Servlet接口实现。开发中可根据目标Web容器的实际情况进行选择。

配置非常简单,在web.xml中增加:
<listener>
  <listener-class>
       org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>
或:
<servlet>
    <servlet-name>context</servlet-name>
    <servlet-class>
       org.springframework.web.context.ContextLoaderServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet> 
 
          通过以上配置,Web容器会自动加载/WEB-INF/applicationContext.xml初始化
ApplicationContext实例,如果需要指定配置文件位置,可通过context-param加以指定:
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>

        配置完成之后,即可通过
 WebApplicationContextUtils.getWebApplicationContext方法在Web应用中获取ApplicationContext引用。

如:ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext();
    LoginAction action=(LoginAction)ctx.getBean("action");

posted @ 2007-08-27 16:03 华梦行 阅读(169) | 评论 (0)编辑 收藏

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

///////在spring里所有的bean都是具体的实现,所谓的装配bean就是装配一个具体的实现
<beans>
  <bean id="quest"
      class="com.springinaction.chapter01.knight.HolyGrailQuest"/>
/////转配一个实现类,用来实现一个接口

  <bean id="knightTarget"
      class="com.springinaction.chapter01.knight.KnightOfTheRoundTable">
    <constructor-arg>
      <value>Bedivere</value>
    </constructor-arg>
    <property name="quest">
////这里是装备一个这个类的属性
      <ref bean="quest"/>
    </property>
  </bean>
 
  <bean id="minstrel"
      class="com.springinaction.chapter01.knight.MinstrelAdvice"/>
     
  <bean id="knight"
      class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <list>
        <value>com.springinaction.chapter01.knight.Knight</value>
      </list>
    </property>
    <property name="interceptorNames">
      <list>
        <value>minstrel</value>
      </list>
    </property>
    <property name="target"><ref bean="knightTarget"/></property>
  </bean>
 
</beans>
在spring 里所有的类都要实现接口与具体实现的分离  iGoHome.java   iGoHomeImp.java  这两个类来具体完成

posted @ 2007-08-27 16:02 华梦行 阅读(197) | 评论 (0)编辑 收藏
List cat =sess.createCriteria(Cat.class).add(Restrictions.like("name","F%").addOrder(Order.asc("name")).addOrder(Order.desc("age")).setMaxResult(20).list();

posted @ 2007-08-24 18:10 华梦行 阅读(418) | 评论 (0)编辑 收藏
  <id        name="id"        type="java.lang.Integer"        column="ID">
            <generator class="native">        
                <param name="sequence">S_10924_1_BSE_BENEFICIARY</param>
            </generator>
    </id>
posted @ 2007-08-24 17:06 华梦行 阅读(164) | 评论 (0)编辑 收藏
JTS Java Transaction Service 是 J2EE 架构的关键元素。它与 JTA Java Transaction API 结合在一起,使我们能够构建对于各种系统和网络故障都非常健壮的分布式应用程序。事务是可靠应用程序的基本构建块 —— 如果没有事务的支持,编写可靠的分布式应用程序将是非常困难的。幸运的是,JTS 执行的大部分工作对于程序员都是透明的;J2EE 容器使事务划分和资源征用对程序员来说几乎是不可见的。这个由三个部分组成的系列文章的第一期讲述了一些基础知识,包括什么是事务,以及事务对于构建可靠的分布式应用程序来说至关重要的原因。

如果您阅读过任何有关 J2EE 的介绍性文章或者书籍,那么就会发现,只有一小部分资料是专门针对 Java Transaction Service(JTS)或 Java Transaction API(JTA)的。这并不是因为 JTS 是 J2EE 中不重要的部分或者可选部分 —— 恰恰相反。JTS 受到的关注之所以会比 EJB 技术少,是因为它为应用程序提供的服务非常透明 —— 很多开发人员甚至没有注意到在他们的应用程序中事务在哪里开始和结束。在某种意义上,JTS 的默默无闻恰恰是它的成功:因为它非常有效地隐藏了事务管理的很多细节,因此,我们没有听说过或者谈论过很多关于它的内容。但是,您可能想了解它在幕后都为您执行什么功能。

毫不夸张地说,没有事务就不能编写可靠的分布式应用程序。事务允许采用某种控制方式修改应用程序的持久性状态,以便使应用程序对于各种各样的系统故障(包括系统崩溃、网络故障、电源故障甚至自然灾害)更加健壮。事务是构建容错、高可靠性以及高可用性应用程序所需的基本构建块之一。

posted @ 2007-08-24 16:34 华梦行 阅读(878) | 评论 (0)编辑 收藏
  <Resource
            name="jdbc/PathPlat"
            auth="Container"
            type="javax.sql.DataSource"
            password="f"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            maxIdle="50"
            maxWait="5000"
            username="t"
            url="jdbc:oracle:thin:@192.168.0.1:1521:www"
            removeAbandoned="true"
            removeAbandonedTimeout="60"
            maxActive="100"/>

Context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/PathCrm" reloadable="true">
  <ResourceLink global="jdbc/PathPlat" name="jdbc/PathPlat" type="javax.sql.DataSource"/>
</Context>
 
<property  name="connection.datasource">java:comp/env/jdbc/PathPlat</property> 

private String dbName ="java:comp/env/jdbc/SavingsAccountDB";

java:comp/env是组件的JNDI上下文的名字(实际上这个上下文也作为一种资源来处理了,资源查找的过程可以是这样:jndictxt = ctxt.lookup(“java:comp/env”)然后用这个jndictxt来查找资源,ref = jndictxt.lookup("jdbc/SavingsAccountDB")。)jdbc/SavingsAccountDB是资源引用的JNDI名(The jdbc/SavingsAccountDB string is the JNDI name for the resource reference,这句话可能意味着资源引用实际上也跟资源一样处理成一种JNDI绑定对象了,但是实际上应该不是这样,因为在部署描述符中它是引用名元素。因为译者也不是高手,所以这里的具体实现细节有待读者自己研究了:)所以JDBC的DataSource对象的JNDI名就存储在java:comp/env/jdbc的上下文子对象中。(组件运行环境的上下文层次需要进一步了解)

5. 在Type列中选择javax.sql.DataSource。前面说过它是数据库连接工厂

posted @ 2007-08-24 15:35 华梦行 阅读(98) | 评论 (0)编辑 收藏
set 元素里不能有重复
posted @ 2007-08-24 14:22 华梦行 阅读(135) | 评论 (0)编辑 收藏
   Connection conn = HibernateUtil.getSession().connection();
posted @ 2007-08-24 11:43 华梦行 阅读(61) | 评论 (0)编辑 收藏
仅列出标题
共15页: First 上一页 7 8 9 10 11 12 13 14 15 下一页