Struts1应用实现简单计算器使用DispatchAction显示友好的报错信息使用动态Form简化开发
Posted clnchanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts1应用实现简单计算器使用DispatchAction显示友好的报错信息使用动态Form简化开发相关的知识,希望对你有一定的参考价值。
实现简单的支持加、减、乘、除的计算器
复制一份Struts1Demo改动:Struts1Calc方案1: Struts1Calc
CalcForm extends ActionForm。 num1 num2。生成getter setter;
AddAction:
public class AddAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm cf = (CalcForm) form; int result = cf.getNum1()+cf.getNum2(); request.setAttribute("result", result); return mapping.findForward("success"); } }
其它三个省略。。
在wen.xml的servlet
加入
<load-on-startup>1</load-on-startup>
struts-config.xml里面的配置:
<!-- Form --> <form-beans> <form-bean name="calcForm" type="com.demo.form.CalcForm"></form-bean> </form-beans> <!-- Action --> <action-mappings> <action name="calcForm" path="/add" type="com.demo.action.AddAction" scope="request"> <forward name="success" path="/result.jsp"></forward> <forward name="input" path="/calc.jsp"></forward> </action> </action-mappings>
其它三个配置省略…
加入clac.jsp
</head> <script type="text/javascript"> function calc(c){ document.getElementById("form").action=c+".do"; document.getElementById("form").submit(); } </script> <body> <form id="form" action="#" method="post"> 第一个数:<input name="num1"><br/> 第二个数:<input name="num2"><br/> <input type="button" value="加" onclick="calc(‘add‘)"> <input type="button" value="减" onclick="calc(‘sub‘)"> <input type="button" value="乘" onclick="calc(‘mul‘)"> <input type="button" value="除" onclick="calc(‘div‘)"> </form> </body>
加入result.jsp
第一个数:${requestScope.calcForm.num1 }
<br /> 第二个数:${requestScope.calcForm.num2 }
<br /> 结构:${requestScope.result}
部署訪问:
http://localhost:8080/Struts1Calc/calc.jsp源代码下载
http://pan.baidu.com/s/1kTDRVi3
方案2:
添加隐藏表单域,表示操作类型 ,在Action Bean中依据不同操作类型做不同处理。
在calc.jsp表单加入:
<input id="oper" name="oper" type="hidden"value="oper">
脚本改动为:<script type="text/javascript"> function calc(c){ /* document.getElementById("form").action=c+".do"; */ document.getElementById("oper").value=c; document.getElementById("form").submit(); } </script>
将form的action改动为action="calc.do"
struts-config.xml里面的<action-mappings>的calcForm的path改动为calc 配置:
<action name="calcForm" path="/calc" type="com.demo.action.CalcAction" scope="request"> <forward name="success" path="/result.jsp"></forward> <forward name="input" path="/calc.jsp"></forward> </action>
在CalcForm加入
private String oper;和getter和setter方法;
改动CalcAction:
public class CalcAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm cf = (CalcForm) form; int result = 0; if("add".equals(cf.getOper())){ result = cf.getNum1()+cf.getNum2(); }else if("div".equals(cf.getOper())){ result = cf.getNum1()/cf.getNum2(); } //.... request.setAttribute("result", result); return mapping.findForward("success"); } }部署訪问:
http://localhost:8080/Struts1Calc2/calc.jsp 測试加和除。
源代码:http://pan.baidu.com/s/1c0nbPsc
使用DispatchAction
以上两个方案说明:
方案1对每一个操作都创建一个Action。系统规模变大时,easy混乱
方案2将相关操作组织在一个Action中,通过operate參数区分不同操作,但easy使Action中execute方法的代码过长。不易维护
使用DispatchAction实现计算机器的步骤:
复制上一个项目Struts1Calc2改动为:Struts1CalcDispatchAction
1. 创建CalcAction,继承自DispatchAction
2. 在CalcAction中创建加、减、乘、除四个方法
打ex 按alt+/ 选择參数HttpServletResponse ... 然后将方法名改为add、div...
public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm cf = (CalcForm) form; int result = 0; result = cf.getNum1() + cf.getNum2(); request.setAttribute("result", result); return mapping.findForward("success"); } /* public ActionForward div … public ActionForward sun … public ActionForward mul … */
在struts-config.xml中配置CalcAction
在action-mapping里 parameter="oper"
<action name="calcForm" path="/calc" type="com.demo.action.CalcAction" scope="request" parameter="oper"> <forward name="success" path="/result.jsp"></forward> <forward name="input" path="/calc.jsp"></forward> </action>Parameter里有oper, calc.jsp里面也要有相应
<input id="oper" name="oper" type="hidden" value="oper">
3. 编写页面代码
不改动页面。
Dispatch的执行原理
DispatchAction可以依据传入參数值自己主动选择Action中同名的方法运行
Parameter有点类似我们Struts2的method;
部署执行:
http://localhost:8080/Struts1CalcDispatchAction1/calc.jsp
源代码:http://pan.baidu.com/s/1bnnJOIV
显示友好的报错信息
Struts提供了报错机制,用于提供友好的报错信息给用户
被除数为0,非数字等
新建属性文件 ApplicationResources.properties 在com.demo.resources下
通过在属性文件里定义errors.header和errors.footer属性设定错误信息格式
改动配置文件 struts-config
<message-resources parameter="com.demo.resources.ApplicationResources"></message-resources>改动相应Action方法
输入的时候不是数字 和被除数是零的时候 ,这里仅仅做div除
public ActionForward div(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm cf = (CalcForm) form; ActionMessages errors = new ActionMessages(); if (!this.isFloat(cf.getNum1())) { errors.add("error1", new ActionMessage("error.valudate.inputnumber")); } if (this.isZero(cf.getNum2())) { errors.add("error2", new ActionMessage("error.valudate.number")); } if (!errors.isEmpty()) { super.saveErrors(request, errors); return mapping.findForward("input"); } int result = 0; result = cf.getNum1() / cf.getNum2(); request.setAttribute("result", result); return mapping.findForward("success"); } private boolean isZero(int num2) { return num2 == 0; } private boolean isFloat(int i) { if (i==0) return false; else return true; }
在页面上显示报错信息
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> 第一个数:<input name="num1"><html:errors property="error1" /><br/> 第二个数:<input name="num2"><html:errors property="error2" /><br/>
部署执行 被除数输入0 測试;http://localhost:8080/Struts1CalcDispatchAction1/calc.jsp
源代码 http://pan.baidu.com/s/1eQcOx38
显示友好的报错信息另外一种方式
加入到全局错误信息中,作用域是request
if (!this.isFloat(cf.getNum1())) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "error.valudate.inputnumber")); // errors.add("error1",new // ActionMessage("error.valudate.inputnumber")); } if (this.isZero(cf.getNum2())) { // errors.add("error2", new ActionMessage("error.valudate.number")); errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "error.valudate.number")); }
vlac.jap 里使用 <html:errors /> 显示全部错误信息。
使用动态Form简化开发
回想计算器的ActionForm属性
1. 仅仅有两个属性2. 假设处理复杂的业务时,属性可能会很的多3. easy漏改出错4. 大量的“纯体力”代码充斥当中
解决这个问题 使用动态Form
以配置的方式创建Form struts-config.xml:
<form-beans> <form-bean name="calcDynaForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="num1" type="java.lang.Integer" /> <form-property name="num2" type="java.lang.Integer" /> </form-bean> </form-beans>
和使用普通Form一样
<action name="calcDynaForm" parameter="oper" path="/calc" scope="request" type="com.demo.action.CalcAction"> <forward name="success" path="/result.jsp"></forward> <forward name="input" path="/calc.jsp"></forward> </action>
Action代码
……
DynaActionForm cf =(DynaActionForm) form;
……
result =(Integer)cf.get("num1")/(Integer)cf.get("num2");
……
使用实体对象作为Form属性
省去了编写ActionForm类页面提交数据变化时仅仅须改动struts-config.xml中的配置
Action中的代码并没有因此变得简单业务逻辑变化、数据库增减字段时,须要改动的地方包含实体类、动态ActionForm定义和Action 中对应代码easy漏掉某处而引入错误
使用实体对象作为Form属性
我们已经知道:
页面提交的表单数据,能够自己主动填充到ActionForm中
假如,ActionForm的代码是这种:
public class UserForm
extends ActionForm {
private USER user = new USER();
// getter and setter
}
假如。页面代码是这种:
<input name="user.uname" />
表单域的值是否可以自己主动填充到Form中呢?
复制一份Struts1Demo,改动为Struts1Login
ActionForm代码
public class LoginForm extends ActionForm { private User user = new User(); private String rePassword;
struts-config.xml
<struts-config> <!-- Form --> <form-beans> <form-bean name="userLoginForm" type="com.demo.form.LoginForm"></form-bean> </form-beans> <!-- Action --> <action-mappings> <action name="userLoginForm" path="/login" type="com.demo.action.LoginAction" scope="request"> <forward name="success" path="/success.jsp"></forward> <forward name="input" path="/index.jsp"></forward> </action> </action-mappings> </struts-config>
Action代码
if (userBiz.login(lf.getUser())) { ...
避免了“纯体力”型编码, 数据库字段增减时。无需改动Form和Action代码
源代码:http://pan.baidu.com/s/1sjucV85
以上是关于Struts1应用实现简单计算器使用DispatchAction显示友好的报错信息使用动态Form简化开发的主要内容,如果未能解决你的问题,请参考以下文章