mashiguang

小马快跑

  语源科技BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  20 随笔 :: 0 文章 :: 60 评论 :: 0 Trackbacks

2007年7月7日 #

spring2.5-reference.pdf
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=d9d1668c0b162f26d115a49e0b308e4f


deerjet src.zip
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=c859c9a30c5f19e2732255e81a4f0c36

jQueryAPI-100214.chm
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=c64a572a16f169ac6db829a3122c4279

hibernate_annotations.pdf
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=88bd4e31848fda5ca2e65b6fc19df73f

hibernate_reference.pdf
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=603986150b7056ce617289370197ea9a

HQL与Criteria对照.pdf
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=c2805f9d49171f6165baa528a29774c7

oracle编程艺术.pdf
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=0c39f09f81f674ef67016482a224a025

精通oracle10g pl_sql编程.pdf
http://m0.mail.sina.com.cn/apps/netdisk/download.php?id=455bb7bbfeff510ee66acafe6c8f035b
posted @ 2011-08-11 23:05 mashiguang| 编辑 收藏

public PageModel<CrmWarning> query(PageModel<CrmWarning> pageModel)
            
throws Exception {
        Assert.notNull(pageModel);
        
        DetachedCriteria dc 
= DetachedCriteria.forClass(CrmWarning.class);
        
        
/*
         * 添加查询条件
         * 如:dc.add(Restrictions.like("key", "%"+pageModel.getCondition("key")+"%"));
         * 
         * 
*/
        
if (null != pageModel.getCondition("warnLevel")) {
            dc.add(Restrictions.eq(
"warnLevel", pageModel.getCondition("warnLevel")));
        }
        
if (StringUtils.isNotBlank((String)pageModel.getCondition("detail"))) {
            dc.add(Restrictions.like(
"detail""%"+pageModel.getCondition("detail")+"%"));
        }
        
if (StringUtils.isNotBlank((String)pageModel.getCondition("warnDate"))) {
            
/*
             * warnDate格式是yyyy-MM-dd,这里改成查询这一天的预警
             * Restrictions.sqlRestriction()允许写原生sql的方式完成特殊需求,如下
             * 
*/
            dc.add(Restrictions.sqlRestriction(
"to_char(time_start,'yyyy-MM-dd') = '" + pageModel.getCondition("warnDate"+ "'"));
        }
        
if (null != pageModel.getCondition("templateId")) {
            
/*
             * 这里的templateId是模板的主键id,查询时应该转换成模板对象
             * 
*/
            CrmWarnTemplate warnTemplate 
= new CrmWarnTemplate();
            warnTemplate.setTemplateId((Long)pageModel.getCondition(
"templateId"));
            dc.add(Restrictions.eq(
"crmWarnTemplate", warnTemplate));
        }
        
        dc.addOrder(Order.asc(
"crmWarnTemplate"));
        dc.addOrder(Order.desc(
"timeStart"));
        
        pageModel.setDateList(warningDao.query(dc, pageModel.getFirstNote(), pageModel.getNumInPage()));
        pageModel.setTotal(warningDao.count(dc));
        
        
return pageModel;
    }
posted @ 2011-08-11 22:50 mashiguang| 编辑 收藏

package com.jl.dao.bookplatform.impl;

import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;
import org.springframework.dao.DataAccessException;

import com.jl.dao.baseDao.GenericDao;
import com.jl.dao.bookplatform.ProductItemDao;
import com.jl.entity.bookplatform.CrmProduct;
import com.jl.entity.bookplatform.CrmProductItem;
import com.jl.entity.bookplatform.ProductItemConfig;

public class ProductItemDaoImpl extends GenericDao<CrmProductItem, Long> implements ProductItemDao {

    
    
public List<ProductItemConfig> getProductItemConfigs(Long productId, Long planetypeId) throws DataAccessException{
        String sql 
= "select chi.charge_item_id \"chargeItemId\"," +
                
" chi.charge_item \"chargeItem\"," +
                
" chi.charge_unit \"chargeUnit\"," +
                
" cpi.product_id \"productId\"," +
                
" cpi.product_item_id \"productItemId\"," +
                
" cpi.sale_planetype_id \"salePlanetypeId\"," +
                
" cpi.inland_price \"inlandPrice\"," +
                
" cpi.outland_price \"outlandPrice\"" +
                
" from (select * from crm_charge_item chi2 where chi2.if_regular = 1) chi left join crm_product_item cpi" +
                
" on cpi.charge_item_id = chi.charge_item_id " +
                
" and cpi.product_id = ?" +
                
" and cpi.sale_planetype_id = ?" +
                
" order by chi.charge_item_id";
        
        Session session 
= getSession();
        Query query 
= session.createSQLQuery(sql)
            .addScalar(
"chargeItemId", Hibernate.LONG)
            .addScalar(
"chargeItem",Hibernate.STRING)
            .addScalar(
"chargeUnit",Hibernate.STRING)
            .addScalar(
"productId",Hibernate.LONG)
            .addScalar(
"productItemId",Hibernate.LONG)
            .addScalar(
"salePlanetypeId",Hibernate.LONG)
            .addScalar(
"inlandPrice",Hibernate.DOUBLE)
            .addScalar(
"outlandPrice",Hibernate.DOUBLE)
            .setResultTransformer(Transformers.aliasToBean(ProductItemConfig.
class))
            .setParameter(
0, productId)
            .setParameter(
1, planetypeId);
        
        List
<ProductItemConfig> configs = query.list();
        
        
return configs;
    }

    
public List<CrmProductItem> getProductItem(CrmProduct product) throws DataAccessException {
        
        String hql 
= "from CrmProductItem cpi where cpi.crmProduct = ?";
        Session session 
= getSession();
        Query query 
= session.createSQLQuery(hql).setParameter(0, product);
        
        List
<CrmProductItem> items = query.list();
        
return items;
    }
    
    
public void copy(Long productId_dest,Long productId_orig,String createMan) throws DataAccessException {
        String sql 
= "insert into crm_product_item " +
                
" select hibernate_sequence.nextval," +
                
" ?," +
                
" cpi.charge_item_id," +
                
" cpi.sale_planetype_id," +
                
" cpi.inland_price," +
                
" cpi.outland_price," +
                
" ?," +
                
" sysdate" +
                
" from crm_product_item cpi" +
                
" where cpi.product_id = ?";
        
        Session session 
= getSession();
        Query sqlQuery 
= session.createSQLQuery(sql)
                        .setParameter(
0, productId_dest)
                        .setParameter(
1, createMan)
                        .setParameter(
2, productId_orig);
        sqlQuery.executeUpdate();
    }
    
    
}
posted @ 2011-08-11 22:25 mashiguang| 编辑 收藏

1,配置tomcat启动参数
直接在%tomcat_home%\bin下建立tomcat_debug.bat文件,内容如下:

cd %CATALINE_HOME%/bin
set JPDA_ADDRESS=8787
set JPDA_TRANSPORT=dt_socket
set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787
startup

需要远程调试时从tomcat_debug.bat启动。

2,eclipse调试
选择菜单"Run>Debug...",弹出窗口里右键点击"Remote Java Application",选择"New",如图:


点击"Debug"按钮,开始远程调试,当程序运行到断点时,Eclipse会捕获到。


有关普通java app的远程调试可以参考http://blog.chenlb.com/2010/07/eclipse-remoting-debug-java-app.html
posted @ 2011-02-26 17:39 mashiguang 阅读(486) | 评论 (2)编辑 收藏

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 
<HEAD>
  
<TITLE> New Document </TITLE>
  
<META NAME="Generator" CONTENT="EditPlus">
  
<META NAME="Author" CONTENT="">
  
<META NAME="Keywords" CONTENT="">
  
<META NAME="Description" CONTENT="">
  
<script type="text/javascript" src="jquery-1.4.2.js"></script>
  
<script type="text/javascript" src="jquery.validate.js"></script>
  
<SCRIPT LANGUAGE="JavaScript">
  
<!--
    jQuery(
function(){        
        jQuery.validator.methods.compareDate 
= function(value, element, param) {
            
//var startDate = jQuery(param).val() + ":00";补全yyyy-MM-dd HH:mm:ss格式
            //value = value + ":00";
            
            
var startDate = jQuery(param).val();
            
            
var date1 = new Date(Date.parse(startDate.replace("-""/")));
            
var date2 = new Date(Date.parse(value.replace("-""/")));
            
return date1 < date2;
        };
        
        jQuery(
"#form1").validate({
            focusInvalid:
false,
            rules:{
                
"timeStart":{
                    required: 
true
                },
                
"timeEnd": {
                    required: 
true,
                    compareDate: 
"#timeStart"
                }
            },
            messages:{
                
"timeStart":{
                    required: 
"开始时间不能为空"
                },
                
"timeEnd":{
                    required: 
"结束时间不能为空",
                    compareDate: 
"结束日期必须大于开始日期!"
                }
            }
        });
    });
  
//-->
  </SCRIPT>
 
</HEAD>

 
<BODY>
 
<form id="form1" name="form1" method="post" action="demo.html">
   
<p>timeStart:
     
<input name="timeStart" type="text" id="timeStart" value="2011-02-17 10:00:00"> yyyy-MM-dd HH:mm:ss
   
</p>
   
<p>timeEnd:
     
<input name="timeEnd" type="text" id="timeEnd" value="2011-02-17 9:00:00"> yyyy-MM-dd HH:mm:ss
   
</p>
   
<p>
     
<input type="submit" name="Submit" value="提交">
   
</p>
 
</form>
  
 
</BODY>
</HTML>
posted @ 2011-02-17 10:34 mashiguang 阅读(12015) | 评论 (9)编辑 收藏

在Oracle定义变量时,常有VARCHAR2 (3 Char)或者VARCHAR2 (10 Byte)的数据类型,那么3char或者10Byte到底代表几个汉字,几个字符呢,上次外公司一同事讨论这个问题,一下没给解释清楚,所以下来以后整理如下:

总结:
当NLS_CHARACTERSET=AL32UTF8时()
NLS_LENGTH_SEMANTICS=BYTE时,一个汉字代表三个字节
NLS_LENGTH_SEMANTICS=CHAR时,一个汉字代表一个字节
当NLS_CHARACTERSET=US7ASCII时(字符集为单字节)
NLS_LENGTH_SEMANTICS=BYTE时,一个汉字代表两个字节
NLS_LENGTH_SEMANTICS=CHAR时,一个汉字代表两个字节

现象:
select * from nls_database_parameters;
….      …………..
NLS_CHARACTERSET        AL32UTF8

…..

NLS_LENGTH_SEMANTICS BYTE

….

NLS_NCHAR_CHARACTERSET      AL16UTF16

NLS_RDBMS_VERSION      10.2.0.4.0
 

SQL> alter session set nls_length_semantics='BYTE';

SQL> create table nls_byte(c1 varchar2(7));

SQL> insert into nls_byte values('测试机');

 insert into nls_byte values('测试机')

 ORA-12899: 列 "SYS"."NLS_BYTE"."C1" 的值太大 (实际值: 9, 最大值: 7)

SQL> insert into nls_byte values('测试a');

 1 row inserted
 
SQL> select table_name,column_name,t.DATA_TYPE,t.DATA_LENGTH,t.CHAR_USED from user_tab_columns t where table_name='NLS_BYTE';

 TABLE_NAME COLU DATA_TYP DATA_LENGTH CHAR_USED

---------- ---- -------- ----------- ---------

NLS_BYTE   C1   VARCHAR2           7 B
  
NLS_LENGTH_SEMANTICS allows you to specify the length of a column datatype in terms of CHARacters rather than in terms of BYTEs. Typically this is when using an AL32UTF8 or other varying width NLS_CHARACTERSET database where one character is not always one byte. While using CHAR semantics has as such no added value in a 7/8 bit characterset it's fully supported so any application code / table setup using CHAR can also be used in a 7/8bit characterset like US7ASCII/WE8MSWIN1252.
This parameter is a 9i (and up) feature and is not available in older releases

翻译过来就是:这个参数允许将列的数据单位设为字符而不是byte.这个问题会在字符集设为UTF8的时候出现. 此参数在9i以上版本有效.

NLS_LENGTH_SEMANTICS 设置.

1.      NLS_DATABASE_PARAMETERS中的值是在数据库创建的时候确定的,一般都为BYTE

2.     此参数可以以 “ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR scope=both”方式修改,但是需要重启数据库才能生效.

3.     也可用” ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR”使对当前session生效.

4.     此参数可以在10G以上版本中,在环境变量或注册表中设置(注意需要大写),设定后从当前客户端启动的所有会话都采用新的取值.

5.     修改后只对新建的列生效,对于已有的列没有作用

6.     新建或升级DB时用BYTE,否则XDB或dba_tables会出现问题.

7.     NLS_LENGTH_SEMANTICS对sys用户下的对象无效.

8.     如果对于7/8bit的字符集,设为byte/char意义不大,因为无论是char和byte都对应一个byte.

测试:

一.在当前session中修改此参数

 SQL> alter session set nls_length_semantics='char';

 Session altered

 SQL> create table nls_char(c1 varchar2(7),c2 varchar2(7));

 Table created

 SQL> desc nls_char

Name Type        Nullable Default Comments

---- ----------- -------- ------- --------

C1   VARCHAR2(7) Y                      

C2   VARCHAR2(7) Y                      

 SQL> insert into nls_char values('测试机','测试测试测试');

 1 row inserted 

如果对于alter system,效果是一样的

二.对于已经存在的表,

 SQL> desc nls_byte

Name Type             Nullable Default Comments

---- ---------------- -------- ------- --------

C1   VARCHAR2(7 BYTE) Y                      

SQL> alter table nls_byte modify c1 varchar2(7 char);

 Table altered

 SQL> desc nls_byte

Name Type        Nullable Default Comments

---- ----------- -------- ------- --------

C1   VARCHAR2(7) Y                      

 SQL> insert into nls_byte values('测试机');

 1 row inserted
 
1.      exp/imp : 不能直接导入,因为会采用source table的建表方式在target db里建表,即使目标库设的值为char.

*可以预先在目标库中以char方式建表

*然后导入,指定参数ignore=y

  2. Alter table

     alter table "<owner>"."<table>" modify "<column>" char (10 char);

      创建脚本,修改列设定.

 注:

Bug-3611750, ora-01450 online rebuild of index fails, 可以在重建索引前指定byte, 10.2.0.5以上已经修复

Bug 1488174 UNICODE: ALTER SYSTEM SET NLS_LENGTH_SEMANTICS DOESN'T
TAKE EFFECT, 用此语句修改后,实际上不起作用,需要重启才能生效, 但是如果用alter session方式即时生效,不用重启.

进一步测试,在另一个字符集设为us7ascii的DB设置此参数

SQL> select * from nls_database_parameters

6          NLS_CHARACTERSET  US7ASCII

SQL> alter session set nls_length_semantics=byte;

Session altered.

SQL> create table nls_byte(c1 varchar2(7));

Table created.

SQL> insert into  nls_byte values('测试测试');

insert into  nls_byte values('测试测试')

ERROR at line 1:

ORA-12899: value too large for column "TEA"."NLS_BYTE"."C1" (actual: 8,

maximum: 7)

SQL> desc nls_byte

 Name                        Null?    Type

 -------------------------------

 C1                                   VARCHAR2(7)

SQL> alter session set nls_length_semantics=char;

Session altered.

SQL> create table nls_char(c1 varchar2(7));

Table created.

SQL> insert into  nls_char values('测试测试');

insert into  nls_char values('测试测试')

ERROR at line 1:

ORA-12899: value too large for column "TEA"."NLS_CHAR"."C1" (actual: 8,

maximum: 7)

SQL> desc nls_char

 Name                        Null?    Type

 ----------------------------------------- -------- -------------------

C1                                  VARCHAR2(7)
 
 可以看出,在字符集为单字节的情况下,无论取何值,汉字都是以二个字节的方式存在的.

 


本文转自http://www.wudeyao.com/post-69.html
posted @ 2011-01-21 12:49 mashiguang 阅读(1486) | 评论 (0)编辑 收藏

在foreach调用remove可能会引发ConcurrentModificationException。
如:
for(Object obj : list){
    .remove(obj);
}

最好像下面这样写:
for (Iterator it = list.iterator(); it.hasNext();) {
......
it.remove();
}

(添加20160420)
如果foreach的同时需要add element,就不能使用iterator了,最好重新启用一个新的list暂存新的集合元素。
posted @ 2010-12-08 09:47 mashiguang 阅读(463) | 评论 (0)编辑 收藏

     摘要: 这个是ie6的bug,并非boxy的问题。在ie6下,select元素的zindex最大,select元素会透过boxy的弹出层显示在其上面。 这里用一个iframe挡住boxy弹出层下的select,使用时只要将useIframe置为true即可,源码如下: (jquery.boxy.js并不好用,很多jquery的弹出层插件都解决了ie6的这个问题) /**  *&n...  阅读全文
posted @ 2010-09-14 17:30 mashiguang 阅读(4551) | 评论 (17)编辑 收藏

 

使用cassso helloword

因为工作需要接触到sso,据知目前多数sso使用耶鲁的cas实现,且发现使用cas真的是很简单就可以做出一个单点登录系统来,cas还提供丰富的扩展功能,对于扩展功能日后再细细研究,这里只使用cas做一个hello world来记录本人的学习过程,如有幸被高人看到,还望指出弊病,不吝赐教。

在使用cas之前最好对数字证书有所了解,不了解也没有关系,跟着我的步骤也一样可以跑的通。

准备工作

需要的文件:

ü         Jdk6

ü         Tomcat

ü         cas-server-3.3.2

ü         cas-client-3.1.9

证书

下面是keytool命令的一些常用方法,先在这里认识一下它们,一会儿会用的到。

使用keytool命令生成密钥库

keytool -genkey -alias tomcat -keyalg RSA -dname "CN=pcma, OU=vanceinfo, O=vanceinfo, L=haidian, S=beijing, C=CN" -keystore c:"keystore5.jks

CN:主机名

OU:组织单位

O:组织

L:地区

S:城市

C:国家

如果需要指定密钥有效期,添加-validity 365即可,单位是天,如:
keytool -genkey -alias tomcat -keyalg RSA -dname "xxxxx" -keystore xxxxx -validity 365

导出证书

keytool -export -file c:/server5.crt -alias tomcat -keystore c:"keystore5.jks

将证书导入到客户端jdk

keytool -import -keystore "D:"Java"jdk1.6.0_14"jre"lib"security"cacerts" -file c:/server5.crt -alias tomcat

从密钥库中删除指定别名的证书

keytool -delete -noprompt -alias tomcat -keystore E:"apache-tomcat-6.0.20_2"conf"keystore2.jks

查看密钥库中的证书

keytool -list -v -keystore c:"keystore5.jks

配置tomcat

使用keytool命令生成密钥库。

配置%tomcat_home%/conf/server.xml使tomcat支持SSL协议,并指定密钥库。

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" keystorePass="mashiguang"

                        keystoreFile="${catalina.home}/conf/keystore5.jks"/>

部署cas server

解压缩cas-server-3.3.2-release.zip文件,在modules目录里找到cas-server-webapp-3.3.2.war文件,这就是一个做好了的cas服务端,我们做的sso helloword可以直接使用,只需把cas-server-webapp-3.3.2.war改了个简单点的名字,如cas.war,然后部署到tomcat即可。

浏览器访问https://pcma:8443/cas,如果打开显示的是cas默认的登录页面,则表示服务端已部署完毕。

客户端使用cas client

新建两个web工程,用于模拟单点登录系统中的客户端,并将cas-client-3.1.9"modules里的jar包放到web工程lib目录下,是主要的是cas-client-core-3.1.9.jar文件,把spring2.5也放到lib目录下。

Web.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<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">

       <context-param> 

        <param-name>contextConfigLocation</param-name> 

        <param-value> 

            /WEB-INF/config/casContext.xml  

        </param-value> 

    </context-param> 

    <listener> 

        <listener-class> 

            org.springframework.web.context.ContextLoaderListener  

        </listener-class> 

    </listener> 

    <!-- 负责用户认证 --> 

    <filter> 

        <filter-name>CAS Authentication Filter</filter-name> 

        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 

        <!-- CAS login 服务地址--> 

        <init-param> 

            <param-name>casServerLoginUrl</param-name> 

            <param-value>https://pcma:8443/cas/login</param-value> 

        </init-param> 

        <init-param> 

            <param-name>renew</param-name> 

            <param-value>false</param-value> 

        </init-param> 

        <init-param> 

            <param-name>gateway</param-name> 

            <param-value>false</param-value> 

        </init-param> 

        <!-- 客户端应用服务地址--> 

        <init-param> 

            <param-name>serverName</param-name> 

            <param-value>http://pcma:8081</param-value> 

        </init-param> 

    </filter> 

    <!--负责Ticket校验--> 

    <filter> 

        <filter-name>CAS Validation Filter</filter-name> 

        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 

        <init-param> 

            <param-name>targetBeanName</param-name> 

            <param-value>cas.validationfilter</param-value> 

        </init-param> 

    </filter> 

    <filter-mapping> 

        <filter-name>CAS Authentication Filter</filter-name> 

        <url-pattern>/*</url-pattern> 

    </filter-mapping> 

    <filter-mapping> 

        <filter-name>CAS Validation Filter</filter-name> 

        <url-pattern>/*</url-pattern> 

    </filter-mapping> 

</web-app>

casContext.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="cas.validationfilter" class="org.jasig.cas.client.validation.Cas10TicketValidationFilter"> 

        <property name="ticketValidator"> 

            <ref bean="cas10TicketValidator"/> 

        </property> 

        <property name="useSession"> 

            <value>true</value> 

        </property> 

        <!-- 客户端应用服务地址--> 

        <property name="serverName"> 

            <value>http://pcma:8081</value> 

        </property> 

        <property name="redirectAfterValidation"> 

            <value>true</value> 

        </property> 

    </bean> 

    <bean id="cas10TicketValidator" class="org.jasig.cas.client.validation.Cas10TicketValidator"> 

    <!-- 这里参数是cas服务器的地址--> 

        <constructor-arg index="0" value="https://pcma:8443/cas" /> 

    </bean> 

</beans> 

新建index.jsp文件

 <body>

   hello sso<br>

   <a href="http://192.168.29.131:8080/sso2">sso2</a>这个地址是另外一台机器上的sso客户端

 </body>

上面的web.xmlcasContext.xmlindex.jsp是两个客户端中的一个,另一个要根据实际情况修改。

最后不要忘记客户端的jdk要使用keytool命令导入证书文件。

测试

启动tomcat,测试器访问http://pcma:8081/sso,出现cas登录页面,输入相同的用户名和密码即可登录,登录成功后页面自动跳转回http://pcma:8081/sso,这时点击页面上的sso2链接,就可以自动登录并跳转到sso2应用。

如果输入用户名密码后提示下面的异常,是因为部署客户端的jdk没有导入证书文件的原因。

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target


源码

http://www.blogjava.net/Files/mashiguang/sso.zip

posted @ 2009-12-07 09:50 mashiguang 阅读(1903) | 评论 (4)编辑 收藏

 

最近公司客户反映有些页面运行速度太慢,通过对系统代码的分析,发现排行榜功能是罪魁祸首,因为数据量太大,每次刷新页面都计算一次排行榜,的确耗时费力。

其实可以让数据库自己计算排行榜,并把计算结果保存到一个单独的表里去,这个表只用来保存排行榜的数据,数据量很小,然后所有的排行榜查询都去select这个表。

计算排行榜的功能我们可以写成一个存储过程,但是排行榜的数据不是一成不变的,还需要不时的调用这个存储过程才行,oracle为我们提供了dbms_jobs

oracel dbms_jobs包可以提交作业到作业队列中,这个包中还提供其它一些函数管理以前提交的作业,如对作业进行修改、禁止或删除等操作。

常用函数:

submit(),提交作业到作业队列。

isumbit()

remove(),从作业队列中删除作业。

change(),改变已有作业的参数。

what(),改变作业要执行的代码。

next_date(),改变作业下一次执行时间。

interval(),改变作业执行的时间间隔。

broken(),暂停执行作业。

run(),强制执行作业。

最常用的submit()函数:

dbms_jobs.submit(

       job out binary_integer,

       what in varchar2,

       next_date in date default sysdate,

       interval in varchar default null,

       no_parse in boolean default false,

       instance in binary_integer default any_instance,

       force in boolean default false

);

submit函数参数:

job,作业的作业号,是个输出参数,所以调用submit函数时,这个参数要指定一个已存在的变量。

what,作业要执行的代码,一般是存储过程。

next_date,下一次作业运行的日期。

interval作业执行的间隔时间,这个参数默认值是null也就是what指定的代码只在next_date这一时间执行一次。

no_parse,默认值是false,当参数值是false,提交作业时就对what指定的代码进行语法分析;当参数值是true,第一次运行what指定代码时才进行语法分析。

instance,指明运行作业的数据库实例。

force,如果是true,instance可以是任何正数;如果是falseinstance指定的实例必须正在运行。

示例:

var jobno number;

begin

dbms_job.submit(:jobno,'p_xxx_taxis;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');--每天18点执行

commit;

end;

上面这段话要在 命令窗口 下运行,如在pl/sql developer里面的-->新键-->命令窗口

这样就会在每天的18点执行存储过程p_xxx_taxis。在我这里p_xxx_taxis执行的是计算排行榜的任务。

posted @ 2008-07-14 16:56 mashiguang 阅读(4220) | 评论 (6)编辑 收藏


调用ejb时,如果客户端和ejb不在同一个jvm,就要设置InitialContext,不同的应用服务器InitialContext写法也不同.
Context.INITIAL_CONTEXT_FACTORY:指定到目录服务的连接工厂
Context.PROVIDER_URL:目录服务提供者URL

//jboss:
Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"
Context.URL_PKG_PREFIXES, "org.jboss.naming"
Context.PROVIDER_URL, "localhost:1099"

//weblogic:
Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"
Context.PROVIDER_URL, "t3://localhost:7001"

//apusic(金蝶):
Context.INITIAL_CONTEXT_FACTORY, "com.apusic.jndi.InitialContextFactory"
Context.PROVIDER_URL, "rmi://localhost:6888"

//WebSphere:
Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"
Context.PROVIDER_URL, "iiop://localhost:900"


//J2EE  SDK(J2EE  RI):
Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"
Context.PROVIDER_URL, "iiop://127.0.0.1:1050"

//SilverStream:
Context.INITIAL_CONTEXT_FACTORY, "com.sssw.rt.jndi.AgInitCtxFactory"
Context.PROVIDER_URL, "sssw://localhost:80"

//OC4J:
Context.INITIAL_CONTEXT_FACTORY, "com.evermind.server.rmi.RMIInitialContextFactory"
Context.PROVIDER_URL, "ormi://127.0.0.1/"

//WAS5:
Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"
Context.PROVIDER_URL, "iiop://localhost:2809"

 

常用JNDI服务提供者连接工厂:
Filesystem:  Com.sun.jndi.fscontext.FSContextFactory或者com.sun.jndi.fscontext.RefFSContextFactory
LDAPv3:    Com.sun.jndi.ldap.LdapCtxFactory
NDS:     com.novell.naming.service.nds.NdsInitialContextFactory
NIS:     com.sun.jndi.nis.NISCtxFactory
RMI registry: com.sun.jndi.rmi.registry.RegistryContextFactory
IBM LDAP服务提供者:   com.ibm.jndi.LDAPCtxFactory
BEA 名字服务提供者:   weblogic.jndi.WLInitialContextFactory
JBOSS名字服务提供者:  org.jnp.interfaces.NamingContextFactory

posted @ 2008-07-14 16:35 mashiguang 阅读(14857) | 评论 (2)编辑 收藏

自JDK1.0开始就存在包装器类,但是在JDK5.0之前,必须手工地插入打包和拆包的代码.
JDK5.0中就有了自动打包功能,但在5.0中自动打包时存在一些差异,刚才看《java核心技术第7版》时才发现.

代码1:
Integer a=1000;
Integer b
=1000;
System.out.println(a
==b);//false
代码2:
Integer a=100;
Integer b
=100;
System.out.println(a
==b);//true
代码3:
Integer a=new Integer(100);
Integer b
=new Integer(100);
System.out.println(a
==b);//false

第一段代码不成立,而第二段代码成立的原因是:自动打包
自动打包规范要求boolean,byte,char≤127,介于-128→127之间的short和int被包装到固定的对象中.
打包和拆包是编译器认可的,而不是虚拟机,编译器在生成类的字节码时,插入必要的方法调用,虚拟机只是执行这些字节码。

第三段代码不用多说肯定不成立.

 

posted @ 2007-12-13 17:03 mashiguang 阅读(1533) | 评论 (6)编辑 收藏


在应用的web.xml中配置了InvokerServlet.

 <servlet>
  
<servlet-name>InvokerServlet</servlet-name>
  
<servlet-class>
   org.apache.catalina.servlets.InvokerServlet
  
</servlet-class>
  
<init-param>
   
<param-name>debug</param-name>
   
<param-value>0</param-value>
  
</init-param>
  
<load-on-startup>-1</load-on-startup>
 
</servlet>
  
<servlet-mapping>
    
<servlet-name>action</servlet-name>
    
<url-pattern>*.do</url-pattern>
  
</servlet-mapping>


在jboss4.0.5中使用没有问题,但迁移到4.2时,当使用到InvokerServlet就会出异常,解决办法:
在D:\jboss-4.2.1.GA\server\all\deploy\jboss-web.deployer下context.xml文件中的context元素中添加属性:privileged

<Context cookies="true" crossContext="true" privileged="true">

出现这个问题可能是tomcat5.5和tomcat6的差异,暂未查明,本文只供个人参考,不接受评论.

 

posted @ 2007-11-28 10:46 mashiguang| 编辑 收藏

     摘要: 用一个简单的ejb3.0示例记录ant打ear包的过程 源码下载 环境: apache-ant-1.6.5 jboss-4.2.1.GA jboss-annotations-ejb3.jar jboss-ejb3.jar jboss-ejb3x.jar 最后三个包在jboss里有. 1,建ejb3.0项目 session bean接口:HelloWorld pub...  阅读全文
posted @ 2007-11-24 00:44 mashiguang 阅读(6685) | 评论 (1)编辑 收藏

使用commons mail时需要的jar包:
1,commons-email-1.1.jar
2,mail.jar
3,activation.jar
(在web应用里只需要commons-email包)

发送简单的文字邮件:

SimpleEmail email = new SimpleEmail();

email.setHostName(
"smtp.sina.com");
email.setAuthentication(
"username""password");//在邮件服务商处注册的用户名和密码
email.addTo("mailTo@163.com");
email.setFrom(
"username@sina.com""alias");

email.setCharset(
"UTF-8");//gbk或gb2312,只要支持中文就行
email.setSubject("title");
email.setMsg(
"content");
email.send();

发送带附件的邮件:
// Create the attachment
EmailAttachment attachment = new EmailAttachment();
attachment.setPath(
"mypictures/john.jpg");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription(
"Picture of John");
attachment.setName(
"John");

// Create the email message
MultiPartEmail email = new MultiPartEmail();
email.setHostName(
"mail.myserver.com");
email.setAuthentication(
"username""password");
email.addTo(
"jdoe@somewhere.org""John Doe");
email.setFrom(
"me@apache.org""Me");
email.setCharset(
"UTF-8");
email.setSubject(
"The picture");
email.setMsg(
"Here is the picture you wanted");

// add the attachment
email.attach(attachment);

// send the email
email.send();

创建多个EmailAttachment对象,并调用MultiPartEmail.attach();就可以发送多个附件.

发送HTML格式的邮件:

发送html格式的邮件和简单邮件的区别就在创建HtmlEmail对象
并用email.setHtmlMsg(String)或email.setMsg(String)把含有html标签的字符串赋给email对象.
HtmlEmail对象还有一个setTextMsg(String)方法,这个方法参数里的html标签会被当做普通字符处理,不会被解析成html元素.
更详细内容可以看apache commons-email的用户指南.

posted @ 2007-11-01 16:51 mashiguang 阅读(1578) | 评论 (4)编辑 收藏

贴子转自http://hi.baidu.com/bobylou,转之前并没有验证文章里的方法是不是有效,估计原作者把它放到blog之前应该做过测试了吧。

Struts本身有一套完善的防止重复提交表单Token(令牌)机制,但笔者目前的项目自写的framework没有用到Struts,故也得自写防止用户因为后退或者刷新来重复提交表单内容的Token机制。不难,容易实现。

实现原理:一致性。jsp生成表单时,在表单中插入一个隐藏<input>字段,该字段就是保存在页面端的token字符串,同时把该字符串存入session中。等到用户提交表单时,会一并提交该隐藏的token字符串。在服务器端,查看下是否在session中含有与该token字符串相等的字符串。如果有,那么表明是第一次提交该表单,然后删除存放于session端的token字符串,再做正常业务逻辑流程;如果没有,那么表示该表单被重复提交,做非正常流程处理,可以警告提示也可以什么也不做。

看代码。

首先是Token主类。类很简单,而且主要方法都给doc注释了

/*
* blog: 
http://hi.baidu.com/bobylou
* $Revision: 1.1 $
* $Date: 2007/07/18 10:02:55 $
* $Author: bobrow$
*/


package com.paizuo.framework.util;

import java.util.ArrayList;

import javax.servlet.http.HttpSession;

public class Token {

    
private static final String TOKEN_LIST_NAME = "tokenList";

    
public static final String TOKEN_STRING_NAME = "token";

    
private static ArrayList getTokenList(HttpSession session) {
       Object obj 
= session.getAttribute(TOKEN_LIST_NAME);
       
if (obj != null{
          
return (ArrayList) obj;
       }
 else {
          ArrayList tokenList 
= new ArrayList();
          session.setAttribute(TOKEN_LIST_NAME, tokenList);
          
return tokenList;
       }

    }


    
private static void saveTokenString(String tokenStr, HttpSession session) {
       ArrayList tokenList 
= getTokenList(session);
       tokenList.add(tokenStr);
       session.setAttribute(TOKEN_LIST_NAME, tokenList);
    }

   
    
private static String generateTokenString(){
       
return new Long(System.currentTimeMillis()).toString();
    }


    
/**
     * Generate a token string, and save the string in session, then return the token string.
     * 
     * 
@param HttpSession
     *            session
     * 
@return a token string used for enforcing a single request for a particular transaction.
     
*/

    
public static String getTokenString(HttpSession session) {
       String tokenStr 
= generateTokenString();
       saveTokenString(tokenStr, session);
       
return tokenStr;
    }


    
/**
     * check whether token string is valid. if session contains the token string, return true. 
     * otherwise, return false.
     * 
     * 
@param String
     *            tokenStr
     * 
@param HttpSession
     *            session
     * 
@return true: session contains tokenStr; false: session is null or tokenStr is id not in session
     
*/

    
public static boolean isTokenStringValid(String tokenStr, HttpSession session) {
       
boolean valid = false;
       
if(session != null){
          ArrayList tokenList 
= getTokenList(session);
          
if (tokenList.contains(tokenStr)) {
             valid 
= true;
             tokenList.remove(tokenStr);
          }

       }

       
return valid;
    }

}



怎么使用?

在jsp页面端。

首先import该类:

<%@ page import="com.paizuo.framework.util.Token" %>

表单包含隐藏的token字符串:

 

<form>

<input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>">

</form>

 

在Server端action中进行检验。

 

if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){
//进行正常业务流程
}

else{
//进行防重复提交处理流程
}

完毕。

posted @ 2007-08-21 11:45 mashiguang 阅读(4203) | 评论 (6)编辑 收藏

1.创建mysql用户并授权:GRANT

语法:
GRANT privileges (columns)
ON what
TO username IDENTIFIED BY "password"
WITH GRANT OPTION

privileges :授予用户的权限
columns :权限运用的列,可选
what :权限运用的对象,可以是数据库,表,列
username :权限授予的用户
password :密码
WITH GRANT OPTION子句是可选的。

先来创建一个用户plmm(漂亮mm),给她最大的权限,可以对所有的表做任何操作,密码是"1234",但是她只能从本地登陆:
grant all
on *.*
to plmm@localhost identified by "1234"
再来创建一个用户klmm(恐龙mm),我们只给她查看test数据库里的table1表的权限,而且只能在192.168.0.%登陆,这里的"%"是个通配符,如果要使用通配符的话一定要用引号括起来.
grant select
on test.table1
to klmm@'192.168.0.%' identified by "1234"

下面表中列出privileges  除了上面用到的all和select还有哪些值可以选择
权限指定符 权限允许的操作
ALTER 修改表和索引
CREATE 创建数据库和表
DELETE 删除表中已有的记录
DROP 抛弃(删除)数据库和表
INDEX 创建或抛弃索引
INSERT 向表中插入新行
REFERENCE 未用
SELECT 检索表中的记录
UPDATE 修改现存表记录
FILE 读或写服务器上的文件
PROCESS 查看服务器中执行的线程信息或杀死线程
RELOAD 重载授权表或清空日志、主机缓存或表缓存。
SHUTDOWN 关闭服务器
ALL 所有;ALL PRIVILEGES同义词
USAGE 特殊的“无权限”权限

2.撤消用户权限:revoke
上面我们创建plmm用户时给了她所有的权限,现在要撤消她更新(update)数据库的权限
revoke update ON *.* FROM plmm@localhost
posted @ 2007-07-07 01:03 mashiguang 阅读(389) | 评论 (0)编辑 收藏