一、action的屬性(地址欄傳參)接收參數:如果使用的JDK屬性不一致,則會使得傳值無法實現。 解決辦法: 1.系統自身需要用到的JDK(window——>屬性——>Java——>Installed JREs——>選擇符合條件的JDK版本)
2.設置JDK級別(項目右鍵——>屬性——>Java Compiler——>Compiler compliance level——>選擇符合條件的級別)
3.Tomcat下的JDK版本(Window——>屬性——>MyEclipse——>sever——>tomcat——>JDK)
二、使用例子驗證其傳值的方法:
1.新建項目 ParamInputAction——>新建類“UserAction”,並設置兩個屬性userName、password。在此需要遵循Java的規則(屬性首字母要小寫,類名首字母大寫,不要亂用不符合常規的名字)
package cn.cqvie.paraminput;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; private String userName; private String password;
public String insert() { System.out.println("userName=" + userName); System.out.println("password=" + 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; } }
2.配置index.jsp頁面屬性,用超鏈接使得在地址欄將其兩個參數傳過去。這里的“!”表示user中將要被調用的方法(定義方法:?屬性=值&屬性=值)
此處賦值:userName=admin,password=123。
<body> 運用action屬性接收參數<a href=user/user!insert?userName=admin&password=123>添加用戶</a> </body>
3.配置struts.xml頁面。使得action的動作去尋找相應的方法。
<struts> <constant name="struts.devMode" value="true" /> <package name="user" extends="struts-default" namespace="/user"> <action name="user" class="cn.cqvie.paraminput.UserAction" > <result>/user_insert_success.jsp</result> </action> </package> </struts>
4.由上可知,需要創建user_insert_success.jsp頁面,以顯示頁面跳轉結果。
<body> User Insert Success! </body>
5.運行、調試
部署項目,開啟服務,打開瀏覽器,輸入相應的項目名。
訪問首頁結果如上,點擊超鏈接“添加用戶”
由結果可知,地址欄里有之前定義的兩個屬性及對應的值,已經一並傳到了user_insert_success.jsp頁面,由控制台結果顯示傳值成功。
6.總結、教訓。
1)學會了該種賦值方法,簡潔明了:user/user!insert?userName=admin&password=123(package/action name!action要調用的方法?屬性=值&屬性=值)
2)需要注意的是屬性的名字要與先前定義的一致,避免后面傳值的時候混淆,以至於傳值失敗。
3)需要熟練運用該種賦值方法,雖然經常看見“!、?”等寫法但是並沒有真正明白其中的寓意,還需要加強練習,以便掌握。
三、用Action 的整個對象接收參數
1.基於上個項目,新建一個beans類 User,並設置它的三個屬性。
package cn.cqvie.beans;
public class User { private String name; private String password; private String confimingPassword; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getConfimingPassword() { return confimingPassword;
} public void setConfimingPassword(String confimingPassword) { this.confimingPassword = confimingPassword; } }
2.新建UserAction繼承至ActionSupport.此時定義的User user是整個對象,而非它擁有的各個屬性,注意引入beans 包才能識別User。
package cn.cqvie.paraminput.model;
import cn.cqvie.beans.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport { private User user;
public String insert() {
System.out.println("name:"+user.getName()); System.out.println("Password:"+user.getPassword());
return SUCCESS; }
public User getUser() { return user; }
public void setUser(User user) { this.user = user; } }
3.同樣的方法配置struts.xml文件的內容:只需改動class即可。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="user" extends="struts-default" namespace="/user"> <action name="user" class="cn.cqvie.paraminput.model.UserAction" > <result>/user_insert_success.jsp</result> </action> </package> </struts>
4.為了有一個較好的用戶體驗效果,需要建立一個登陸界面login.jsp,使用戶自己輸入登陸信息。需要注意到的是name和password一定要用(對象.屬性)的方法來獲取。
注:基於實踐用此種方式是否傳值成功,所以登陸的用戶名及密碼沒有進行驗證,有漏洞。
<body> <form action="user/user!insert" method="post"> 用戶名稱:<input type="text" name="user.name"><br> 密 碼:<input type="password" name="user.password"><br> 確認密碼:<input type="password" name="user.password"><br> <input type="submit" value="登錄"> </form> </body>
5.當用戶點擊“登錄‘按鈕時,需要有一個頁面顯示登錄結果:user_insert_success.jsp ,在這里只是顯示了用戶登錄名;注意引入EL標簽庫。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> 登錄成功,歡迎<c:out value="${user.name}"></c:out>! </body> </html>
6.運行、調試
在瀏覽器地址欄輸入項目名/login.jsp,訪問登錄界面
輸入相應的用戶名、密碼、以及確認密碼。
點擊“登錄”
可以發現表單提交到action,訪問UserAction的insert方法,切換到后台可以發現輸出了用戶的用戶名和密碼。
7.總結、教訓。
1)struts是通過set方法傳參的,所以需要注意編碼時要將字段名寫的一致,避免后面獲取不到對象的屬性。
2)用DTO(Data Transfer Object)數據傳輸對象,可以避免重寫大量的屬性,直接用model將對象封裝到entity,再用(該對象 . 屬性)的方法即可訪問到。
3)由於重點在於實踐action屬性對象傳參,所以此程序有較大漏洞,比如當我輸入的”密碼“與“確認密碼”不一致,也會跳轉到登錄成功界面,顯示登錄成功,因為沒有做登錄名和密碼的驗證。
4)通過這個小項目,我學到了新的知識,之前登錄界面的action跳轉的方式是user/user.action,可以跳轉成功,但是發現控制台沒有輸出我想要的結果,也就說明並沒有訪問到“insert”方法,后來才又改了代碼,使得“login.jsp”的action="user/user!insert" 直接訪問“insert”方法;結果證明我成功了,控制台輸出了結果。