在上一篇文章中已经对Struts的整体流程有一个基本了解,接下来的小例子是通过实现一个简易计算器来进一步了解Struts.
简单需求如下:
能够输入两个值,运算符.
计算成功后将成功的信息显示在页面上
Action 完成计算
ActionFrom 传数据
三个页面
重新配环境
1 拷贝lib下所有的jar类
2 配置ActionServlet在web.xml中
3 配置Struts核心配置文件struts-config.xml
建立三个页面显示.
input.jsp
<%@ page language="java"contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type"content="text/html; charset=GB18030"> <title>简易计算器</title> </head> <body> <form action="cal.action"method="post"> <input type="text"name="value1"/> <select name="flag"> <optionvalue="+">+</option> <optionvalue="-">-</option> <optionvalue="*">*</option> <optionvalue="/">/</option> </select> <input type = "text" name="value2"/> <input type ="submit"value="计算"/> </form> </body> </html>
success.jsp
<%@ page language="java" contentType="text/html;charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=GB18030"> <title>计算结果</title> </head> <body> ${calForm.value1 } ${calForm.flag } ${calForm.value2 } = ${result }; </body> </html>
error.jsp
<%@ page language="java" contentType="text/html;charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=GB18030"> <title>Insert title here</title> </head> <body> ${calForm.value1 } ${calForm.flag } ${calForm.value2 } 失败 </body> </html>
分析Action
CalActionFrom(提供相关的属性和方法),继承Struts的ActionForm
警告出现的ID表示序列号的错误.(一个容器里不会出现这个问题,但是分布式,或者夸JVM则会出现这中问题.)生成的Set后面的值要和表单里面的值一致
package com.bjpowernod.struts; import org.apache.struts.action.ActionForm; /** * 获取页面相关数据. * @author jnqqls * @group TGB * @version 1.0 * @comments */ @SuppressWarnings("serial") public class CalActionForm extendsActionForm { private int value1; privateString flag; private int value2; public int getValue1() { return value1; } public void setValue1(int value1) { this.value1 = value1; } publicString getFlag() { return flag; } public void setFlag(String flag) { this.flag = flag; } public int getValue2() { return value2; } public void setValue2(int value2) { this.value2 = value2; } }
CalAction 继承Action
重写Execute方法
获取相关的数值.
进行分发处理;
进行异常处理
成功时候转到一个页面(forward对象);失败时候转到一个失败页面.
将计算的结果设置到request中.
package com.bjpowernod.struts; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; /** * 对请求进行分发. * @author jnqqls * @group TGB * @version 1.0 * @comments */ public class CalAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //获得ActionFrom相关信息 CalActionForm calForm=(CalActionForm)form; int value1=calForm.getValue1(); int value2 =calForm.getValue2(); String flag =calForm.getFlag(); //存储计算结果 int result=0; try{ if(flag.equals("+")){ result=value1+value2; }else if("-".equals(flag)){ result=value1-value2; }else if("*".equals(flag)){ result=value1*value2; }else if("/".equals(flag)){ result=value1/value2; } request.setAttribute("result", result); return mapping.findForward("success"); }catch(Exception e){ e.printStackTrace(); return mapping.findForward("error"); } } }
获取相关数据结果在页面中
成功:
success.jsp
失败
error.jsp
配置流程
配置ActionForm <form-beans>
配置Action <action-mapping>
<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD StrutsConfiguration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="calForm" type="com.bjpowernod.struts.CalActionForm"/> </form-beans> <action-mappings> <action path="/cal" type="com.bjpowernod.struts.CalAction" name="calForm" scope="request" > <forward name="success" path="/success.jsp"/> <forward name="error" path="/error.jsp"></forward> </action> </action-mappings> </struts-config>
小结:通过以上的例子我们来对两个重要的对象进行总结:ActionFrom和Action.
ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的。因此应保证ActionForm的参数,与表单域的名字相同。 可以简单的理解为ActionForm是将页面的信息进行包装然后进行传递.所有的ActionForm都被配置在struts-config.xml文件中,该文件包括了一个form-beans的元素,该元素内定义了所有ActionForm,每个ActionForm对应一个form- bean元素。可以参考上面配置流程中的相关代码.
Action是struts中的一个抽象类,它其实是Struts的核心部分,上面说到的ActionForm进过处理获取的请求和数据,都会到达Action中得到分发。
Action可以进行一些表单数据的检查,这里面的检查一般和页面的检查是不一样的,页面的检查都是客户端的一些数据格式规范的检查,这里的检查而与业务相关的检查一般放到这里面检查,比如与JavaBean相关的一些操作。它会直接调用业务逻辑层的javabean去处理数据库的操作,比如增删改查等。 根据处理的结果决定程序的去向,并以ActionForward对象的形式传递给ActionServlet,这样ActionServlet通过配置文件,决定返回的数据到达那个页面。 Action是一个抽象类,必须实现以后才能执行,执行的方法是execute方法。本文中CalAction类便是实现Action类的一个具体类,来进行相关的计算,并将计算结果进行转发.