Struts2是一個基於MVC設計模式的Web開發框架, 正如官網上介紹的那樣:html
ApacheStruts 2 is an elegant, extensible framework for creating enterprise-ready Javaweb applications. The framework is designed to streamline the full developmentcycle, from building, to deploying, to maintaining applications over time.java
Struts2是由Struts和Webwork這兩個優秀的框架演化而來,它的出現解決了表現層和業務邏輯層緊耦合的問題。web
爲了支持Struts 2,一般咱們須要添加如下類庫:apache
接下來編輯Web應用中的web.xml,配置Struts2的核心類庫,下面是配置文件的代碼片斷,在web.xml文件中,定義了框架的攔截器FilterDispatcher,Servlet初始化Struts框架而且處理全部請求。「/*」表示對於全部的請求都容許。json
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <!-- 定義Struts2的核心Filter --> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>actionPackages</param-name> <param-value>com.mycompany.myapp.actions</param-value> </init-param> </filter> <!-- 讓struts2的核心Filter攔截全部的請求 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- web應用的默認首頁 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
Jsp頁面(welcome.jsp和error.jsp省略):login.jsp設計模式
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <body> <s:form action="login.action"> <s:textfield name="username" key="user"></s:textfield> <s:textfield name="password" key="pass"></s:textfield> <s:submit key="login"></s:submit> </s:form> </body>
import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class Demo extends ActionSupport { 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() throws Exception { if (getUsername().equals("Beta")) { ActionContext.getContext().getSession().put("user", getUsername()); System.out.print(getUsername()); return SUCCESS; } else { return ERROR; } } }
接下來須要配置stuts.xml文件,該文件的最大做用就是配置Action和請求之間的對應關係,並配置邏輯視圖名和物理視圖資源之間的關係。app
<?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.custom.i18n.resources" value="mess" /> <!-- 指定國際化編碼字符集 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="no-default" extends="struts-default"> <action name="login" class="ntci.cloud.openstack.action.Demo"> <!—定義了三個邏輯視圖和物理視圖之間的映射 --> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> </package>
它的整個業務流程以下圖所描述的:框架
1. 在web.xml中定義核心的Filter來攔截用戶的請求;jsp
2. 在struts.xml中查找匹配的Action實例,並調用該Action的業務邏輯方法,上圖中若是用戶請求url爲login.action,則使用ntci.cloud.openstack.action.Demo來處理;工具
3. 當Action處理用戶請求完畢後,一般會返回一個處理結果,一般咱們稱之爲邏輯視圖名,這個邏輯視圖和物理視圖進行關係映射;
4. Action將數據傳給視圖資源。
Struts2中有一些常量配置:
struts.i18n.encoding:指定web應用的指定編碼集。該常量的默認配置是UTF-8,對於獲取中文請求參數,應該將常量設置爲GBK或者GBK2312
struts.devMode:該常量設置Struts2應用是否使用開發模式
Struts 2默認會加載類加載路徑下的struts.xml、struts-default.xml、struts-plugin.xml三類文件,其中struts.xml是開發者定義的默認配置文件,struts-default.xml是struts 2框架自帶的配置文件,而struts-plugin.xml則是Struts 2插件的默認配置文件。除了以上三個文件,咱們也能夠在struts.properties、web.xml文件中配置struts常量。在struts.xml文件中,在根目錄下添加:
<constantname="struts.i18n.encoding" value="UTF-8" />
在web.xml文件filter目錄下,添加
<init-param> <param-name> struts.i18n.encoding</param-name> <param-value> UTF-8</param-value> </init-param>
爲了不struts.xml過於龐大,咱們能夠將一個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> <!—經過include元素導入其它配置文件--> <include file=」struts-part1.xml」/> </struts>
Action類中的屬性,不只能夠用於封裝請求參數,也能夠封裝處理結果,Action類並不會對此進行區分。若是請求參數中包含了username屬性,則系統會調用Action類中username的setter方法,經過這種方法,username參數就能夠傳給Action實例。
Struts 2提供了一個Action接口,這個接口提供了Struts2的Action類應該事先的規範,下面是Action接口的代碼:
public interface Action{ public static final java.lang.String SUCCESS = "success"; public static final java.lang.String NONE = "none"; public static final java.lang.String ERROR = "error"; public static final java.lang.String INPUT = "input"; public static final java.lang.String LOGIN = "login"; public abstract java.lang.String execute() throws Exception; }
Struts 2爲Action接口提供了一個實現類ActionSupport,爲了方便開發,該類裏面提供了不少默認方法,包括數據校驗的方法、國際化信息的方法等。