2015年6月29日 星期一

Struts2 HelloWorld(Struts2.3.x 一)

※XML設定

hello world struts2
這個網址為官方教學,蠻清楚的,我針對不清楚的部分說明,它是用maven,我用eclipse創建

struts-2.x/docs/docs/create-struts-2-web-application-using-maven-to-manage-artifacts-and-to-build-the-application.html 這個是下載下來的目錄裡,比較準確,因為和你下載的版本完全一樣

1.先new一個Maven Project

2.直接Next

3.選webapp的選項

4.Artifact Id就是專案名稱,官方的第一步是叫basic_struts

5.mvnrepository.com為maven網站,官方的第三和第四步會用到,自行搜尋一下

6.將網站找到的貼到pom.xml,<finalName>為官方的第一步,因為我們用maven,第四部就做好了,這邊會自動出現

7.官方的Step2 5 6 7都做一下,run起專案,叫會看到index.jsp的內容了,如果jsp<%@ page 前面有錯的話,注意訊息,我的部分是要加servlet-api.jar,將tomcat build進來即可。

jsp的「s:」必須在上面加上<%@ taglib prefix="s" uri="/struts-tags" %>,兩支都有用到,如果不想用,可以自己打hello.action,才會連到另外一頁

再來最下面會有Hello World Using Struts 2,點進去,也寫的非常清楚,照著做即可
<a href="<s:url action='hello'/>">Hello World</a>-->hello會連到struts.xml的name,如下:
<action name="hello" class="helloworld.action.HelloWorldAction" method="execute">
所以它會去call這個class的execute方法
做完事後,會回傳success,然後到HelloWorld.jsp
<result name="success">/HelloWorld.jsp</result>
最後用<s:property value="messageStore.message" />struts2的專用標籤語法,顯示內容
我把我這次做的程式碼放在下面好了

HelloWorldAction.java,類似controller,永遠繼承ActionSupport
package helloworld.action;
import helloworld.model.MessageStore;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private MessageStore messageStore;

    @Override
    public String execute() throws Exception {
        messageStore = new MessageStore();
        return SUCCESS;
    }

    public MessageStore getMessageStore() {
        return messageStore;
    }

    public void setMessageStore(MessageStore messageStore) {
        this.messageStore = messageStore;
    }
}
MessageStore.java
package helloworld.model;
public class MessageStore {
    private String message;

    public MessageStore() {
        this.setMessage("Hello Struts User");
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
log4j.xml,其實不加也沒關係,和struts2沒有絕對關係
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">

    
        
            <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n" />
        
    

    
    
        <level value="DEBUG" />
    

    
        <level value="DEBUG" />
    

    
    
        <priority value="INFO" />
        <appender-ref ref="STDOUT" />
    

struts.xml-->struts-2.3.dtd",copy官網是2.0,不過我的是2.3,所以我改成2.3,這個檔案放在src/main/java或src/main/resources都可以
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

    <constant name="struts.devMode" value="true" />
    
        
            /index.jsp
        
        
            /HelloWorld.jsp
        
    

web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

    Archetype Created Web Application
    
        struts2
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    
    
        struts2
        /*
    

HelloWorld.jsp
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%>
<%@ 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=BIG5">
<title>Hello World!</title>
</head>

<body>
    <h1>HelloWorld.jsp</h1>
    <h2>
        <s:property value="messageStore.message" />
    </h2>
</body>
</html>
index.jsp
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%>
<%@ 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=BIG5">
<title>Struts2</title>
</head>
<body>
    <h1>看到了</h1>
    <p>
        <a href="<s:url action='hello'/>">Hello World</a>
    </p>
</body>
</html>

※以下是annotation設定

anotation struts2,這邊可以參考。
因為是annotation設定,所以可以替換xml,當然也可以留著,只是待會測就測不出來了,先註解掉好了,根據網站的說法, struts.xml,只剩下一行(其實web.xml的init-param和這裡的constant根本不用,但第一次就先以官方為主好了)
<struts>
    <constant name="struts.devMode" value="true" />
</struts>

※然後要下載一個叫struts2-convention-plugin的jar,web.xml要設定init-param,都從官網copy就可以了

※但我有遇到一個問題一裝完啟動會出「java.lang.NoClassDefFoundError: org/apache/commons/lang/xwork/StringUtils」的錯,最好的解決方法就是,版本和struts2-core的版本一樣就可以了

※還有一個問題,官網寫說action類別一定要放在包名叫struts、struts2、action、actions四者之一,否者就會出「There is no Action mapped for namespace [/] xxx」的錯,只有annotation會這樣

以下是action類,我覺得它寫得不清楚 如下:
package helloworld.action;
import helloworld.model.MessageStore;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;

@Namespace(value = "/")
public class HelloWorldAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private MessageStore messageStore;

    @Override
    @Action(value = "hello", results = { @Result(name = "success", location="/HelloWorld.jsp") })
    public String execute() throws Exception {
        messageStore = new MessageStore();
        return SUCCESS;
    }

    public MessageStore getMessageStore() {
        return messageStore;
    }

    public void setMessageStore(MessageStore messageStore) {
        this.messageStore = messageStore;
    }
}

對照一下原本的xml
<package name="basicstruts2" extends="struts-default">
    <action name="index">
        <result>/index.jsp</result>
    </action>
    <action name="hello" class="helloworld.action.HelloWorldAction" method="execute">
        <result name="success">/HelloWorld.jsp</result>
    </action>
</package>

package 裡面本來就有一個屬性namespace了,不打就是「/」,所以@Namespace也可以不打

沒有留言:

張貼留言