本文來自:曹勝歡博客專欄。轉載請註明出處: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>
<?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>
<?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>
<%@ 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";
- }
- }
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>
<?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的應用程序就寫完了,下面我們一起來看一下運行結果:
————》