前面我們已經把Struts2的運行環境搭建起來了,下面我們開始創建我們的第一個Action,還是按照Max的教程來,我新創建瞭如下幾個文件:
sayHello.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Say Hello</title>
</head>
<body>
<h3>Say "Hello" to: </h3>
Address:<input type="text" name="address"/>
<s:form action="HelloWorld">
Name: <s:textfield name="name"/>
<s:submit></s:submit>
</s:form>
</body>
</html>
HelloWorld.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello</title>
</head>
<body>
<h3><s:property value="name" /></h3>
</body>
</html>
- HelloWorld.java
- package tutorial;
- import com.opensymphony.xwork2.ActionSupport;
- public class HelloWorld extends ActionSupport {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String execute(){
- name="Hello "+name+"!";
- //System.out.println(name);
- return SUCCESS;
- }
- }
這幾個文件之間的流程如下圖所示:
首先sayHello.jsp向服務器發送請求,然後根據我們web.xml文件的配置,這個請求被交給了FilterDispatcher這個類來進行處理,FilterDispatcher會根據我們struts.xml文件的中的配置信息來對這個請求分流,讓它進入某個指定的action(本例中是HelloWorld.java),在處理完請求之後,再將頁面轉向HelloWorld.jsp(這個也是在struts.xml中指定的)。爲了保證上述流程的順利執行,現在struts.xml文件的內容修改如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- this is a test
<include file="struts-default.xml"></include> -->
<package name="tutorial" extends="struts-default">
<action name="HelloWorld" class="tutorial.HelloWorld">
<result>HelloWorld.jsp</result>
</action>
</package>
</struts>
注意,這裏action的name屬性和sayHello.jsp中的action屬性的值是一樣的,實際上在FilterDispatcher中就是根據這兩個值對request進行分流的,具體過程如下:
1. 我們寫出這個處理這個請求的url,本例是http://localhost:8888/Struts/HelloWorld,
2. 取出http://localhost:8888/Struts/之後的字符串得到了HelloWorld
3. 在struts.xml文件中查找name屬性爲HelloWorld的action,把request交給它處理,默認情況下首先執行它裏面的execute()方法
4. 請求處理完畢之後進入HelloWorld.jsp頁面,配置在<result>標籤裏面
當然上述流程是最簡單的一個過程,還沒有涉及到命名空間、請求處理完畢之後要根據執
行結果跳轉到不同的頁面等一些複雜的問題,後面我會把我的學習心得貼出來。
注:上述request的分流流程是我根據struts1裏面的機制推測的,在struts1裏面這個過程由ActionServlet負責,它會調用RequestProcessor裏面的一個方法對訪問路徑進行處理,這個在我博客裏面的《Struts工作流程》中可以找到,至於這個FilterDispatcher,因爲看不到源碼只能推測一下了,^_^。