在上一篇文章中已经对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类的一个具体类,来进行相关的计算,并将计算结果进行转发.