??xml version="1.0" encoding="utf-8" standalone="yes"?>
1、开发环?br />
JDK1.4.2.*
Tomcat6.0.*
Spring-2.5.5
Spring-ws-1.5.4
XmlBeans-2.3
2、确定需要请求和应答的xml实例
Request.xml
<?xml version="1.0" encoding="UTF-8"?>
<wl_request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://footmarktech.com/samples">
<flights>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
</flights>
</wl_request>
Response.xml
<?xml version="1.0" encoding="UTF-8"?>
<wl_response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://footmarktech.com/samples">
<flights>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
</flights>
</wl_response>
3、设|XmlBeans环境
讄XMLBEANS_HOME
q将 %XMLBEANS_HOME%/bin增加到path路径?/p>
4、用xmlbeans tool准备数据契约xsd
Ҏ(gu)上一步骤h和应{的实例xml执行如下命o(h)
inst2xsd -enumerations never Request.xml Response.xml
生成的schema0.xsd文g命名?Airline.xsd
?Airline.xsd攑֜ ${web-context}/WEB-INF目录?br />
5、用xmlbeans tool生成OXM数据映射对象
需要说明的是这些对象是跟Xmlbeans耦合比较紧的,不是POJO
执行如下命o(h)
scomp -out Airline.jar Airline.xsd
6、准备运行时和编译时jar?/p>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/acegi-security-1.0.7.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/activation-1.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/antlr-2.7.7.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/aopalliance-1.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/axiom-api-1.2.6.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/axiom-dom-1.2.6.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/axiom-impl-1.2.6.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/backport-util-concurrent-3.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/bsf-2.3.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/cglib-nodep-2.1_3.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-beanutils-1.7.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-codec-1.3.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-collections-3.2.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-configuration-1.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-digester-1.8.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-discovery-0.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-el-1.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-fileupload-1.2.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-httpclient-3.0.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-io-1.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-lang-2.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-logging-1.1.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-net-1.2.2.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-pool-1.3.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/commons-validator-1.3.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/concurrent-1.3.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/dom4j-1.6.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/ehcache-1.2.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/ezmorph-1.0.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/groovy-all-1.5.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/hibernate-3.2.6.ga.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/hsqldb-1.8.0.7.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/icu4j-3.4.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jasypt-1.4.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/javassist-3.6.ga.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jaxen-1.1.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jaxrpc-1.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jcaptcha-all-1.0-RC6.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jcr-1.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jdom-1.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/json-lib-2.2.1-jdk13.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jta-spec1_0_1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/log4j-1.2.15.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/lucene-core-2.2.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/mail-1.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/mysql-connector-java-5.1.5-bin.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/ognl-2.7.2.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/oro-2.0.8.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/oscache-2.4.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/pdfbox-0.6.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/poi-3.0.1-FINAL-20070705.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/poi-contrib-3.0.1-FINAL-20070705.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/poi-scratchpad-3.0.1-FINAL-20070705.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/proxool-0.9.0RC3.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/serializer-2.7.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/slf4j-api-1.4.3.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/slf4j-log4j12-1.4.3.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/spring-2.5.5.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/stax-api-1.0.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/wsdl4j-1.6.2.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/wstx-asl-3.2.3.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xalan-2.7.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xercesImpl-2.8.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xfire-all-1.2.6.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xml-apis-1.3.04.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xom-1.1.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xpp3_min-1.1.3.4.0.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xstream-1.2.2.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/axis-saaj-1.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/axis-1.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/spring-oxm-1.5.4.jar" sourcepath="D:/maven-1.0.2/.maven/repository/springframework/srcs/spring-ws-1.5.4-with-dependencies.zip"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/spring-webmvc-2.5.5.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/spring-ws-core-1.5.4.jar" sourcepath="D:/maven-1.0.2/.maven/repository/springframework/srcs/spring-ws-1.5.4-with-dependencies.zip"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/spring-ws-security-1.5.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/spring-ws-support-1.5.4.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/spring-xml-1.5.4.jar" sourcepath="D:/maven-1.0.2/.maven/repository/springframework/srcs/spring-ws-1.5.4-with-dependencies.zip"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/jsr173_1.0_api.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/resolver.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xbean_xpath.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xbean.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xmlbeans-qname.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/xmlpublic.jar"/>
<classpathentry kind="lib" path="web/src/context/WEB-INF/lib/Airline.jar"/>
<classpathentry kind="output" path="web/src/context/WEB-INF/classes"/>
Spring-ws1.5.4必须使用springframework2.5版本以上
其对org.springframework.core.io.Resource版本要求较高
必须加入spring-webmvc-2.5.5.jar
org.springframework.web.servlet.FrameworkServlet?.5版本后被分到spring-webmvc.jar?q不包含于主spring包内
?可能有些jar包没有用?br /> 7、书写web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Web</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>ws-spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ws-spring-ws</servlet-name>
<url-pattern>/spring-ws/*</url-pattern>
</servlet-mapping>
</web-app>
8、书写业务实?/p>
package demo1;
public class Order {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
package demo1;
public interface OrderService {
Order getOrder(String id);
}
package demo1;
public class OrderServiceImpl implements OrderService{
public Order getOrder(String id) {
Order order = new Order();
order.setId(id);
return order;
}
}
书写spring配置攑֜classpath?br /> applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="no" default-lazy-init="false" default-dependency-check="none">
<bean id="orderService" class="demo1.OrderServiceImpl"/>
</beans>
9、书写Spring-ws EndPoint
package demo1;
import org.springframework.oxm.Marshaller;
import org.springframework.ws.server.endpoint.AbstractMarshallingPayloadEndpoint;
import com.footmarktech.samples.WlRequestDocument;
import com.footmarktech.samples.WlResponseDocument;
public class SampleMarshallingEndpoint extends
AbstractMarshallingPayloadEndpoint {
private final OrderService orderService;
public SampleMarshallingEndpoint(OrderService orderService,
Marshaller marshaller) {
super(marshaller);
this.orderService = orderService;
}
protected Object invokeInternal(Object request) throws Exception {
com.footmarktech.samples.WlRequestDocument ab = null;
ab = (WlRequestDocument)request;
//TODO invoke orderService
WlResponseDocument rs = (WlResponseDocument) WlResponseDocument.Factory.newInstance();
rs.addNewWlResponse().addNewFlights().addNewFlight().setTicketNo(ab.getWlRequest().getFlights().getFlightArray(0).getTicketNo());
return rs;
}
}
10、书写ws-spring-ws-servlet.xml
攄?{web-context}/WEB-INF目录?/p>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="true"/>
</bean>
<bean id="xmlBeansMarshaller" class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller" />
<bean id="orderEndPoint" class="demo1.SampleMarshallingEndpoint">
<constructor-arg><ref bean="orderService"/></constructor-arg>
<constructor-arg><ref bean="xmlBeansMarshaller"/></constructor-arg>
</bean>
<bean id="payloadMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
<property name="defaultEndpoint" ref="orderEndPoint"/>
</bean>
<bean id="echo" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
<property name="schema">
<bean class="org.springframework.xml.xsd.SimpleXsdSchema">
<property name="xsd" value="/WEB-INF/Airline.xsd"/>
</bean>
</property>
<property name="portTypeName" value="Echo"/>
<property name="locationUri" value="http://localhost:8080/ss1/spring-ws/echo/services"/>
</bean>
</beans>
11、开发客L(fng)
配置a(chn)pplicationContext1.xml攄?classpath demo1.client包内
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="xmlBeansMarshaller" class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller" />
<bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="true"/>
</bean>
<bean id="webServiceTemplate1" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory" />
<property name="marshaller" ref="xmlBeansMarshaller" />
<property name="unmarshaller" ref="xmlBeansMarshaller" />
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
<property name="readTimeout" value="0" />
</bean>
</property>
<property name="defaultUri" value="http://localhost:8080/ss1/spring-ws/echo/services" />
</bean>
</beans>
package demo1.client;
import java.io.File;
import java.io.IOException;
import javax.xml.transform.Source;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.jdom.JDOMException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.xml.transform.ResourceSource;
import org.springframework.xml.transform.StringResult;
import com.footmarktech.smscenter.webservice.SendSMDocument;
import com.footmarktech.smscenter.webservice.SendSMResponseDocument;
import com.footmarktech.samples.WlRequestDocument;
import com.footmarktech.samples.WlResponseDocument;
public class EchoClient {
public static void RequestSpring() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext1.xml", EchoClient.class);
WebServiceTemplate webServiceTemplate = (WebServiceTemplate) applicationContext
.getBean("webServiceTemplate1");
WlRequestDocument request = WlRequestDocument.Factory.newInstance();
request.addNewWlRequest().addNewFlights().addNewFlight().setTicketNo(new Long(1231235555).longValue());
WlResponseDocument response = (WlResponseDocument)webServiceTemplate.marshalSendAndReceive(request);
System.out.println(response.getWlResponse().getFlights().getFlightArray(0).getTicketNo());
}
public static void main(String[] args) throws IOException, JDOMException {
RequestSpring();
}
}
12、参考资?br />
http://xmlbeans.apache.org/
http://static.springframework.org/spring-ws/sites/1.5/reference/html/index.html
http://mdasgin.blogspot.com/2008/06/web-servisleri-bir-makinede-sunulan.html
http://www.infoq.com/cn/articles/arjen-poutsma-spring-ws
http://www.infoq.com/cn/articles/sosnoski-code-first
下蝲pdf版文?/a>
Tapestry .java
package common.tapestry;
public final class Tapestry {
public static final String LOGOUT_SERVICE = "logout";
}
LogoutService.java
package common.tapestry.engine;
import java.io.IOException;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.RestartService;
import common.tapestry.Tapestry;
public class LogoutService extends RestartService {
private LoginCookiesManager loginCookiesManager;
public void setLoginCookiesManager(
LoginCookiesManager loginCookiesManager) {
this.loginCookiesManager = loginCookiesManager;
}
public void service(IRequestCycle cycle) throws IOException {
loginCookiesManager.removeCookies();
super.service(cycle);
}
public String getName() {
return Tapestry.LOGOUT_SERVICE;
}
}
hivemodule.xml
<?xml version="1.0"?>
<module id="common.tapestry" version="1.0.0">
<!-- extends tapestry RestartService and clear the login cookies info-->
<service-point id="LogoutService" interface="org.apache.tapestry.engine.IEngineService">
<invoke-factory>
<construct class="common.tapestry.engine.LogoutService">
<set-service property="request" service-id="tapestry.globals.HttpServletRequest" />
<set-service property="response" service-id="tapestry.globals.HttpServletResponse" />
<set-object property="servletPath" value="app-property:org.apache.tapestry.servlet-path" />
<set-object property="linkFactory" value="infrastructure:linkFactory" />
<set-object property="loginCookiesManager" value="service:common.tapestry.LoginCookiesManager"/>
</construct>
</invoke-factory>
</service-point>
<contribution configuration-id="tapestry.services.ApplicationServices">
<service name="logout" object="service:common.tapestry.LogoutService" />
</contribution>
</module>
in your Pages
<a jwcid="@ServiceLink" href="#" service="ognl:@common.tapestry.Tapestry@LOGOUT_SERVICE" target="_top">退?lt;/a>
pd?br />
作者其他blog http://oxyc.spaces.live.com
http://hiok.blog.sohu.com
思\
首先BasePage是需要登陆的 protected ,
BasePage实现org.apache.tapestry.event.PageValidateListenerҎ(gu),判断asm对象Visit是否已经登陆
如没visit==null,去cookies扑֛用户名和密码从cycle中获得Login面
Login面实现common.tapestry.IConstructVisit接口。LoginPage登陆时保存用户名密码到cookies?q对cookies的值加?
cookies的key是baseUrl+key,取回时对cookiesD?加密解密的password攑ֈApplication的meta信息?
实现代码如下
抽象接口LoginCookiesManager
package common.tapestry.engine;
public interface LoginCookiesManager {
String APPLICATION_META_KEY_DEFAULT_COOKIES_IS_ENCRYPTION = "common.tapestry.default-cookies-encrypt";//是否需要加?默认加密
String APPLICATION_META_KEY_DEFAULT_COOKIES_ENCRYPTION_KEY = "common.tapestry.default-cookies-encryption-key";//加密的password
public static final String COOKIES_KEY_LOGIN_USERNAME = "USERNAME";
public static final String COOKIES_KEY_LOGIN_PASSWORD = "PASSWORD";
/**
* 用户名和密码写入cookies
* @param username
* @param password
* @param maxAge
*/
void writeCookies(String username,String password,int maxAge);
/**
* 清除用户名和密码cookies
*/
void removeCookies();
/**
* 从cookies中获得用户名
* @return
*/
String getUsername();
/**
* 从cookies中获得密?br />
* @return
*/
String getPassword();
}
LoginCookiesManagerImpl 实现
package common.tapestry.engine;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.tapestry.engine.IPropertySource;
import org.apache.tapestry.services.AbsoluteURLBuilder;
import org.apache.tapestry.services.CookieSource;
import org.apache.tapestry.web.WebRequest;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
public class LoginCookiesManagerImpl implements LoginCookiesManager {
private static StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
private IPropertySource applicationPropertySource;
private CookieSource cookieSource;
private WebRequest request;
private AbsoluteURLBuilder absoluteURLBuilder;
public void setApplicationPropertySource(
IPropertySource applicationPropertySource) {
this.applicationPropertySource = applicationPropertySource;
String encrypKey = getCookiesEncryptionKey();
standardPBEStringEncryptor.setPassword(encrypKey);
}
private String decrypt(String value) {
String tmp = value;
try {
tmp = standardPBEStringEncryptor.decrypt(value);
} catch (EncryptionOperationNotPossibleException e) {
throw new ApplicationRuntimeException("please clear your cookies");
}
return tmp;
}
private String encrypt(String value) {
return standardPBEStringEncryptor.encrypt(value);
}
private String getCookiesEncryptionKey() {
String temp = applicationPropertySource
.getPropertyValue(APPLICATION_META_KEY_DEFAULT_COOKIES_ENCRYPTION_KEY);
return (temp != null) ? temp : "crypassword";
}
private boolean isCookiesEncryption() {
String temp = applicationPropertySource
.getPropertyValue(APPLICATION_META_KEY_DEFAULT_COOKIES_IS_ENCRYPTION);
return (temp != null) ? Boolean.valueOf(temp).booleanValue() : true;
}
public void removeCookies() {
String cookiesKeyLogin_username = generateApplicationCookiesKey_Login__Username();
String cookiesKeyLogin_password = generateApplicationCookiesKey_Login__Password();
cookieSource.removeCookieValue(cookiesKeyLogin_username);
cookieSource.removeCookieValue(cookiesKeyLogin_password);
}
public void writeCookies(String username, String password, int maxAge) {
writeCookiesValue_Login__Username(username, maxAge);
writeCookiesValue_Login__Password(password, maxAge);
}
public String getUsername() {
String value = cookieSource
.readCookieValue(generateApplicationCookiesKey_Login__Username());
if (isCookiesEncryption()) {
value = decrypt(value);
}
return value;
}
public String getPassword() {
String value = cookieSource
.readCookieValue(generateApplicationCookiesKey_Login__Password());
if (isCookiesEncryption()) {
value = decrypt(value);
}
return value;
}
private void writeCookiesValue_Login__Username(String username, int maxAge) {
String key = generateApplicationCookiesKey_Login__Username();
String value = username;
if (isCookiesEncryption()) {
value = encrypt(username);
}
cookieSource.writeCookieValue(key, value, maxAge);
}
private void writeCookiesValue_Login__Password(String password, int maxAge) {
String key = generateApplicationCookiesKey_Login__Password();
String value = password;
if (isCookiesEncryption()) {
value = encrypt(password);
}
cookieSource.writeCookieValue(key, value, maxAge);
}
private String generateApplicationCookiesKey_Login__Username() {
return generateApplicationCookiesKey(COOKIES_KEY_LOGIN_USERNAME);
}
private String generateApplicationCookiesKey_Login__Password() {
return generateApplicationCookiesKey(COOKIES_KEY_LOGIN_PASSWORD);
}
private String generateApplicationCookiesKey(String key) {
String contextPath = request.getContextPath();
return absoluteURLBuilder.constructURL(contextPath + "/") + key;
}
public void setCookieSource(CookieSource cookieSource) {
this.cookieSource = cookieSource;
}
public void setRequest(WebRequest request) {
this.request = request;
}
public void setAbsoluteURLBuilder(AbsoluteURLBuilder absoluteURLBuilder) {
this.absoluteURLBuilder = absoluteURLBuilder;
}
}
hivemodule.xml配置
<?xml version="1.0"?>
<module id="common.tapestry" version="1.0.0">
<service-point id="LoginCookiesManager" interface="common.tapestry.engine.LoginCookiesManager">
<invoke-factory>
<construct class="common.tapestry.engine.LoginCookiesManagerImpl" >
<set-object property="cookieSource" value="infrastructure:cookieSource"/>
<set-service property="absoluteURLBuilder" service-id="tapestry.request.AbsoluteURLBuilder"/>
<set-service property="request" service-id="tapestry.globals.WebRequest"/>
<set-object property="applicationPropertySource" value="service:tapestry.props.ApplicationPropertySource"/>
</construct>
</invoke-factory>
</service-point>
<contribution configuration-id="tapestry.Infrastructure">
<property name="loginCookiesManager" object="service:common.tapestry.LoginCookiesManager"/>
</contribution>
</module>
使用
在BasePage中获得该service
public LoginCookiesManager getLoginCookiesManager() {
LoginCookiesManager svc = (LoginCookiesManager) getRequestCycle().getInfrastructure().getProperty("loginCookiesManager");
return svc;
}
/**
* 判断用户是否已经登陆
*
* @return
*/
private boolean isUserLoggedIn() {
Object asmVisit = this.getRequestCycle().getInfrastructure().getApplicationStateManager().get(ASM_VISIT);
if (!(asmVisit instanceof IVisit)) {
throw new ApplicationRuntimeException(
"The visit class must implements " + IVisit.class);
}
IVisit visit = (IVisit) asmVisit;
if (visit == null || (visit != null && !visit.isLoggedIn())) {
IPage loginPage = getRequestCycle().getPage(PAGE_LOGIN);
if (loginPage instanceof IConstructVisit) {
//从cookies中找回用户名和密?br />
String cookiesLoginUsername = getLoginCookiesManager().getUsername();
String cookiesLoginPassword = getLoginCookiesManager().getPassword();
IConstructVisit constructVisit = (IConstructVisit) loginPage;
visit = constructVisit.doConstructVisit(this.getRequestCycle(),
cookiesLoginUsername, cookiesLoginPassword);
} else {
throw new ApplicationRuntimeException("The " + PAGE_LOGIN
+ " class must implements " + IConstructVisit.class);
}
}
if (visit == null)
return Boolean.FALSE.booleanValue();
return visit.isLoggedIn();
}
Logincdd现如下接?br />
package common.tapestry;
import org.apache.tapestry.IRequestCycle;
public interface IConstructVisit {
public IVisit doConstructVisit(IRequestCycle cycle, String username,String password);
}
pd?br />
其他blog地址 http://oxyc.spaces.live.com/
http://hiok.blog.sohu.com
4*a = 7*b
->a = 7b/4
带入x = 2ay/3b
x = 2*7by/12b
x = 7y/6
(tng)
b = 4a/7
(n*a - 80*b)/y = n*a/x
n*a*x - 80*b*x = n*a*y
n*a*(x-y) = 80*b*x
n = 80*b*x
(tng) (tng) ------------
(tng) (tng) (tng) a*(x-y)
(tng) (tng) = (tng)80 *4a/7* 7y/6
(tng) (tng) ----------------
(tng) (tng) a* (7y/6 - y)
(tng)= 80*4/7 *7y/6
(tng)---------------
(tng)1y/6
(tng)= 80*4=320
(tng)
(tng)
(tng)
服务->q接~冲?>最大容?>5
问一? after checkout a new project from cvs how to use Maven to deploy the web ear to the weblogic? what is the first,second
copy build.properties.sample to build.properties
then modify it to fit your environment.
2. install weblogic plugin for weblogic (if not installed ) by
maven plugin:download -DartifactId=maven-weblogic-plugin -DgroupId=footmark-plugins -Dversion=0.1.1
3. invoking maven weblogic:prepare-domain to prepare weblogic runtime
4.invoking maven:create-launcher to create weblogic launcher which can be used to debug or run weblogic application server
that's all
catch me immediately if you have further more questions.
ok,i see
===================================
提纲:
===================================
一、通用?BR> 1.1 不用new关键词创建类的实?BR> 1.2 使用非阻塞I/O
1.3 慎用异常
1.4 不要重复初始化变?BR> 1.5 量指定cȝfinal修饰W?BR> 1.6 量使用局部变?BR> 1.7 乘法和除?BR>二、J2EE?BR> 2.1 使用~冲标记
2.2 始终通过?x)话Bean讉K实体Bean
2.3 选择合适的引用机制
2.4 在部|描q器中设|只d?BR> 2.5 ~冲对EJB Home的访?BR> 2.6 为EJB实现本地接口
2.7 生成主键
2.8 ?qing)时清除不再需要的?x)?BR> 2.9 在JSP面中关闭无用的?x)?BR> 2.10 Servlet与内存(sh)?BR> 2.11 HTTP Keep-Alive
2.12 JDBC与Unicode
2.13 JDBC与I/O
1.14 内存数据?BR>三、GUI?BR> 3.1 用JAR压羃cL?BR> 3.2 提示Applet装入q程
3.3 在画出图形之前预先装入它
3.4 覆盖updateҎ(gu)
3.5 延迟重画操作
3.6 使用双缓冲区
3.7 使用BufferedImage
3.8 使用VolatileImage
3.9 使用Window Blitting
四、补充资?BR>===================================
正文:
===================================
一、通用?/P>
"通用?讨论的问题适合于大多数Java应用?/P>
1.1 不用new关键词创建类的实?/P>
用new关键词创建类的实例时Q构造函数链中的所有构造函数都?x)被自动调用。但如果一个对象实C(jin)Cloneable接口Q我们可以调用它的clone()Ҏ(gu)。clone()Ҏ(gu)不会(x)调用McL造函数?/P>
在用设计模式(Design PatternQ的场合Q如果用Factory模式创徏对象Q则改用clone()Ҏ(gu)创徏新的对象实例非常单。例如,下面是Factory模式的一个典型实玎ͼ(x)
public static Credit getNewCredit() {return new Credit();}
改进后的代码使用clone()Ҏ(gu)Q如下所C:(x)
private static Credit BaseCredit = new Credit();public static Credit getNewCredit() {return (Credit) BaseCredit.clone();}
上面的思\对于数组处理同样很有用?/P>
1.2 使用非阻塞I/O
版本较低的JDK不支持非dI/O API。ؓ(f)避免I/OdQ一些应用采用了(jin)创徏大量U程的办法(在较好的情况下,?x)用一个缓冲池Q。这U技术可以在许多必须支持q发I/O的应用中见刎ͼ如Web服务器、报价和拍卖应用{。然而,创徏JavaU程需要相当可观的开销?/P>
JDK 1.4引入?jin)非d的I/O库(java.nioQ。如果应用要求用版本较早的JDKQ在q里有一个支持非dI/O的Y件包?/P>
请参见Sun中国|站的《调整Java的I/O性能》?/P>
1.3 慎用异常
异常Ҏ(gu)能不利。抛出异帔R先要创徏一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本圎ͼNativeQ方法,fillInStackTrace()Ҏ(gu)(g)查堆栈,攉调用跟踪信息。只要有异常被抛出,VM必调整调用堆栈,因ؓ(f)在处理过E中创徏?jin)一个新的对象?/P>
异常只能用于错误处理Q不应该用来控制E序程?/P>
1.4 不要重复初始化变?/P>
默认情况下,调用cȝ构造函数时Q?Java?x)把变量初始化成定的|(x)所有的对象被设|成nullQ整数变量(byte、short、int、longQ设|成0Qfloat和double变量讄?.0Q逻辑D|成false。当一个类从另一个类zӞq一点尤其应该注意,因ؓ(f)用new关键词创Z个对象时Q构造函数链中的所有构造函数都?x)被自动调用?/P>
1.5 量指定cȝfinal修饰W?/P>
带有final修饰W的cL不可z的。在Java核心(j)API中,有许多应用final的例子,例如java.lang.String。ؓ(f)StringcL定final防止?jin)h们覆盖length()Ҏ(gu)?/P>
另外Q如果指定一个类为finalQ则该类所有的Ҏ(gu)都是final。Java~译器会(x)LZ(x)内联QinlineQ所有的finalҎ(gu)Q这和具体的~译器实现有养I(j)。此举能够性能q_提高50%?/P>
1.6 量使用局部变?/P>
调用Ҏ(gu)时传递的参数以及(qing)在调用中创徏的(f)时变量都保存在栈QStackQ中Q速度较快。其他变量,如静(rn)态变量、实例变量等Q都在堆QHeapQ中创徏Q速度较慢。另外,依赖于具体的~译?JVMQ局部变量还可能得到q一步优化。请参见《尽可能使用堆栈变量》?/P>
1.7 乘法和除?/P>
考虑下面的代码:(x)
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码Q?/P>
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
修改后的代码不再做乘?sh)?的操作,而是改用{h(hun)的左U?位操作,每左U?位相当于乘(sh)2。相应地Q右U?位操作相当于除以2。值得一提的是,虽然UM操作速度快,但可能代码比较难于理解Q所以最好加上一些注释?/P>
二、J2EE?/P>
前面介绍的改善性能技巧适合于大多数Java应用Q接下来要讨论的问题适合于用JSP、EJB或JDBC的应用?/P>
2.1 使用~冲标记
一些应用服务器加入?jin)面向JSP的缓冲标记功能。例如,BEA的WebLogic Server?.0版本开始支持这个功能,Open Symphony工程也同h持这个功能。JSP~冲标记既能够缓冲页面片断,也能够缓冲整个页面。当JSP面执行Ӟ如果目标片断已经在缓冲之中,则生成该片断的代码就不用再执行。页面~冲捕获Ҏ(gu)定URL的请求,q缓冲整个结果页面。对于购物篮、目录以?qing)门L(fng)站的主页来说Q这个功能极其有用。对于这cd用,面U缓冲能够保存页面执行的l果Q供后(h)h使用?/P>
对于代码逻辑复杂的页面,利用~冲标记提高性能的效果比较明显;反之Q效果可能略逊一{V?/P>
请参见《用~冲技术提高JSP应用的性能和稳定性》?/P>
2.2 始终通过?x)话Bean讉K实体Bean
直接讉K实体Bean不利于性能。当客户E序q程讉K实体BeanӞ每一个getҎ(gu)都是一个远E调用。访问实体Bean的会(x)话Bean是本地的Q能够把所有数据组l成一个结构,然后q回它的倹{?/P>
用会(x)话Bean装对实体Bean的访问能够改q事务管理,因ؓ(f)?x)话Bean只有在到达事务边界时才会(x)提交。每一个对getҎ(gu)的直接调用生一个事务,容器在每一个实体Bean的事务之后执行一?装入-d"操作?/P>
一些时候,使用实体Bean?x)导致程序性能不佳。如果实体Bean的唯一用途就是提取和更新数据Q改成在?x)话Bean之内利用JDBC讉K数据库可以得到更好的性能?/P>
2.3 选择合适的引用机制
在典型的JSP应用pȝ中,头、页脚部分往往被抽取出来,然后Ҏ(gu)需要引入页头、页脚。当前,在JSP面中引入外部资源的Ҏ(gu)主要有两U:(x)include指o(h)Q以?qing)include动作?/P>
include指o(h)Q例如。该指o(h)在编译时引入指定的资源。在~译之前Q带有include指o(h)的页面和指定的资源被合ƈ成一个文件。被引用的外部资源在~译时就定Q比q行时才定资源更高效?/P>
include动作Q例如。该动作引入指定面执行后生成的l果。由于它在运行时完成Q因此对输出l果的控制更加灵zR但Ӟ只有当被引用的内定wJ地改变Ӟ或者在对主面的请求没有出C前,被引用的面无法定Ӟ使用include动作才合?/P>
2.4 在部|描q器中设|只d?/P>
实体Bean的部|描q器允许把所有getҎ(gu)讄?只读"。当某个事务单元的工作只包含执行d操作的方法时Q设|只d性有利于提高性能Q因为容器不必再执行存储操作?/P>
2.5 ~冲对EJB Home的访?/P>
EJB Home接口通过JNDI名称查找获得。这个操作需要相当可观的开销。JNDI查找最好放入Servlet的init()Ҏ(gu)里面。如果应用中多处频繁地出现EJB讉KQ最好创Z个EJBHomeCachecREJBHomeCachecM般应该作为singleton实现?/P>
2.6 为EJB实现本地接口
本地接口是EJB 2.0规范新增的内容,它得Bean能够避免q程调用的开销。请考虑下面的代码?/P>
PayBeanHome home = (PayBeanHome) javax.rmi.PortableRemoteObject.narrow (ctx.lookup ("PayBeanHome"), PayBeanHome.class); PayBean bean = (PayBean) javax.rmi.PortableRemoteObject.narrow (home.create(), PayBean.class);
W一个语句表C我们要LBean的Home接口。这个查N过JNDIq行Q它是一个RMI调用。然后,我们定位q程对象Q返回代理引用,q也是一个RMI调用。第二个语句C?jin)如何创Z个实例,涉及(qing)?jin)创建IIOPhq在|络上传输请求的stubE序Q它也是一个RMI调用?/P>
要实现本地接口,我们必须作如下修改:(x)
Ҏ(gu)不能再抛出java.rmi.RemoteException异常Q包括从RemoteExceptionz的异常,比如TransactionRequiredException、TransactionRolledBackException和NoSuchObjectException。EJB提供?jin)等L(fng)本地异常Q如TransactionRequiredLocalException、TransactionRolledBackLocalException和NoSuchObjectLocalException?/P>
所有数据和q回值都通过引用的方式传递,而不是传递倹{?/P>
本地接口必须在EJB部v的机器上使用。简而言之,客户E序和提供服务的lg必须在同一个JVM上运行?/P>
如果Bean实现?jin)本地接口,则其引用不可串行化?/P>
请参见《用本地引用提高EJB讉K效率》?/P>
2.7 生成主键
在EJB之内生成主键有许多途径Q下面分析了(jin)几种常见的办法以?qing)它们的特点?/P>
利用数据库内建的标识机制QSQL Server的IDENTITY或Oracle的SEQUENCEQ。这U方法的~点是EJB可移植性差?/P>
由实体Bean自己计算主键|比如做增量操作)(j)。它的缺Ҏ(gu)要求事务可串行化Q而且速度也较慢?/P>
利用NTP之类的时钟服务。这要求有面向特定^台的本地代码Q从而把Bean固定C(jin)特定的OS之上。另外,它还D?jin)这样一U可能,卛_多CPU的服务器上,同一个毫U之内生成了(jin)两个主键?/P>
借鉴Microsoft的思\Q在Bean中创Z个GUID。然而,如果不求助于JNIQJava不能定|卡的MAC地址Q如果用JNIQ则E序p依赖于特定的OS?/P>
q有其他几种办法Q但q些办法同样都有各自的局限。似乎只有一个答案比较理惻I(x)l合q用RMI和JNDI。先通过RMI注册把RMIq程对象l定到JNDI?wi)。客L(fng)序通过JNDIq行查找。下面是一个例子:(x)
public class keyGenerator extends UnicastRemoteObject implements Remote { private static long KeyValue = System.currentTimeMillis(); public static synchronized long getKey() throws RemoteException { return KeyValue++; }
2.8 ?qing)时清除不再需要的?x)?/P>
Z(jin)清除不再zd的会(x)话,许多应用服务器都有默认的?x)话时旉Q一般ؓ(f)30分钟。当应用服务器需要保存更多会(x)话时Q如果内存容量不I操作pȝ?x)把部分内存数据转移到磁盘,应用服务器也可能?gu)"最q最频繁使用"QMost Recently UsedQ算法把部分不活跃的?x)话转储到磁盘,甚至可能抛?内存?sh)?异常。在大规模系l中Q串行化?x)话的代h很昂늚。当?x)话不再需要时Q应当及(qing)时调用HttpSession.invalidate()Ҏ(gu)清除?x)话。HttpSession.invalidate()Ҏ(gu)通常可以在应用的退出页面调用?/P>
2.9 在JSP面中关闭无用的?x)?/P>
对于那些无需跟踪?x)话状态的面Q关闭自动创建的?x)话可以节省一些资源。用如下page指o(h)Q?/P>
2.10 Servlet与内存(sh)?/P>
许多开发者随意地把大量信息保存到用户?x)话之中。一些时候,保存在会(x)话中的对象没有及(qing)时地被垃圑֛收机制回收。从性能上看Q典型的症状是用h到系l周期性地变慢Q却又不能把原因归于M一个具体的lg。如果监视JVM的堆I间Q它的表现是内存占用不正常地大v大落?/P>
解决q类内存问题?sh)要有二U办法。第一U办法是Q在所有作用范围ؓ(f)?x)话的Bean中实现HttpSessionBindingListener接口。这P只要实现valueUnbound()Ҏ(gu)Q就可以昑ּ地释放Bean使用的资源?/P>
另外一U办法就是尽快地把会(x)话作废。大多数应用服务器都有设|会(x)话作废间隔时间的选项。另外,也可以用~程的方式调用会(x)话的setMaxInactiveInterval()Ҏ(gu)Q该Ҏ(gu)用来讑֮在作废会(x)话之前,Servlet容器允许的客戯求的最大间隔时_(d)以秒计?/P>
2.11 HTTP Keep-Alive
Keep-Alive功能使客L(fng)到服务器端的q接持箋(hu)有效Q当出现Ҏ(gu)务器的后l请求时QKeep-Alive功能避免?jin)徏立或者重新徏立连接。市(jng)Z的大部分Web服务器,包括iPlanet、IIS和ApacheQ都支持HTTP Keep-Alive。对于提供静(rn)态内容的|站来说Q这个功能通常很有用。但是,对于负担较重的网站来_(d)q里存在另外一个问题:(x)虽然为客户保留打开的连接有一定的好处Q但它同样媄(jing)响了(jin)性能Q因为在处理暂停期间Q本来可以释攄资源仍旧被占用。当Web服务器和应用服务器在同一台机器上q行ӞKeep-Alive功能对资源利用的影响其H出?/P>
2.12 JDBC与Unicode
惛_你已l了(jin)解一些用JDBC时提高性能的措施,比如利用q接池、正地选择存储q程和直接执行的SQL、从l果集删除多余的列、预先编译SQL语句Q等{?/P>
除了(jin)q些显而易见的选择之外Q另一个提高性能的好选择可能是把所有的字符数据都保存(sh)ؓ(f)UnicodeQ代码页13488Q。Java以Unicode形式处理所有数据,因此Q数据库驱动E序不必再执行{换过E。但应该CQ如果采用这U方式,数据库会(x)变得更大Q因为每个Unicode字符需?个字节存储空间。另外,如果有其他非Unicode的程序访问数据库Q性能问题?sh)旧会(x)出玎ͼ因?f)q时数据库驱动程序仍旧必L行{换过E?/P>
2.13 JDBC与I/O
如果应用E序需要访问一个规模很大的数据集,则应当考虑使用块提取方式。默认情况下QJDBC每次提取32行数据。D例来_(d)假设我们要遍历一?000行的记录集,JDBC必须调用数据?57ơ才能提取到全部数据。如果把块大改?12Q则调用数据库的ơ数减到10ơ?/P>
在一些情形下q种技术无效。例如,如果使用可滚动的记录集,或者在查询中指定了(jin)FOR UPDATEQ则块操作方式不再有效?/P>
1.14 内存数据?/P>
许多应用需要以用户为单位在?x)话对象中保存相当数量的数据Q典型的应用如购物篮和目录等。由于这cL据可以按照行/列的形式l织Q因此,许多应用创徏?jin)庞大的Vector或HashMap。在?x)话中保存这cL据极大地限制?jin)应用的可~性,因ؓ(f)服务器拥有的内存臛_必须辑ֈ每个?x)话占用的内存数量乘(sh)ƈ发用h大数量,它不仅服务器h(hun)格昂贵,而且垃圾攉的时间间隔也可能廉到难以忍受的E度?/P>
一些h把购物篮/目录功能转移到数据库层,在一定程度上提高?sh)(jin)可伸羃性。然而,把这部分功能攑ֈ数据库层也存在问题,且问题的Ҏ(gu)与大多数关系数据库系l的体系l构有关。对于关pL据库来说Q运行时的重要原则之一是确保所有的写入操作E_、可靠,因而,所有的性能问题都与物理上把数据写入盘的能力有兟뀂关pL据库力图减少I/O操作Q特别是对于L作,但实现该目标的主要途径只是执行一套实现缓冲机制的复杂法Q而这正是数据库层W一h能瓉通常LCPU的主要原因?/P>
一U替代传l关pL据库的方案是Q用在内存?sh)运行的数据库(In-memory DatabaseQ,例如TimesTen。内存数据库的出发点是允许数据(f)时地写入Q但q些数据不必怹C存到盘?sh),所有的操作都在内存?sh)进行。这P内存数据库不需要复杂的法来减I/O操作Q而且可以采用比较单的加锁机制Q因而速度很快?/P>
三、GUI?/P>
q一部分介绍的内定w合于图形用L(fng)面的应用QApplet和普通应用)(j)Q要用到AWT或Swing?/P>
3.1 用JAR压羃cL?/P>
Java档案文gQJAR文gQ是Ҏ(gu)JavaBean标准压羃的文Ӟ是发布JavaBeanlg的主要方式和推荐方式。JAR档案有助于减文件体U,~短下蝲旉。例如,它有助于Applet提高启动速度。一个JAR文g可以包含一个或者多个相关的Bean以及(qing)支持文gQ比如图形、声韟뀁HTML和其他资源?/P>
要在HTML/JSP文g中指定JAR文gQ只需在Applet标记中加入ARCHIVE = "name.jar"声明?/P>
请参见《用档案文件提?applet 的加载速度》?/P>
3.2 提示Applet装入q程
你是否看到过使用Applet的网站,注意到在应该q行Applet的地方出C(jin)一个占位符Q当Applet的下载时间较长时Q会(x)发生什么事情?最大的可能是用户掉头d。在q种情况下,昄一个Applet正在下蝲的信息无疑有助于鼓励用户l箋(hu){待?/P>
下面我们来看看一U具体的实现Ҏ(gu)。首先创Z个很的AppletQ该Applet负责在后C载正式的AppletQ?/P>
import java.applet.Applet;import java.applet.AppletStub;import java.awt.Label;import java.awt.Graphics;import java.awt.GridLayout; public class PreLoader extends Applet implements Runnable, AppletStub { String largeAppletName; Label label; public void init() { // 要求装蝲的正式Applet largeAppletName = getParameter("applet"); // "L(fng){?提示信息 label = new Label("L(fng){?.." + largeAppletName); add(label); } public void run(){ try { // 获得待装载Applet的类 Class largeAppletClass = Class.forName(largeAppletName); // 创徏待装载Applet的实?nbsp; Applet largeApplet = (Applet)largeAppletClass.newInstance(); // 讄该Applet的StubE序 largeApplet.setStub(this); // 取消"L(fng){?信息 remove(label); // 讄布局 setLayout(new GridLayout(1, 0)); add(largeApplet); // 昄正式的Applet largeApplet.init(); largeApplet.start(); } catch (Exception ex) { // 昄错误信息 label.setText("不能装入指定的Applet"); } // h屏幕 validate(); } public void appletResize(int width, int height) { // 把appletResize调用从stubE序传递到Applet resize(width, height); }}
~译后的代码于2KQ下载速度很快。代码中有几个地方值得注意。首先,PreLoader实现?jin)AppletStub接口。一般地QApplet从调用者判断自qcodebase。在本例中,我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地Ҏ(gu)QAppletStub接口包含许多和AppletcML(fng)Ҏ(gu)Q但appletResize()Ҏ(gu)除外。这里我们把对appletResize()Ҏ(gu)的调用传递给?jin)resize()Ҏ(gu)?/P>
3.3 在画出图形之前预先装入它
ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate()Q能够用一ơrepaint()操作在屏q上d囑Ş。下面提供了(jin)一个例子?/P>
public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { if ((flags & ALLBITS) !=0 { repaint(); } else if (flags & (ERROR |ABORT )) != 0) { error = true; // 文g没有扑ֈQ考虑昄一个占位符 repaint(); } return (flags & (ALLBITS | ERROR| ABORT)) == 0;}
当图形信息可用时QimageUpdate()Ҏ(gu)被调用。如果需要进一步更斎ͼ该方法返回trueQ如果所需信息已经得到Q该Ҏ(gu)q回false?/P>
3.4 覆盖updateҎ(gu)
update()Ҏ(gu)的默认动作是清除屏幕Q然后调用paint()Ҏ(gu)。如果用默认的update()Ҏ(gu)Q频J用图形的应用可能出现昄闪烁现象。要避免在paint()调用之前的屏q清除操作,只需按照如下方式覆盖update()Ҏ(gu)Q?/P>
public void update(Graphics g) { paint(g);}
更理想的Ҏ(gu)是:(x)覆盖update()Q只重画屏幕上发生变化的区域Q如下所C:(x)
public void update(Graphics g) { g.clipRect(x, y, w, h); paint(g);}
3.5 延迟重画操作
对于囑Ş用户界面的应用来_(d)性能低下的主要原因往往可以归结为重dq的效率低下。当用户改变H口大小或者滚动一个窗口时Q这一炚w常可以很明昑֜观察到。改变窗口大或者滚动屏q之cȝ操作D重画屏幕事g大量地、快速地生成Q甚臌q了(jin)相关代码的执行速度。对付这个问题最好的办法是忽略所?q到"的事件?/P>
在这里引入一个数毫秒的时差,卛_果我们立x(chng)收到?jin)另一个重MӞ可以停止处理当前事g转而处理最后一个收到的重画事gQ否则,我们l箋(hu)q行当前的重画过E?/P>
如果事g要启动一耗时的工作,分离Z个工作线E是一U较好的处理方式Q否则,一些部件可能被"ȝ"Q因为每ơ只能处理一个事件。下面提供了(jin)一个事件处理的单例子,但经q扩展后它可以用来控制工作线E?/P>
3.6 使用双缓冲区
在屏q之外的~冲区绘图,完成后立x(chng)整个囑Ş昄出来。由于有两个~冲区,所以程序可以来回切换。这P我们可以用一个低优先U的U程负责dQ得程序能够利用空闲的CPU旉执行其他d。下面的伪代码片断示范了(jin)q种技术?/P>
Graphics myGraphics;Image myOffscreenImage = createImage(size().width, size().height);Graphics offscreenGraphics = myOffscreenImage.getGraphics(); offscreenGraphics.drawImage(img, 50, 50, this);myGraphics.drawImage(myOffscreenImage, 0, 0, this);
3.7 使用BufferedImage
Java JDK 1.2使用?jin)一个Y昄讑֤Q得文本在不同的^C看v来相伹{ؓ(f)实现q个功能QJava必须直接处理构成文字的像素。由于这U技术要在内存(sh)大量地进行位复制操作Q早期的JDK在用这U技术时性能不佳。ؓ(f)解决q个问题而提出的Java标准实现?jin)一U新的图形类型,即BufferedImage?/P>
BufferedImage子类描述的图形带有一个可讉K的图形数据缓冲区。一个BufferedImage包含一个ColorModel和一l光栅图形数据。这个类一般用RGBQ红、绿、蓝Q颜色模型,但也可以处理灰度U图形。它的构造函数很单,如下所C:(x)
public BufferedImage (int width, int height, int imageType)
ImageType允许我们指定要缓冲的是什么类型的囑ŞQ比?-位RGB?-位RGB、灰度{?/P>
3.8 使用VolatileImage
许多gq_和它们的操作pȝ都提供基本的g加速支持。例如,g加速一般提供矩形填充功能,和利用CPU完成同一d相比Q硬件加速的效率更高。由于硬件加速分M(jin)一部分工作Q允许多个工作流q发q行Q从而缓解了(jin)对CPU和系lȝ的压力,使得应用能够q行得更快。利用VolatileImage可以创徏g加速的囑Ş以及(qing)理囑Ş的内宏V由于它直接利用低层q_的能力,性能的改善程度主要取决于pȝ使用的图形适配器。VolatileImage的内定w时可能丢失,也即它是"不稳定的QvolatileQ?。因此,在用图形之前,最好检查一下它的内Ҏ(gu)否丢失。VolatileImage有两个能够检查内Ҏ(gu)否丢qҎ(gu)Q?/P>
public abstract int validate(GraphicsConfiguration gc);public abstract Boolean contentsLost();
每次从VolatileImage对象复制内容或者写入VolatileImageӞ应该调用validate()Ҏ(gu)。contentsLost()Ҏ(gu)告诉我们Q自从最后一ơvalidate()调用之后Q图形的内容是否丢失?/P>
虽然VolatileImage是一个抽象类Q但不要从它q里z子类。VolatileImage应该通过Component.createVolatileImage()或者GraphicsConfiguration.createCompatibleVolatileImage()Ҏ(gu)创徏?/P>
3.9 使用Window Blitting
q行滚动操作Ӟ所有可见的内容一般都要重画,从而导致大量不必要的重d作。许多操作系l的囑Ş子系l,包括WIN32 GDI、MacOS和X/WindowsQ都支持Window Blitting技术。Window Blitting技术直接在屏幕~冲Z把图形移到新的位|,只重L出现的区域。要在Swing应用中用Window Blitting技术,讄Ҏ(gu)如下Q?/P>
setScrollMode(int mode);
在大多数应用中,使用q种技术能够提高滚动速度。只有在一U情形下QW(xu)indow Blitting?x)导致性能降低Q即应用在后台进行滚动操作。如果是用户在滚动一个应用,那么它L在前収ͼ无需担心(j)M负面影响?/P>
MVC框架
A controller servlet that dispatches requests to appropriate action classes
provided by the application developer.
All requests are dispatched through a single controller servlet that is part of the
framework.
单独的控制器把所有的h集中分发
This controller provides numerous application-wide services, such as
database connection pooling and automatic request dispatching. The controller
creates action classes, which are built by the developer to perform the work of the
application. These action classes extend the Struts Action class. This is a perfect
example of a reusable framework part—the controller is designed to create
Action subclasses to perform work. This aspect of Struts is based on the Command
design pattern, which allows for parameterizing activities.
控制器提供了(jin)众多的应用程序范围的服务,例如数据库连接池,h自动分发.控制器创建开发者提供解决业务问题的action业务c?BR>q些actioncd括Struts Action class.控制器可以重复创建ActioncL复用框架
The action instances create model beans that perform domain-specific activities.
Examples of these activities include executing business logic, connecting to
databases, and calling other bean methods. The model beans encapsulate the real
work of the application, just as in Model 2. Once the action instance has utilized
the model beans to perform work, it forwards the models that contribute to the
display via the controller to a view component, generally a JSP (although other
view options are possible; see the discussion on Velocity in chapter 9). The view
extracts the model beans and presents the visual results to the user. As you can
see, this is the same general information flow described in Model 2. Struts provides
a great deal of the infrastructure to make it easy to accommodate this information
flow.
Struts handles other details of application development as well. The framework
includes numerous custom JSP tags to help you construct the view. It also
provides classes that aid in internationalization, database connection pooling, and
flexible resource mapping.
Struts is a fairly lightweight framework whose primary job is to facilitate building
web applications using Model 2. I estimate that Struts saves from 35 to 40 percent
of the typical amount of effort to build a Model 2 application. One of Struts?BR>strengths is its cohesiveness—it doesn’t supply services outside those needed for
building Model 2 applications. Other frameworks are much more extensive; the
Turbine framework is one of them.
摘自<ARTOF
JAVA WEB
DEVELOPMENT>
EnterpriseDB is an enterprise-class relational database management system (RDBMS) that is built on PostgreSQL, the world's most advanced open source database. EnterpriseDB is compatible with most Oracle applications, reliable and scalable enough for high-volume, mission-critical enterprise use, and surprisingly affordable.
http://www.enterprisedb.com/products/index.do
Mysql
The World's Most Popular Open Source Database
http://dev.mysql.com/
Postgresql
The world's most advanced open source database.
http://www.postgresql.org/
Request-based frameworks are very close to the original CGI specification. They use controllers and actions that directly handle incoming requests. Each request is fundamentally stateless. With the introduction of server-side sessions, a certain degree of statefulness has been achieved. The different frameworks basically differentiate themselves by the way they map logic to URLs and how data is structured and provided to the developer.
Component-based frameworks abstract the developer away from the internals of the request handling and encapsulate the logic into reusable components, often independent from the web medium. The state is automatically handled by the framework, based on the data that is present in each component instance. Together with some form of event handling, this development model is very similar to the features offered by desktop GUI toolkits. The different frameworks basically differentiate themselves by the provided component API and how components are combined together.
http://www.rifers.org/
https://rife-jumpstart.dev.java.net/
- 作者:(x) HairRoot 2005q?5?4? 星期?20:02
q是以jsp+扩展标签为基本的框架~~
用扩展标{?感觉q是不如 Tapestry 的用ongl实现的组件来的好
表示你现在查询的对象所兌的对象有问题Q一般是因ؓ(f)数据的问题(该对象所兌的对象找不到Q?/P>
Caused by: org.dom4j.DocumentException: Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence.
如果出现q行错误说明你的xml配置文g有不规范的字W,(g)查下?
net.sf.hibernate.MappingException: Error reading resource: hibernate/Hello_Bean.hbm.xml
如果出现q行错误说明你的hibernate的XML配置文g有错
net.sf.hibernate.MappingException: Resource: hibernate/Hello_Bean.hbm.xml not found
如果出现q行错误说明hibernate的XML配置文g没有扑ֈQ你应该把XML文g攑֜与你的类文g同个目录?本文中是攑֜hibernate\classes\hibernate\目录下,也就是跟Hello_Bean.classcL件一赗?
net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean
如果出现q行错误说明你的xml文g里设|的字段名name的gHello_Bean.javac里的getXXX或setXXXҎ(gu)不一致?
net.sf.hibernate.HibernateException: JDBC Driver class not found: org.gjt.mm.mysql.Driver
如果出现q行错误说明你的MYSQL驱动没有加进JB库里或者不在CLASSPATH里?/P>
Inversion of Control/Dependency Injection
IOC容器相当于一个bean工厂,来管理整个应用程序中使用的bean,来管理这些bean的生命周?
实现IOC/DI是通过一堆描q文?IOC容器Ҏ(gu)q堆描述文g来实现创建对象提供服务等工作;
一般情况下,我们通过new一个对象ƈ调用q个对象的某个方法来完成服务.
既然有了(jin)IOC容器理概念,那么通过描述文g容器׃ؓ(f)我们创徏所需要对象和Ҏ(gu).
好处是减少?jin)硬~码.
There are three different implementation pattern types for IoC:
type-1 | Services need to implement a dedicated interface through which they are provided with an object from which they can look up dependencies (other services). This is the pattern used by the earlier containers provided by Excalibur. |
type-2 | Services dependencies upon are assigned via JavaBeans properties (setter methods). Both HiveMind and Spring use this approach. |
type-3 | Services dependencies are provided as constructor parameters (and are not exposed as JavaBeans properties). This is the exclusive approach used by PicoContainer, and is also used in HiveMind and Spring. |
介绍MD5加密法基本情况MD5的全U是Message-Digest Algorithm 5Q在90q代初由MIT的计机U学实验室和RSA Data Security Inc发明Q经MD2、MD3和MD4发展而来?BR>Message-Digest泛指字节?Message)的Hash变换Q就是把一个Q意长度的字节串变换成一定长的大整数。请注意我用了(jin)"字节?而不?字符?q个词,是因U变换只与字节的值有养I与字W集或编码方式无兟?
MD5Q意长度的"字节?变换成一?28bit的大整数Qƈ且它是一个不可逆的字符串变换算法,换句话说是Q即使你看到源程序和法描述Q也无法一个MD5的值变换回原始的字W串Q从数学原理上说Q是因ؓ(f)原始的字W串有无I多个,q有点象不存在反函数的数学函数?/P>
MD5的典型应用是对一DMessage(字节?产生fingerprint(指纹)Q以防止?改"。D个例子,你将一D话写在一个叫readme.txt文g中,q对q个readme.txt产生一个MD5的值ƈ记录在案Q然后你可以传播q个文gl别人,别h如果修改?jin)文件中的Q何内容,你对q个文g重新计算MD5时就?x)发现。如果再有一个第三方的认证机构,用MD5q可以防止文件作者的"抵赖"Q这是所谓的数字{应用?/P>
MD5q广泛用于加密和解密技术上Q在很多操作pȝ中,用户的密码是以MD5|或类似的其它法Q的方式保存的,用户Login的时候,pȝ是把用户输入的密码计成MD5|然后再去和系l中保存的MD5D行比较,而系lƈ?知道"用户的密码是什么?/P>
一些黑客破莯U密码的Ҏ(gu)是一U被UCؓ(f)"跑字?的方法。有两种Ҏ(gu)得到字典Q一U是日常搜集的用做密码的字符串表Q另一U是用排列组合方法生成的Q先用MD5E序计算?gu)些字兔R的MD5|然后再用目标的MD5值在q个字典中检索?/P>
即假设密码的最大长度ؓ(f)8Q同时密码只能是字母和数字,?6+26+10=62个字W,排列l合出的字典的项数则是P(62,1)+P(62,2)....+P(62,8)Q那也已l是一个很天文的数字了(jin)Q存储这个字典就需要TBU的盘l,而且q种Ҏ(gu)q有一个前提,是能获得目标̎L(fng)密码MD5值的情况下才可以?/P>
在很多电(sh)子商务和C应用中,理用户的Account是一U最常用的基本功能,管很多Application Server提供?jin)这些基本组Ӟ但很多应用开发者ؓ(f)?jin)管理的更大的灵zL还是喜Ƣ采用关pL据库来管理用P懒惰的做法是用户的密码往往使用明文或简单的变换后直接保存在数据库中Q因此这些用L(fng)密码对Y件开发者或pȝ理员来说可以说毫无保密可言Q本文的目的是介lMD5的Java Bean的实玎ͼ同时l出用MD5来处理用L(fng)Account密码的例子,q种Ҏ(gu)使得理员和E序设计者都无法看到用户的密码,管他们可以初始化它们。但重要的一Ҏ(gu)对于用户密码讄?fn)惯的保?/P>
MD加密法的JAVA描述为:(x)