一、屬性接收參數並輸出
導入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="登錄"> <input type="reset" value="重置"> </form>
登錄成功loginSuccess3.jsp 主要代碼如下:
登錄成功!歡迎你:<s:property value="userName"/>
控制台打印
使用ModelDriven 方式:去去去
使用ModelDriven 方式:qqq
使用屬性 方式:null
使用屬性 方式:null
七、三種方試對比
三種Action 接收參數的方式中,當Action 接收非字符串類型參數時,Action 中相應屬性最好設置為包裝類型。