在应用程序设计中,经常出现如下的需求。

查看用户填写的数据,而且数据是分页填写。

看下面这个情况

用户的信息有三页,分别是Form abc。





现在的问题是,后面的逻辑该如何设计。





如果把,FormABC,三张记录的保存(在froma里点下一步,就会先保存froma的数据)与回显(在formb里点上一步,就会显示之前填写的forma)都放在一个类里面,那么系统就很容易设计了。

在FormB里面点击下一步后,程序到ActionB,先运行savaB方法,然后在saveB里面调用showC,在内存里存放FormC需要的数据,然后返回到formC的视图。

可问题是,保存B与显示C是两个逻辑,放到一个类里面不合适呀

而且这个类会大,后面如果需要重构的话,这个类是个大麻烦。

那么就是第二种方案。

在FormB里面点击下一步后,程序到ActionB,先运行sava方法。然后跳转到ActionC的shwo方法...

也就是说,ActionA里面有save与show方法,同理ActionB里面也有save与show方法。

那么这里的问题就是要涉及到action间的跳转。

我认为这个也不好。

为什么?

因为我总觉得保存a与显示b是两回事,让这两个逻辑直接耦合不好。





那么我的方案出现了

在FormB里面点击下一步后,程序到ActionB运行完save方法后,直接跳转到formC的页面。在formc的页面里通过

<%@ taglib prefix="s" uri="/struts-tags"%>
<s:action name=" " namespace=" " executeResult="false" var="rd"/>  

来取得数据,并且通过s:action标签的rd属性来获得数据,如下:

   <form id="form" method="post">
   		 <input type="text" name="" value="${rd.parameter}" style="width:370px"> <br>2016/3/2
	         <input type="submit" value="提交" >
   </form>

我们看一个例子:

我设计的例子是3个jsp页面,Step1,2,3。

对应3个类,StepOne.java....

//Step1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:action name="showstep1" namespace="/module/step" executeResult="false" var="rd"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>标题</title>
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="This is my page">
 </head>
 <body>
 <h1>This is step1</h1>
   <form action="module/step/step1" method="post">
   		 <input type="text" name="step1_name" value="${rd.step1_name}" style="width:370px"> <br>

   		 <input type="submit" value="下一步">

   </form>

 </body>
</html>
</pre><pre code_snippet_id="1594936" snippet_file_name="blog_20160302_9_4890384" name="code" class="html">
//Step2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:action name="showstep2" namespace="/module/step" executeResult="false" var="rd"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>标题</title>
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="This is my page">

 </head>
 <body>
 <h1> this is step2</h1>
   <form id="form" method="post">
   		 <input type="text" name="step2_name" value="${rd.step2_name}" style="width:370px"> <br>

   		 <input type="button" value="下一步" onclick="next()">
   		 <input type="button" value="上一步" onclick="pre()">

   </form> 

 </body>

<script type="text/javascript">
	function next() {
		var form = window.form;
		form.action = "module/step/Step3.jsp";
		form.submit();
	}
	function pre() {
		var form = window.form;
		form.action = "module/step/Step1.jsp";
		form.submit();
	}
</script>
</html>

//Step3.jsp
   <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:action name="showstep3" namespace="/module/step" executeResult="false" var="rd"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>标题</title>
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="This is my page">
 </head>

 <body>
 <h1> this is step3</h1>
   <form action="module/step/step3" method="post">
   		 <input type="text" name="step3_name" value="${rd.step3_name}" style="width:370px"><br>

   		 <input type="submit" value="提交" >

   </form>
 </body>

</html>

然后就是关键的struts配置文件了

 <package name="step" namespace="/module/step" extends="basePack" >
        	<action name="step1" class="stepOne" >
					 <result name="success">Step2.jsp</result>
			</action>

			 <action name="step2" class="stepTwo" >
				     <result name="success">Step3.jsp</result>
			</action>

			<action name="step3" class="stepThree" >
				     <result name="success">success.jsp</result>
			</action>
       </package>
       
        <!-- 注意,下面这个几个action都没有返回值 为什么? 你说为什么? 记住在jsp里面action调用action的时候executeResult="false" -->
       <package name="showstep" namespace="/module/step" extends="basePack" >
        	       <action name="showstep1" class="stepOne" method="show" >
			</action>
			 <action name="showstep2" class="stepTwo" method="show" >
			</action>
			<action name="showstep3" class="stepThree" method="show" >
			</action>
       </package>
package com.module.step;
import java.util.Date;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.core.BaseAction;

@Controller()
@Scope("prototype")
public class StepOne  {
	/**
	 *
	 */
	private static final long serialVersionUID = 4765544864968563763L;
	private String step1_name;

	public String execute() {
		System.out.println(step1_name);
		return SUCCESS;
	}

	public String show(){
		step1_name="step1_name"+new Date();
		System.out.println(step1_name);
		return SUCCESS;
	}
	public String getStep1_name() {
		return step1_name;
	}

	public void setStep1_name(String step1_name) {
		this.step1_name = step1_name;
	}

}

package com.module.step;
import java.util.Date;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.core.BaseAction;

@Controller()
@Scope("prototype")
public class StepTwo {
	/**
	 *
	 */
	private static final long serialVersionUID = 4765544864968563763L;
	private String step2_name;

	public String execute(){
		System.out.println(step2_name);
		return SUCCESS;
	}

	public String show(){
		step2_name="step2_name"+new Date();
		System.out.println(step2_name);
		return SUCCESS;
	}

	public String getStep2_name() {
		return step2_name;
	}

	public void setStep2_name(String step2_name) {
		this.step2_name = step2_name;
	}

}
package com.module.step;
import java.util.Date;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.core.BaseAction;

@Controller()
@Scope("prototype")
public class StepThree {
	/**
	 *
	 */
	private static final long serialVersionUID = 4765544864968563763L;
	private String step3_name;

	public String execute(){
		System.out.println(step3_name);
		return SUCCESS;
	}

	public String show(){
		step3_name="step3_name"+new Date();
		System.out.println(step3_name);
		return SUCCESS;
	}

	public String getStep3_name() {
		return step3_name;
	}

	public void setStep3_name(String step3_name) {
		this.step3_name = step3_name;
	}

}

Struts2处理流程性需求的一种解决方案的更多相关文章

  1. Struts2 核心流程

    1.Struts2架构图  这是Struts2官方站点提供的Struts 2 的整体结构.  执行流程图 2.Struts2部分类介绍  这部分从Struts2参考文档中翻译就可以了. ActionM ...

  2. springmvc与struts2执行流程比较

    之前写过一篇struts2的执行流程的文章了,这里对struts2的流程就不做过多的分析,这篇文章主要分析spring-mvc的执行流程以 及struts2与spring-mvc的差别. 1.stru ...

  3. Struts2学习第一天——struts2基本流程与配置

    struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实 ...

  4. Struts2 运行流程

    Struts2运行流程 1.在web.xml中使用Struts的核心过滤器拦截所有请求. <filter> <filter-name>struts2</filter-na ...

  5. Struts2中Action接收参数的四种形式

    1.Struts2的Action接收参数的三种形式.      a. 使用Action的属性接收(直接在action中利用get方法来接收参数):                   login.js ...

  6. Struts2中validate数据校验的两种常用方法

    本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器.  1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...

  7. Struts2中访问web元素的四种方式

    Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...

  8. struts2 基本流程

    一.配置过程 1.在web.xml中配置过滤器 <filter> <filter-name>StrutsPrepareAndExecuteFilter</filter-n ...

  9. 【跟我一步一步学Struts2】——Struts2工作流程

    上一篇博客通过一个简单的小样例对struts2的流程有一个简单的了解,这篇博客继续. 当用户要登陆某一个站点.输入username,password,点击登陆就会触发以下一系列过程 : 1.请求过来之 ...

随机推荐

  1. 【NOIP2016TG】solution

    传送门:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C33 D1T1(toys) 题意:有n个小人, ...

  2. ●HDU 6021 MG loves string

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=6021 题解: 题意:对于一个长度为 N的由小写英文字母构成的随机字符串,当它进行一次变换,所有字符 i ...

  3. bzoj 2004: [Hnoi2010]Bus 公交线路

    Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...

  4. C++函数式编程实现牛顿法

    In numerical analysis, Newton's method (also known as the Newton–Raphson method), named after Isaac ...

  5. 机器学习基础—集成学习Bagging 和 Boosting

    集成学习 就是不断的通过数据子集形成新的规则,然后将这些规则合并.bagging和boosting都属于集成学习.集成学习的核心思想是通过训练形成多个分类器,然后将这些分类器进行组合. 所以归结为(1 ...

  6. C语言程序设计实验第四次作业

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

  7. day08 JSP

    day08 JSP 1. jsp 入门和 jsp 运行原理 2. jsp 语法 2.1 jsp 模板元素:jsp 页面中的 html 内容.它定义了网络基本骨架,即定义了页面结构和外观. 2.2 js ...

  8. Bootstrap3 表单-被支持的控件:文本域

    支持多行文本的表单控件.可根据需要改变 rows 属性. <textarea class="form-control" rows="3"></ ...

  9. MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引

    mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询 ...

  10. Android动态修改ToolBar的Menu菜单

    Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了. 开始上货 Menu Me ...