Struts2框架詳解
來源:程序員人生 發布時間:2014-09-25 03:54:37 閱讀次數:3742次
在Struts2的Model-View-Controller模式實現以下五個核心組件:
-
動作-Actions
-
攔截器-Interceptors
-
值棧/OGNL
-
結果/結果類型
-
視圖技術
Struts 2和傳統的MVC框架有些不同,在該框架中的作用的模式,而不是控制器的作用略有不同,雖然有一些重疊。這是Struts的MVC模式的體系結構概述。

上圖描述了Struts2的高層體系結構模型,視圖和控制器。一個Struts2的調度Servlet過濾器和攔截器與控制器實現,該模型實現的動作和視圖的組合的結果類型和結果。值棧和OGNL提供了共同點,其他部件之間的連接和集成。
除了從上述組分中,將有一個特定的信息,涉及到配置。為Web應用程序的配置,以及配置的行動,攔截器,結果等。
基于上述數據圖,可以解釋用戶的請求的生命周期在Struts 2如下所示:
-
用戶的請求發送到服務器,用于請求某些資源(即頁面)。
-
該過濾器調度的要求和確定適當的動作。
-
配置攔截器的功能適用于如驗證,文件上傳等。
-
選擇的動作執行,執行所請求的操作。
-
同樣,配置攔截器做任何后期處理,如果需要的話。
-
最后的結果是由視圖準備,并且將結果返回給用戶。
下載并且解壓struts之后可以把lib目錄下的一下文件復制到我們的項目
WEB-INFlib 目錄. 要做到這一點,你可以簡單地將下降到WEB-INFlib文件夾中的所有下列文件。(下面是最小依賴集)
-
commons-fileupload-x.y.z.jar
-
commons-io-x.y.z.jar
-
commons-lang-x.y.jar
-
commons-logging-x.y.z.jar
-
commons-logging-api-x.y.jar
-
freemarker-x.y.z.jar
-
javassist-.xy.z.GA
-
ognl-x.y.z.jar
-
struts2-core-x.y.z.jar
-
xwork-core.x.y.z.jar
創建動作類(Action Class):
Action類是Struts 2的應用程序的關鍵,我們實現了大部分的Action類中的業務邏輯。Action類來響應用戶的操作,當用戶點擊一個URL。
Action類中的一個或多個方法被執行,并返回一個字符串結果。基于結果的值,一個特定的JSP頁面的呈現方式。
package com.tutorialspoint.struts2;
public class HelloWorldAction{
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Struts2框架的HelloWorldAction類將創建一個對象并調用execute方法來響應用戶的操作。執行業務邏輯里面的execute方法,并最終返回字符串常量。簡單地說,為每個URL你必須執行一個動作類,或者可以直接使用這個類的名稱作為操作名,也可以映射到一些其他的名稱使用struts.xml文件,如下圖所示。
創建視圖(View)
我們需要一個JSP提交最后的消息,這個頁面會使用在Struts 2框架中預定義的動作時,這將會發生在struts.xml文件中定義的映射。
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value="name"/>
</body>
</html>
taglib指令告訴Servlet容器中,這個頁面將使用Struts2標簽,這些標簽之前,將通過s。s:property標簽顯示動作類‘name’的屬性值,是調用HelloWorldAction
類的方法getName()。
接下來創建一個主頁面:
我們還需要在WebContent文件夾中創建index.jsp頁面文件。該文件將作為初始動作URL,用戶可以直接點擊告訴Struts2框架調用的HelloWorldAction類定義的方法并渲染HelloWorld.jsp視圖。
這里可能會遇到一個問題:
web項目無法部署到eclipse配置的本地tomcat
一、發現問題
在eclipse中新建Dynamic Web Project,配置好本地的tomcat并寫好代碼后選擇Run on Server,但運行后發現在tomcat的安裝目錄下的webapps并沒有出現所建立的工程名字。
二、驗證
很明顯項目并沒有自動部署到Tomcat的Webapps中而是部署在了別的容器中。在內置瀏覽器中輸入http://localhost:8080/webDemo/login.jsp可正常打開。但在外部瀏覽器上打開http://localhost:8080時確沒有出現所期望的小貓畫面。
三、原因
eclipse不像MyEclipse默認將項目部署到tomcat安裝目錄下的webapps中,而默認部署到工作目錄下
的.metadata.pluginsorg.eclipse.wst.server.core mp1wtpwebapps中,tmp1文件夾里面存放著該項目的信息。
四、修改
為了使項目默認部署到tomcat安裝目錄下的webapps中,show view―>servers―>找到需要修改的tomcat―>右擊 ①停止eclipse內的Tomcat服務器(stop) ②刪除該容器中部署的項目(add and remove) ③清除該容器相關數據(clean) ④打開tomcat的修改界面(open)
⑤找到servers location,選擇第二個(User tomcat Installation) ⑥修改deploy path為webapps ⑦保存關閉
需要說明的是①②③必須操作,否則下面的步驟會被置灰無法操作。
還會遇到另一個錯誤就是在jsp的開始會有JavaWeb:報錯信息The
superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
原來Javaweb工程類中沒有添加Tomcat運行時相關類導致。
下面是具體的解決方法:
1、右擊web工程-》屬性或Build
Path-》Java Build Path->Libraries-> Add Libray...->Server Runtime -》Tomcat Server
2、切換到Java
Build Path界面中的Orader and Export,選擇Tomcat。
主頁面的代碼如下(index.jsp):
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ 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 World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action="hello">
<label for="name">Please enter your name</label><br/>
<input type="text" name="name"/>
<input type="submit" value="Say Hello"/>
</form>
</body>
</html>
hello動作定義在上面的視圖文件將被映射到HelloWorldAction類和它的執行方法使用struts.xml文件。當用戶點擊“提交”按鈕,它會導致Struts2框架運行的執行方法定義在其中,HelloWorldAction類和方法的返回值的基礎上,將相應的視圖選擇和呈現的一個響應。
配置文件
我們需要一個映射,以配合URL,HelloWorldAction類(模型),HelloWorld.jsp(視圖)。映射告訴Struts 2框架的類將如何響應用戶的操作(URL),這一類的方法將被執行,在該方法返回的基礎上選擇什么視圖來顯示字符串結果。
<?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.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello" class="com.tutorialspoint.struts2.HelloWorldAction" method="execute">
<result name="success">/Hello.jsp</result>
</action>
</package>
</struts>
在這里,我們設置struts.devMode為true,因為我們正在努力開發環境,我們需要看到一些有用的日志消息。然后,我們定義了一個包叫做 helloworld.
當你想要將動作類放入其中時創建一個包是有用的。在我們的例子中,我們的action命名為“hello”,這是相應的URL是/hello.action和備份為HelloWorldAction.class.HelloWorldAction.class中execute方法是時運行的URL的方法/hello.action被調用.
如果execute方法返回"success",
然后我們把用戶引到HelloWorld.jsp.
下一步是創建一個web.xml文件這是任何請求發送到Struts2的一個切入點。Struts2的應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。
在web.xm文件中,我們定義一個過濾器org.apache.struts2.dispatcher.FilterDispatcher. web.xml文件需要創建WEB-INF文件夾下的WebContent。 Eclipse在創建項目時已經創建了一個web.xml文件。所以,讓我們只需要修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>/*</url-pattern>
</filter-mapping>
</web-app>
我們已經指定index.jsp是我們主頁的文件。我們已經配置Struts2的過濾器上運行的所有URL (i.e, any url that match the pattern /*)
啟用詳細的日志:
您可以啟用完整的日志記錄功能,通過創建工作和Struts2同時創建logging.properties文件在 WEB-INF/classes 文件,在屬性文件中,請注意以下兩行:
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers =
java.util.logging.ConsoleHandler
默認logging.properties指定ConsoleHandler的路由記錄到stdout和也的FileHandler。一個處理程序的日志級別閾值可以設置使用SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST或ALL。
就是這樣。我們已經準備好來運行我們的Hello World應用程序使用Struts 2框架。
下面還有幾個需要注意的信息,最主要的是,出錯以后要看出錯信息,找到原因。現在遇到的問題歸結為兩個原因:
1)配置文件中的書寫錯誤。
2)導包不全面,按照錯誤提示的導包就行。
版本過期如圖:

org.apache.struts2.dispatcher.FilterDispatcher 換成:
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈