您的位置:首页 > 编程语言 > Java开发

Struts1应用、实现简单计算器、使用DispatchAction、显示友好的报错信息、使用动态Form简化开发

2014-06-26 19:20 876 查看

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

复制一份Struts1Demo修改:Struts1Calc

方案1: Struts1Calc

创建ActionForm:

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

使用Struts框架开发时,对每一个页面提交的属性都要建立一个ActionForm属性

回顾计算器的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的好处

省去了编写ActionForm类

页面提交数据变化时只须修改struts-config.xml中的配置

使用动态ActionForm的缺陷

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐