热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用Struts1构建简易计算器:采用DispatchAction处理请求,动态Form优化开发流程,提供用户友好的错误提示

本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。

实现简单的支持加、减、乘、除的计算器

复制一份Struts1Demo改动:Struts1Calc

方案1: Struts1Calc

创建ActionForm:
CalcForm extends ActionForm。 num1 num2。生成getter setter;

创建4个Action。在页面中,通过Javascript控制提交到不同的Action Bean。

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
加入
    1


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的path改动为calc 配置&#xff1a;

在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简化开发

使用Struts框架开发时。对每个页面提交的属性都要建立一个ActionForm属性
回想计算器的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的优点
省去了编写ActionForm类
页面提交数据变化时仅仅须改动struts-config.xml中的配置
使用动态ActionForm的缺陷
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




推荐阅读
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 回顾两年前春节期间的一个个人项目,该项目原本计划参加竞赛,但最终作为练习项目完成。独自完成了从编码到UI设计的全部工作,尽管代码量不大,但仍有一定的参考价值。本文将详细介绍该项目的背景、功能及技术实现。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
  • 本文详细探讨了BCTF竞赛中窃密木马题目的解题策略,重点分析了该题目在漏洞挖掘与利用方面的技巧。 ... [详细]
  • 1#include2#defineM1000103#defineRGregister4#defineinf0x3f3f3f3f5usingnamespacestd;6boolrev ... [详细]
  • SQL Server 存储过程实践任务(第二部分)
    本文档详细介绍了三个SQL Server存储过程的创建与使用方法,包括统计特定类型客房的入住人数、根据房间号查询客房详情以及删除特定类型的客房记录。 ... [详细]
  • 在编程实践中,正确管理和释放资源是非常重要的。本文将探讨 Python 中的 'with' 关键字及其背后的上下文管理器机制,以及它们如何帮助我们更安全、高效地管理资源。 ... [详细]
  • Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
      近期项目需要是实现一个通过筛选选取所需数据刷新表格的功能,因为表格只占页面的一小部分,不希望整个也页面都随之刷新,所以首先想到了使用AJAX来实现。  以下介绍解决方法(请忽视 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
author-avatar
何包蛋0727
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有