一、使用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="120;height:23"/> <input type="password" name="account.password" size="16" style="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.放到你需要的项目中