struts - error 提示问题! (有请 kui(kui) 及各位高手 进来解答)

flyshp 游客  2003-12-26 04:56:30
这是我的 actionform :

import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.io.Serializable;
public class OrderCarForm extends org.apache.struts.validator.ValidatorForm
implements Serializable {
private String errormessage;
private String password;
private String username;


public OrderCarForm()
{
}


public String getErrormessage()
{
return errormessage;
}
public void setErrormessage(String errormessage) {
this.errormessage = errormessage;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}

public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest)
{
/**@todo: finish this method, this is just the skeleton.*/
ActionErrors errors = new ActionErrors();
OrderCarForm form = new OrderCarForm();
try
{
if (username.equals("")) {
errors.add("username", new ActionError("username.errors"));
//errors.add(errors.GLOBAL_MESSAGE, new ActionMessage("username.errors"));
form.setErrormessage("用户名称不可以为空!");
//errors.add("error",new ActionMessage("用户名不可以为空!")) ;
}
if (password.equals(""))
errors.add("password", new ActionError("password.error"));
}
catch(Exception e)
{
System.out.println(e.getMessage() );
errors = null;
}
return errors;
}

public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest)
{

}
}

这是我的 action ;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class RegistrationAction extends Action
{
private Log log;

public RegistrationAction()
{
log = LogFactory.getFactory().getInstance(getClass().getName());
}

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
HttpSession session = request.getSession();
java.util.Locale locale = getLocale(request);
org.apache.struts.util.MessageResources messages = getResources(request);
OrderCarForm info = (OrderCarForm)form;

String action = request.getParameter("action");
if(isCancelled(request))
{
if(log.isInfoEnabled())
log.info(" " + mapping.getAttribute() + " - Registration transaction was cancelled");
removeFormBean(mapping, request);
return mapping.findForward("success");
} else
{

ActionErrors errors = new ActionErrors();
System.out.println("in action errorsadd !!");
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error.login.failed"));
saveErrors(request,errors);
return (new ActionForward(mapping.getInput()));

}
}

这是 struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>

<form-beans>
<form-bean name="orderCarForm" type="shopbag.OrderCarForm" />
</form-beans>

<global-forwards>
<forward name="home" path="/login.jsp" />
</global-forwards>

<action-mappings>
<action name="orderCarForm" type="shopbag.loginAction" input="/login.jsp" scope="session" path="/loginAction" />
</action-mappings>

<!-- Registration Action -->
<action path="/loginAction"
type="shopbag.RegistrationAction"
name="OrderCarForm"
scope="request"
validate="true"
input="/registration.jsp">
<forward name="success" path="/calendarRG.htm"/>
</action>
<!-- ========== Message Resources Definitions =========================== -->

<message-resources
parameter="shopbag.ApplicationResources"/>

<!-- ========== Plug Ins Configuration ================================== -->

<!--
Add multiple validator resource files by setting the pathnames property
with a comma delimitted list of resource files to load.
-->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
</struts-config>

这是 jsp :
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>



<html:html>
<head>
<title>
login.jsp
</title>
<LINK href="css/style1.css" rel="stylesheet" type="text/css">
<LINK href="css/aa.css" rel="stylesheet" type="text/css">
<LINK href="css/bb.css" rel="stylesheet" type="text/css">
<LINK href="css/cc.css" rel="stylesheet" type="text/css">
</head>
<html:errors/>
<body text="#000000" background="images/bg.gif">
<html:form action="loginAction" >



<table width="550" border="0" cellspacing="0" cellpadding="0" align="center" height="80%">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0" bordercolor="#88B3D9" style="border-collapse: collapse" height="100">
<tr align="center">
<td valign="middle">
<table width="300" border="1" cellspacing="0" cellpadding="0" bordercolor="#88B3D9" style="border-collapse: collapse" height="100" align="center">
<tr bgcolor="#B3D9FF">
<td class="head" height="25" colspan="2">
<div align="center"><bean:message key="login.title"/></div>
</td>
</tr>
<tr>
<td align="center" class="fr" height="30">
<bean:message key="login.name"/>
</td>
<td align="center" class="button" height="30">
<html:text property="username" maxlength="10"/>
</td>
</tr>
<tr>
<td align="center" class="fr" height="30">
<bean:message key="login.pass"/>
</td>
<td align="center" class="button" height="30">
<html:password property="password" maxlength="10"/>

</td>
<tr>
<td height="35" align="center" colspan="2">
<html:submit property="submit" onclick="bCancel=false;">
<bean:message key="button.login"/>
</html:submit>
  <html:reset property="reset">
<bean:message key="button.reset"/>
</html:reset>

</td>
</tr>
</table>
</td>
</tr>
</table>
</html:form>
<html:javascript formName="OrderCarForm"/>
</body>
</html:html>

我想知道 为什么利用 ActionErrors validate 的方法可以实现对数据的检验 但是没有提示具体的错误信息!!!
...全文
12 点赞 收藏 22
写回复
22 条回复
kui 2003年12月30日
楼主的上述程序出错处理主要有三个地方:一是Action中的出错处理:
ActionErrors errors = new ActionErrors();
System.out.println("in action errorsadd !!");
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error.login.failed"));
saveErrors(request,errors);
return (new ActionForward(mapping.getInput()));
二是ActionForm中validate效验:
public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest)
{
/**@todo: finish this method, this is just the skeleton.*/
ActionErrors errors = new ActionErrors();

errors.add("username", new ActionError("username.errors"));
return errors;
}

三是定义Bean一个出错消息属性:
ublic String getErrormessage()
{
return errormessage;
}
public void setErrormessage(String errormessage) {
this.errormessage = errormessage;
}

前两个出错处理的本质是一样的,都是通过ActionServlet把错信息转发到输入页面中:其中validate效验是在表单提交到ActionServlet中调用Action前由ActionServlet调用处理的,当validate返回的错误数不为0时,在列出错误键名的Request属性中保存这个实例,并不再调用Action而是直接转发到输入页面中,如果在输入页面中有<html:errors/>标签,将显示出错信息。Action中的出错处理也是同样的道理,由ActionServlet把出错信息转发到输入页面中。要注意的是转发的是输入页面而不是输出页面,如果转发到输出页面,如果是saveErrors函数用request值,将得不到出错信息。
前两个出错处理不同的是前者要用saveErrors(request,errors)保存出错消息,后者由ActionServlet自动完成。
另外一个是楼主在Bean中自己定义了一个errormessage属性,采用通常的显示Bean属性的方法显示就行了,但是楼主如下代码:
OrderCarForm form = new OrderCarForm();
form.setErrormessage("用户名称不可以为空!");
这样不行的,不要用新的对象,直接用setErrormessage("用户名称不可以为空!");就行了。

前两者楼主的代码没有错误,主要代码我调试了一次,能正常显示出错消息,如果用<html:errors/>标签不显示出错消息,那只有一种可能,就是在shopbag\ApplicationResources.properties文件没定义键值username.errors(注意文件路径shopbag\)。要注意的是new ActionError("username.errors")是提取properties文件中的username.errors的值,而不是生意定义一个新的username.errors值。

对于下述代码:
<logic:messagesPresent>
<bean:message key="errors.header"/>
<ul>

<html:messages id="error" >
<li><bean:write name="error"/></li>
</html:messages>
</ul><hr>
</logic:messagesPresent>
我调试没能过, 建议用<html:errors/>标签行了。
回复 点赞
flyshp 2003年12月30日
package shopbag;

import org.apache.struts.action.*;
import javax.servlet.http.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class RegistrationAction extends Action
{
private Log log;

public RegistrationAction()
{
log = LogFactory.getFactory().getInstance(getClass().getName());
}

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
HttpSession session = request.getSession();
java.util.Locale locale = getLocale(request);
org.apache.struts.util.MessageResources messages = getResources(request);
OrderCarForm info = (OrderCarForm)form;

String action = request.getParameter("action");
if(isCancelled(request))
{
if(log.isInfoEnabled())
log.info(" " + mapping.getAttribute() + " - Registration transaction was cancelled");
removeFormBean(mapping, request);
return mapping.findForward("success");
}
/*
else
{
ActionErrors errors = new ActionErrors();
System.out.println("in action errorsadd !!");
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error"));
request.setAttribute("org.apache.struts.action.ERROR",errors) ;
saveErrors(request,errors);
//return (new ActionForward(mapping.getInput()));
System.out.println("out action errorsadd !!");
return mapping.findForward("error");
//return (new ActionForward(mapping.getInput()));
}
*/
ActionErrors errors = info.validate(mapping, request);
if(errors != null && errors.isEmpty())
{
if(info.getPage() == 1)
return mapping.findForward("input2");
if(info.getPage() == 2)
return mapping.findForward("success");
} else
{
saveErrors(request, errors);
if(info.getPage() == 1)
return mapping.findForward("input" + info.getPage());
if(info.getPage() == 2)
return mapping.findForward("input" + info.getPage());
}
return mapping.findForward("input1");

}

protected void removeFormBean(ActionMapping mapping, HttpServletRequest request)
{
if(mapping.getAttribute() != null)
if("request".equals(mapping.getScope()))
{
request.removeAttribute(mapping.getAttribute());
} else
{
HttpSession session = request.getSession();
session.removeAttribute(mapping.getAttribute());
}
}

}

这是我的actiong 有一部分隐掉了 是我调试用的 !!
回复 点赞
flyshp 2003年12月30日
你的action 里 是怎么处理的呢 ??
回复 点赞
flyshp 2003年12月30日
有一个疑问

你觉得 这种结构 要把所有的验证都方到 actionform 里面 合理么??
回复 点赞
xinshou1979330 2003年12月30日
哦 MY GOD 刚才好象回答错了不好意思啊


package com.user;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.*;
import java.util.*;

public class LogonForm extends ActionForm {
private String loginuserpassword = null;
private String loginusername = null;


public String getLoginuserpassword() {
return loginuserpassword;
}

public void setLoginuserpassword(String loginuserpassword) {
this.loginuserpassword = loginuserpassword;
}

public String getLoginusername() {
return loginusername;
}

public void setLoginusername(String loginusername) {
this.loginusername = loginusername;
}



public void reset(ActionMapping mapping, HttpServletRequest request) {
loginusername = null;
loginuserpassword = null;
//初始化登陆页面的option 实际应用中要做到bean中

}

public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if((loginusername == null) || (loginusername.length() < 1)) {
errors.add("loginusername",
new ActionError("error.loginusername.required"));
}
if((loginuserpassword == null) || (loginuserpassword.length() < 1)) {
errors.add("loginuserpassword",
new ActionError("error.loginuserpassword.required"));
}

return errors;
}
}

这是我FORM里的 在这里可以进行判断啊
回复 点赞
flyshp 2003年12月30日
我也是那样写的啊 !!

但是 对于 数据具体的判断应该在哪里呢 ??

实在 actionform 里 还是在 action 里?? 或者就在 validation.xml 里??
回复 点赞
xinshou1979330 2003年12月30日
还有在你的

<action path="/user_edit"
type="com.user.UserEditAction"
name="user_editForm"
scope="request"
input="/manage/user/user_add.jsp"
validate="true">
<forward name="success" path="/manage/user/user_add.jsp"/>
<forward name="fail" path="/err/err.jsp"/>

</action>

注意 : validate="true"> 要这样写
那里的判断才能进行
回复 点赞
flyshp 2003年12月30日
to :Leemaasn(祝大家新年愉快!)

你说得有道理,但是 我怎么才知道 Request 里是否存在 errors 呢 ?
回复 点赞
Leemaasn 2003年12月30日
你可以在jsp里检查一下是不是有error这个对象



将“流氓无赖”测试到底。。。
——始于2003年7月


树欲止而风不停,行云流水匆匆去;
树梢蚂蚱凭空望,江边浪花碎巨石;



支持“流金岁月”!!!
发送框,少个“右键菜单,选择粘贴”;
——2003年12月24日am

^@^
回复 点赞
Leemaasn 2003年12月30日
我记得以前用Struts开发时,
关于这个<html:errors>,它是保存在Request里的。
如果你得Request里没有errors的话,<html:errors>它是不起作用的(不显示)。

还有,他跟Properties文件的位置也是有关系的。
好像是得带个包名!

自己再调调吧。。。不难的。



将“流氓无赖”测试到底。。。
——始于2003年7月


树欲止而风不停,行云流水匆匆去;
树梢蚂蚱凭空望,江边浪花碎巨石;



支持“流金岁月”!!!
发送框,少个“右键菜单,选择粘贴”;
——2003年12月24日am

^@^
回复 点赞
flyshp 2003年12月30日
你说的对

我也是按照上面的步骤来做的! 但是 不知道在那个环节出现了错误! ^_^
但我可以肯定的是

我是在显示错误的提示信息时出现的异常!!
<logic:messagesPresent>
<bean:message key="errors.header"/>
<ul>

<html:messages id="error" > //异常位置
<li><bean:write name="error"/></li>
</html:messages>
</ul><hr>
</logic:messagesPresent>
回复 点赞
kui 2003年12月30日
对于数据的验证问题,特别是数据量大时,最好采用在客户端进行验证,方法是在<html:javascript/>标签中处理,例如Struts11RC2中的struts-example就是这样做的,你上述也用了这个标签,<html:javascript/>标签可以理解为把放在配置文件中的javascript代码插入到JSP页中。详细分析一下Struts11RC2中的struts-example有关Logon部分的代码,什么都清楚了,javascript代码放在validator-rules.xml文件中。
回复 点赞
flyshp 2003年12月30日
to : kui(kui)

感谢你的详细解答,对于struts 我也是初学 !
这段程序已经调试好了,问题的确是在 对errors 引用上

马上结贴 ! 我想请教一下 : 我感觉对于数据的验证 在server端上执行 无论是安全性还是这对执行效率 都应该很优化 ! 但是对于复杂的处理,如果都放到actionform 里去执行 ??!! 这合理么? 您在大中型项目中是怎么组织结构的呢 ?? 还有,如果结合ejb 对于那些复杂逻辑处理怎么样才可以合理的调用呢 ?

感谢各位的参与和帮助 !! 以后希望我们共同进步!
回复 点赞
dby_ 2003年12月30日
关注。。。
回复 点赞
flyshp 2003年12月29日
<logic:messagesPresent>
<bean:message key="errors.header"/>
<ul>
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
</ul><hr>
</logic:messagesPresent>
我看到有些例子是用 html 标签中 message 这个 bean 来做提示的 , id="error" 是不是应该在actionform 中 定义呢?? 还是在别的地方!!!! 我是个初学者!
回复 点赞
wangaj 2003年12月29日
同意small的。
回复 点赞
small 2003年12月29日
1、先建立一个propertier文件(定义错误的显示方式)
2、在web.xml中进行参数定义
3、在actionform中进行检测的定义
4、在struts-config.xml中对actionform的action加上判断。
5、在jsp页面上加上<html:errors>
回复 点赞
flyshp 2003年12月29日
:<

help !!
回复 点赞
flyshp 2003年12月29日
顺便问一个别的问题:

谁用过 java 调用 ocx 或者 dll

听说要使用 jni 接口 ? 有没有相关的例子??

我指的不是在jsp 内用 javascript 或 vbscript 调用ocx!而是在 java 中的rmi 或 自己的类里调用也就是说在server 中调用!!!!!!!
回复 点赞
寒冬 2003年12月28日
我不知道为什么,但我也想知道为什么
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告