本文來自:曹勝歡部落格專欄。轉載請註明出處: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的配置:
<?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配置如下:
<?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設定檔資訊,name和value分別相當於struts.properties檔案中的name和value
2.<package>主要是作為分包作用,比如一個項目分好幾個模組,這裡可以每一個模組分配一個包,一個struts.xml檔案中可以出現多個<package>標籤,這裡一定要有extends="struts-default",因為struts的核心攔截器都配置在struts-default包中,如果沒有這個,所有請求都不會請求到
3.一個<action>標籤對應一個action類,主要是通過action標籤中的去尋找class,然後執行對應的class。Action標籤裡有一個一個method屬性,他可以指定執行action中的哪個方法
下面我們就開始以登入狀態例來寫一下struts2開發的視圖層:
Login.jsp
<%@ 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了,由於商務邏輯層就是判斷使用者名稱和密碼是否與固定的admin和123456相等,所以本程式只是為了測試,就不再單獨抽出來了,直接寫在action裡面了LoginAction.java
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表單中資料都以私人變數的形式定義出來,然後在提供對應的set和get方法。很多同學可能在這又有疑問了。為什麼給他提供set和get方法,form表單中的資料就可以設定到對應的屬性上呢?為什麼他會預設的去執行execute方法呢?為什麼把設定檔中action標籤對應的method屬性修改後就可以執行新設定的方法呢?呵呵,在這在賣個關子,在接下來的部落格中,會為大家一一把這些疑問解決。
Action寫完之後,我們就可以把struts.xml對應的寫上了,本程式完整的struts.xml:
<?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.jsp和fai.jsp沒什麼內容,就是顯示成功和失敗幾個字。
好了,到此,我們的第一個struts2的應用程式就寫完了,下面我們一起來看一下運行結果:
————》