天天看點

一個簡單的struts的例子

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