Validation trong Struts Framework (Struts Framework-Phần 3)

Trong phần 3 này chúng ta sẽ tìm hiểu cách mà Framework Struts kiểm tra xác nhận (validation) các thông tin đầu vào được người dùng nhập vào form thông tin trong một ứng dụng  Chúng ta sẽ tiếp tục sử dụng ứng dụng đã được xây dựng trong phần 2.


Struts Action dựa trên một framework xác nhận được cung cấp bởi XWork để kích hoạt các quy tắc xác nhận đầu vào của ứng dụng truyền tới các Action trước khi chúng được chạy. Struts2 Validation Framework  cho phép chúng ta tách phần xác nhận logic từ code Java/JSP,  nó có thể được xem lại và dễ dàng chỉnh sửa sau.
 Validation framework được đi kèm với một bộ các chương trình hữu ích để xử lý các form xác nhận tự động và nó có thể xử lý cả 2 phía server cũng như form các nhận trên client. Nếu một xác nhận nào đó không tồn tại, bạn có thể tự tạo một xác nhận thích hợp bằng cách implement interface com.opensymphony.xwork2.Validator và đưa nó vào validation framework như một thành phần có thể dùng  lại được.
 Validator sử dụng các file XML cấu hình để xác định các xác nhận thường dùng và cách để chúng được áp dụng cho một ứng dụng nhất đinh. File validators.xml chưa tất cả các khai báo xác nhận chung. Nếu file validators.xml không có trong classpath thì một file xác nhận mặc định được load từ đường dẫn com/opensymphony/xwork2/validator/validators/default.xml.
 File xác nhận đầu tiên validator-rules.xml khai báo các xác nhận được đặt trong framework và cung cấp tên logic cho từng xác nhận. File validator-rules.xml cũng xác định code JavaScript từ phía client cho từng xác nhận. Validator có thể được cấu hình để gửi code JavaScript này tới trình duyệt để các kiểm tra xác nhận được thực hiện trên client cũng như server.

Validators Scope

Có 2 loại xác nhận trong Struts2 Validation Framework :
- Field Validators
- Non-field validators

Field validators, hoạt động trên các field đơn có thể được truy cập thông qua một action. Hầu hết các xác nhận có thể định trên trên bất cứ field cơ bản nào.

<validators>
  <field name="bar">
      <field-validator type="required">
          <message>You must enter a value for bar.</message>
      </field-validator>
  </field>
</validators>

Non-field validators, chỉ thêm các thông điệp mức action.
<validators>
      <validator type="expression">
            <param name="expression">foo lt bar</param>
            <message>Foo must be greater than Bar.</message>
      </validator>
</validators>

Bắt đầu ví dụ


Bây giờ chúng ta sẽ thêm một xác nhận vào ứng dụng LoginPageWithStruts mà chúng ta đã tạo trong phần trước (Phần 2) .Chúng ta tạo một lớp Action tên là CustomerAction sẽ chứa một vài field. Tạo một file CustomerAction.java trong gói net.viralpatel.struts2. Copy nội dung sau vào đó:

package net.viralpatel.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class CustomerAction extends ActionSupport{
    private String name;
    private Integer age;
    private String email;
    private String telephone;
    public String addCustomer() {
        return SUCCESS;
    }
     
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getTelephone() {
        return telephone;
    }
    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
}

Lưu ý rằng lớp CustomerAction có các field : name, email, telephone và age. Ngoài ra nó cũng có một phương thức gọi là addCusstomer() chỉ trà về giá trị SUCCESS.

Bây giờ chúng ta sẽ thêm lớp action mới này vào file struts.xml . Mở file struts.xml trong thư mục Resources và thêm nội dung sau vào giữa 2 tag : <package></package>

<action name="customer"
    class="net.viralpatel.struts2.CustomerAction">
    <result name="success">SuccessCustomer.jsp</result>
    <result name="input">Customer.jsp</result>
</action>

Sau khi thêm file struts.xml sẽ có nội dung như sau:
<?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.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<package name="default" extends="struts-default" namespace="/">
<action name="login" class="net.viralpatel.struts2.LoginAction">
<result name="success">Welcome.jsp</result>
<result name="error">Login.jsp</result>
</action>
<action name="customer" class="net.viralpatel.struts2.CustomerAction">
<result name="success">SuccessCustomer.jsp</result>
<result name="input">Customer.jsp</result>
</action>
</package>
</struts>
Trong đoạn code vừa thêm chúng ta đang map lớp CustomerAction với tên "customer". Ngoài ra khi người dùng xác thực thành công sẽ được trả về trang SuccessCustomer.jsp. Tag "input" được sử dụng trong trường hợp có một xác nhận gặp sự cố , nó sẽ chuyển người dùng tới trang quy định đầu vào, trong trường hợp này nó là trang Customer.jsp

Bây giờ chúng ta sẽ tạo ra file JSP mới trong thư mục WebContent :
- Customer.jsp : Chứa form thông tin nhập thông tin khách hàng.
- SuccessCustomer.jsp : Trang sẽ hiển thị khi xác thực thành công.

Customer.jsp:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Customer Form - Struts2 Demo | Minhbangchu.blogspot.com</title>
</head>
<body>
<h2>Customer Form</h2>
<s:form action="customer.action" method="post">
    <s:textfield name="name" key="name" size="20" />
    <s:textfield name="age" key="age" size="20" />
    <s:textfield name="email" key="email" size="20" />
    <s:textfield name="telephone" key="telephone" size="20" />
    <s:submit method="addCustomer" key="label.add.customer" align="center" />
</s:form>
</body>
</html>

SuccessCustomer.jsp :
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Customer Page - Struts2 Demo | Minhbangchu.blogspot.com</title>
</head>
<body>
    <h2>Customer Added Successfully.</h2>
</body>
</html>

Chúng ta đã tạo file Customer.jsp để hiển thị form thông tin khách hàng, nhưng chúng ta chưa có link nào để dẫn đến trang JSP này trong ứng dụng của chúng ta. Vì vậy chúng ta sẽ tạo một link tới Customer.jsp từ trang Welcome.jsp . Mở trang Welcome.jsp và thêm đoạn code sau vào đó:

<s:a href="Customer.jsp">Add Customer</s:a>

Bây giờ trang Welcome.jsp của chúng ta sẽ như sau:

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Welcome</title>
</head>

<body>
    <h2>Xin chào, <s:property value="username" />...!</h2>
 
    <s:a href="Customer.jsp">Add Customer</s:a>
</body>
</html>

Tiếp tục mở file ApplicationResources.properties trong thư mục /Resources và thêm các key/giá trị sau vào đó

name= Name
age= Age
email= Email
telephone= Telephone
label.add.customer=Add Customer
errors.invalid=${getText(fieldName)} is invalid.
errors.required=${getText(fieldName)} is required.
errors.number=${getText(fieldName)} must be a number.
errors.range=${getText(fieldName)} is not in the range ${min} and ${max}.

Bây giờ khi thực hiện chạy thử , trang form nhập thông tin khách hàng sẽ như sau:

Thêm các xác nhận

Chúng ta đã tạo xong form thông tin khách hàng cơ bản, bây giờ chúng ta sẽ thực hiện thêm các xác nhận, kiểm tra thông tin đầu vào . Các quy luật xác nhận sau sẽ được thêm vào ứng dụng :\
- Field Name là bắt buộc, không được để trống.
- Field Age là bắt buộc và nó phải là một số từ 1 tới 100.
- Field Email là bắt buộc và nó là một địa chỉ Email hợp lệ
- Field Telephone là bắt buộc

Để định nghĩa một xác nhận kiểm tra thông tin cho một form riêng, đầu tiên chúng ta cần tạo một file XML để chứa dữ liệu này. Struts quy ước cách đặt tên trong việc điện nghĩa file XML xác nhận thông tin, định dạng file như sau : <Tên lớp Action>-validation.xml. Vì vậy đối với ứng dụng của chúng ta, tên của file XML này sẽ là CustomerAction-validation.xml. Lưu ý rằng file XML này sẽ được để cùng gói với Lớp Action.
 Tạo file CustomerAction-validation.xml trong package net.viralpatel.struts2 và copy nội dung sau vào đó:

CustomerAction-validation.xml
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message key="errors.required" />
        </field-validator>
    </field>
    <field name="age">
        <field-validator type="required">
            <message key="errors.required" />
        </field-validator>
        <field-validator type="int">
            <param name="min">1</param>
            <param name="max">100</param>
            <message key="errors.range"/>
        </field-validator>
    </field>
    <field name="email">
        <field-validator type="requiredstring">
            <message key="errors.required" />
        </field-validator>
        <field-validator type="email">
            <message key="errors.invalid" />
        </field-validator>
    </field>
    <field name="telephone">
        <field-validator type="requiredstring">
            <message key="errors.required" />
        </field-validator>
    </field>
</validators>

Client Side Validation

Rất dễ dàng để thêm xác nhận từ Client hoặc xác nhận JavaScript vào bất kỳ form nào tỏng Struts. Bạn chỉ cần thêm validate = "true" trong tag form ở file JSP. Ví dụ bạn mở file Customer.jsp và thêm validate="true" vào tag form. Struts sẽ tự động tạo ra mã JavaScript cho việc xác nhận từ client của form.

<s:form action="customer.action" method="post" validate="true">
    ...
</s:form>

Chạy thử ứng dụng 








Bạn có thể download Source của ví dụ tại link sau nhé : http://www.mediafire.com/?k1jc2y5sn1zg3



0 Nhận xét:

Đăng nhận xét

Rất mong các ý kiến của các bạn khi đọc bài viết này !