Strust2第(二)篇《開發第一個struts2的實例》

本文來自:曹勝歡博客專欄。轉載請註明出處:http://blog.csdn.net/csh624366188   

 

          前面一篇博客(細談struts2之自己實現struts2框架)帶大家對基於mvc業務流程熟悉了一下,現在我們就用對mvc實現最好的框架struts2來開發一個應用實例。雖然現在MyEclipse8.5以上版本已經開始支持Struts2但爲了我們能更好的熟悉開發struts2的業務流程,現在我們還是手動去搭配環境。首先我們需要到struts.apache.org去下載struts-2.2.3-all包。現在最高版本應該達到2.3了。要想正常使用Struts2,至少需要如下五個包(可能會因爲Struts2的版本不同,包名略有差異,但包名的前半部是一樣的)。

    struts2-core-2.0.11.1.jar

    xwork-2.0.4.jar

    commons-logging-1.0.4.jar

    freemarker-2.3.8.jar

ognl-2.6.11.jar

注:貌似好像一些高版本的還需要加入一些其他jar包,如下圖所示:

  

好了,jar包加入之後,我們下一步開始搭配配置環境了。很多同學可能會有這樣的疑問,爲什麼我提交的請求能到struts.xml去找對應的action呢??至少我剛開始學習的時候有這麼個疑問。現在答案即可以爲大家揭曉了,因爲struts2的核心是攔截器,一切請求都要經過攔截器才轉發給所對應的action的。Struts2中第一個攔截請求的就是org.apache.struts2.dispatcher.FilterDispatcher這個攔截器(下一篇博客我們即將對這個攔截器的源碼進行分析),攔截器對請求進行一些處理之後然後去struts.xml尋找對應的action。我們一起來看一下web.xml的配置:


  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"   
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.     <filter>  
  8.     <filter-name>struts2</filter-name>  
  9.     <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  10.     </filter>  
  11.     <filter-mapping>  
  12.     <filter-name>struts2</filter-name>  
  13.     <url-pattern>*.action</url-pattern>  
  14.     </filter-mapping>  
  15.   <welcome-file-list>  
  16.     <welcome-file>index.jsp</welcome-file>  
  17.   </welcome-file-list>  
  18. </web-app>  
<?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.FilterDispatcher</filter-class>
	</filter>
	<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>*.action</url-pattern>
	</filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

      在struts2官方提供的文檔中要求,在服務器class文件夾下建立struts.xml文件。由於在web項目部署到服務器上,開啓服務器對web項目進行編譯時會自動把src文件夾下的文件加載到服務器class文件夾下,所以我們直接在src下面建立struts.xml文件,具體struts.xml配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6. <constant name="struts.i18n.encoding" value="utf-8" />  
  7.     <package name="struts2" extends="struts-default">  
  8.         <action name="" class="">  
  9.             <result name=""></result>  
  10.             <result name=""></result>  
  11.         </action>  
  12.     </package>  
  13. </struts>     
<?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.i18n.encoding" value="utf-8" />
	<package name="struts2" extends="struts-default">
		<action name="" class="">
			<result name=""></result>
			<result name=""></result>
		</action>
	</package>
</struts>   

注:上述代碼具體意義:

1.<constant>標籤主要是用來修改struts.properties配置文件信息,namevalue分別相當於struts.properties文件中的namevalue

2.<package>主要是作爲分包作用,比如一個項目分好幾個模塊,這裏可以每一個模塊分配一個包,一個struts.xml文件中可以出現多個<package>標籤,這裏一定要有extends="struts-default"因爲struts的核心攔截器都配置在struts-default包中,如果沒有這個,所有請求都不會請求到

3.一個<action>標籤對應一個action類,主要是通過action標籤中的去尋找class,然後執行對應的classAction標籤裏有一個一個method屬性,他可以指定執行action中的哪個方法

下面我們就開始以登錄爲例來寫一下struts2開發的視圖層:

Login.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6. <html>  
  7.   <head>  
  8.   </head>  
  9.     <body>  
  10.   <form action="LoginAction.action">  
  11.    <input type="text" name="username"/><br/>  
  12.    <input type="password" name="password"/><br/>  
  13.    <input type="submit" value="提交"/>  
  14.    </form>  
  15.   </body>  
  16. </html>  
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
  <head>
  </head>
    <body>
  <form action="LoginAction.action">
   <input type="text" name="username"/><br/>
   <input type="password" name="password"/><br/>
   <input type="submit" value="提交"/>
   </form>
  </body>
</html>

好了,視圖層寫完了,下面就要開始寫核心action了,由於業務邏輯層就是判斷用戶名和密碼是否與固定的admin123456相等,所以本程序只是爲了測試,就不再單獨抽出來了,直接寫在action裏面了LoginAction.java

  1. package com.bzu.action;  
  2. public class LoginAction {  
  3.       
  4.     private String username;  
  5.     private String password;  
  6.     public String getUsername() {  
  7.         return username;  
  8.     }  
  9.     public void setUsername(String username) {  
  10.         this.username = username;  
  11.     }  
  12.     public String getPassword() {  
  13.         return password;  
  14.     }  
  15.     public void setPassword(String password) {  
  16.         this.password = password;  
  17.     }  
  18.     public String execute(){  
  19.           
  20.         if(username.equals("admin")&&password.equals("123456"))  
  21.             return "success";  
  22.         return "fail";  
  23.     }  
  24. }  
package com.bzu.action;
public class LoginAction {
	
	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 String execute(){
		
		if(username.equals("admin")&&password.equals("123456"))
			return "success";
		return "fail";
	}
}


從上面的程序可以看出,我們在action中要把form表單中數據都以私有變量的形式定義出來,然後在提供對應的setget方法。很多同學可能在這又有疑問了。爲什麼給他提供setget方法,form表單中的數據就可以設置到對應的屬性上呢?爲什麼他會默認的去執行execute方法呢?爲什麼把配置文件中action標籤對應的method屬性修改後就可以執行新設置的方法呢?呵呵,在這在賣個關子,在接下來的博客中,會爲大家一一把這些疑問解決。

Action寫完之後,我們就可以把struts.xml對應的寫上了,本程序完整的struts.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6. <constant name="struts.i18n.encoding" value="utf-8" />  
  7.     <package name="struts2" extends="struts-default">  
  8.         <action name="LoginAction" class="com.bzu.action.LoginAction">  
  9.             <result name="success">success.jsp</result>  
  10.             <result name="fail">fail.jsp</result>  
  11.         </action>  
  12.     </package>  
  13. </struts>     
  14.    
<?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.i18n.encoding" value="utf-8" />
	<package name="struts2" extends="struts-default">
		<action name="LoginAction" class="com.bzu.action.LoginAction">
			<result name="success">success.jsp</result>
			<result name="fail">fail.jsp</result>
		</action>
	</package>
</struts>   
 

 

對應的success.jspfai.jsp沒什麼內容,就是顯示成功和失敗幾個字。

好了,到此,我們的第一個struts2的應用程序就寫完了,下面我們一起來看一下運行結果:

————》

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章