一、Struts2 概述
Struts 翻譯:支柱
Struts 是流行和成熟的基于 MVC 設計模式的 Web 應用程式架構
POJO(Plain Ordinary Java Object)簡單的 Java 對象
MVC 模式
模型視圖控制器
Model View Controller
工作原理圖

二、Struts2 項目
項目結構
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── mouday
│ │ └── HelloWorldAction.java
│ ├── resources
│ │ └── struts.xml
│ └── webapp
│ ├── WEB-INF
│ │ └── web.xml
│ ├── hello.jsp
│ └── index.html
└── test
└── java
1、配置檔案
(1)pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>java-demo-struts</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<!-- tomcat7插件 maven 指令 tomcat7:run 啟動項目-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<!--添加忽略war包檢查标簽,則可以讓tomcat7:run指令正常啟動tomcat-->
<ignorePackaging>true</ignorePackaging>
<contextFile>src/main/webapp/WEB-INF/web.xml</contextFile>
<contextReloadable>true</contextReloadable>
</configuration>
</plugin>
</plugins>
</build>
<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
(2)src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="utf-8" ?>
<web-app>
<display-name>Hello</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
(3)src/main/resources/struts.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="HelloWorldAction" class="com.mouday.HelloWorldAction">
<result name="">/hello.jsp</result>
</action>
</package>
</struts>
2、Action
src/main/java/com/mouday/HelloWorldAction.java
package com.mouday;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("hello action");
return SUCCESS;
}
}
3、視圖檔案
src/main/webapp/index.html
<!DOCTYPE html>
<html lang="en">
<body>
hi
</body>
</html>
4、通路測試
GET http://localhost:8080/
hi
GET http://localhost:8080/HelloWorldAction
hello action jsp
三、核心檔案
web.xml
struts.xml
struts.properties 全局屬性檔案,自動加載
struts.properties 常用配置
# struts.xml改動後重新加載重載 預設 false
struts.configuration.xml.reload=true
# 打開開發模式 預設 false
struts.devMode=true
# 設定浏覽器緩存靜态頁面 預設true
struts.serve.static.browserCache=false
# 被struts處理的請求字尾
struts.action.extension=action,do
# 伺服器運作時端口号
struts.url.http.port=8080
四、深入 Struts2
1、通路 Servlet API 方式
- ActionContext
- 實作 Aware 接口
- ServletActionContext
2、Action 搜尋順序
逐級向上查找
3、動态方法調用
(1)指定 method 屬性
package com.mouday;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("hello action");
return SUCCESS;
}
public String add(){
System.out.println("add");
return SUCCESS;
}
}
struts.xml(簡化)
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="add" class="com.mouday.HelloWorldAction" method="add">
<result name="">/add.jsp</result>
</action>
</package>
</struts>
通路結果
GET http://localhost:8080/add.action
add result
(2)感歎号方式(不推薦)
參考 struts2.5 使用感歎号和通配符實作動态方法調用無效的問題及解決! 配置檔案<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <global-allowed-methods>regex:.*</global-allowed-methods> <action name="HelloWorldAction" class="com.mouday.HelloWorldAction"> <result>/hello.jsp</result> <result name="add">/add.jsp</result> </action> </package> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> </struts>
GET http://localhost:8080/HelloWorldAction!add.action
add result
(3) 通配符方式
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="*_*" method="{2}" class="com.mouday.{1}Action">
<result name="{2}">/{2}.jsp</result>
</action>
</package>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
</struts>
GET http://localhost:8080/HelloWorldAction_add.action
add result
4、指定多個配置檔案
<include file="helloworld.xml" />
配置示例
struts.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<include file="hello.xml"/>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 以防亂碼-->
<constant name="struts.i18n.encoding" value="UTF-8"/>
</struts>
hello.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="*_*" method="{2}" class="com.mouday.{1}Action">
<result name="{2}">/{2}.jsp</result>
</action>
</package>
</struts>
通路
GET http://localhost:8080/HelloWorld_add.action
add result
5、預設 Action
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result>/error.jsp</result>
</action>
</package>
</struts>
GET http://localhost:8080/xxxx.action
error jsp
6、Struts2 字尾
(1)struts.xml
<constant name="struts.action.extension" value="html" />
(2)struts.properties
struts.action.extension=action,do
(3)web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do</param-value>
</init-param>
</filter>
7、接收參數
(1)Action 屬性
Action 類
package com.mouday;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
System.out.println(username);
return SUCCESS;
}
}
路由配置
<action name="login" class="com.mouday.LoginAction">
<result>/login.html</result>
</action>
表單頁面
<form action="login.action" method="post">
<input type="text" name="username" />
<input type="submit" />
</form>
(2)Domain Model
建立 User 類
package com.mouday.bean;
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
Action
package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user.getUsername());
return SUCCESS;
}
}
登入表單
<form action="login.action" method="post">
<input type="text" name="user.username" />
<input type="submit" />
</form>
(3)ModelDriven
package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user.getUsername());
return SUCCESS;
}
public User getModel() {
return user;
}
}
表單
<form action="login.action" method="post">
<input type="text" name="username" />
<input type="submit" />
</form>
4)接收清單類型
User 類
package com.mouday.bean;
import java.util.List;
public class User {
private String username;
private List<String> list;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getList());
return SUCCESS;
}
public User getModel() {
return user;
}
}
<form action="login.action" method="post">
<input type="text" name="username" />
<input type="text" name="list[0]" />
<input type="text" name="list[1]" />
<input type="submit" />
</form>
8、處理結果類型
Struts2 處理流程
使用者請求
-> Stuts架構
-> 控制器Action
-> Stuts架構
-> 視圖資源
result 如果省略 name,則預設是 success
<result name="success">/success.jsp</result>
<!-- 等價于 -->
<result>/success.jsp</result>
處理結果類型:
- SUCCESS 正确執行,預設視圖
- NONE 正确執行,不傳回視圖
- ERROR 執行失敗
- LOGIN 登入視圖
- INPUT 參數輸入界面
package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getList());
return SUCCESS;
}
@Override
public void validate() {
if (user.getUsername() == null || "".equals(user.getUsername())
) {
addFieldError("username", "使用者名不能為空");
}
}
public User getModel() {
return user;
}
}
配置
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.mouday.action.LoginAction">
<result>/login.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
登入框
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<form action="login.action" method="post">
<input type="text" name="username"/>
<!-- 顯示錯誤提示 -->
<s:fielderror name="username"></s:fielderror>
<input type="text" name="list[0]"/>
<input type="text" name="list[1]"/>
<input type="submit" />
</form>
9、局部結果和全局結果
OGNL
<result name="">
<param name="location">resource</param>
</result>