zoukankan      html  css  js  c++  java
  • struts2 表单处理

    在这篇教程里我们将探究如何处理表单提交。本文例子介绍:

    • javabean存储表单数据
    • 在action中重写validate方法进行简单的校验
    • 创建一个struts2表单并和javabean匹配

    javabean存储表单数据

    为了封装数据,我们将使用一个简单的Java类,它遵循基本的Java Bean规范,即为每个属性设置public get/set 方法。

    Person.java

    package model;
    
    public class Person {
        private String firstName;
        private String lastName;
        private String email;
        private int age;
        public String getFirstName() {
            return firstName;
        }
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [firstName=" + firstName + ", lastName=" + lastName + ", email="
                    + email + ", age=" + age + "]";
        }
    }
    
    

    注意上面的javabean:

    • 年龄为int类型(action在讲表单参数填充到javabean中,会进行适当的类型转换)
    • 复写了toString方法(<s:property>会调用toString方法)

    action处理表单数据

    action类需要继承ActionSupport,在Register类中我们申明一个属性personBean,并且提供相应的get/set方法。同时,在Register类中复写execute方法和validate方法。

    • execute方法:

    默认实现不执行任何操作的返回"success"。子类应重写此方法以提供业务逻辑,并由此返回Action的预定义的返回值:SUCCESS、NONE 、ERROR、INPUT、LOGIN。

    我们在Struts.xml中添加action元素时,需要定义这些返回值对应的页面(注:返回哪些写哪些)。

    • validate方法:

    在Validatable接口中定义了一个validate()方法,重写该方法,如果建议表单输入域出现错误,则将错误添加到Actionsupport类的fieldErrors域中,然后通过OGNL表达式负责输出。

    Register.java

    package test.action;
    
    import model.Person;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class Register extends ActionSupport {
        private static final long serialVersionUID = 1L;
        private Person personBean;
        
        public String execute() throws Exception {
    
            // call Service class to store personBean's state in database
    
            return SUCCESS;
        }
        
        public void validate() {
            if (personBean.getFirstName().length() == 0) {
                addFieldError("personBean.firstName", "firstName is required");
            }
            if (personBean.getEmail().length() == 0) {
                addFieldError("personBean.email", "firstName is required");
            }
            if(personBean.getAge()<18){
                addFieldError("personBean.age", "Age is required and must be 18 or older");
            }
        }
    
        public Person getPersonBean() {
            return personBean;
        }
    
        public void setPersonBean(Person person) {
            personBean = person;
        }
    }
    
    
    

    jsp页面的struts2表单

    表单维持和错误输出

    用struts标签<s:form>进行表单维持和错误输出比较方便,但也因此生成了<table>的大量HTML代码。往往我们并不需要这些格式和代码,并且对这些标签的格式控制可能会增加我们的工作量。因此我们更改struts默认的主题,输出我们想要的效果。

    struts2的主题和模板

    struts2默认主题为XHTML,我们可以在struts.properties文件中修改struts2的默认主题。

    struts.properties

    struts.ui.theme=simple

    表单书写格式

    因为用了simple模板,就需要自己定义fielderror的显示。

    格式为:<s:fielderror fieldName="XXX">并将此标签放在表单XXX字段之后。

    fielderror默认主题是ul li的格式,我们需要可以将默认文档进行更改。参考:

    http://bbs.csdn.net/topics/300107242

    register.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>My JSP 'register.jsp' starting page</title>
    </head>
    <s:head />
    <body>
        <h1>register</h1>
        <s:form action="register">
            firstName:<s:textfield name="personBean.firstName"></s:textfield>
                      <s:fielderror fieldName="personBean.firstName" /><br>
            lastName:<s:textfield name="personBean.lastName"></s:textfield>
                          <s:fielderror fieldName="personBean.lastName" /><br>
            email:<s:textfield name="personBean.email"></s:textfield>
                  <s:fielderror fieldName="personBean.email" /><br>
            age:<s:textfield name="personBean.age"></s:textfield>
                <s:fielderror fieldName="personBean.age" /><br>
            <s:submit />
        </s:form>
    </body>
    </html>
    
    

    显示结果的thankyou.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>   
        <title>My JSP 'thankyou.jsp' starting page</title>
      </head> 
      <body>
        <p>Your registration information: <s:property value="personBean" /> </p>    
        <h3><s:text name="thankyou" /></h3>
      </body>
    </html>

    struts.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <struts>
    
        <constant name="struts.devMode" value="true" />
        <package name="basicstruts2" extends="struts-default">
            <action name="register" class="test.action.Register" method="execute">
                <result name="success">/thankyou.jsp</result>
                <result name="input">/register.jsp</result>
            </action>
        </package>
    </struts>
  • 相关阅读:
    java后台对上传的图片进行压缩
    Reflections框架,类扫描工具
    commons-httpclient和org.apache.httpcomponents的区别
    sql里面插入语句insert后面的values关键字可省略
    Callable接口、Runable接口、Future接口
    Java多线程之Callable接口的实现
    说说Runnable与Callable
    论坛贴吧问题:如何终止运行时间超时的线程
    使用Future停止超时任务
    spring的@Transactional注解详细用法
  • 原文地址:https://www.cnblogs.com/klguang/p/4896150.html
Copyright © 2011-2022 走看看