Struts2(四)Action一接收參數


一、屬性接收參數並輸出

導入struts2的包,導入需要的包

和struts.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="false" />

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

        <default-action-ref name="index" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>

        <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
    </package>

    <include file="example.xml"/> -->

    <!-- Add packages here -->
    <!--  開發模式-->    
 <constant name="struts.devMode" value="true" />
 <package name="default" namespace="/" extends="struts-default">
 <action name="login" class="com.pb.web.action.LoginAction">
 <result>
 /loginSuccess.jsp
 </result>
 </action>
 </package>
</struts>

二、實現登錄名和密碼的接收和輸出

Action接收參數(屬性方式)

package com.pb.web.action;

import com.opensymphony.xwork2.ActionSupport;
/*
 * 登錄響應action
 */
public class LoginAction extends ActionSupport {
    private String userName;
    private String passWord;

    private static final long serialVersionUID = 1L;

    @Override
    public String execute() throws Exception {
        
        return "success";
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    
    
    
    

}

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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Struts2demo2</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>

登錄頁面和登錄成功頁面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!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>登錄頁面</title>
</head>
<body>
<form action="login.action" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="userName" /></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="passWord" /></td>
</tr>
<tr>
<td><input type="submit" value="登錄" /></td>
<td><input type="reset" value="重置" /></td>
</tr>
</table>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!-- 導入struts標簽 -->
 <%@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>登錄成功頁面</title>
</head>
<body>
歡迎您的到來!<s:property value="userName"/>
</body>
</html>

三、Action接收參數一(屬性方式)

以上用的就是第一種方式表單參數名稱必須在Action中有對應的setter和getter方法

解決亂碼問題

修改struts.xml添加

<constant name="struts.i18n.encoding" value="相應的編碼格式" />

頁面顯示:

   <!-- 導入struts標簽 -->
 <%@taglib prefix="s" uri="/struts-tags" %>

應用場景:接收參數字段個數少的時候適合使用,比如:對於搜索應用接收用戶輸入的查詢條件

接收參數字段個數多時,就可以使用JavaBean的方式來接收

四、Action接收參數二(JavaBean形式)

建立實體類

package com.pb.entity;

public class User {
    
    private String userName;
    private String passWord;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    
    

}
package com.pb.web.action;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User;
/*
 * 登錄響應action
 */
public class LoginAction2 extends ActionSupport {
    private User user;

    private static final long serialVersionUID = 1L;

    @Override
    public String execute() throws Exception {
        
        return "success";
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

struts.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="false" />

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

        <default-action-ref name="index" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>

        <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
    </package>

    <include file="example.xml"/> -->

    <!-- Add packages here -->
    <!--  開發模式-->    
 <constant name="struts.devMode" value="true" />
 
 <package name="default" namespace="/" extends="struts-default">
 <action name="login" class="com.pb.web.action.LoginAction">
 <result>
 /loginSuccess.jsp
 </result>
 </action>
 <action  name="login2"  class="com.pb.web.action.LoginAction2">
 <result>
 /loginSuccess2.jsp
 </result>
 </action>
 </package>
</struts>

登錄頁面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!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>登錄頁面</title>
</head>
<body>
<form action="login2.action" method="post">
<table>
<tr>
<td>用戶名:</td>
<!--這里的name要和提交的地址中聲明的實體類.屬性來用  -->
<td><input type="text" name="user.userName" /></td>
</tr>
<tr>
<td>密碼:</td>
<!--這里的name要和提交的地址中聲明的實體類.屬性來用  -->
<td><input type="password" name="user.passWord" /></td>
</tr>
<tr>
<td><input type="submit" value="登錄" /></td>
<td><input type="reset" value="重置" /></td>
</tr>
</table>
</form>
</body>
</html>

登錄成功頁面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!-- 導入struts標簽 -->
 <%@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>登錄成功頁面</title>
</head>
<body>
<!-- 輸出:提交的地址中聲明的實體類.屬性來用-->
歡迎您的到來!<s:property value="user.userName"/>
</body>
</html>

 定義實體類,為實體添加屬性及setter和getter方式

com.pb.entity.User

為Action添加實體屬性以及setter和getter方法

User user

修改表單參數name為實體對象名.屬性名 這里的對象名要與Action中聲名的對象名一致

<input name="user.userName"/>

五、Action接收參數三(ModelDriven形式)

 定義實體類,為實體添加屬性及setter和getter方式

com.pb.entity.User

創建Action實現接口ModelDriven接口,重寫getModel();

Action中要提供JavaBean類型的屬性,需要實例化,但不需要相應的setter和getter方法

Form表單項的name屬性以及頁頁面取值通過<s:property value="屬性名"/>的形式

實體類:

package com.pb.entity;

public class User {
    
    private String userName;
    private String passWord;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    
    

}

action

package com.pb.web.action;


import com.opensymphony.xwork2.ModelDriven;
import com.pb.entity.User;
/*
 * 登錄響應action3
 */
public class LoginAction3 implements ModelDriven<Object> {
    
    //實例化對象
    private User user=new User(); 

    //重寫接口的方法
    @Override
    public User getModel() {
        return user;
    }

    
    //要有execute方法
public String execute(){
    return "success";
}

}

struts.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="false" />

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

        <default-action-ref name="index" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>

        <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
    </package>

    <include file="example.xml"/> -->

    <!-- Add packages here -->
    <!--  開發模式-->    
 <constant name="struts.devMode" value="true" />
 
 <package name="default" namespace="/" extends="struts-default">
 <action name="login" class="com.pb.web.action.LoginAction">
 <result>
 /loginSuccess.jsp
 </result>
 </action>
 <action  name="login2"  class="com.pb.web.action.LoginAction2">
 <result>
 /loginSuccess2.jsp
 </result>
 </action>
 <action  name="login3"  class="com.pb.web.action.LoginAction3">
 <result>
 /loginSuccess3.jsp
 </result>
 </action>
 </package>
</struts>

登錄login3.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!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>登錄頁面</title>
</head>
<body>
<form action="login3.action" method="post">
<table>
<tr>
<td>用戶名:</td>
<!--這里的name要和提交的地址中聲明的實體類的屬性來用  -->
<td><input type="text" name="userName" /></td>
</tr>
<tr>
<td>密碼:</td>
<!--這里的name要和提交的地址中聲明的實體類的屬性來用  -->
<td><input type="password" name="passWord" /></td>
</tr>
<tr>
<td><input type="submit" value="登錄" /></td>
<td><input type="reset" value="重置" /></td>
</tr>
</table>
</form>
</body>
</html>

登錄成功loginSuccess3.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!-- 導入struts標簽 -->
 <%@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>登錄成功頁面</title>
</head>
<body>
<!-- 輸出:提交的地址中聲明的實體類的屬性來用-->
歡迎您的到來!<s:property value="userName"/>
</body>
</html>

 六、區別

public class User {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class School {
private String schoolName;
private String schoolAddress;
private String schoolName;
private String schoolAddress;
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
public String getSchoolAddress() {
return schoolAddress;
}
public void setSchoolAddress(String schoolAddress) {
this.schoolAddress = schoolAddress;
}
}

Action 使用ModelDriven 方式代碼如下:

public class UserAction implements ModelDriven{
private User user=new User();
private School school=new School();
@Override
public User getModel() {
return user;
}
public String execute(){
return "success";
}
}
/*上述代碼中,屬性中盡管有兩個Model(user 以及school),但是只有一個可以被getModel()
返回(user),這個實體用於接收參數。*/

Action 使用JavaBean 方式代碼如下:

public class UserAction2 {
private User user;
private School school;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
public String execute(){
return "success";
}
}
/*上述代碼中,同樣聲明了兩個Model(user 以及school),這兩個實體都可以用於接收參數。*/

Action 接收參數:ModelDriven 方式與屬性方式區別

ModelDriven 方式和屬性方式同時存在Action 中時, ModelDriven 方式優先被賦值

//實體類User
public class User {
private String userName;
private String password;
public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }

Action 代碼如下,同時使用了ModelDriven 以及屬性方式。並且在execute()方法中在控
制台分別為兩種方式的屬性輸出了相應語句。

package com.pb.web.action;


import com.opensymphony.xwork2.ModelDriven;
import com.pb.entity.User;
/*
 * 登錄響應action3
 */
public class LoginAction3 implements ModelDriven<Object> {
    
    //實例化對象
    private User user=new User(); 
    private String userName;
    private String passWord;

    //重寫接口的方法
    @Override
    public User getModel() {
        return user;
    }

    
    //要有execute方法
public String execute(){
    System.out.println("使用ModelDriven 方式:"+user.getUserName());
    System.out.println("使用ModelDriven 方式:"+user.getPassWord());
    System.out.println("使用屬性 方式:"+userName);
    System.out.println("使用屬性 方式:"+passWord);
    return "success";
}


public String getUserName() {
    return userName;
}


public void setUserName(String userName) {
    this.userName = userName;
}


public String getPassWord() {
    return passWord;
}


public void setPassWord(String passWord) {
    this.passWord = passWord;
}

}

在struts.xml 中配置Action 如下:

<action name="login3" class="com.pb.web.action.UserAction3">
<result>
/loginSuccess3.jsp
</result>
</action>

登錄頁面login3.jsp 表單代碼如下:

<form action="login3" method="post">
用戶名:<input type="text" name="userName"/><br>
用戶密碼:<input type="password" name="password"/><br>
<input type="submit" value="登錄">&nbsp;&nbsp;
<input type="reset" value="重置">
</form>

登錄成功loginSuccess3.jsp 主要代碼如下:

登錄成功!歡迎你:<s:property value="userName"/>

控制台打印

使用ModelDriven 方式:去去去
使用ModelDriven 方式:qqq
使用屬性 方式:null
使用屬性 方式:null

七、三種方試對比

三種Action 接收參數的方式中,當Action 接收非字符串類型參數時,Action 中相應屬性最好設置為包裝類型。


免責聲明!

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



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