一、使用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&characterEncoding=UTF-8
注意,上述写法是JBoss的mysql-ds.xml写法,多亏网友提示,在tomcat中&要写成&即可。一般其他数据库都可以通过管理设置设定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
保尔任 阅读(755)
评论(0) 编辑 收藏