亚洲网站在线播放,亚洲A丁香五香天堂网,亚洲熟妇AV一区二区三区宅男http://www.tkk7.com/lzj520/category/15591.htmlzh-cnThu, 31 Jan 2008 20:54:30 GMTThu, 31 Jan 2008 20:54:30 GMT60SSH集成Fckeditorhttp://www.tkk7.com/lzj520/archive/2008/01/31/178672.htmllzj520lzj520Thu, 31 Jan 2008 06:24:00 GMThttp://www.tkk7.com/lzj520/archive/2008/01/31/178672.htmlhttp://www.tkk7.com/lzj520/comments/178672.htmlhttp://www.tkk7.com/lzj520/archive/2008/01/31/178672.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/178672.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/178672.html
去下載了FCKeditor_2.5.1.zip和FCKeditor-2.3.zip,一個是JAVA版本的文件,一個是FCK原本的文件。擺放的方式大概如下圖:


web.xml加入代碼:

 <!-- fckeditor -->

  <servlet>

        <servlet-name>Connector</servlet-name>
        <servlet-class>com.fredck.FCKeditor.connector.ConnectorServlet</servlet-class>
        <init-param>
            <param-name>baseDir</param-name>
            <!-- 此為文件瀏覽路徑 -->
            <param-value>/UserFiles/</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>SimpleUploader</servlet-name>
        <servlet-class>com.fredck.FCKeditor.uploader.SimpleUploaderServlet</servlet-class>
        <init-param>
            <param-name>baseDir</param-name>
            <!-- 此為文件上傳路徑,需要在WebRoot 目錄下新建 UserFiles 文件夾 -->
            <!-- 根據(jù)文件的類型還需要新建相關的文件夾 Image、 Flash -->
            <param-value>/UserFiles/</param-value>
        </init-param>

        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>

            <!-- 此參數(shù)為是否開啟上傳功能 -->
            <param-name>enabled</param-name>
            <param-value>false</param-value>
        </init-param>

        <init-param>
            <param-name>AllowedExtensionsFile</param-name>
            <param-value></param-value>
        </init-param>

        <init-param>
            <!-- 此參數(shù)為文件過濾,以下的文件類型都不可以上傳 -->
            <param-name>DeniedExtensionsFile</param-name>
            <param-value>php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi</param-value>
        </init-param>

        <init-param>
            <param-name>AllowedExtensionsImage</param-name>
            <param-value>jpg|gif|jpeg|png|bmp</param-value>
        </init-param>

        <init-param>
            <param-name>DeniedExtensionsImage</param-name>
            <param-value></param-value>
        </init-param>

        <init-param>
            <param-name>AllowedExtensionsFlash</param-name>
            <param-value>swf|fla</param-value>
        </init-param>

        <init-param>
            <param-name>DeniedExtensionsFlash</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>  

  <servlet-mapping>
    <servlet-name>Connector</servlet-name>
    <url-pattern>/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>SimpleUploader</servlet-name>
    <url-pattern>/FCKeditor/editor/filemanager/upload/simpleuploader</url-pattern>
  </servlet-mapping>

輸入的jsp文件類似如下:

  <html:form action="/fck" method="post">
    <fck:editor id = "fcktext" basePath = "/new1/FCKeditor/"
    height = "100%"
    skinPath = "/new1/FCKeditor/editor/skins/default/"
    toolbarSet = "Default"
        imageBrowserURL = "/new1/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector"
        linkBrowserURL = "/new1/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector"
        flashBrowserURL = "/new1/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector"
    imageUploadURL = "/new1/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Image"
       linkUploadURL = "/new1/FCKeditor/editor/filemanager/upload/simpleuploader?Type=File"
       flashUploadURL = "/new1/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Flash" >
    </fck:editor>
    <html:submit/><html:cancel/>
    </html:form>

其中的id是對應于ActionForm與validationv.xml里的property。分別類似如下:

  String strfcktext = fckForm.getString("fcktext");

<form name="fckForm">
        <field property="fcktext" depends="required">
       <arg key="fckForm.fcktext"/>    
       </field>  
   </form>

另外需要注意的是,如果顯示找不到頁面的錯誤,應該是form里FCK相關的路徑設置不正確。數(shù)據(jù)庫段的字段也需要設置足夠大。如果傳輸過程里出現(xiàn)亂碼,可以所有jsp頁面加入:<%@ page language="java" contentType="text/html; charset=UTF-8"%>,在web.xml里加入u-f8 filter:

<!-- u-f8 filter -->
  <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
 </filter>

 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>*.do</url-pattern>
 </filter-mapping>

 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
 </filter-mapping>



lzj520 2008-01-31 14:24 發(fā)表評論
]]>
Struts+spring使用隨機驗證碼http://www.tkk7.com/lzj520/archive/2008/01/18/176261.htmllzj520lzj520Fri, 18 Jan 2008 08:09:00 GMThttp://www.tkk7.com/lzj520/archive/2008/01/18/176261.htmlhttp://www.tkk7.com/lzj520/comments/176261.htmlhttp://www.tkk7.com/lzj520/archive/2008/01/18/176261.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/176261.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/176261.htmlstruts-config.xml

    <form-bean name="checkForm" type="org.apache.struts.validator.DynaValidatorForm">
      <form-property name="rand" type="java.lang.String" />
    </form-bean>
    <action
      attribute="checkForm"
      input="/check/check.jsp"
      name="checkForm"
      path="/check"
      scope="request"
      validate="true"
      type="com.yourcompany.struts.action.CheckAction">
      <forward name="ok" path="/check/checkok.jsp" />
    </action>

validation.xml

   <form name="checkForm">
        <field property="rand" depends="required">
       <arg key="checkForm.rand"/>    
       </field>  
   </form>

spring config

<bean name="/check" class="com.yourcompany.struts.action.CheckAction"/>

checkAction.java

public class CheckAction extends Action {
 /*
  * Generated Methods
  */

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  DynaValidatorForm checkForm = (DynaValidatorForm) form;// TODO Auto-generated method stub
        /*HttpSession session=request.getSession();
        String strrand = (String)session.getAttribute("rand");
        session.setAttribute("rand", strrand);*/
  return mapping.findForward("ok");
 }
}

check.jsp

<%@ page language="java" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
 
<html>
 <head>
  <title>JSP for DynaValidatorForm form</title>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
  <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
  <META HTTP-EQUIV="Expires" CONTENT="0">
 </head>
 <body>
  <html:form action="/check">
  <td><img border=0 src="check/image.jsp"></td>
  <html:text property="rand"/><html:errors property="rand"/><br/>
   <html:submit/><html:cancel/>
  </html:form>
 </body>
</html>

 

checkok.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>  
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  </head>
  <body>
<%
 String rand = (String)session.getAttribute("rand");
 String input = request.getParameter("rand");
  if (rand.equals(input)) {
%>
<font color=green>OK</font>
<%
  } else {
%>
<font color=red>FAIL</font>
<%
  }
%>
  </body>
</html>

image.jsp

<%@ page language="java" import="java.util.*" %>
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,javax.imageio.*" %>
<%@ page import="java.io.OutputStream" %>
<%!
Color getRandColor(int fc,int bc){
        Random random = new Random();
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
        }
%>
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
OutputStream os=response.getOutputStream();
Graphics g = image.getGraphics();

Random random = new Random();


g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

g.setFont(new Font("Times New Roman",Font.PLAIN,18));

g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
 int x = random.nextInt(width);
 int y = random.nextInt(height);
        int xl = random.nextInt(12);
        int yl = random.nextInt(12);
 g.drawLine(x,y,x+xl,y+yl);
}

String sRand="";
for (int i=0;i<4;i++){
    String rand=String.valueOf(random.nextInt(10));
    sRand+=rand;

    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
    g.drawString(rand,13*i+6,16);
}

session.setAttribute("rand",sRand);

g.dispose();

ImageIO.write(image, "JPEG",os);
os.flush();
os.close();
os=null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
%>



lzj520 2008-01-18 16:09 發(fā)表評論
]]>
ssh上傳并顯示圖片http://www.tkk7.com/lzj520/archive/2008/01/17/176020.htmllzj520lzj520Thu, 17 Jan 2008 09:44:00 GMThttp://www.tkk7.com/lzj520/archive/2008/01/17/176020.htmlhttp://www.tkk7.com/lzj520/comments/176020.htmlhttp://www.tkk7.com/lzj520/archive/2008/01/17/176020.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/176020.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/176020.html
struts部分:

 <form-bean name="upfileForm" type="org.apache.struts.validator.DynaValidatorForm">
      <form-property name="filename" type="java.lang.String" />
      <form-property name="filedata" type="org.apache.struts.upload.FormFile" />
    </form-bean>

    <action
      attribute="upfileForm"
      input="/upload/uploadfile.jsp"
      name="upfileForm"
      path="/upfile"
      scope="request"
      validate="true"
      type="com.yourcompany.struts.action.UpfileAction">
      <forward name="ok" path="/upload/ok.jsp" />
    </action>

    <action path="/displayimg" type="com.yourcompany.struts.action.DisplayimgAction">
      <forward name="ok" path="/upload/displayimg.jsp" />
    </action>

 

public class UpfileAction extends Action {
 /*
  * Generated Methods
  */

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  DynaActionForm upfileForm = (DynaActionForm) form;// TODO Auto-generated method stub  
   Image image = new Image();

   String strimgname = upfileForm.getString("filename");
   image.setImgname(strimgname);
   imageDAO.save(image); 
  FormFile filedata = (FormFile)upfileForm.get("filedata");
   ServletContext servletContext = this.getServlet().getServletContext();
   String filePath = servletContext.getRealPath("/");
   try {
    InputStream stream = filedata.getInputStream();
    OutputStream bos = new FileOutputStream(filePath + "/image/" + filedata.getFileName());
     int bytesRead = 0;
             byte[] buffer = new byte[8192];
             while ( (bytesRead = stream.read(buffer, 0, 8192)) != -1) {
             bos.write(buffer, 0, bytesRead);
             }
             bos.close();
             stream.close();
   }catch (FileNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return mapping.findForward("ok");
 }
 
 private ImageDAO imageDAO;
 public void setImageDAO(ImageDAO dao){
  this.imageDAO = dao;  
 }
 
}


 

public class DisplayimgAction extends Action {
 /*
  * Generated Methods
  */

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  List results = imageDAO.findAll();
  if(results!=null){
   HttpSession session=request.getSession();
            session.setAttribute("results",results);
            return mapping.findForward("ok");
  }return mapping.findForward("fail");
 }
 
 private ImageDAO imageDAO;
 public void setImageDAO(ImageDAO dao){
  this.imageDAO = dao;  
 }
 
}


ImageDAO.java

 public void save(Image transientInstance) {
     Session session =this.getSession();
     Transaction tx = null;
     tx = session.beginTransaction();
     session.save(transientInstance);
     tx.commit();
     session.evict(transientInstance);
 }

 public List findAll() {
  Session session =this.getSession();
  Query query = session.createQuery("from Image");
  return query.list();
 }

displayimg.jsp

<logic:iterate id="element" name="results">
    <tr>
   <td width="100"><bean:write name="element" property="id"/> </td>
   <td width="100"><img  src="image/<bean:write  name='element' property='imgname'/>"/></td>
   </tr>
</logic:iterate>

uploadfile.jsp

<html:form action="/upfile" enctype = "multipart/form-data">
   filename : <html:text  property="filename"/><html:errors property="filename"/><br/>
   filedata : <html:file property="filedata"/><html:errors property="filedata"/><br/>
   <html:submit/><html:cancel/>
  </html:form>

<!-- u-f8 filter -->
  <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
 </filter>

 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>*.do</url-pattern>
 </filter-mapping>

 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
 </filter-mapping>



lzj520 2008-01-17 17:44 發(fā)表評論
]]>
SSH發(fā)送郵件的代碼http://www.tkk7.com/lzj520/archive/2008/01/14/175271.htmllzj520lzj520Mon, 14 Jan 2008 10:10:00 GMThttp://www.tkk7.com/lzj520/archive/2008/01/14/175271.htmlhttp://www.tkk7.com/lzj520/comments/175271.htmlhttp://www.tkk7.com/lzj520/archive/2008/01/14/175271.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/175271.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/175271.html
serviceContext-moudle_sendmail.xml:

<beans>
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
      <property name="host" >
     <value>smtp.gmail.com</value>
    </property>
  <property name="javaMailProperties">
 <props>
 <prop key="mail.smtp.auth">true</prop>
   <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
    <prop key="mail.smtp.socketFactory.fallback">false</prop>
 <prop key="mail.smtp.timeout">25000</prop>
 </props>
 </property>
 <property name="port">
        <value>465</value>
        </property>
 <property name="username">
 <value>your_name@gmail.com</value>
 </property>
 <property name="password">
  <value>your_password</value>
 </property>  
 </bean>
   
    <bean id ="enrollmentMailMessage" class="org.springframework.mail.SimpleMailMessage">
    <property name="to">
     <value>abc@21cn.com</value>
    </property>
    <property name="from">
     <value>your_name@gmail.com</value>
    </property>
    <property name="subject">
     <value>spring mail test</value>
    </property>
    </bean>
   
 <bean id="SendMail" class="com.yourcompany.service.SendMailImpl">
 <property name="mailMessage">
     <ref bean="enrollmentMailMessage"/>
    </property>
 <property name="mailSender">
     <ref bean="mailSender"/>
    </property>   
 </bean>
</beans>

SendMailAction.java

public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  DynaActionForm sendMailForm = (DynaActionForm) form;// TODO Auto-generated method stub
  String strcontent = sendMailForm.getString("content");
  sendMail.sendmail(strcontent);
  return mapping.findForward("ok");
 }
 private SendMail sendMail;
 public void setSendMail(SendMail dao){
  this.sendMail = dao;  
 }

SendMail.java

public interface SendMail {
 public void sendmail(String content);
}

SendMailImpl.java

public class SendMailImpl implements SendMail {
private MailSender mailSender;
public void setMailSender(MailSender mailSender){
 this.mailSender = mailSender;
}
 private SimpleMailMessage mailMessage;
 public void setMailMessage(SimpleMailMessage mailMessage){
  this.mailMessage = mailMessage;
 }

 public void sendmail(String content){
  SimpleMailMessage message = new SimpleMailMessage(this.mailMessage);
  StringBuffer messageText = new StringBuffer();
  messageText.append(content);
  message.setText(messageText.toString());
  mailSender.send(message);
 }
}


struts-config.xml

    <form-bean name="sendMailForm" type="org.apache.struts.validator.DynaValidatorForm">
      <form-property name="content" type="java.lang.String" />
    </form-bean>

    <action
      attribute="sendMailForm"
      input="/sendmail/SendMail.jsp"
      name="sendMailForm"
      path="/sendMail"
      scope="request"
      validate="true"
      type="com.yourcompany.struts.action.SendMailAction" >
      <forward name="ok" path="/sendmail/SendMailOk.jsp" />
    </action>

SendMail.jsp

  <html:form action="/sendMail">
   content : <html:text property="content"/><html:errors property="content"/><br/>
   <html:submit/><html:cancel/>
  </html:form>

validation.xml

   </form>
     <form name="sendMailForm">
     <field property="content" depends="required">
       <arg key="sendMailForm.content"/>    
       </field>      
   </form>

lzj520 2008-01-14 18:10 發(fā)表評論
]]>
自己寫了一個ssh分頁http://www.tkk7.com/lzj520/archive/2008/01/10/174373.htmllzj520lzj520Thu, 10 Jan 2008 10:55:00 GMThttp://www.tkk7.com/lzj520/archive/2008/01/10/174373.htmlhttp://www.tkk7.com/lzj520/comments/174373.htmlhttp://www.tkk7.com/lzj520/archive/2008/01/10/174373.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/174373.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/174373.html
首先,先創(chuàng)建一個顯示每一頁(有若干條數(shù)據(jù))的方法(如下面的hfindAll方法),決定好每一頁接收一個頁碼參數(shù),然后顯示該頁碼里的數(shù)據(jù)。比如有100條數(shù)據(jù),那么分10頁,那第幾頁顯示第幾條至第幾條數(shù)據(jù)。然后再創(chuàng)建一個方法是用于在view層顯示頁數(shù)(如下面的amountPage方法),最后是在view層上為每一頁數(shù)的數(shù)字加上超鏈接。

以下是主要代碼:
public class LoginDAO extends HibernateDaoSupport {
private int PageSize =5;
/*設置每頁的數(shù)據(jù)條數(shù)*/

 public Integer amountPage(){
     Session session =this.getSession();
  Query query = session.createQuery("from Login");
  query.setCacheable(true);
  int a = query.list().size()%PageSize;
/*總記錄數(shù)/每頁數(shù)據(jù)數(shù),判斷是否能整除*/
  Integer amount;
  if(a!=0){
   amount = query.list().size()/PageSize+1;
/*如果整除有余數(shù),則頁數(shù)加1*/
  }else{
   amount = query.list().size()/PageSize;
/*如果整除沒余數(shù),則直接總記錄數(shù)/每頁數(shù)據(jù)數(shù)*/
  }
  return amount;
 }

 public List hfindAll(String pagenum) {
     Session session =this.getSession();
  Query query = session.createQuery("from Login");
  if (pagenum == null){
/*如果pagenum是空,則數(shù)據(jù)從第一條開始*/
  query.setFirstResult(0);
/*設置查詢開始的第幾條數(shù)據(jù),這里是從第1條開始*/
  query.setMaxResults(PageSize);
/*設置查詢數(shù)據(jù)條數(shù),這里是5條*/
  query.setCacheable(true);
/*設置一級緩存*/
  }else{
   Integer p = (Integer.valueOf(pagenum)-1) * PageSize;
   query.setFirstResult(p);
   query.setMaxResults(PageSize);
   query.setCacheable(true);
  }
  return query.list();
 }
}

然后需要解決的是一些數(shù)據(jù)傳遞,類型轉換和在view層顯示的問題,主要代碼如下:

在ACTION里:
String strpagenum = request.getParameter("pagenum");
  List results= loginManage.hfind(strpagenum);
  Integer amountPage = loginManage.amountPage();
    if(results!=null){
             HttpSession session=request.getSession();
             session.setAttribute("results",results);
             session.setAttribute("amountPage",amountPage);
             return mapping.findForward("ok");
         }
    return mapping.findForward("fail");

在view視圖里:
顯示每頁數(shù)據(jù)的代碼:

 <logic:iterate id="element" name="results">    <tr>
   <td width="100"><input type="checkbox" name="select" value="<bean:write name="element" property="id"/>"><bean:write name="element" property="id"/></td>
   <td width="100"><bean:write name="element" property="name"/> </td>
   <td width="100"><bean:write name="element" property="password"/></td>
   </tr></logic:iterate>

顯示頁碼的代碼:
<%
   int i;
  int a=Integer.parseInt(session.getAttribute("amountPage").toString());
   for (i=1;i<=a;i++){
   out.println("<tr>");  
          out.println("<td><a href='display.do?pagenum="+ i +"'>"+ i +"</a></td>");    
          out.println("</tr>");    
   }
    %>




lzj520 2008-01-10 18:55 發(fā)表評論
]]>
070825 struts1的ActionFormhttp://www.tkk7.com/lzj520/archive/2007/08/25/139219.htmllzj520lzj520Sat, 25 Aug 2007 01:17:00 GMThttp://www.tkk7.com/lzj520/archive/2007/08/25/139219.htmlhttp://www.tkk7.com/lzj520/comments/139219.htmlhttp://www.tkk7.com/lzj520/archive/2007/08/25/139219.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/139219.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/139219.htmlMyEclipse 6.0 GA for eclipse 3.3已經(jīng)正式發(fā)布了,但還不支持struts2。我還是先用著5.5GA吧。

struts1里面的ActionForm有分ActionForm和DynaActionForm,如果需要使用Validator的話,也有分為ValidatorForm,ValidatorActionForm,DynaValidatorForm,DynaValidatorActionForm幾種。一般用得比較多的是Dyna的Form,而其中又以Validator使用較為普遍。我都試過用,其中DynaValidatorForm和DynaValidatorActionForm比較容易混淆。

用簡單的話說,這2者寫法上的區(qū)別在于這3個地方:

1)struts-config.xml:ActionForm type應分別為org.apache.struts.validator.DynaValidatorForm和org.apache.struts.validator.DynaValidatorActionForm
2)Action里的分別使用為:DynaActionForm addLoginMemberForm = (DynaActionForm) form;和DynaValidatorActionForm addOrdersForm = (DynaValidatorActionForm) form;
3)validation.xml里:DynaValidatorForm引用form的方法是如addLoginMemberForm,用名稱,而DynaValidatorActionForm是使用spring里注冊的action路徑:/addOrders

很多時候將一個ActionForm公用到多個Action上(兩者通過name屬性來關聯(lián)),這時麻煩出來了.由于不同業(yè)務處理對數(shù)據(jù)的有效性驗證的要求略有不同,這對處理數(shù)據(jù)驗證的validator框架提供了一個要求----如何根據(jù)不同的業(yè)務請求,對同一個ActionForm進行不同的數(shù)據(jù)驗證了?

使用DynaValidatorActionForm,校驗是根據(jù)action元素的path屬性值來區(qū)分FormBean,而action元素的path屬性值正是不同action區(qū)分的唯一標記,這樣根據(jù)不同的action我們對同一個ActionForm給出不同的驗證規(guī)則了。



lzj520 2007-08-25 09:17 發(fā)表評論
]]>
070621 SSH一些出錯小結(不斷更新)http://www.tkk7.com/lzj520/archive/2007/06/21/125513.htmllzj520lzj520Thu, 21 Jun 2007 04:01:00 GMThttp://www.tkk7.com/lzj520/archive/2007/06/21/125513.htmlhttp://www.tkk7.com/lzj520/comments/125513.htmlhttp://www.tkk7.com/lzj520/archive/2007/06/21/125513.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/125513.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/125513.htmlSpring Hibernate在AOP方面的配置沖突
Spring2.0 Hibernate3.1.x/Hibernate3.2

在使用Spring的AOP編程時,會用到這幾個lib:
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar

Hibernate如果使用lib:
asm.jar
asm-attrs.jar

其中asm-2.2.2.jar與asm.jar存在類上的沖突!!!
使用其中之一或兩者都使用,可能會出現(xiàn)如下錯誤:
java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。

解決辦法是:
1).去掉類路徑上的關于Hibernate的3個lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2).加入Spring中的以下4個lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar

如果再不行,都試試刪刪看。


java.lang.SecurityException: class "javax.xml.bind.JAXBContext"'s signer information does not match signer information of other classes in the same package
這個錯誤是因為載入的包里面有兩個相同路徑的類,就是在一個包里面有兩個同名的類
有可能是將相同的包載入兩次或者把包解開后,先將jar文件載入了,后又將解開的類載入了


Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
試試自己去下一個spring的包,把包里的spring.jar加到項目里去。eclipse生成的時候可能會有些包沒有放進去。


Error creating bean with name 'datasource' defined in file
Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
試試將commons-dbcp.jar,commons-pool.jar和commons- collections.jar加入CLASSPATH中


hibernate 3.1 中的hibernateTemplate ,class應該為org.springframework.orm.hibernate3.HibernateTemplate,而非org.springframework.orm.hibernate.HibernateTemplate,因為某些原因我現(xiàn)在還用3.1,早前在玩springside的時候感覺hibernate 3.2 的Hibernate Annotations方便多了。

找不到action或報錯的另一少有原因,一些版本hibernate版本會有些沖突方面的問題,可換一版本的hibernate試試,個人感覺hibernate的版本對應用會比較敏感


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
java.lang.NoClassDefFoundError: javax/transaction/TransactionManager


原因:缺少jta.jar 或者是找不到hbm.xml文件導致sessionfactory出錯,檢查hbm文件路徑是否正確,文件是否存在
<property name="mappingResources">
  <list>
  <value>com/yourcompany/model/Login.hbm.xml
  </value>
  </list>
  </property>


2007-06-26 18:38:13,671 ERROR [com.yourcompany.model.dao.LoginDAO] - <save failed>
org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not insert: [com.yourcompany.model.Login]; bad SQL grammar [insert into mysql__login (name, password) values (?, ?)]; nested exception is java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist
java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist

把hbm文件里面的catalog="'mysql"去掉即可!
另注意的一點是eclipse生成的DAO文件應該是:
    public void save(Login transientInstance) {
        log.debug("saving Login instance");
        try {
            getHibernateTemplate().save(transientInstance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }
而不是原來的    public void save(LoginDAO transientInstance)

只要在applicationContext.xml中加上
<property name="mappingResources">
<list>
<value>com/yourcompany/hibernate/Users.hbm.xml</value>
</list>
</property>
加這段代碼就會找不到action
換一個版本的hibernate應該就ok


Invalid path /addcustomer was requested
輸入的路徑不正確,檢查spring中注冊的action的路徑和輸入的路徑是否一致,留意大小寫是否一致



lzj520 2007-06-21 12:01 發(fā)表評論
]]>
070618 Struts的Validator驗證遇到的一些小問題http://www.tkk7.com/lzj520/archive/2007/06/18/124917.htmllzj520lzj520Mon, 18 Jun 2007 04:50:00 GMThttp://www.tkk7.com/lzj520/archive/2007/06/18/124917.htmlhttp://www.tkk7.com/lzj520/comments/124917.htmlhttp://www.tkk7.com/lzj520/archive/2007/06/18/124917.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/124917.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/124917.html 

validation.xml提示arg1、arg2出錯:
檢查bundle屬性引用的dtd文檔是否有相關定義。

其他出錯提示:
1、檢查bundle屬性引用的dtd文檔是否有相關定義。2、檢查是否有拼寫錯誤。(這個可能性還是挺大的)3、檢查一下資源文件是否有問題(這個可能性不大)

lzj520 2007-06-18 12:50 發(fā)表評論
]]>
(轉)在Struts 2.0中國際化(i18n)您的應用程序http://www.tkk7.com/lzj520/archive/2006/11/02/78626.htmllzj520lzj520Thu, 02 Nov 2006 03:32:00 GMThttp://www.tkk7.com/lzj520/archive/2006/11/02/78626.htmlhttp://www.tkk7.com/lzj520/comments/78626.htmlhttp://www.tkk7.com/lzj520/archive/2006/11/02/78626.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/78626.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/78626.html國際化是商業(yè)系統(tǒng)中不可或缺的一部分,所以無論您學習的是什么Web框架,它都是必須掌握的技能。

其實,Struts 1.x在此部分已經(jīng)做得相當不錯了。它極大地簡化了我們程序員在做國際化時所需的工作,例如,如果您要輸出一條國際化的信息,只需在代碼包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME為默認資源文件的文件名),然后在struts-config.xml中指明其路徑,再在頁面用<bean:message>標志輸出即可。

不過,所謂“沒有最好,只有更好”。Struts 2.0并沒有在這部分止步,而是在原有的簡單易用的基礎上,將其做得更靈活、更強大。

國際化Hello World

下面讓我們看一個例子——HelloWorld。這個例子演示如何根據(jù)用戶瀏覽器的設置輸出相應的HelloWorld。

  1. 在Eclipse創(chuàng)建工程配置開發(fā)和運行環(huán)境(如果對這個步驟有問題,可以參考我早前的文章《為Struts 2.0做好準備》)。
  2. 在src文件夾中加入struts.properties文件,內容如下:
    struts.custom.i18n.resources=globalMessages
    Struts 2.0有兩個配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
    • struts.xml用于應用程序相關的配置
    • struts.properties用于Struts 2.0的運行時(Runtime)的配置
  3. 在src文件夾中加入globalMessages_en_US.properties文件,內容如下:
    HelloWorld=Hello World!
  4. 在src文件夾中加入globalMessages_zh_CN.properties文件,內容如下:
    HelloWorld=你好,世界!
    在此想和大家分享一個不錯的編寫properties文件的Eclipse插件(plugin),有了它我們在編輯一些簡體中文、繁體中文等Unicode文本時,就不必再使用native2ascii編碼了。您可以通過Eclipse中的軟件升級(Software Update)安裝此插件,步驟如下:
    1、展開Eclipse的Help菜單,將鼠標移到Software Update子項,在出現(xiàn)的子菜單中點擊Find and Install;
    2、在Install/Update對話框中選擇Search for new features to install,點擊Next;
    3、在Install對話框中點擊New Remote Site;
    4、在New Update Site對話框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http://propedit.sourceforge.jp/eclipse/updates/;
    5、在Site to include to search列表中,除上一步加入的site外的其它選項去掉,點擊Finsih;
    6、在彈出的Updates對話框中的Select the features to install列表中將所有結尾為“3.1.x”的選項去掉(適用于Eclipse 3.2版本的朋友);
    7、點擊Finish關閉對話框;
    8、在下載后,同意安裝,再按提示重啟Eclipse,在工具條看到形似vi的按鈕表示安裝成功,插件可用。此時,Eclpise中所有properties文件的文件名前有綠色的P的圖標作為標識。
  5. 在WebContent文件夾下加入HelloWorl.jsp文件,內容如下:
    <%@ page  contentType="text/html; charset=UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
       
    <title>Hello World</title>
    </head>
    <body>
       
    <h2><s:text name="HelloWorld"/></h2>
       
    <h2><s:property value="%{getText('HelloWorld')}"/></h2>
    </body>
    </html>
  6. 發(fā)布運行應用程序,在瀏覽器地址欄中輸入http://localhost:8080/Struts2_i18n/HelloWorld.jsp ,出現(xiàn)圖1所示頁面。
    圖1 中文輸出
    圖1 中文輸出
  7. 將瀏覽器的默認語言改為“英語(美國)”,刷新頁面,出現(xiàn)圖2所示頁面。
    圖2 英文輸出
    圖2 英文輸出
上面的例子的做法,與Struts 1.x的做法相似,似乎并不能體現(xiàn)Struts 2.0的優(yōu)勢。不過,我在上面的例子用了兩種方法來顯示國際化字符串,其輸出是相同的。其實,這就是Struts 2.0的一個優(yōu)勢,因為它默認支持EL,所示我們可以用getText方法來簡潔地取得國際化字符串。另外更普遍的情況——在使用UI表單標志時,getText可以用來設置label屬性,例如:
<s:textfield name="name" label="%{getText('UserName')}"/>

資源文件查找順序

之所以說Struts 2.0的國際化更靈活是因為它可以能根據(jù)不同需要配置和獲取資源(properties)文件。在Struts 2.0中有下面幾種方法:

  1. 使用全局的資源文件,方法如上例所示。這適用于遍布于整個應用程序的國際化字符串,它們在不同的包(package)中被引用,如一些比較共用的出錯提示;
  2. 使用包范圍內的資源文件。做法是在包的根目錄下新建名的package.properties和package_xx_XX.properties文件。這就適用于在包中不同類訪問的資源;
  3. 使用Action范圍的資源文件。做法為Action的包下新建文件名(除文件擴展名外)與Action類名同樣的資源文件。它只能在該Action中訪問。如此一來,我們就可以在不同的Action里使用相同的properties名表示不同的值。例如,在ActonOne中title為“動作一”,而同樣用title在ActionTwo表示“動作二”,節(jié)省一些命名工夫;
  4. 使用<s:i18n>標志訪問特定路徑的properties文件。使用方法請參考我早前的文章《常用的Struts 2.0的標志(Tag)介紹》。在您使用這一方法時,請注意<s:i18n>標志的范圍。在<s:i18n name="xxxxx">到</s:i18n>之間,所有的國際化字符串都會在名為xxxxx資源文件查找,如果找不到,Struts 2.0就會輸出默認值(國際化字符串的名字)。

上面我列舉了四種配置和訪問資源的方法,它們的范圍分別是從大到小,而Struts 2.0在查找國際化字符串所遵循的是特定的順序,如圖3所示:

圖3 資源文件查找順序圖
圖3 資源文件查找順序圖

假設我們在某個ChildAction中調用了getText("user.title"),Struts 2.0的將會執(zhí)行以下的操作:

  1. 查找ChildAction_xx_XX.properties文件或ChildAction.properties;
  2. 查找ChildAction實現(xiàn)的接口,查找與接口同名的資源文件MyInterface.properties;
  3. 查找ChildAction的父類ParentAction的properties文件,文件名為ParentAction.properties;
  4. 判斷當前ChildAction是否實現(xiàn)接口ModelDriven。如果是,調用getModel()獲得對象,查找與其同名的資源文件;
  5. 查找當前包下的package.properties文件;
  6. 查找當前包的父包,直到最頂層包;
  7. 在值棧(Value Stack)中,查找名為user的屬性,轉到user類型同名的資源文件,查找鍵為title的資源;
  8. 查找在struts.properties配置的默認的資源文件,參考例1;
  9. 輸出user.title。

參數(shù)化國際化字符串

許多情況下,我們都需要在動行時(runtime)為國際化字符插入一些參數(shù),例如在輸入驗證提示信息的時候。在Struts 2.0中,我們通過以下兩種方法做到這點:

  1. 在資源文件的國際化字符串中使用OGNL,格式為${表達式},例如:
    validation.require=${getText(fileName)} is required
  2. 使用java.text.MessageFormat中的字符串格式,格式為{ 參數(shù)序號(從0開始), 格式類形(number | date | time | choice), 格式樣式},例如:
    validation.between=Date must between {0, date, short} and {1, date, short}
在顯示這些國際化字符時,同樣有兩種方法設置參數(shù)的值:
  1. 使用標志的value0、value1...valueN的屬性,如:
    <s:text name="validation.required" value0="User Name"/>
  2. 使用param子元素,這些param將按先后順序,代入到國際化字符串的參數(shù)中,例如:
    <s:text name="validation.required">
       
    <s:param value="User Name"/>
    </s:text>

讓用戶方便地選擇語言

開發(fā)國際化的應用程序時,有一個功能是必不可少的——讓用戶快捷地選擇或切換語言。在Struts 2.0中,通過ActionContext.getContext().setLocale(Locale arg)可以設置用戶的默認語言。不過,由于這是一個比較普遍的應用場景(Scenario),所以Struts 2.0為您提供了一個名i18n的攔截器(Interceptor),并在默認情況下將其注冊到攔截器鏈(Interceptor chain)中。它的原理為在執(zhí)行Action方法前,i18n攔截器查找請求中的一個名為"request_locale"的參數(shù)。如果其存在,攔截器就將其作為參數(shù)實例化Locale對象,并將其設為用戶默認的區(qū)域(Locale),最后,將此Locale對象保存在session的名為“WW_TRANS_I18N_LOCALE”的屬性中。

下面,我將提供一完整示例演示它的使用方法。

package tutorial;

import java.util.Hashtable;
import java.util.Locale;
import java.util.Map;

publicclass Locales {
   
public Map<String, Locale> getLocales() {
       Map
<String, Locale> locales =new Hashtable<String, Locale>(2);
       locales.put(
"American English", Locale.US);
       locales.put(
"Simplified Chinese", Locale.CHINA);
       
return locales;
   }

}
tutorial/Locales.java

<%@taglib prefix="s" uri="/struts-tags"%>
<script type="text/javascript">
<!--
   
function langSelecter_onChanged() {
        document.langForm.submit();
    }
//-->
</script>
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
<s:bean id="locales" name="tutorial.Locales"/>
<form action="<s:url includeParams="get" encode="true"/>" name="langForm" 
    style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;">
    Language:
<s:select label="Language" 
        list
="#locales.locales" listKey="value"    listValue="key"
        value
="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
        name
="request_locale" id="langSelecter" 
        onchange
="langSelecter_onChanged()" theme="simple"/>
</form>
LangSelector.jsp

上述代碼的原理為,LangSelector.jsp先實例化一個Locales對象,并把對象的Map類型的屬性locales賦予下拉列表(select) 。如此一來,下拉列表就獲得可用語言的列表。大家看到LangSelector有<s:form>標志和一段Javascript腳本,它們的作用就是在用戶在下拉列表中選擇了后,提交包含“reqeust_locale”變量的表單到Action。在打開頁面時,為了下拉列表的選中的當前區(qū)域,我們需要到session取得當前區(qū)域(鍵為“WW_TRANS_I18N_LOCALE”的屬性),而該屬性在沒有設置語言前是為空的,所以通過值棧中l(wèi)ocale屬性來取得當前區(qū)域(用戶瀏覽器所設置的語言)。

你可以把LangSelector.jsp作為一個控件使用,方法是在JSP頁面中把它包含進來,代碼如下所示:
<s:include value="/LangSelector.jsp"/>

在例1中的HellloWorld.jsp中<body>后加入上述代碼,并在struts.xml中新建Action,代碼如下:
<action name="HelloWorld">
   
<result>/HelloWorld.jsp</result>
</action>

或者,如果你多個JSP需要實現(xiàn)上述功能,你可以使用下面的通用配置,而不是為每一個JSP頁面都新建一個Action。
<action name="*">
   
<result>/{1}.jsp</result>
</action>

分布運行程序,在瀏覽器的地址欄中輸入http://localhost:8080/Struts2_i18n/HelloWorld.action,出現(xiàn)圖4所示頁面:
圖3 HelloWorld.action
圖3 HelloWorld.action

在下拉列表中,選擇“American English”,出現(xiàn)圖5所示頁面:
圖3 HelloWorld.action
圖4 HelloWorld.action
可能大家會問為什么一定要通過Action來訪問頁面呢?
你可以試一下不用Action而直接用JSP的地址來訪問頁面,結果會是無論你在下拉列表中選擇什么,語言都不會改變。這表示不能正常運行的。其原因為如果直接使用JSP訪問頁面,Struts 2.0在web.xml的配置的過濾器(Filter)就不會工作,所以攔截器鏈也不會工作。


lzj520 2006-11-02 11:32 發(fā)表評論
]]>
(轉)Struts Validation 需要注意的細節(jié)http://www.tkk7.com/lzj520/archive/2006/09/23/71471.htmllzj520lzj520Sat, 23 Sep 2006 08:44:00 GMThttp://www.tkk7.com/lzj520/archive/2006/09/23/71471.htmlhttp://www.tkk7.com/lzj520/comments/71471.htmlhttp://www.tkk7.com/lzj520/archive/2006/09/23/71471.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/71471.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/71471.html1. validation.xml 中的Resourse屬性
------------------------------------------------------------------------------
     <field property="username" depends="maxlength">
        <arg0 name="maxlength" key="${var:maxlength}" resource="false" />
        <var>
          <var-name>maxlength</var-name>
          <var-value>10</var-value>
        </var>
      </field>
------------------------------------------------------------------------------

來,我們將它支解掉。:)  好象沒有什么好說的。很簡單。這是某個form下的一個properties的標準寫法。其中我們要重視一下這句話: <arg0 name="maxlength" key="${var:maxlength}" resource="false" /> , resource屬性指的是:是從資源文件里面讀key的值嗎? 
                                  if (resource == "false") {
                                        請取當前定義的變量的值。[因為為false的時候,因為得必須得給個值來組裝錯誤信息,因為此時我們不會到消息資源文件里提取值]
                                  } else if (resource == "true) {
                                       請到資源文件里提取用來組裝錯誤消息的值.
                                 }
你會問:如果我不指定resourse的值怎么樣?默認是true,即:默認下它會去讀properties文件里面的值。 (這似乎與java的boolean的默認是false有點違背),如果我沒有配呢?那么是null.

當然我也做了一個實驗證明了這點:

properties file tips
------------------------------------------------------------------------------
errors.maxlength = The length of the password can not surpass {0}
------------------------------------------------------------------------------
validation.xml tips :
------------------------------------------------------------------------------
     <field property="username" depends="maxlength">
        <arg0 name="maxlength" key="${var:maxlength}" resource="false" />
        <var>
          <var-name>maxlength</var-name>
          <var-value>10</var-value>
        </var>
      </field>
------------------------------------------------------------------------------
如果username的長度超過10的話,那么打印的是:The length of the password can not surpass 10

resouse屬性改成true,
properties file tips
------------------------------------------------------------------------------
errors.maxlength = The length of the password can not surpass {0}
username.maxlength  = 10
------------------------------------------------------------------------------
validation.xml tips :
------------------------------------------------------------------------------
     <field property="username" depends="maxlength">
        <arg0 name="maxlength" key="username.maxlength" resource="true" />
        <var>
          <var-name>maxlength</var-name>
          <var-value>10</var-value>
        </var>
      </field>
------------------------------------------------------------------------------
這樣我們也能達到同樣的效果。Right? 但是誰愿意呢? 只是我這樣寫似乎更加容易理解吧.并且這樣做就失去了validation的某些特別的功效,你得為每個重新在資源文件里寫一條message,不值得。

2. validation.xml 中的msg屬性.
官方資料:[The default error message for a pluggable validator can be overriden with the msg element. So instead of using the msg attribute for the mask validator to generate the error message the msg attribute from the field will be used if the name of the field's name attribute matches the validator's name attribute.]后面的例子我也就沒有給出來,那么這句話到底在肌理哇啦個什么呢? 先看一小段代碼:
------------------------------------------------------------------------------------------------
<field property="username" depends="maxlength">
    <arg0 name="maxlength" key="${var:maxlength}" resource="false" />
    <var>
     <var-name>maxlength</var-name>
     <var-value>10</var-value>
    </var>
   </field>
------------------------------------------------------------------------------------------------
再強調一遍:validation的錯誤信息是這樣組裝的:通過arg0 - arg3等來和資源文件里面的并且消息名字在validator-rule.xml定義好的規(guī)則所對應的消息來合成的。validator-rule.xml所定義的msg是面向所有的該規(guī)則的錯誤消息,每個form field可以通過arg0-arg3來定制自己的消息(這個我提到過)

如果我們加入msg消息到filed標簽下面:

------------------------------------------------------------------------------------------------
<field property="username" depends="maxlength">
    <msg name="maxlength" key="msg.maxlength" />
    <arg0 name="maxlength" key="${var:maxlength}" resource="false" />
    <var>
     <var-name>maxlength</var-name>
     <var-value>10</var-value>
    </var>
   </field>
------------------------------------------------------------------------------------------------
那么此時的maxlength在規(guī)則里面的msg將會被<field>里面的msg覆蓋,也就是說<arg0>的定義形同虛設,更會無視resourse屬性的false or true;

3.幾個規(guī)則(rules)作用于同一個form的屬性上面
------------------------------------------------------------------------------------------------
<field property="username" depends="required,maxlength,minlength">
    <arg0 name="maxlength" key="${var:maxlength}" resource="false" />
    <arg1 name="required" key="prompt.username" />
    <arg2 name="minlength" key="${var:minlength}" resource="false" />
    <var>
     <var-name>maxlength</var-name>
     <var-value>10</var-value>
    </var>
    <var>
     <var-name>minlength</var-name>
     <var-value>3</var-value>
    </var>
   </field>
------------------------------------------------------------------------------------------------
如果很多約束針對某一個form的屬性,我們可以這樣寫,當然如果你非要分開寫也可以。那么在xml文件中一個form的field就有多條記錄.
這里有一點需要注意一下:<arg0><arg1><arg2>在這里定義了以后,別的form的屬性也要按照這種順序來,也就是:<arg0>對應的是 maxlength. <arg1>對應的是minlength.<arg2>對應的是 requried.為什么這樣做?
因為在我們的properties文件中是寫死的。如果不這樣做,那么就會出現(xiàn)得到null值的錯誤啦.
------------------------------------------------------------------------------------------------
errors.required ={1} is required.
errors.maxlength = The length of the password can not surpass {0}
errors.minlength = The length of the password can not shorter than {2}
------------------------------------------------------------------------------------------------


補充一下validwhen的用法

<field property="emailAddress" depends="validwhen">

<arg0 key="userinfo.emailAddress.label"/>

<var>

<var-name>test</var-name>

<var-value>((sendNewsletter == null) or (*this* != null))</var-value>

</var>

</field>

上面定義的意思是:如果通訊地址是空或不空時這個字段時有效的



lzj520 2006-09-23 16:44 發(fā)表評論
]]>
主站蜘蛛池模板: 亚洲国产成人久久一区WWW| 免费观看四虎精品成人| 亚洲永久精品ww47| 最近2019中文字幕mv免费看 | jizz在线免费播放| 亚洲日韩国产欧美一区二区三区| 久久亚洲伊人中字综合精品| 免费人成网站在线播放| 成全视频免费高清 | 亚洲情a成黄在线观看动漫尤物| 亚洲高清偷拍一区二区三区 | 亚洲一线产区二线产区区| 久久亚洲AV无码精品色午夜| 亚洲国产另类久久久精品小说 | 天天综合亚洲色在线精品| 亚洲看片无码在线视频| 亚洲高清资源在线观看| 亚洲va中文字幕无码久久| 国产亚洲精久久久久久无码AV| 国产aa免费视频| 国产高清免费的视频| 在线免费视频一区| 色se01短视频永久免费| 四虎免费影院ww4164h| 三年片在线观看免费大全电影| a级毛片免费完整视频| 五月天婷婷精品免费视频| 特级一级毛片免费看| 在线观看亚洲免费| 理论亚洲区美一区二区三区| 亚洲精品乱码久久久久久V | 日本高清免费不卡在线| 免费看www视频| 日本一区二区三区日本免费| 成人免费在线观看网站| 青青草国产免费久久久91| 成年女人永久免费观看片| 国产成人免费高清在线观看| 国产一区在线观看免费| 亚洲精品偷拍视频免费观看 | 无遮挡国产高潮视频免费观看|