• 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 {
    	@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。系统规模变大时,easy混乱

    方案2将相关操作组织在一个Action中,通过operate參数区分不同操作,但easy使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. easy漏改出错
    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 中对应代码

      easy漏掉某处而引入错误

    使用实体对象作为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

  • 相关阅读:
    php 邮件发送开发前期配置
    抛弃传统的curl,使用Guzzle
    TP5.1 分页(带参数传递)
    tp5.1 模型 where多条件查询 like 查询
    xpath 和 jsonpath 解析
    python分布式爬虫框架 --- scrapy-redis
    python爬虫框架——scrapy
    python爬虫 --- urllib
    mysql事务和锁
    mysql数据储存
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6881995.html
Copyright © 2020-2023  润新知