[轉]Eclipse中配置Struts2並實現HelloWorld


Struts2.xml的配置說明(—)

http://www.cnblogs.com/taxuewuhen/archive/2012/07/12/2588928.html

按struts2小例子配置開發環境。配置好后目錄如下:                                             

Struts2.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.enable.DynamicMethodInvocation" value="true" /><!-- 動態方法調用應設為true -->
    <constant name="struts.devMode" value="true" />
    
    <!-- namespace相當於路徑,訪問方式如下:/teacher/a/b/c/d/hello.action,
        先找 /teacher/a/b/c/d這個namespace,若存在,則找hello.action,若action找到,則進行處理,若action找不到,會報錯,
            若namespace不存在,則找下級namespace即/teacher/a/b/c再次執行上述查找。直到/這個根namespace,若還找不到action,
            則會報錯。
    -->
    <package name="default" namespace="/" extends="struts-default">
        <!-- 這些配置要注意符合struts2配置的先后順序 -->
        <default-action-ref name="hello"/>   <!-- 配置默認action,即在該包下若找不到要訪問的action,則就交給默認action處理 -->
    
        <global-results>   <!--配置global-result 這些result該包下所有action都可以使用-->
            <result name="error">/index.jsp</result>
        </global-results> 
           
        <global-exception-mappings>  <!-- 配置Exception-mapping來處理異常 ,交給相應的頁面處理-->
            <exception-mapping result="error" exception="java.lang.Exception"/>
        </global-exception-mappings>
        
        <action name="hello"><!-- 若action的class和method沒有配,默認調用ActionSupport.execute(),返回"success"-->
            <result>/index.jsp</result>  <!-- 默認result的name="success",type="dispatcher" -->
            <result name="error">/index.jsp</result>
            
            <exception-mapping result="error" exception="java.lang.Exception"/>   <!-- 在action配置該action的異常處理 -->
        </action>
    </package>
    <package name="teacher" namespace="/teacher" extends="struts-default">
        <action name="teacherAdd" class="cn.com.soft.action.TeacherAction" method="add">
            <param name="name">zhangsan</param>   <!-- 向action中傳遞靜態參數 -->
            <param name="age">23</param>
            <result name="add_success">/teacher_add_success.jsp</result>
        </action>
        <!-- 可以使用/teacher!add.action來動態方法調用 method也可以配置-->
        <action name="teacher" class="cn.com.soft.action.TeacherAction">  
            <result name="add_success">/teacher_add_success.jsp</result>
            <!-- result type 有好多種, 可以在struts-default.xml查看,
                默認dispatcher服務器端跳轉,redirect客戶端跳轉   這兩個只能跳轉到頁面
                chain服務器端跳轉,redirectAction客戶端跳轉  這兩個跳轉到action
            -->
            <result name="delete_success">/teacher_delete_success.jsp</result>
            <result name="redirect" type="redirect">/teacher_delete_success.jsp</result>
            <result name="chain" type="chain">teacherAdd</result>
            <result name="redirectAction" type="redirectAction">
                <param name="actionName">hello</param> <!-- 若action不在同一個package中,配這兩個參數 -->
                <param name="namespace">/</param>
            </result>
        </action>
    </package>
    <!-- 使用通配符來進行action方法調用 -->
    <package name="user" namespace="/user" extends="struts-default"> 
        <action name="*_*" class="cn.com.soft.action.{1}Action" method="{2}">
            <result name="{2}_success">/${path}.jsp?path=${path}</result>  <!-- ${path}是從valueStack中取數據,動態跳轉 和傳遞參數-->
        </action>
    </package>
</struts>
復制代碼

Teacher.java如下:

復制代碼
package cn.com.soft.model;

public class Teacher {

    private String name ;
    
    private int age ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
復制代碼

TeacherAction.java如下:

復制代碼
package cn.com.soft.action;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

import cn.com.soft.model.Teacher;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class TeacherAction extends ActionSupport 
                implements RequestAware,SessionAware,ApplicationAware ,
                ServletRequestAware ,ServletContextAware {
    /**
     * 使用屬性和Model來接受參數
     */
    private String name ;
    private int age ;
    private Teacher teacher ;
    
    private int type ;
    
    /**
     * 實現接口來獲取request、session、application
     */
    private Map<String, Object> request3 ;
    private Map<String, Object> session3 ;
    private Map<String, Object> application3 ;
    
    private HttpServletRequest request4 ;
    private HttpSession session4 ;
    private ServletContext application4 ;

    /**
     * @method:add()
     * @return : add_success
     */
    public String add(){
        System.out.println("name :" + name );
        System.out.println("age : " + age);
        
        //獲取request、session、context的常用兩種方式,我們也可以使用implements接口:
        @SuppressWarnings("unchecked")
        Map<String, Object> request = (Map<String, Object>) ActionContext.getContext().get("request") ;
        Map<String, Object> session = ActionContext.getContext().getSession() ;
        Map<String, Object> application = ActionContext.getContext().getApplication() ;
        request.put("request", "requestAttribute") ;
        session.put("session", "sessionAttribute") ;
        application.put("application", "applicationAttribute") ;
        
        HttpServletRequest request2 = ServletActionContext.getRequest() ;
        HttpSession session2 = request2.getSession() ;
        ServletContext application2 = ServletActionContext.getServletContext() ;
        request2.setAttribute("request2","requestAttribute2") ;
        session2.setAttribute("session2", "sessionAttribute2") ;
        application2.setAttribute("application2", "applicationAttribute2") ;
        return "add_success" ;
    }
    /**
     * @method:delete()
     * @return : delete_success
     */
    public String delete(){
        if(type == 1 ){      
            return "redirect" ;
        }else if (type == 2) {
            return "chain" ;
        }else if (type == 3) {
            return "redirectAction" ;
        }
        return "delete_success" ;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    //另一種實現接口來獲得request、session、application
    public void setApplication(Map<String, Object> application) {
        application3 = application ;
    }

    public void setSession(Map<String, Object> session) {
        session3 = session ;
    }

    public void setRequest(Map<String, Object> request) {
        request3 = request ;
    }

    //第四種獲得request、session、application
    public void setServletContext(ServletContext context) {
        application4 = context ;
    }

    public void setServletRequest(HttpServletRequest request) {
        request4 = request ;
        session4 = request.getSession() ;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
}
復制代碼

UserActioin.java如下:

復制代碼
package cn.com.soft.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {

    private String path ;
    
    public String add(){
        
        path = "user_add_success" ;
        return "add_success" ;
    }
    
    public String delete(){
        
        path = "user_delete_success" ;
        return "delete_success" ;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }
}
復制代碼

攔截器后面再寫。

在Eclipse中配置struts-core.jar和x-work.jar的源文件,方式如下:

在引入的struts-core.jar和x-work.jar兩個jar包上分別點擊右鍵,打開properties對話框,在對話框中選中Java Source Attachment選項,在右邊點擊External Folder打開文件查找窗口。

struts-core.jar找:E:/文檔/struts-2.3.1.2-all/struts-2.3.1.2/src/core/src/main/java 這個文件夾   確定  OK

x-work.jar找:E:/文檔/struts-2.3.1.2-all/struts-2.3.1.2/src/xwork-core/src/main/java這個文件夾  確定  OK

E:/文檔/這個目錄根據自己情況確定下載的struts-2.3.1.2-all的位置

 

本文轉自:http://913046394-qq-com.iteye.com/blog/1456584

 

剛剛把玩了Struts2,是第一次接觸Struts2,就不做過多的解釋了。下面介紹在Eclipse中配置Struts2的過程:

一、下載Struts2,因為Struts2是開源的,百度或者google一下就可以找到下載地址。我下載的是struts-2.3.1.2版本 的,解壓之后入下圖:



apps目錄:Struts2的范例

docs目錄:Struts2的文檔

lib目錄:Struts2的類庫

src目錄:關於Struts2的一些資源

二、現在是利用apps中的范例實現一個helloworld的action,在apps目錄下有幾個war文件,如下圖:



 

這幾個文件可以用WinRAR打開,我用好壓打開struts2-blank.war之后,如下圖



 

在WEB-INF目錄下打開classes目錄,找到struts.xml文件,如下圖



 

將struts.xml文件復制到Eclipse新建工程的src目錄下,在我的工程中如下圖:



 

三、如上面所示,在WEB-INF目錄下打開lib目錄,如下圖:



 打開之后會有如上圖的jar包,為保險起見,將所有的jar包復制到新建工程的lib目錄下,在我的工程中如下圖:



 

四、返回到WEB-INF目錄下,找到web.xml文件並打開,打開之后會看到有如下代碼:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

 將其中<filter></filter>和<filter-mapping></filter-mapping>元素復制到Eclipse新建工程的web.xml文件中,我的web.xml文件如下所示:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Structs0317</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
   <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

 

五、在Eclipse中打開復制來的struts.xml文件,將文件中<struts>和</struts>之間的內容注釋掉,並添加如下所示的代碼:

 

 
<package name="default" namespace="/" extends="struts-default">

        <action name="hello">
            <result>
                /Hello.jsp
            </result>
        </action>
    </package>

 

六、在Ecplise中新建一個Hello.jsp文件,在<body>標簽之間寫如下代碼:

     

 

Hello Struts2<br>

 

然后啟動Tomcat服務器,在IE瀏覽器中輸入http://localhost:8080/Structs0317會發現出現如下錯誤:

 

There is no Action mapped for namespace [/] and action name [] associated with context path [/Structs0317]. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:500)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

 

其實正確的輸入是http://localhost:8080/Structs0317/hello或者http://localhost:8080/Structs0317/hello.action  訪問到的Hello.jsp如下圖所示:



 

 

OK,至此所有的配置都配置好了,接下來就可以好好的去玩Struts2了。在這里還想再談一點感受就是,遇到新的東西首先是先拿去用,等會用了在好好研究它的原理和細枝末節,就像別人給你一把槍一樣,你不會一拿到槍就把它拆開來研究它的內部構造,而是直接拿去用,會用了,覺得這東西有意思了,再好好去研究的內部結構甚至是仿制出一把出來。這也是我以前所沒有意識到的,希望今后改進,好好學習,天天向上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM