blogjava-凯发k8网页登录http://www.blogjava.net/wangxinsh55/category/14223.htmlzh-cnthu, 27 oct 2011 13:51:33 gmtthu, 27 oct 2011 13:51:33 gmt60spring事务配置的五种方式http://www.blogjava.net/wangxinsh55/archive/2011/10/27/362165.htmlsimonesimonethu, 27 oct 2011 06:31:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2011/10/27/362165.htmlhttp://www.blogjava.net/wangxinsh55/comments/362165.htmlhttp://www.blogjava.net/wangxinsh55/archive/2011/10/27/362165.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/362165.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/362165.html阅读全文

simone 2011-10-27 14:31
]]>
struts2 标签中的调用enum方法或调用内部类中的静态方法http://www.blogjava.net/wangxinsh55/archive/2011/08/24/357191.htmlsimonesimonewed, 24 aug 2011 06:48:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2011/08/24/357191.htmlhttp://www.blogjava.net/wangxinsh55/comments/357191.htmlhttp://www.blogjava.net/wangxinsh55/archive/2011/08/24/357191.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/357191.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/357191.html
com.duxiu.mobile.dao.web.wapruleconfigdao这个为一个类;custompage是com.duxiu.mobile.dao.web.wapruleconfigdao类中的enum或是内部类,则struts2标签中调用的方法如下:


simone 2011-08-24 14:48
]]>
历史上关于struts2 遍历map最全的总结http://www.blogjava.net/wangxinsh55/archive/2010/09/21/332623.htmlsimonesimonetue, 21 sep 2010 09:56:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2010/09/21/332623.htmlhttp://www.blogjava.net/wangxinsh55/comments/332623.htmlhttp://www.blogjava.net/wangxinsh55/archive/2010/09/21/332623.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/332623.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/332623.htmlstruts2中iterator标签遍历map总结

针对以下几种情况的map:

  •     private map map;   
  •       
  •     private map studentmap;   
  •        
  •     private map arraymap;   
  •        
  •     private map> listmap;

  •  


  •         map=new hashmap();   
  •         map.put("1""one");   
  •         map.put("2""two");   
  • 用法:

  •    "map" id="column">   
  •    "#column"/>
      
  •    key: "key"/>
      
  •    value:"value"/>
     
  •      
  •  


  •         studentmap=new hashmap();   
  •         studentmap.put("student1",new student(new long(1),"20034140201","张三1","男",25));   
  •         studentmap.put("student2",new student(new long(2),"20034140202","张三2","女",26));   
  •         studentmap.put("student3",new student(new long(3),"20034140202","张三3","男",27));    
  • 用法:

     

  •     "studentmap" id="column">   
  •        
  •      "#column"/>   
  •      "value.id"/>   
  •      "value.num"/>   
  •      "value.name"/>   
  •      "value.sex"/>   
  •      "value.age"/>   
  •        
  •      
  •  


  •         arraymap=new hashmap();   
  •         arraymap.put("arr1"new string[]{"1","2003401","leejie","male","20"});   
  •         arraymap.put("arr2"new string[]{"2","2003402","huanglie","male","25"});   
  •         arraymap.put("arr3"new string[]{"3","2003403","lixiaoning","male","21"});   
  •            
  • 用法

     

  •     "arraymap" id="column">   
  •        
  •      "#column"/>   
  •      "value[0]"/>   
  •      "value[1]"/>   
  •      "value[2]"/>   
  •      "value[3]"/>   
  •      "value[4]"/>   
  •        
  •       
  •  


  •            
  •         listmap=new hashmap>();   
  •            
  •         list list1=new arraylist();   
  •         list1.add(new student(new long(1),"20034140201","张三1","男",25));   
  •         list1.add(new student(new long(2),"20034140202","张三2","男",25));   
  •         list1.add(new student(new long(3),"20034140203","张三3","男",25));   
  •         listmap.put("class1", list1);   
  •            
  •         list list2=new arraylist();   
  •         list2.add(new student(new long(1),"20034140301","李四1","男",20));   
  •         list2.add(new student(new long(2),"20034140302","李四2","男",21));   
  •         list2.add(new student(new long(3),"20034140303","李四3","男",22));   
  •         list2.add(new student(new long(4),"20034140304","李四4","男",23));   
  •         listmap.put("class2", list2);   
  •  

    用法:

  •    "listmap" id="column">   
  •      "total" value="#column.value.size"/>   
  •      "#column.value" status="s">   
  •          
  •         if test="#s.first">"${total}">"#column.key"/>if>   
  •         "id"/>   
  •         "num"/>   
  •         "name"/>   
  •         "sex"/>   
  •         "age"/>   
  •          
  •         
  •     


  • simone 2010-09-21 17:56
    ]]>
    springside 3 中的多数据源配置的问题http://www.blogjava.net/wangxinsh55/archive/2010/02/25/313859.htmlsimonesimonethu, 25 feb 2010 02:27:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2010/02/25/313859.htmlhttp://www.blogjava.net/wangxinsh55/comments/313859.htmlhttp://www.blogjava.net/wangxinsh55/archive/2010/02/25/313859.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/313859.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/313859.html阅读全文

    simone 2010-02-25 10:27
    ]]>
    s2sh 框架 基于annotation配置http://www.blogjava.net/wangxinsh55/archive/2010/02/24/313835.htmlsimonesimonewed, 24 feb 2010 14:06:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2010/02/24/313835.htmlhttp://www.blogjava.net/wangxinsh55/comments/313835.htmlhttp://www.blogjava.net/wangxinsh55/archive/2010/02/24/313835.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/313835.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/313835.html阅读全文

    simone 2010-02-24 22:06
    ]]>
    struts2 spring发送mailhttp://www.blogjava.net/wangxinsh55/archive/2009/05/15/270872.htmlsimonesimonefri, 15 may 2009 08:27:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2009/05/15/270872.htmlhttp://www.blogjava.net/wangxinsh55/comments/270872.htmlhttp://www.blogjava.net/wangxinsh55/archive/2009/05/15/270872.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/270872.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/270872.html

      spring中有集成了javamail,在使用框架的时候用spring来发送mail也是很方便的。下面是一个spring mail的小例子。

      在这个例子中,除了需要struts和spring的框架外,还需要mail.jar,activation.jar.

      web.xml的代码:

     
     xmlns=""
     xmlns:xsi=""
     xsi:schemalocation="
     ">
     
      contextconfiglocation
      classpath*:spring/*.xml
     

     
      org.springframework.web.context.contextloaderlistener
     

       
     
      org.springframework.web.util.introspectorcleanuplistener
     

     
                                                            
          org.springframework.web.context.request.requestcontextlistener
     

     
     
            struts2
           
                org.apache.struts2.dispatcher.filterdispatcher
           

       

       
            org.springframework.web.context.contextloaderlistener
       

        
            struts2
            /*
       

       
     
      30
     

     
     
      send.jsp
     


    java类mailaction.java:

    package action;

    import org.springframework.mail.simplemailmessage;
    import org.springframework.mail.javamail.javamailsenderimpl;

    import com.opensymphony.xwork2.action;
    import com.opensymphony.xwork2.actionsupport;
    public class mailaction extends actionsupport{
     private javamailsenderimpl mailsender;
     private simplemailmessage mailmessage;
      public string sendmail(){
      simplemailmessage msg = new simplemailmessage(mailmessage);
            msg.settext("spring mail simple!");
            mailsender.send(msg);
            return action.success;
     }
      public void setmailmessage(simplemailmessage mailmessage) {
      this.mailmessage = mailmessage;
     }

     public void setmailsender(javamailsenderimpl mailsender) {
      this.mailsender = mailsender;
     }

    }
    spring配置文件applicationcontext.xml:


    http://www.springframework.org/schema/beans"
        xmlns:xsi=""
        xmlns:aop=""
        xmlns:tx=""
        xsi:schemalocation="
              
               "
        default-autowire="byname" default-lazy-init="true">

     
      
      
     

     
                class="org.springframework.mail.javamail.javamailsenderimpl">
           
               
           
           
           
               
                    true
               

           

       

         
       
            shwwwx@163.com,nabelun@163.com"/>
            shwwwx@163.com"/>
           
       

    struts2的配置文件struts.xml:


        "-//apache software foundation//dtd struts configuration 2.0//en"
        "">

       
       
       
          extends="struts-default">
          
            sendok.jsp
           
          

       


    页面send.jsp:

    <%@ page language="java" import="java.util.*" pageencoding="utf-8"%>

     
        my jsp 'send.jsp' starting page
     
     
     


      
     

     

    页面sendok.jsp:

    <%@ page language="java" import="java.util.*" pageencoding="utf-8"%>


     
        my jsp 'sendok.jsp' starting page
     
     
        send mail success!

     

    运行send.jsp发送邮件,成功的话会跳转到sendok.jsp页面。



    simone 2009-05-15 16:27
    ]]>
    struts2中二维数组的显示http://www.blogjava.net/wangxinsh55/archive/2009/02/24/256486.htmlsimonesimonetue, 24 feb 2009 09:50:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2009/02/24/256486.htmlhttp://www.blogjava.net/wangxinsh55/comments/256486.htmlhttp://www.blogjava.net/wangxinsh55/archive/2009/02/24/256486.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/256486.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/256486.html

    1、用两重循环的方法

    id="data1" value="#request.data" status="d1">
    data1" status="d2">


    2、用一重循环的方法

    <s:iteratorvalue="collection1"status="status">
    <s:propertyvalue="collection1[#status.index][0]"/>
    <s:propertyvalue="collection1[#status.index][1]"/>
    s:iterator> 



    simone 2009-02-24 17:50
    ]]>
    struts ajaxtagshttp://www.blogjava.net/wangxinsh55/archive/2006/11/22/82757.htmlsimonesimonewed, 22 nov 2006 06:10:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2006/11/22/82757.htmlhttp://www.blogjava.net/wangxinsh55/comments/82757.htmlhttp://www.blogjava.net/wangxinsh55/archive/2006/11/22/82757.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/82757.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/82757.htmlfrank w. zammetti扩展了struts的tag库,使struts具备了ajax功能。
          (注:下面的代码引用自frank w. zammetti 的ajaxtags包)
     
          tag库的扩展
          1、formtag
               增加了refajax属性以及setter和getter方法;
          2、basehandlertag
               增加了refajax属性以及setter和getter方法;
               同时扩展了prepare×××events方法,使其加载ajax属性,如:
               if (getonkeydown() != null) {
                      ......
               }
               /* frank w. zammetti */
               else {
                      prepareajax("onkeydown", handlers);
               }
               /* frank w. zammetti */
          3、struts-html.tld
               增加了refajax属性;
     
          应用
          1、ajax-config.xml
               ......
              

                    
                          
                                //发送请求的设置
                                
                                     example1.do
                                     firstname=firstname,lastname=lastname
                                
                                //回调函数(方法)及回写区域的设置
                                
                                     example1_resultlayer
                                

                          
                    
              
               ......
          2、struts-config.xml
               ......
               //与其它action的区别是:ajax调用的action没有input和forward
              
                                 type="com.omnytex.ajaxtags.example1action" />
               ......
               //ajax tag plugin
              
               ......
          3、jsp客户界面
               ......
               //对应于ajax-config.xml中的form ajaxref
              
                    ......
                    //对应于ajax-config.xml中的element ajaxref
                   
              
               result:
               //对应于ajax-config.xml中的responsehandler
                
               ......
               //启用ajax(应该放在jsp的最后)
              
               ......
          4、action
               ......
               public actionforward execute( ...... ) throws exception {
                    try {
                        ......
                        //ajax的action需要输出内容到out
                        printwriter out = response.getwriter();
                        out.println(......);
                        out.flush();
                        out.close();
                    } catch (exception e) {
                        system.err.println("exception in example1action.execute(): " e);
                    }
                    //由于ajax的action输出的内容由页面的区域接收,不需要跳转到其它页面
                    //所以,返回null
                    return null;
               }
               ......
     
          struts ajax tag工作原理
          1、struts启动,加载ajaxinit;
          2、ajaxinit解析ajax-config.xml;
          3、struts加载ajaxenabled的jsp;
          4、struts-ajaxtag根据form ajaxref和elment ajaxref找到ajax-config的设置;
          5、输出ajaxenabled的html(tag库加入了ajax需要的script,如:xmlhttprequest);
          6、用户输入数据,提交数据(异步模式提交后,用户可以继续其它操作);
          7、xmlhttprequest对象接管提交数据,并向struts提交do及参数;
          8、struts actionservlet加载formbean,和相应的action;
          9、struts action执行相应逻辑,得到返回的数据,通过out输出;
          10、xmlhttprequest得到struts返回的数据;
          11、xmlhttprequest调用设置的回调函数(方法),输出数据到指定的区域;


    simone 2006-11-22 14:10
    ]]>
    struts下拉菜单对应显示(getdirectlabelvaluebean )http://www.blogjava.net/wangxinsh55/archive/2006/11/16/81439.htmlsimonesimonethu, 16 nov 2006 01:44:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2006/11/16/81439.htmlhttp://www.blogjava.net/wangxinsh55/comments/81439.htmlhttp://www.blogjava.net/wangxinsh55/archive/2006/11/16/81439.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/81439.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/81439.html2006-10-31 19:55

    ****************************************************************************************************************

    dao里面如下写:

    package com.sinoconcept.match.dao.impl;

    import java.util.list;

    import org.springframework.dao.dataaccessexception;

    import com.sinoconcept.match.dao.dirctdao;

    public class dirctdaoimpl extends basedaohibernateimpl implements dirctdao {

     public list loadall(string classname) {
      
      try {
       return this.gethibernatetemplate().loadall(class.forname(classname));
      } catch (dataaccessexception e) {
       // todo auto-generated catch block
       e.printstacktrace();
      } catch (classnotfoundexception e) {
       // todo auto-generated catch block
       e.printstacktrace();
      }
      return null;
     }

    }

    ***************************************************************************************************************

    service里如下写:

    package com.sinoconcept.match.service.impl;

    import java.lang.reflect.invocationtargetexception;
    import java.util.iterator;
    import java.util.linkedlist;
    import java.util.list;

    import org.apache.struts.util.labelvaluebean;

    import com.sinoconcept.match.dao.dirctdao;
    import com.sinoconcept.match.service.dirctservice;

    public class dirctserviceimpl implements dirctservice {
     private dirctdao dirctdao;

     public list getdirect(string dirname) {

      list result = this.getdir(dirname);
      return result;
     }

     public list getdirectlabelvaluebean(string dirname) {

      list result = this.getdirlablevaluebean(dirname);
      return result;
     }

     public list getdir(string dirname) {
      list result = null;

      result = dirctdao.loadall(dirname);

      return result;
     }

     @suppresswarnings("unchecked")
     public list getdirlablevaluebean(string dirname) {
      list result = new linkedlist();
      list list = getdir(dirname);
      iterator it = list.iterator();
      while (it.hasnext()) {
       object obj = it.next();
       labelvaluebean lv = new labelvaluebean();
       string label = null;
       try {
        label = obj.getclass().getmethod("getname", new class[] {})
          .invoke(obj, null).tostring();
       } catch (exception e) {
        try {
         label = obj.getclass()
           .getmethod("getvalue", new class[] {}).invoke(obj,
             null).tostring();
        } catch (illegalargumentexception e1) {
         // todo auto-generated catch block
         e1.printstacktrace();
        } catch (securityexception e1) {
         // todo auto-generated catch block
         e1.printstacktrace();
        } catch (illegalaccessexception e1) {
         // todo auto-generated catch block
         e1.printstacktrace();
        } catch (invocationtargetexception e1) {
         // todo auto-generated catch block
         e1.printstacktrace();
        } catch (nosuchmethodexception e1) {
         // todo auto-generated catch block
         e1.printstacktrace();
        }
       } finally {
        if (label == null)
         try {
          label = label = obj.getclass().getmethod("getvalue",
            new class[] {}).invoke(obj, null).tostring();
         } catch (illegalargumentexception e) {
          // todo auto-generated catch block
          e.printstacktrace();
         } catch (securityexception e) {
          // todo auto-generated catch block
          e.printstacktrace();
         } catch (illegalaccessexception e) {
          // todo auto-generated catch block
          e.printstacktrace();
         } catch (invocationtargetexception e) {
          // todo auto-generated catch block
          e.printstacktrace();
         } catch (nosuchmethodexception e) {
          // todo auto-generated catch block
          e.printstacktrace();
         }
       }
       lv.setlabel(label);
       try {
        lv.setvalue(obj.getclass().getmethod("getid", new class[] {})
          .invoke(obj, null).tostring());
       } catch (illegalargumentexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
       } catch (securityexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
       } catch (illegalaccessexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
       } catch (invocationtargetexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
       } catch (nosuchmethodexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
       }
       result.add(lv);
      }
      return result;
     }

     public dirctdao getdirctdao() {
      return dirctdao;
     }

     public void setdirctdao(dirctdao dirctdao) {
      this.dirctdao = dirctdao;
     }

    }

    ***********************************************************************************************************************

    action里面如下设置:

    string status = request.getparameter("status");
      if (status == null || status.equals("")) {
       status = "0";
      }

    list sttuslist = dirctservice
        .getdirectlabelvaluebean("com.sinoconcept.match.domain.drstatus");//数据字典表

    //drstatus 数据映设文件只要二个字段:private integer id;private string value;

    mandiaryform.setstatus(status);

    request.setattribute("statuslist", sttuslist);

    ****************************************************************************************************************

    页面上如下获得:


           
          



    simone 2006-11-16 09:44
    ]]>
    struts validation框架浅尝2http://www.blogjava.net/wangxinsh55/archive/2006/08/17/64197.htmlsimonesimonethu, 17 aug 2006 11:51:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64197.htmlhttp://www.blogjava.net/wangxinsh55/comments/64197.htmlhttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64197.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/64197.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/64197.html javascript 支持

           web 应用中,使用 javascript 的机会非常多。虽然不少书上提及客户有可能从浏览器关闭 js 的执行,但是要想完全的不使用它,目前看来好像还不行。比如一些复杂的 ui 是必须通过 js 来实现的(如下拉式菜单等等)。那么 validation 框架支不支持客户端的 js 验证呢?

    答案是:当然。具体做法是:

    -          在页面 html:form 标签内部添加 onsubmit="return validateeditform(this);" (具体的语法: validate validation.xml 文件中定义的 form 的名字);如:

    onsubmit="return validateeditform(this);">

    -          html:form 内部块中添加:

           如此 2 步即可。虽然, validation 框架非常简单易用,但是还是有需要注意的地方。

    blogjava-凯发k8网页登录

    1.       使用 validation 框架后, form 必须从 validatorform 中派生,同时必须在你的 validate 方法中先调用基类的 validate 方法。对于使用 dyna 开头的方法来创建 formbean 的读者,你也必须改为以 dyna 开头含有 validator form

    2.       注意 dynavalidatorform validatorform )和 dynavalidatoractionform validatoractionform )的区别。刚开始时从帮助中没看明白这 2 者的区别,后来从网上一篇文章中得到了用法的区别。前者主要的视角是 formbean ,而后者的视角是 action

    formbean 被不同的 action 使用时,对于不同的 action 而言,使用的 formbean 的属性集合有大有小。此时如果仍然以 formbean 为主体,会造成其他 action 的不正常使用。因此, struts 中提出了 dynavalidatoractionform validatoractionform )。此时在 validation.xml 中的 form 标签的 name 属性改为 action path 属性,又由于 action 中有 attribute name 属性, validation 框架就可根据这个 action 得到对应的 formbean 。例子:

     

       

              depends="required">

         

       

     

     

       

              depends="required">

         

       

     

    3.       dispatchaction 的配合。 struts1.1 dispatchaction 使得相关的 action 的关系紧密,大大减少了应用中 action 的个数,但是随之而来也带来了使用 validation 框架的不便,不能不说是一个遗憾。读者也许认为这种情况可以使用第 2 条的凯发天生赢家一触即发官网的解决方案来解决,即采用 dyanvalidatoractionform ,然后在 validation.xml 文件中 form 的名称使用不同的 actiond path ,即在 validation.xml 中使用:

        。然而,在目前的版本中 validation 框架并不支持这种辨认。一种绕过这个情况的方法是,针对同一个 action 实现类在 struts-config.xml 文件中定义多个 action path ,在不需要进行验证的地方将 action validate 属性置为 false 。即:

    struts-config.xml

    user" name="editform" input="/edituser.jsp"

    parameter="method" scope="request" type="foxgem.struts.userdispatchaction"

         validate="true">

                  

                  

           

    loaduser" name="editform" input="/edituser.jsp"

              parameter="method" scope="request" type="foxgem.struts.userdispatchaction"

              validate="false">

                  

                  

    然后在 validation.xml 文件中使用 2 的方法。

           总的说来, validation 框架大大的提高了页面验证的开发效率,更吸引人的是这些验证方法可通过自定义的 validator 来得到复用。使得这些验证代码更加集中,可维护性得到加强。当然随着项目的进行, validation.xml validator-rules.xml 会随之增长,这部分的维护工作加重了。

           同时,由于不能非常好的和 dispatchaction 一起协作,也使得大量使用 dispatchaction 的项目不能非常好的使用它。建议大量使用 dispatchaction 和页面验证非常复杂多变的项目可以暂时按原来的方法来验证,不使用 validation 框架。

           至于 validation 框架的其他详细信息,请参见 struts 的文档,在此不再赘述。

    n         dispatchaction validation 框架的协作凯发天生赢家一触即发官网的解决方案来源于此。

    n         check your form with validator

    n         深入 struts 1.1

    n         stepping through the struts 1.1 validator



    simone 2006-08-17 19:51
    ]]>struts validator验证器使用指南http://www.blogjava.net/wangxinsh55/archive/2006/08/17/64191.htmlsimonesimonethu, 17 aug 2006 11:32:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64191.htmlhttp://www.blogjava.net/wangxinsh55/comments/64191.htmlhttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64191.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/64191.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/64191.html阅读全文

    simone 2006-08-17 19:32
    ]]>
    struts、spring、hibernate中文乱码问题解决 http://www.blogjava.net/wangxinsh55/archive/2006/08/17/64185.htmlsimonesimonethu, 17 aug 2006 11:01:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64185.htmlhttp://www.blogjava.net/wangxinsh55/comments/64185.htmlhttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64185.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/64185.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/64185.html       近日,使用struts 1.1,发现讨厌的中文乱码问题,在form的传送过程和入库时候出现。就我在网络上找的方法罗列如下:
    (tomcat 5.0.28 struts 1.1 hibernate 2.1 sqlserver2k)
    1.直接转编码public static string isotogb(string src){   
    string strret=null;   
    try{    
      strret = new string(src.getbytes("iso_8859_1"),"gb2312");  
      }catch(exception e)    {         
    }    return strret;
    }通过一个函数转编码,我没有成功,不知为何!

    2.过滤filter设置法

    package yourbean;

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.util.*;

    public class servfilter extends httpservlet implements filter {  private filterconfig filterconfig;  //handle the passed-in filterconfig  public void init(filterconfig filterconfig) {    this.filterconfig = filterconfig;  }  //process the request/response pair  public void dofilter(servletrequest request, servletresponse response, filterchain filterchain) {    try {      request.setcharacterencoding("gb2312");       ((httpservletresponse)response).setheader("cache-control","no-cache");      response.setheader("pragma","no-cache"); response.setheader("cache-control","no-cache"); response.setheader("expires","0");       ((httpservletresponse)response).setheader("pragram","no-cache");      filterchain.dofilter(request, response);    }    catch(servletexception sx) {      filterconfig.getservletcontext().log(sx.getmessage());    }    catch(ioexception iox) {      filterconfig.getservletcontext().log(iox.getmessage());    }  }  //clean up resources  public void destroy() {  }}下面是一个web.xml文件你用jbuilder写上面的bean的时候会生成一个



      welcome to tomcat       welcome to tomcat        servfilter    yourbean.servfilter        servfilter    /*  把上面的servfilter编译放在你的web-inf/classes/yourbean/下web.xml放在web-inf/下和classes在一个目录下在每个jsp页面上加上<%@page contenttype="text/html;charset=gbk"%>

    也不是很方便,而且在tomcat也没有成功,继续郁闷!

    3.我现在使用方法,推荐!!

    写一个myactionservlet来并覆盖actionservlet中的process()方法。

      protected void process(httpservletrequest request, httpservletresponse response) throws java.io.ioexception, javax.servlet.servletexception {    /**@todo override this org.apache.struts.action.actionservlet method*/    request.setcharacterencoding("gb2312");//就加着一行一切都解决了    super.process(request, response);  }

    当然别忘了改一下web.xml里面的配置      action    strutsdemo.myactionservlet          debug      2              config      /web-inf/struts-config.xml        2 

    改一下servlet-class标签中的内容就可以!

    真的可以,一劳用yi!

    具体编码的理论就不说了,google上已经够多了。

    另外,如果不用struts的话,hibernate也可能碰到中文乱码问题,只要在hibernate.cfg.xml配置中如下:

       jdbc:microsoft:sqlserver://localhost:1433;selectmethod=cursor;characterencoding=gbk;databasename=mydatabase.  

    characterencoding=gbk!就可以了。



    ********************************************************************************************************************

    java/j2ee中文问题终极解决之道

    java中文问题一直困扰着很多初学者,如果了解了java系统的中文问题原理,我们就可以对中文问题能够采取根本的解决之道。

      最古老的凯发天生赢家一触即发官网的解决方案是使用string的字节码转换,这种方案问题是不方便,我们需要破坏对象封装性,进行字节码转换。

      还有一种方式是对j2ee容器进行编码设置,如果j2ee应用系统脱离该容器,则会发生乱码,而且指定容器配置不符合j2ee应用和容器分离的原则。

      在java内部运算中,涉及到的所有字符串都会被转化为utf-8编码来进行运算。那么,在被java转化之前,字符串是什么样的字符集? java总是根据操作系统的默认编码字符集来决定字符串的初始编码,而且java系统的输入和输出的都是采取操作系统的默认编码。

      因此,如果能统一java系统的输入、输出和操作系统3者的编码字符集合,将能够使java系统正确处理和显示汉字。这是处理java系统汉字的一个原则,但是在实际项目中,能够正确抓住和控制住java系统的输入和输出部分是比较难的。j2ee中,由于涉及到外部浏览器和数据库等,所以中文问题乱码显得非常突出。

      j2ee应用程序是运行在j2ee容器中。在这个系统中,输入途径有很多种:一种是通过页面表单打包成请求(request)发往服务器的;第二种是通过数据库读入;还有第3种输入比较复杂,jsp在第一次运行时总是被编译成servlet,jsp中常常包含中文字符,那么编译使用javac时,java将根据默认的操作系统编码作为初始编码。除非特别指定,如在jbuilder/eclipse中可以指定默认的字符集。

      输出途径也有几种:第一种是jsp页面的输出。由于jsp页面已经被编译成servlet,那么在输出时,也将根据操作系统的默认编码来选择输出编码,除非指定输出编码方式;还有输出途径是数据库,将字符串输出到数据库。

      由此看来,一个j2ee系统的输入输出是非常复杂,而且是动态变化的,而java是跨平台运行的,在实际编译和运行中,都可能涉及到不同的操作系统,如果任由java自由根据操作系统来决定输入输出的编码字符集,这将不可控制地出现乱码。

      正是由于java的跨平台特性,使得字符集问题必须由具体系统来统一解决,所以在一个java应用系统中,解决中文乱码的根本办法是明确指定整个应用系统统一字符集。

      指定统一字符集时,到底是指定iso8859_1 、gbk还是utf-8呢?

      (1)如统一指定为iso8859_1,因为目前大多数软件都是西方人编制的,他们默认的字符集就是iso8859_1,包括操作系统linux和数据库mysql等。这样,如果指定jive统一编码为iso8859_1,那么就有下面3个环节必须把握:

      开发和编译代码时指定字符集为iso8859_1。

      运行操作系统的默认编码必须是iso8859_1,如linux。

      在jsp头部声明:<%@ page contenttype="text/html;charset=iso8859_1" %>。

      (2)如果统一指定为gbk中文字符集,上述3个环节同样需要做到,不同的是只能运行在默认编码为gbk的操作系统,如中文windows。

      统一编码为iso8859_1和gbk虽然带来编制代码的方便,但是各自只能在相应的操作系统上运行。但是也破坏了java跨平台运行的优越性,只在一定范围内行得通。例如,为了使得gbk编码在linux上运行,设置linux编码为gbk。

      那么有没有一种除了应用系统以外不需要进行任何附加设置的中文编码根本凯发天生赢家一触即发官网的解决方案呢?

      将java/j2ee系统的统一编码定义为utf-8。utf-8编码是一种兼容所有语言的编码方式,惟一比较麻烦的就是要找到应用系统的所有出入口,然后使用utf-8去“结扎”它。

      一个j2ee应用系统需要做下列几步工作:

    1. 开发和编译代码时指定字符集为utf-8。jbuilder和eclipse都可以在项目属性中设置。
    2. 使用过滤器,如果所有请求都经过一个servlet控制分配器,那么使用servlet的filter执行语句,将所有来自浏览器的请求(request)转换为utf-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句:
      request.setcharacterencoding("utf-8")。
      网上有此filter的源码,中com.jdon.util.setcharacterencodingfilter
      需要配置web.xml 激活该filter。
    3. 在jsp头部声明:<%@ page contenttype="text/html;charset= utf-8" %>。
    4. 在jsp的html代码中,声明utf-8:
    5. 设定数据库连接方式是utf-8。例如连接mysql时配置url如下:
      jdbc:mysql://localhost:3306/test?useunicode=true&characterencoding=utf-8
      一般数据库都可以通过管理设置设定utf-8
    6. 其他和外界交互时能够设定编码时就设定utf-8,例如读取文件,操作xml等。
           

      以上讨论了java/j2ee的中文问题。如果整个应用系统是从开始进行开发,那么统一指定编码为utf-8就非常容易做到。如果是在英文源代码基础上二次开发,那么首先要将原来的源代码转换为统一编码utf-8,那么这种转换工作会带来一定的麻烦。

      

      有了这个凯发天生赢家一触即发官网的解决方案,无论使用什么框架struts 或jsf或未来出现的java技术,统一成utf-8的方案都不会出现乱码,笔者以前在jsp/servlet时就基于这个原则,后来使用struts等框架,从未被乱码困扰过,希望本方案公布出来供更多初学者分享,减少java/j2ee的第一个拦路虎,也避免采取一些临时凯发天生赢家一触即发官网的解决方案。


    ***********************************************************************************************************************
       
      encodingfilter  
       
      org.springframework.web.filter.characterencodingfilter  
     
     
       
      encoding  
      utf-8  
     
     
       
      forceencoding  
      true  
     
     
     
     
       
                         
      encodingfilter  
      action  
     



    ***********************************************************************************************

    hibernate mysql写入数据库的中文是乱码,怎么解决??


    hibernate.hbm.xml加上属性.
    true
    utf-8

    mysql 的驱动用3.0.15以上版本的,

    加个filter, 使用utf-8字符集就可以了,


     


    1.使applicationresources.properties支持中文
    建立一个applicationresources_iso.properties文件,把应用程序用的message都写进去,然后在dos下执行这个命令,
    native2ascii -encoding gb2312 applicationresources_iso.properties applicationresources.properties
    这样就会将iso编码的applicationresources转换成gb2312编码的格式了,同时保存到applicationresources.properties.
    native2ascii这个工具是jdk自带的一个东东,所以如果path都设定正确就可以直接运行了,你可以在$java_home$/bin下找到他。
    转换后的中文类似于这个样子
    iso 格式下 :tj.type=商品车类型
    gb2312格式下 :tj.type=\u5546\u54c1\u8f66\u7c7b\u578b
    然后在struts-config.xml中设置应用这个资源文件
     
    开发jsp时在jsp的开头写上<%@ page contenttype=\"text/html; charset=gb2312\" %>,将字符集设置成gb2312就可以了。

    2.使数据库操作支持中文。
    数据库操作支持中文一直让我比较头痛,但是感谢善解人衣向我推荐了www.chinaxp.org,这个网站是用struts框架开发的,而且
    开放源码,下载了源码后发现它的中文处理得很好,阅读部分源码,没有发现什么特殊的字符集转换,很纳闷,偶然看到楼上网友
    留言知道原来servlet可以统一设置字符转换。chinaxp.org就是这么做的。
    在web.xml中加上
      
        set character encoding
        com.huahang.tj.struts.filters.setcharacterencodingfilter
        
          encoding
          gb2312
        

        
          ignore
          true
        

      

      
        set character encoding
        action
      

    这里会涉及一个bean,源码如下:
    /*
     * xp forum
     *    
     * 凯发天生赢家一触即发官网 copyright (c) 2002-2003 redsoft group.  all rights reserved.
     *
     */
    package com.huahang.tj.struts.filters;

    import javax.servlet.*;
    import java.io.ioexception;

    /**
     * 

    filter that sets the character encoding to be used in parsing the
     * incoming request, either unconditionally or only if the client did not
     * specify a character encoding.  configuration of this filter is based on
     * the following initialization parameters:


     * 

       * 
    • encoding - the character encoding to be configured
       *     for this request, either conditionally or unconditionally based on
       *     the ignore initialization parameter.  this parameter
       *     is required, so there is no default.

    •  * 
    • ignore - if set to \"true\", any character encoding
       *     specified by the client is ignored, and the value returned by the
       *     selectencoding() method is set.  if set to \"false,
       *     selectencoding() is called only if the
       *     client has not already specified an encoding.  by default, this
       *     parameter is set to \"true\".

    •  * 

     *
     * 

    although this filter can be used unchanged, it is also easy to
     * subclass it and make the selectencoding() method more
     * intelligent about what encoding to choose, based on characteristics of
     * the incoming request (such as the values of the accept-language
     * and user-agent headers, or a value stashed in the current
     * user\'s session.


     *
     * @author john wong
     *
     * @version $id: setcharacterencodingfilter.java,v 1.1 2002/04/10 13:59:27 johnwong exp $
     */
    public class setcharacterencodingfilter implements filter {

        // ----------------------------------------------------- instance variables


        /**
         * the default character encoding to set for requests that pass through
         * this filter.
         */
        protected string encoding = null;


        /**
         * the filter configuration object we are associated with.  if this value
         * is null, this filter instance is not currently configured.
         */
        protected filterconfig filterconfig = null;


        /**
         * should a character encoding specified by the client be ignored?
         */
        protected boolean ignore = true;


        // --------------------------------------------------------- public methods


        /**
         * take this filter out of service.
         */
        public void destroy() {

            this.encoding = null;
            this.filterconfig = null;

        }


        /**
         * select and set (if specified) the character encoding to be used to
         * interpret request parameters for this request.
         *
         * @param request the servlet request we are processing
         * @param result the servlet response we are creating
         * @param chain the filter chain we are processing
         *
         * @exception ioexception if an input/output error occurs
         * @exception servletexception if a servlet error occurs
         */
        public void dofilter(servletrequest request, servletresponse response,
                             filterchain chain)
        throws ioexception, servletexception {

            // conditionally select and set the character encoding to be used
            if (ignore || (request.getcharacterencoding() == null)) {
                string encoding = selectencoding(request);
                if (encoding != null)
                    request.setcharacterencoding(encoding);
            }

        // pass control on to the next filter
            chain.dofilter(request, response);

        }


        /**
         * place this filter into service.
         *
         * @param filterconfig the filter configuration object
         */
        public void init(filterconfig filterconfig) throws servletexception {

        this.filterconfig = filterconfig;
            this.encoding = filterconfig.getinitparameter(\"encoding\");
            string value = filterconfig.getinitparameter(\"ignore\");
            if (value == null)
                this.ignore = true;
            else if (value.equalsignorecase(\"true\"))
                this.ignore = true;
            else if (value.equalsignorecase(\"yes\"))
                this.ignore = true;
            else
                this.ignore = false;

        }


        // ------------------------------------------------------ protected methods


        /**
         * select an appropriate character encoding to be used, based on the
         * characteristics of the current request and/or filter initialization
         * parameters.  if no character encoding should be set, return
         * null.
         * 


         * the default implementation unconditionally returns the value configured
         * by the encoding initialization parameter for this
         * filter.
         *
         * @param request the servlet request we are processing
         */
        protected string selectencoding(servletrequest request) {

            return (this.encoding);

        }

    }//eoc
    加上这个后,在action中就可以直接从form中接收gb2312编码的数据了,返回时自然也是gb2312了。
    但是这个好像需要servlet 2.2以上的容器

    综合上面的方法,我解决了struts中的中文问题,现在还没发现新的问题。



    simone 2006-08-17 19:01
    ]]>
    struts常见异常信息和解决方法http://www.blogjava.net/wangxinsh55/archive/2006/08/17/64183.htmlsimonesimonethu, 17 aug 2006 10:57:00 gmthttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64183.htmlhttp://www.blogjava.net/wangxinsh55/comments/64183.htmlhttp://www.blogjava.net/wangxinsh55/archive/2006/08/17/64183.html#feedback0http://www.blogjava.net/wangxinsh55/comments/commentrss/64183.htmlhttp://www.blogjava.net/wangxinsh55/services/trackbacks/64183.html以下所说的struts-config.xml和applicationresources.properties等文件名是缺省时使用的,如果你使用了多模块,或指定了不同的资源文件名称,这些名字要做相应的修改。

    1、“no bean found under attribute key xxx”
    在struts-config.xml里定义了一个actionform,但type属性指定的类不存在,type属性的值应该是form类的全名。或者是,在action的定义中,name或attribute属性指定的actionform不存在。

    2、“cannot find bean xxx in any scope”
    在action里一般会request.setattribute()一些对象,然后在转向的jsp文件里(用tag或request.getattribute()方法)得到这些对象并显示出来。这个异常是说jsp要得到一个对象,但前面的action里并没有将对象设置到request(也可以是session、servletcontext)里。
    可能是名字错了,请检查jsp里的tag的一般是name属性,或getattribute()方法的参数值;或者是action逻辑有问题没有执行setattribute()方法就先转向了。
    还有另外一个可能,纯粹是jsp文件的问题,例如会指定一个id值,然后在循环里使用这个值作为name的值,如果这两个值不同,也会出现此异常。(都是一个道理,request里没有对应的对象。)

    3、“missing message for key "xxx"”
    缺少所需的资源,检查applicationresources.properties文件里是否有jsp文件里需要的资源,例如:

     

    < bean:message key = " msg.name.prompt " />

     

    这行代码会找msg.name.prompt资源,如果appliationresources.properties里没有这个资源就会出现本异常。在使用多模块时,要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名称,否则当然什么资源也找不到,这也是一个很容易犯的错误。

    4、“no getter method for property xxx of bean teacher”
    这条异常信息说得很明白,jsp里要取一个bean的属性出来,但这个bean并没有这个属性。你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对:

    < bean:write name = " teacher "  property = " cade "  filter = " true " />

    5、“cannot find actionmappings or actionformbeans collection”
    待解决。

    6、“cannot retrieve mapping for action xxx”
    在.jsp的标签里指定action='/xxx',但这个action并未在struts-config.xml里设置过。

    7、http status 404 - /xxx/xxx.jsp
    forward的path属性指向的jsp页面不存在,请检查路径和模块,对于同一模块中的action转向,path中不应包含模块名;模块间转向,记住使用contextrelative="true"。

    8、没有任何异常信息,显示空白页面
    可能是action里使用的forward与struts-config.xml里定义的forward名称不匹配。

    9、“the element type "xxx" must be terminated by the matching end-tag "xxx".”
    这个是struts-config.xml文件的格式错误,仔细检查它是否是良构的xml文件,关于xml文件的格式这里就不赘述了。

    10、“servlet.init() for servlet action threw exception”
    一般出现这种异常在后面会显示一个关于actionservlet的异常堆栈信息,其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下:

    java.lang.nullpointerexception
        at org.apache.struts.action.actionservlet.parsemoduleconfigfile(actionservlet.java:
    1003 )
        at org.apache.struts.action.actionservlet.initmoduleconfig(actionservlet.java:
    955 )


    为解决问题,先下载struts的源码包,然后在actionservlet.java的第1003行插入断点,并对各变量进行监视。很丢人,我竟然把struts-config.xml文件弄丢了,因此出现了上面的异常,应该是和cvs同步时不小心删除的。

    11、“resources not defined for validator”
    这个是利用validator插件做验证时可能出现的异常,这时你要检查validation.xml文件,看里面使用的资源是否确实有定义,form的名称是否正确,等等。

    上面这些是我在用struts做项目时遇到过的问题,其中一些曾困绕我不少时间,其实大部分都是自己不细心造成的。希望这篇文章能对你的开发有所帮助,并欢迎继续补充。

    12.struts编译中出现“cannot find actionmappings or actionformbeans collection”提示的原因?

    1. web.xml未初始化问题
      少了一个0
      这样开始是没有加载这个类,就没有初始化struts-config.xml,所以找不到
      actionmappings or actionformbeans collection。
    2. struts-config.xml问题
    3. jar包不全或版本不对
      也有可能导致这个问题,从stuts例子里面拷过来就好了。struts1.1自带共10个jar包。
    4. 编译问题
      有可能action和formbean没有编译,也会有这个问题,检查一下有没有对应的class文件就好。class路径不对可能也会导致这个问题。
    5. 版本问题
      用的servlet容器和struts版本不对或这两个版本协调有问题。
      在以上几条都不能解决问题的情况下,可能就是版本的问题了,换个高版本试试吧


    simone 2006-08-17 18:57
    ]]>
    网站地图