实现简单的支持加、减、乘、除的计算器
复制一份Struts1Demo改动:Struts1Calc方案1: Struts1Calc
CalcForm extends ActionForm。 num1 num2。生成getter setter;
AddAction:
public class AddAction extends Action {@Overridepublic 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
加入
struts-config.xml里面的配置:
其它三个配置省略…
加入clac.jsp
第一个数:
第二个数:
加入result.jsp
第一个数:${requestScope.calcForm.num1 }
第二个数:${requestScope.calcForm.num2 }
结构:${requestScope.result}
部署訪问:
http://localhost:8080/Struts1Calc/calc.jsp源代码下载
http://pan.baidu.com/s/1kTDRVi3
方案2:
添加隐藏表单域,表示操作类型 ,在Action Bean中依据不同操作类型做不同处理。
在calc.jsp表单加入:
<input id&#61;"oper" name&#61;"oper" type&#61;"hidden"value&#61;"oper">
脚本改动为&#xff1a;
将form的action改动为action&#61;"calc.do"
struts-config.xml里面的
在CalcForm加入
private String oper;和getter和setter方法&#xff1b;
改动CalcAction&#xff1a;
public class CalcAction extends Action {&#64;Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {CalcForm cf &#61; (CalcForm) form;int result &#61; 0;if("add".equals(cf.getOper())){result &#61; cf.getNum1()&#43;cf.getNum2();}else if("div".equals(cf.getOper())){result &#61; cf.getNum1()/cf.getNum2();}//....request.setAttribute("result", result);return mapping.findForward("success");}
部署訪问&#xff1a;
}
http://localhost:8080/Struts1Calc2/calc.jsp 測试加和除。
源代码&#xff1a;http://pan.baidu.com/s/1c0nbPsc
使用DispatchAction
以上两个方案说明&#xff1a;
方案1对每一个操作都创建一个Action。系统规模变大时&#xff0c;easy混乱
方案2将相关操作组织在一个Action中&#xff0c;通过operate參数区分不同操作&#xff0c;但easy使Action中execute方法的代码过长。不易维护
使用DispatchAction实现计算机器的步骤&#xff1a;
复制上一个项目Struts1Calc2改动为&#xff1a;Struts1CalcDispatchAction
1. 创建CalcAction&#xff0c;继承自DispatchAction
2. 在CalcAction中创建加、减、乘、除四个方法
打ex 按alt&#43;/ 选择參数HttpServletResponse ... 然后将方法名改为add、div...
public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {CalcForm cf &#61; (CalcForm) form;int result &#61; 0;result &#61; cf.getNum1() &#43; 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&#61;"oper"
Parameter里有oper, calc.jsp里面也要有相应
3.编写页面代码
不改动页面。
Dispatch的执行原理
DispatchAction可以依据传入參数值自己主动选择Action中同名的方法运行
Parameter有点类似我们Struts2的method&#xff1b;
部署执行&#xff1a;
http://localhost:8080/Struts1CalcDispatchAction1/calc.jsp
源代码&#xff1a;http://pan.baidu.com/s/1bnnJOIV
显示友好的报错信息
Struts提供了报错机制&#xff0c;用于提供友好的报错信息给用户
被除数为0&#xff0c;非数字等
新建属性文件 ApplicationResources.properties 在com.demo.resources下
通过在属性文件里定义errors.header和errors.footer属性设定错误信息格式
改动配置文件 struts-config
改动相应Action方法
输入的时候不是数字 和被除数是零的时候 &#xff0c;这里仅仅做div除
public ActionForward div(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {CalcForm cf &#61; (CalcForm) form;ActionMessages errors &#61; 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 &#61; 0;result &#61; cf.getNum1() / cf.getNum2();request.setAttribute("result", result);return mapping.findForward("success");}private boolean isZero(int num2) {return num2 &#61;&#61; 0;}private boolean isFloat(int i) {if (i&#61;&#61;0)return false;elsereturn true;}
在页面上显示报错信息
<%&#64; taglib prefix&#61;"html" uri&#61;"http://struts.apache.org/tags-html" %>第一个数&#xff1a;
第二个数&#xff1a;
部署执行 被除数输入0 測试&#xff1b;http://localhost:8080/Struts1CalcDispatchAction1/calc.jsp
源代码 http://pan.baidu.com/s/1eQcOx38
显示友好的报错信息另外一种方式
加入到全局错误信息中&#xff0c;作用域是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 里使用 显示全部错误信息。
使用动态Form简化开发
回想计算器的ActionForm属性
1.仅仅有两个属性2.假设处理复杂的业务时&#xff0c;属性可能会很的多3.easy漏改出错4.大量的“纯体力”代码充斥当中
解决这个问题 使用动态Form
以配置的方式创建Form struts-config.xml&#xff1a;
和使用普通Form一样
Action代码
……
DynaActionForm cf &#61;(DynaActionForm) form;
……
result &#61;(Integer)cf.get("num1")/(Integer)cf.get("num2");
……
使用实体对象作为Form属性
省去了编写ActionForm类页面提交数据变化时仅仅须改动struts-config.xml中的配置
Action中的代码并没有因此变得简单业务逻辑变化、数据库增减字段时&#xff0c;须要改动的地方包含实体类、动态ActionForm定义和Action 中对应代码easy漏掉某处而引入错误
使用实体对象作为Form属性
我们已经知道&#xff1a;
页面提交的表单数据&#xff0c;能够自己主动填充到ActionForm中
假如&#xff0c;ActionForm的代码是这种&#xff1a;
public class UserForm
extends ActionForm {
private USER user &#61; new USER();
// getter and setter
}
假如。页面代码是这种&#xff1a;
表单域的值是否可以自己主动填充到Form中呢&#xff1f;
复制一份Struts1Demo&#xff0c;改动为Struts1Login
ActionForm代码
public class LoginForm extends ActionForm {private User user &#61; new User();private String rePassword;
struts-config.xml
Action代码
if (userBiz.login(lf.getUser())) { ...
避免了“纯体力”型编码, 数据库字段增减时。无需改动Form和Action代码
源代码&#xff1a;http://pan.baidu.com/s/1sjucV85