posts - 73,  comments - 55,  trackbacks - 0

一、使用struts表单验证而不用struts标签的方法:
使用struts标签时:
<html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="false" />

<html:form action="login" onsubmit="return validateLoginForm(this);">
 <input type="text" name="account.accountId"/>
 <input type="password" name="account.password"/>
 <INPUT type="submit" value="提交">
 <input type="reset" value="清空">
</html:form>

改成html标签后:
<html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="false" />

<form action="login.do" name="loginForm" onsubmit="return validateLoginForm(this);">
<input type="text" name="account.accountId" size="16" style="width:120;height:23"/>
<input type="password" name="account.password" size="16" style="width:120;height:23" />
<INPUT type="submit" value="提交">
<input type="reset" value="清空">
</form>

二、动态表单知识
  <form-bean>的<form-property>子元素用来设置动态ActionForm的属性。<form-property>元素的name属性指定属性名,type指定属性类型,可以把动态ActionForm的属性设为以下Java类型:

· java.lang.BigDecimal

· java.lang.BigInteger

· java.lang.Boolean

· java.lang.Byte

· java.lang.Character

· java.lang.Class

· java.lang.Double

· java.lang.Float

· java.lang.Integer

· java.lang.Long

· java.lang.Short

· java.lang.String

· java.sql.Data

· java.sql.Time

· java.sql.Timestamp

      如果表单的字段值为Java基本类型,在配置时应该用响应的包装类型来代替,例如int类型的包装类型为Integer。如果属性为Java基本类型,应该把属性设置为相应的Java包装类型。
      DynaActionForm基类提供了initialize()方法,它把表单的所有属性恢复为默认值。表单属性默认值由<form-bean>的<form-property>子元素的initial属性来决定。如果没有设置initial属性,则表单属性的默认值由其Java类型来自动决定,例如对象类型的默认值为null,整数类型的默认值为0,boolean类型的默认值为false,date类型的默认值为当天。

三、用到spring框架后action都是继承org.springframework.web.struts.DispatchActionSupport,DispatchActionSupport类里有
1)Log log,所以在action中可直接写:log.info("Get a Bean named:Object");
2)protected void onInit(){};//创建action对象时先执行此方法。
3)protected void onDestroy(){};//回收action对象时先执行此方法

四、Tiles框架用法见《精通struts》第十六章。
详细步骤:P397
当编译Index.jsp时如果错误信息为: javax.servlet.jsp.JspException: ServletException in '/Layout.jsp': ServletException in

'common/CatalogsBar.jsp': null
其中Layout.jsp为模板,common/CatalogsBar.jsp为Index.jsp其中一部分,这个信息表名不是'common/CatalogsBar.jsp'找不到,而是它内部

有空引用异常,单独编译该文件得到具体错误信息:
java.lang.NullPointerException at _common._CatalogsBar_2e_jsp._jspService(CatalogsBar.jsp:11) [/common/CatalogsBar.jsp] 表名

在第11行有空引用。

五、国际化
1.开发和编译代码时指定字符集为UTF-8。JBuilder和Eclipse都可以在项目属性中设置。
2.使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句:
request.setCharacterEncoding("UTF-8")。
3.在JSP头部声明:<%@ page contentType="text/html;charset= UTF-8" %>。
在Jsp的html代码中,声明UTF-8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
4.设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下:
jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8
注意,上述写法是JBoss的mysql-ds.xml写法,多亏网友提示,在tomcat中&amp;要写成&即可。一般其他数据库都可以通过管理设置设定UTF-8
其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。
 
六、表单验证:
1、验证的配置是在validation.xml中,验证规则的配置是在validator-rules.xml与validator-rules-user.xml中.

七、action中转url的方式:
1。转到.jsp页面:
return mapping.findForward("***");//***指struts-config中定义好的forward项。
forward项有两个选项,默认都为false,说明如下:
contextRelative——是否是相对目录。(如现页面为business/input.jsp,转到action后forward项到business/result.jsp,如果contextRelative为false,则转到链接business/business/result.jsp,所以此选项最好勾上)
redirect——是否重定向,即是否包含request信息。
2。返回上页显示出错信息:
this.saveErrors(request,errors);
return this.***(mapping,form,request,response);//***指本action的一个方法,为了转到上个页面显示出错信息
3。转到本action的其他方法:
ActionForward forward = new ActionForward();
forward.setPath(mapping.getPath() + ".do?method=****&***);
forward.setRedirect(true););//用此方法则间接跳转,即不带request信息,不加此
//方法会保留request信息
return forward;


八、处理日期类型
struts使用日期包括将string自动转化为日期fill到form中,以及将form中的日期按照指定格式显示在html的textfield中。首先讲第一种情况的解决方法:

创建如下类:

import java.util.*;
import org.apache.commons.beanutils.*;
import java.text.SimpleDateFormat;

public class DateConvert implements Converter
{
  static SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
  public DateConvert()
  {

  }
  public Object convert(Class type, Object value)
  {
    
    if(value==null)return null;
    if(((String)value).trim().length()==0) return null;

    if(value instanceof String)
    {
      try
      {
        return df.parse((String)value);
      }
      catch (Exception ex)
      {
        throw new ConversionException("输入的日期类型不合乎yyyy/MM/dd"
          + value.getClass());
      }

    }
    else
    {
      throw new ConversionException("输入的不是字符类型"+value.getClass());
    }

  }
}

然后在你的系统某出使用如下(如web的init方法)
ConvertUtils.register(new DateConvert(),java.util.Date.class);
参数用于表示DateConvert类负责处理java.util.Date类型的转化

第二种情况是如何显示form中日期类型到html:text中,我用的办法是修改struts的代码,重新生成一个新的struts.jar
org.apache.struts.taglib.html.BaseFieldTag的doStartTag的方法
找到 if (value != null) {results.append(ResponseUtils.filter(value))代码行下面的内容,需要修改此处代码,以便输出日期类型
如下:
if (value != null) {
            results.append(ResponseUtils.filter(value));
        } else if (redisplay || !"password".equals(type)) {
            Object value = RequestUtils.lookup(pageContext, name, property, null);
            //System.out.println("lijz "+value);

            if(value instanceof java.util.Date)
            {
               //System.out.println("date="+value);

               if (value == null)
                   value = "";
        else
        {
          java.util.Date d= (java.util.Date)value;
          try
           {

            results.append(ResponseUtils.filter(df.format(d)));
          }
          catch(Exception ex)
          {
            System.out.println("form error:"+ex.getMessage());
          }
          }
            }
           else
           {
               if (value == null)
                value = "";
                results.append(ResponseUtils.filter(value.toString()));
           }
           
       }
        results.append("\"");
        results.append(prepareEventHandlers());
        results.append(prepareStyles());
        results.append(getElementClose());

        // Print this field to our output writer

        ResponseUtils.write(pageContext, results.toString());

        // Continue processing this page

        return (EVAL_BODY_TAG);      
 
 重新编译struts成struts.jar.放到你需要的项目中

posted on 2006-07-07 11:00 保尔任 阅读(746) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(4)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜