概述
Struts2是一个基于MVC设计模式web应用框架,在webwork框架技术基础上,Strurts2核心是拦截器,Struts2框架的核心功能都依靠拦截器实现的。Struts2框架对控制器进行了统一的和规范。
创建 一个Java web应用
增加 jetty plugin
<groupId>cn.java.struts</groupId><artifactId>BasicStruts</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><struts2.version>2.5.14.1</struts2.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties>...<build>...<finalName>basic-struts</finalName><plugins><plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>9.4.7.v20170914</version><configuration><webApp><contextPath>/${build.finalName}</contextPath></webApp><stopKey>CTRL+C</stopKey><stopPort>8999</stopPort><scanIntervalSeconds>10</scanIntervalSeconds><scanTargets><scanTarget>src/main/webapp/WEB-INF/web.xml</scanTarget></scanTargets></configuration></plugin></plugins></build>
在src/main/下创建webapp目录,在webapp下创建WEB-INF目录,在WEB-INF目录创建web.xml
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name></web-app>
在src/main/webapp新建index.jsp
<!DOCTYPE html><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><html><head><meta charset="UTF-8"><title>Basic Struts 2 Application - Welcome</title></head><body><h1>Welcome To Struts 2!</h1></body></html>
增加 Struts 2 jar包
<dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>${struts2.version}</version></dependency>
在web.xml创建 Servlet Filter
<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_ID" 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"><display-name>Basic Struts2</display-name><welcome-file-list><welcome-file>index</welcome-file></welcome-file-list><filter><filter-name>struts2</filter-name><!--如果Struts2 的2.3.24版本应该是这样的<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>--><filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>
创建HelloAction
import com.opensymphony.xwork2.ActionSupport;public class HelloAction extends ActionSupport {@Overridepublic String execute() throws Exception {System.out.println("执行action");return SUCCESS;}}
创建struts.xml
在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" extends="struts-default"><action name="hello" class="cn.java.struts.HelloAction"><result name="success">/success.jsp</result></action></package></struts>
mvn直接运行jetty:
mvn jetty:run
打开浏览器输入http://localhost:8080/basic-struts/hello.action 注意是URL末尾是hello.action不是 hello.jsp

Struts动态方法调用
动态方法调用就是为了解决一个Anction对应多个请求的处理,以免Action太多。
1、xml中配置 method 属性,对应 指定方法
public class HelloAction extends ActionSupport {public String add(){System.out.println("执行add");return SUCCESS;}public String update(){System.out.println("执行update");return SUCCESS;}@Overridepublic String execute() throws Exception {System.out.println("执行action");return SUCCESS;}}
修改struts.xml
<struts><package name="default" extends="struts-default"><action name="hello" class="cn.java.struts.HelloAction"><result >/success.jsp</result></action><action name="add" method="add" class="cn.java.struts.HelloAction"><result >/add.jsp</result></action><action name="update" method="update" class="cn.java.struts.HelloAction"><result >/update.jsp</result></action></package></struts>
2、感叹号方式
public class HelloAction extends ActionSupport {public String add(){System.out.println("执行add");return "add";}public String update(){System.out.println("执行update");return "update";}@Overridepublic String execute() throws Exception {System.out.println("执行action");return SUCCESS;}}
<struts><package name="default" extends="struts-default"><global-allowed-methods>regex:.*</global-allowed-methods><action name="hello" class="cn.java.struts.HelloAction"><result >/success.jsp</result><result name="add">/add.jsp</result><result name ="update">/update.jsp</result></action></package><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant></struts>
在struts2.5 为了提升安全性,要在package标签后加上regex:.*

3、通配符方式
<struts><package name="default" extends="struts-default"><global-allowed-methods>regex:.*</global-allowed-methods><action name="hello_*" method="{1}" class="cn.java.struts.HelloAction"><result >/success.jsp</result><result name="add">/{1}.jsp</result><result name ="update">/{1}.jsp</result></action></package><constant name="struts.enable.DynamicMethodInvocation" value="false"></constant></struts>

默认Action页面
<default-action-ref name="error"></default-action-ref><action name="error" method="error" class="cn.java.struts.HelloAction"><result name="error">/error.jsp</result></action>
public class HelloAction extends ActionSupport {public String error(){System.out.println("执行error");return ERROR;}}

Struts2接收参数
使用Action属性接收
public class LoginAction extends ActionSupport {private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String login() throws Exception {if ("admin".equals(name)&&"123456".equals(password)){return SUCCESS;}return ERROR;}}
struts.xml增加login action
<action name="login" method="login" class="cn.java.struts.LoginAction"><result name="success">/success.jsp</result><result name="error">/error.jsp</result></action>

通过model
创建login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>User Login</title></head><body><center><h1>用户登录</h1><form action="login.action" method="post">用 户:<input type="text" name="name"><br>密 码:<input type="password" name="password"><br><input type="submit" value="commit"></form></center></body></html>
public class LoginAction extends ActionSupport {private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String login() throws Exception {if ("admin".equals(user.getName())&&"123456".equals(user.getPassword())){return SUCCESS;}return ERROR;}}
User.java
public class User {private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}
修改login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>User Login</title></head><body><center><h1>用户登录</h1><form action="login.action" method="post">用 户:<input type="text" name="user.name"><br>密 码:<input type="password" name="user.password"><br><input type="submit" value="commit"></form></center></body></html>
ModelDriven
public class LoginAction extends ActionSupport implements ModelDriven<User> {private User user = new User(); //必须实例化public String login() throws Exception {System.out.println(user.getName());System.out.println(user.getPassword());if ("admin".equals(user.getName())&&"123456".equals(user.getPassword())){return SUCCESS;}return ERROR;}@Overridepublic User getModel() {return user;}}
取得user
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>User Login</title></head><body><center><h1>用户登录</h1><form action="login.action" method="post">用 户:<input type="text" name="name"><br>密 码:<input type="password" name="password"><br><input type="submit" value="commit"></form></center></body></html>
Action中五种内置属性
(1) SUCCESS  Action正确的执行完成,返回相应的视图,success是name属性的默认值。
(2) NONE  表示Action正确的执行完成,但并不返回任何事视图。
(3) ERROR  表示Action执行失效,返回错误处理视图。
(4) LOGIN  Action因为用户没有登录的原因没有正确执行,将返回该登录视图,要求用户进行登录验证
(5) INPUT  Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入界面,一般在应用中,会对这些 参数进行验证,如果验证没有通过,将自动返回该视图。
public class LoginAction extends ActionSupport implements ModelDriven<User> {private User user = new User(); //必须实例化public String login() throws Exception {if(user.getName() ==null||"".equals(user.getName().trim())){this.addFieldError("username","用户名为空");return INPUT;}if ("admin".equals(user.getName())&&"123456".equals(user.getPassword())){return SUCCESS;}return ERROR;}@Overridepublic User getModel() {return user;}}
增加input结果处理
<action name="login" method="login" class="cn.java.struts.LoginAction"><result name="success">/success.jsp</result><result name="error">/error.jsp</result><result name="input">/login.jsp</result></action>
