軟件開發架構平臺技術-------Struts框架的第一次使用
偉大團隊的靈魂在於,它們可以讓傑出的個體一起合作來實現結果。
每一個偉人的背後都有一個偉大團隊,一種有效的夥伴關係,而每一個偉大團隊都是由一羣優秀且往往古怪的個體組成的。
-----對核心力團隊的嚮往.
在前一段的學習中一直疲於使用jsp+Servlet的開發模式中徘徊,使用JSP+Servlet完全不使用框架的條件下完成了寵物商店的編寫。其中也暴露出了一些問題,在那樣的開發模式下代碼量真的有點龐大,工作的難度也是比較大的。但是這個過程是必須經歷的,因爲只有通過這些我們纔會體會到使用框架進行開發給我們帶來的便捷。使用框架也使我們在不知不覺最後那個遵守了比較合理的開發模式上面。
因爲這是可以說是我第一次真正的使用框架,其中我也發現了一些值得最足以的問題。做什麼事不要湊合着過去就行了,我們不要滿足於僅僅會使用了這個框架,還要我體驗框架之美。我這次寫了一個非常簡單的Demo,使用的框架是Struts2。本以爲這個簡單的例子會非常簡單,但是中間還是遇見了很多使我摸不着頭腦的問題。
下面我就把自己正確的使用方式總結一下,希望給讀者一點點幫助。
1.打開MyEclipse新建一個Web Project,這裏我的工程名爲StrutsDemo2
2.在Struts2的資源包中解壓那個空的工程包將lib文件夾下面的jar文件考到工程的lib文件夾下面
3.進行Struts.xml文件的配置,將空工程裏面的Struts.xml文件考到src文件的根目錄下面。如下圖:
並配置其中的內容:
<?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="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="Login" class="com.zdx.Action.UserAction"> <result name="input">/login.jsp</result> <result name="success">/success.jsp</result> </action> </package> <!-- Add packages here --> </struts>
4.然後需要配置web.xml文件,其配置代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app 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"> <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>login.jsp</welcome-file> </welcome-file-list> </web-app>
5.然後便攜User類,類中的內容爲:
package com.zdx.domain;
public class User {
private String username;
private String password;
public User() {
// TODO Auto-generated constructor stub
}
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;
}
}
6.編寫Action類,這裏必須特別注意的是,此類的編寫室友講究的。因爲他的編寫方式會在一定程度上影響JSP代碼中表單的命名方式。
首先看第一中方式,其中的UserAction類的代碼如下:
import com.zdx.domain.User;
public class UserAction {
private User user;
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
if (user.getUsername().equals("zdx")
&& user.getPassword().equals("123")) {
return "success";
} else {
return "input";
}
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
當然這種寫法的話必須在jsp頁面對應的表單的參數命名就要講究一下了,jsp頁面的表單用戶名和密碼組件的名稱前一定要寫成
user.username
user.password
user是指UserAction 裏面的user對象,username和password是User類的屬性。然後我們還必須寫user對象的get和set方法。
對應的jsp代碼如下:
<body>
<center>
<h1>
用戶登錄
</h1>
<hr>
<form action="Login" method="post">
<table>
<td>
用戶名:
</td>
<td>
<input type="text" name="user.username">
</td>
</tr>
<tr>
<td>
密碼:
</td>
<td>
<input type="password" name="user.password">
</td>
</tr>
</table>
<p>
<input type="submit" value="登錄">
<input type="reset" value="重置">
</form>
這樣就完成了整個程序的。部署運行,訪問服務器,填入用戶名,密碼後提交。在UserAction類中就會用我們輸入的用戶名和密碼創建一個user對象。
還有另外一中方式我們可以通過繼承ActionSupport類直接使用裏面的SUCCESS,INPUT,LOGIN等常量。
代碼:
package com.zdx.Action;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.zdx.domain.User;
/**
* 1. 若Action類不繼承不實現任何類的話,首先execute,login方法返回的值就需要自己寫"success","input"等,
* 然後必須實現user的標準get和set方法,然後在jsp頁面表單,中參數的定義必須使用user.變量名 (變量名和User類的屬性是一樣的)
*
* 2. 若Action類只繼承 ActionSupport 的話必須實現user的標準get和set方法,然後在jsp頁面表單
* 中參數的定義必須使用user.變量名 (變量名和User類的屬性是一樣的)
*
* 3. 實現ModelDriven<User> 接口,可以不用寫user的get和set方法(需要在getModel()方法中返回
* user對象。另外在jsp頁面表單中參數的定義要使用和User屬性一樣變量的命名(變量名和User類的屬性是一樣的)
*/
public class UserAction extends ActionSupport {
private User user = new User();
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
if (user.getUsername().equals("zdx")
&& user.getPassword().equals("123")) {
return SUCCESS;
} else {
return INPUT;
}
}
public String login() throws Exception {
if (user.getUsername().equals("zdx")
&& user.getPassword().equals("123")) {
return SUCCESS;
} else {
return INPUT;
}
}
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
還有一種方式可以是我們不用寫user的get和set方法,而且在對應jsp表單命名上也不用加user.(實際上加了user.會報錯)。代碼如下:
package com.zdx.Action;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.zdx.domain.User;
/**
* 1. 若Action類不繼承不實現任何類的話,首先execute,login方法返回的值就需要自己寫"success","input"等,
* 然後必須實現user的標準get和set方法,然後在jsp頁面表單,中參數的定義必須使用user.變量名 (變量名和User類的屬性是一樣的)
*
* 2. 若Action類只繼承 ActionSupport 的話必須實現user的標準get和set方法,然後在jsp頁面表單
* 中參數的定義必須使用user.變量名 (變量名和User類的屬性是一樣的)
*
* 3. 實現ModelDriven<User> 接口,可以不用寫user的get和set方法(需要在getModel()方法中返回
* user對象。另外在jsp頁面表單中參數的定義要使用和User屬性一樣變量的命名(變量名和User類的屬性是一樣的)
*/
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
if (user.getUsername().equals("zdx")
&& user.getPassword().equals("123")) {
return SUCCESS;
} else {
return INPUT;
}
}
public String login() throws Exception {
if (user.getUsername().equals("zdx")
&& user.getPassword().equals("123")) {
return SUCCESS;
} else {
return INPUT;
}
}
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
其表單的jsp頁面是:
<form action="Login" method="post">
<table>
<td>
用戶名:
</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>
密碼:
</td>
<td>
<input type="password" name="password">
</td>
</tr>
</table>
<p>
<input type="submit" value="登錄">
<input type="reset" value="重置">
</form>
附件裏面有工程的代碼,可以作爲參考