index.jsp
代碼
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>測試ActionForm</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">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>測試ActionForm</h1>
<hr>
<li>測試動态ActionForm</li><br>
<form action="dyanactionform.do" method="post">
姓名:<input type="text" name="username"><br>
年齡:<input type="text" name="age"><br>
<input type="submit" value="送出">
</form>
<p>
<li>測試struts上傳檔案</li><br>
<form action="upload.do" method="post" enctype="multipart/form-data">
标題:<input type="text" name="title"><br>
檔案:<input type="file" name="myfile"><br>
<input type="submit" value="送出">
</form>
<li>空字段測試</li><br>
<form action="blankfield.do" method="post">
<p>
<li>測試ActionForm類型轉換器</li><br>
<form action="typeconvert.do" method="post">
intValue:<input type="text" name="intValue"><br>
doubleValue:<input type="text" name="doubleValue"><br>
booleanValue:<input type="text" name="booleanValue"><br>
java.sql.Date:<input type="text" name="sqlDate"><br>
java.util.Date:<input type="text" name="utilDate"><br>
<input type="submit" value="送出">
</form>
</body>
</html>
配置檔案
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="age" type="java.lang.Integer"/>
</form-bean>
<form-bean name="uploadForm" type="com.bjsxt.struts.UploadActionForm"/>
<form-bean name="blankFieldForm" type="com.bjsxt.struts.BlankFieldActionForm"/>
<form-bean name="typeconvertForm" type="com.bjsxt.struts.TypeConvertActionForm"/>
</form-beans>
<action-mappings>
<action path="/dyanactionform"
type="com.bjsxt.struts.DynaActionFormTestAction"
name="dynaForm"
scope="request"
>
<forward name="success" path="/dyna_actionform.jsp"/>
</action>
<action path="/upload"
type="com.bjsxt.struts.UploadTestAction"
name="uploadForm"
<forward name="success" path="/upload_success.jsp"/>
<action path="/blankfield"
type="com.bjsxt.struts.BlankFieldTestAction"
name="blankFieldForm"
scope="request"
<forward name="success" path="/blankfield_success.jsp"/>
<action path="/typeconvert"
type="com.bjsxt.struts.TypeConvertTestAction"
name="typeconvertForm"
<forward name="success" path="/typeconvert_success.jsp"/>
</action-mappings>
<controller maxFileSize="10M"/>
<plug-in className="com.bjsxt.struts.UtilDateConverterInitWithPlugin"/>
</struts-config>
1、AtionForm
package com.bjsxt.struts;
import org.apache.struts.action.ActionForm;
/**
* 測試空字段
* @author Administrator
*
*/
public class BlankFieldActionForm extends ActionForm {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
public String getPassword() {
return password;
public void setPassword(String password) {
this.password = password;
}
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class BlankFieldTestAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
return mapping.findForward("success");
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="com.bjsxt.struts.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<%
BlankFieldActionForm form = (BlankFieldActionForm)request.getAttribute("blankFieldForm");
%>
<li>jsp腳本</li><br>
姓名:<%=form.getUsername() %><br>
密碼:<%=form.getPassword() %><br>
<p>
<li>el表達式</li><br>
姓名:${blankFieldForm.username }<br>
密碼:${blankFieldForm.password }<br>
</body>
業務邏輯類
DynaActionFormTestAction.java
import org.apache.struts.action.DynaActionForm;
* 測試動态ActionForm
*/
public class DynaActionFormTestAction extends Action {
@Override
DynaActionForm daf = (DynaActionForm)form;
String username = (String)daf.get("username");
Integer age = (Integer)daf.get("age");
System.out.println("username=" + username);
System.out.println("age=" + age);
成功的傳回頁面
dyna_actionform.jsp
使用者名稱:${dynaForm.map.username }<br>
年齡:${dynaForm.map.age }<br>
2、struts上傳檔案
import org.apache.struts.upload.FormFile;
* 上傳ActionForm
public class UploadActionForm extends ActionForm {
private String title;
//必須采用FormFile
private FormFile myfile;
public String getTitle() {
return title;
public void setTitle(String title) {
this.title = title;
public FormFile getMyfile() {
return myfile;
public void setMyfile(FormFile myfile) {
this.myfile = myfile;
import java.io.FileOutputStream;
* 上傳Action
public class UploadTestAction extends Action {
UploadActionForm uaf = (UploadActionForm)form;
System.out.println("title" + uaf.getTitle());
FormFile myFile = uaf.getMyfile();
if (myFile != null) {
System.out.println("fileName=" + myFile.getFileName());
FileOutputStream fos = new FileOutputStream("c:\\" + myFile.getFileName());
fos.write(myFile.getFileData());
fos.flush();
fos.close();
}
成功傳回頁面
upload_success.jsp
标題:${uploadForm.title}<br>
檔案名:${uploadForm.myfile.fileName }<br>
3、類型轉換
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.Converter;
* java.util.Date類型轉換器
public class UtilDateConverter implements Converter {
public Object convert(Class type, Object value) {
System.out.println("UtilDateConverter.value=" + value);
if (value == null) {
return value;
if (value instanceof Date) {
Date d = null;
if (value instanceof String) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
d = sdf.parse((String)value);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return d;
import javax.servlet.ServletException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class UtilDateConverterInitWithPlugin implements PlugIn {
public void destroy() {
public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException {
System.out.println("UtilDateConverterInitWithPlugin.init()");
ConvertUtils.register(new UtilDateConverter(), Date.class);
import javax.servlet.http.HttpServlet;
* 注冊java.util.date轉換器
public class UtilDateConverterInitWithServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("UtilDateConverterInitWithServlet.init()");
typeconvert_success.jsp
intValue:${typeconvertForm.intValue }<br>
doubleValue:${typeconvertForm.doubleValue }<br>
booleanValue:${typeconvertForm.booleanValue }<br>
java.sql.dateValue:${typeconvertForm.sqlDate }<br>
java.util.utilValue:${typeconvertForm.utilDate }<br>
講解
1、動态ActionForm
動态ActionForm是為了避免标準ActionForm膨脹而設計的,使用動态ActionForm可以獲得标準
ActionForm的所有功能
* 在struts-config.xml檔案中定義動态ActionForm,如:
<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer"/>
</form-bean>
</form-beans>
*在Action中使用動态ActionForm,參見DynaActionFormTestAction.java
DynaActionForm daf = (DynaActionForm)form;
String username = (String)daf.get("username");
Integer age = (Integer)daf.get("age");
動态ActionForm其實是把頁面中的html元素的名字和值放到了map中,是以通過get方法可以取出相應的值
動态ActionForm采用EL表達式的輸出方式,${dynabean.map.prop}, 參見:dyna_actionform.jsp
動态Action的驗證,通常使用動态驗證架構validator
2、采用struts上傳檔案
* 頁面的配置,如:
<form action="upload.do" method="post" enctype="multipart/form-data">
标題:<input type="text" name="title"><br>
檔案:<input type="file" name="myfile"><br>
<input type="submit" value="送出">
</form>
* ActionForm中使用FormFile來接收上傳的檔案,參見:UploadActionForm.java
* 在Action中調用FormFile取得上傳檔案資料,采用流輸出,即完成上傳,參見:UploadTestAction.java
* 采用<controller/>标簽配置上傳參數,如:<controller maxFileSize="10M"/>
3、空字段測試
* 在表單中沒有input輸入域,jsp腳本接收到的值為null,el表達式接收到的值為空串
* 如果表單中的值,沒有輸入,那麼jsp腳本和el表達式接收到的值都為空串
4、測試ActionForm類型的自動轉換
* boolean:yes,1,on,true都會轉換成True類型,而且忽略大小寫,其他情況轉換成false
* Date類型的轉換:
* 如果是java.sql.Date,頁面日期的格式必須為yyyy-mm-dd,才可以轉換
* 如果是java.util.Date,預設情況下struts無法轉換
* 自定義轉換器的實作步驟
* 實作converter接口,實作convert方法
* 将實作的conerter注冊,通常情況采用servlet注冊
* 采用servlet注冊需要注意标簽的配置,<load-on-startup>10</load-on-startup>(也可以采用struts plugin注冊)
Struts對ActionForm的自動搜集過程:
* 将頁面資料放到map中,其中map中的key為頁面中的名稱,map中的value為頁面中的value值
* 調用BeanUtils.setProperties方法,将map中的值逐個設定到ActionForm執行個體上,對于ActionForm中的每個屬性
根據類型調用相應的Converter,然後調用相應的convert方法,将相應的字元串轉換成ActionForm中指定的類型
可以通過BeanUtils.copyProperties(目标對象,源對象)方法進行對象值的複制。
本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1080869