Struts2 – Action

ครั้งที่แล้วเรียนรู้การสร้าง form ตอนนี้จะทำการส่งค่าไปประมวลผลที่ action (อย่าลืมไปหัด Setup project ก่อนที่จะลุยต่อไปนะครับ)

Action


หากดูใน struts.xml ในตอนแรกจะพบว่า มี default action ชื่อ index ในกรณีที่เข้าหน้าเว็บโดยไม่ระบุ url ไปยังหน้าอื่น

  1. struts จะทำการเรียก default action จากตัวอย่างจะเป็นการไปเรียก action ที่ชื่อ index
  2. action index จะไปเรียกคลาส HelloWorldAction เมธอด execute
  3. เมธอดนี้ return ค่า SUCCESS กลับมาเป็น String
  4. เมื่อกลับไปเทียบใน struts.xml จะพบว่าค่า success ให้วิ่งไปหา view ที่ /WEB-INF/jsp/home.jsp
  5. struts ทำการโหลดหน้า home.jsp แล้วส่งกลับไปให้ Browser เพื่อแสดงผล

แล้วก็กลายเป็น Hello world ในตัวอย่างแรก

struts2-flow

กรณีศึกษา: ลงทะเบียน


ผมแก้ไขหน้า home.jsp จากตัวอย่างที่แล้วให้เป็นลิงก์ไปยังหน้า register แต่ยังไม่มี action ที่มารับคำสั่งประมาณนี้

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>

<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Home</title>
</head>
<body>
Hello, world!

<br/>
<s:url id="registerUrl" action="input_register" namespace="/register"/>
<a href="${registerUrl}">Register</a>
</body>
</html>
  1. สร้างคลาส RegisterAction ข้างในมีการประกาศตัวแปรสองตัวเพื่อรับค่าจากหน้าจอ และสองเมธอดสำหรับเรียกหน้า input และเมื่อกดปุ่ม submit
    package com.magicalcyber.hellostruts2.action.register;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * Created by magicalcyber on 1/14/2015.
     */
    public class RegisterAction extends ActionSupport {
        private String email;
        private String password;
    
        @Override
        public String execute() throws Exception {
            return SUCCESS;
        }
    
        @Override
        public String input() throws Exception {
            return INPUT;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    
  2. สร้าง jsp สองไฟล์
    /WEB-INF/jsp/register/input.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    
    <%@ taglib prefix="s" uri="/struts-tags" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Home</title>
    </head>
    <body>
    <s:form action="_register">
        <s:textfield name="email" label="E-mail"/>
        <s:password name="password" label="Password"/>
        <s:submit value="Submit"/>
    </s:form>
    </body>
    </html>
    

    /WEB-INF/jsp/register/success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    
    <%@ taglib prefix="s" uri="/struts-tags" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Home</title>
    </head>
    <body>
    Hello, <s:property value="email"/>
    </body>
    </html>
    
  3. Copy ไฟล์ struts.xml แล้วเปลี่ยนชื่อเป็น register.xml และเพิ่ม package กับ action ที่มีค่า result input ไปยังหน้า input.jsp และ success ไปยังหน้า success.jsp ดังนี้
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <package name="register" namespace="/register" extends="default">
    
    
            <action name="*_register" class="com.magicalcyber.hellostruts2.action.register.RegisterAction" method="{1}">
                <result name="input">/WEB-INF/jsp/register/input.jsp</result>
                <result name="success">/WEB-INF/jsp/register/success.jsp</result>
            </action>
        </package>
    
    </struts>
    
    
  4. แก้ไขไฟล์ struts.xml โดยทำการ include register.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
            "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
        <constant name="struts.devMode" value="true"/>
    
        <package name="default" namespace="/" extends="struts-default">
    
            <default-action-ref name="index"/>
    
            <global-results>
                <result name="error">/WEB-INF/jsp/error.jsp</result>
            </global-results>
    
            <global-exception-mappings>
                <exception-mapping exception="java.lang.Exception" result="error"/>
            </global-exception-mappings>
    
            <action name="index" class="com.magicalcyber.hellostruts2.action.HelloWorldAction" method="execute">
                <result name="success">/WEB-INF/jsp/home.jsp</result>
            </action>
        </package>
    
        <!-- Add packages here -->
        <include file="register.xml"/>
    </struts>
    
    

สุดท้ายไฟล์ที่มีในโปรเจคควรมีดังนี้ (ผมใช้ IntelliJ ทำให้หน้าตาอาจจะแปลกๆ อย่างที่ผมเคยบอก อย่ายึดติดกับ IDE ครับ)
project-structure

เมื่อทำการ start server แล้วเข้า URL http://localhost:8080/hellostruts2/ ก็จะพบ link ให้ไปยังหน้า register

Home

เมื่อกด link ก็จะพบกับหน้า register form
register form

กดปุ่ม submit โดยไม่กรอกค่าอะไรเลยก็จะพบกับหน้าจอ success
register success without validate

กลายเป็น Hello, ว่างๆ ซึ่งเราไม่ได้ต้องการให้เป็นแบบนี้ เราต้องทำการ validate ค่าจากหน้าจอว่าต้องกรอกค่าเข้ามาถึงจะ success ซิ

ในตอนหน้าพบกับวิธีการ validate ครับ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s