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
增加隐藏表单域,表示操作类型 ,在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;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://pan.baidu.com/s/1c0nbPsc
以上两个方案说明:
方案1对每个操作都创建一个Action,系统规模变大时,容易混乱
方案2将相关操作组织在一个Action中,通过operate参数区分不同操作,但容易使Action中execute方法的代码过长,不易维护
复制上一个项目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   … 
		*/
在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里面也要有对应
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
添加到全局错误信息中,作用域是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"));
		}
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>
<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>
……
DynaActionForm cf =(DynaActionForm) form;
……
result =(Integer)cf.get("num1")/(Integer)cf.get("num2");
……
省去了编写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中呢?
ActionForm代码
public class UserForm extends ActionForm {
    private USER user = new USER();
    // getter and setter
}
struts-config.xml
<form-bean name="userForm" type="com.aptech.jb.web.form.UserForm" />
     ... 
<action name="userForm" ...
Action代码
UserForm myForm = (UserForm)form;
// 执行登录
USER userWithUid = userBiz.login( myForm.getUser() );
避免了“纯体力”型编码, 数据库字段增减时,无需修改Form和Action代码
Struts1应用、实现简单计算器、使用DispatchAction、显示友好的报错信息、使用动态Form简化开发,布布扣,bubuko.com
Struts1应用、实现简单计算器、使用DispatchAction、显示友好的报错信息、使用动态Form简化开发
原文:http://blog.csdn.net/jerome_s/article/details/34876943