Struts1应用、实现简单计算器、使用DispatchAction、显示友好的报错信息、使用动态Form简化开发
实现简单的支持加、减、乘、除的计算器
复制一份Struts1Demo修改:Struts1Calc
方案1: Struts1Calc
CalcForm extends ActionForm, num1 num2,生成getter setter;
创建4个Action,在页面中,通过JavaScript控制提交到不同的Action Bean。
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,系统规模变大时,容易混乱
方案2将相关操作组织在一个Action中,通过operate参数区分不同操作,但容易使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. 容易漏改出错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 中相应代码容易漏掉某处而引入错误
使用实体对象作为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简化开发的更多相关文章
- ionic使用iframe时无法显示网页或报错
ionic使用iframe时无法显示网页或报错 Uncaught DOMException: Blocked a frame with origin 在config.xml中添加 <access ...
- Ubuntu下开启php调试模式,显示报错信息
在Ubuntu下php的缺省设置是不显示错误信息的,如果程序出错会显示“无法处理此请求的错误提示”,这在开发环境下非常不方便. 其实我们只要编辑下apache的配置文件就好 1.我的apache 配置 ...
- lamp 网站打不开,不显示也不报错,
原因是该网站的编程员,习惯简写,<? ?>;而服务器版本的php.ini 默认不支持只支持<?php ?>这种格式. 解决方法vim /usr/loacl/php/etc/ph ...
- JUnit出错,却没有显示任何报错信息【待解答】
JUnit测试代码如下: 原因分析: JUnit测试单元里,测试函数好像不能带参数? 解决办法: 发现测试函数testBookShopDaoUpdateBookStock(int isbn)里的参数i ...
- 简单记录一次REDO文件损坏报错 ORA-00333重做日志读取块出错
一.故障描写叙述 首先是实例恢复须要用到的REDO文件损坏 二.解决方法 1.对于非当前REDO或者当前REDO可是无活动事务使用下面CLEAR命令: 用CLEAR命令重建该日志文件SQL>al ...
- springboot启动只显示图标不报错
问题如下: 问题原因是:logback.xml文件中日志打印级别设置的有问题.设置不打印
- php大力力 [005节] php大力力简单计算器001
2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ...
- py+selenium 自动判断页面是否报错并显示在自动化测试报告【原创】
有需求就会去研究解决的路子. 现在需求就是,测试报告报错信息一堆,但却无法肉眼看出是什么问题,你只能知道定位不到元素或是超时,但你却不知道其实进入页面就报错了或是提交表单就报错了!也就是看到报错,需要 ...
- IIS7显示ASP的详细错误信息到浏览器
服务端环境:Windows2008 + IIS7 客户端浏览器设置:取消“显示友好的HTTP错误信息” IIS7设置(GUI): 1. 网站->ASP->调试属性->将错误发送到浏览 ...
随机推荐
- codevs 1054 电梯
1054 电梯 提交地址:http://codevs.cn/problem/1054/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 D ...
- EntityFramework Core 学习系列(一)Creating Model
EntityFramework Core 学习系列(一)Creating Model Getting Started 使用Command Line 来添加 Package dotnet add pa ...
- Caffe的运行mnist手写数字识别
老规矩,首先附上官方教程:http://caffe.berkeleyvision.org/gathered/examples/mnist.html 1.必要软件 因为Caffe中使用的是Linux才能 ...
- P2520 [HAOI2011]向量
题目描述 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量 ...
- [HEOI2014]大工程
题目描述 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 ...
- 计蒜客NOIP模拟赛(2) D2T1 劫富济贫
[问题描述] 吕弗·普自小从英国长大,受到骑士精神的影响,吕弗·普的梦想便是成为一位劫富济贫的骑士. 吕弗·普拿到了一份全国富豪的名单(不在名单上的都是穷人),上面写着所有富豪的名字以及他们的总资产, ...
- [HNOI2001]矩阵乘积
题目描述 输入输出格式 输入格式: 第1行为:x y (第1行为两个正整数:x,y分别表示输出结果所在的行和列) 第2行为:m n o p(第2行给出的正整数表明A为m×n矩阵,B为n×o矩阵,C为o ...
- ●BZOJ 3994 [SDOI2015]约数个数和
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3994 题解: 莫比乌斯反演 (先定义这样一个符号[x],如果x为true,则[x]=1,否则 ...
- 第一节mysql 安装
1 安装之前的检查 先要检查Linux系统中是否已经安装了MySQL,输入命令尝试打开MySQL服务: 输入密码后,如果出现以下提示,则说明系统中已经安装有 MySQL: 如果提示是这样的,则说明系统 ...
- linux安装ftp
安装vsftpd 1.以管理员(root)身份执行以下命令 1. yum install vsftpd 2.设置开机启动vsftpd ftp服务 1. chkconfig vsftpd on 3. ...