struts2是基于mvc设计模式的web框架
工作原理:

一.使用maven+struts2工具创建第一个helloworld
-
首先新建maven项目后的目录结构(项目名为:struts2-test1)
struts2-1.jpg 配置pom.xml对于struts2的依赖,只需要解决struts2-core一个依赖即可
<!-- Struts2 依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.1</version>
</dependency>
pom.xml整体内容如下:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>struts2</groupId>
<artifactId>struts2-test1</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>struts2-test1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 开发环境部署所用 -->
<properties>
<warPackageName>struts2-test1</warPackageName>
<tomcat.deploy.server>localTestServer</tomcat.deploy.server>
<tomcat.deploy.serverUrl>http://localhost:8081/manager/text</tomcat.deploy.serverUrl>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Struts2 依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
<build>
<finalName>struts2-test1</finalName>
<plugins>
<plugin>
<!-- 编译时指定jdk1.7进行编译 -->
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- 部署相关 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>${tomcat.deploy.serverUrl}</url>
<server>${tomcat.deploy.server}</server>
<path>/${warPackageName}</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置完成后会看到如下依赖已经加载:(下面三个标红色的包必须加载)

- 配置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>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 新建HelloWorldAction
package com.lxf.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("执行HelloWorld action!");
return SUCCESS;
}
}
- 新建UserAction
package com.lxf.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private static final long serialVersionUID = -1417237614181805435L;
private String name;
private String password;
/**
* 跳转到登录界面
* @return
*/
public String login_input() {
return SUCCESS;
}
/**
* 登录
* @return
*/
public String login() {
System.out.println("name->" + name);
System.out.println("password->" + password);
return SUCCESS;
}
}
- 配置struts2.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>
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" class="com.lxf.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
<action name="login" class="com.lxf.action.UserAction" method="login">
<result name="success">
/index.jsp
</result>
</action>
</package>
</struts>
- 创建index.jsp页面
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
- result.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h2>This is result.jsp</h2>
</body>
</html>
- 在项目右击点击Run AS->ON Server选择tomcat7,启动web容器.(或者在pos.xml中Run AS->Maven build 使用 tomcat7:deploy部署到远程web服务器)
- 在浏览器中输入:
http://localhost:8081/struts2-test1/helloworld.action
http://localhost:8081/struts2-test1/login.action
二.功能介绍
-
搜索action顺序
Paste_Image.png 动态方法调用(一个action中有多个方法在xml的配置)
第一种方法,在struts.xml中每个action标签配置一个method(会导致多个action,不推荐使用)
<action name="helloworld" class="com.lxf.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
<action name="add" class="com.lxf.action.HelloWorldAction" method="add">
<result>/result.jsp</result>
</action>
第二种方法,感叹号方式(不推荐使用)
(1) 在struts.xml中配置常量
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>
(2) action中添加update方法
/**
* 我是修改方法
*/
public String update()
{
System.out.println("我是修改方法");
return "update";
}
(3)配置struts.xml的action标签
<!-- 使用感叹号方式配置多个method -->
<action name="helloworld2" class="com.lxf.action.HelloWorldAction">
<result>/result.jsp</result>
<result name="update">/index.jsp</result>
</action>
(4)访问方式:http://localhost:8081/struts2-test1/myRoute/helloworld2!update.action
第三种通配符方式(推荐使用)
(1) 配置struts.xml中的action
<!-- 通配符方式配置多个method -->
<action name="helloworld_*" method="{1}" class="com.lxf.action.HelloWorldAction" >
<result>/result.jsp</result>
<result name="add">/index.jsp</result>
<result name="update">/result.jsp</result>
</action>
(2) 访问:
http://localhost:8081/struts2-test1/myRoute/helloworld_add.action (访问action中的add方法)
http://localhost:8081/struts2-test1/myRoute/helloworld_update.action(访问action中的update方法)
- structs.xml中包含多个模块的配置文件(注意:被包含文件的packag的name值不能一样)
<struts>
<!-- 使用include标签引入各个模块xml配置文件 -->
<include file="helloworld.xml"></include>
<include file="helloworld2.xml"></include>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>
helloworld.xml内容
<struts>
<package name="default" namespace="/myRoute" extends="struts-default">
<action name="helloworld" class="com.lxf.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
<action name="add" class="com.lxf.action.HelloWorldAction" method="add">
<result>/result.jsp</result>
</action>
<!-- 使用感叹号方式配置多个method -->
<action name="helloworld2" class="com.lxf.action.HelloWorldAction">
<result>/result.jsp</result>
<result name="update">/index.jsp</result>
</action>
...
</struts>
helloworld2.xml内容
<struts>
<package name="default1" namespace="/myHello" extends="struts-default">
<action name="helloworld3" class="com.lxf.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
</package>
</struts>
- 默认action
<!-- 默认action -->
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/index.jsp</result>
</action>
- struts2后缀名配置
(1)第一种方式配置struts.xml中的常量
<struts>
<constant name="struts.action.extension" value="html,action,do"></constant>
</struts>
访问以下路径完成的功能都是相同的
http://localhost:8081/struts2-test1/myHello/helloworld3.html
http://localhost:8081/struts2-test1/myHello/helloworld3.do
http://localhost:8081/struts2-test1/myHello/helloworld3.action
(2)第二种方式,还可以在struts.properties中配置
struts.action.extension=html,action,do
(3)第三种方式,web.xml在过滤器中配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>action</param-value>
</init-param>
</filter>
- action中接收参数
- 第一种:使用Action属性接收
login.jsp内容
<form action="/struts2-test1/myRoute/login.action" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"> <br>
<input type="submit" name="submit" value="提交" /><br>
</form>
LoginAction内容定义属性和对应的set和get方法就可以接收
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String login()
{
System.out.println(username+password);
return SUCCESS;
}
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;
}
}
第二种:使用DomainModel接收(建立一个User类专门用来接收参数)
User.java内容如下:
package com.lxf.po;
/**
* 用来在action中接收用户表单提交过来的数据
* @author lxf
*
*/
public class User {
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;
}
}
login.xml内容如下:
<form action="/struts2-test1/myRoute/login.action" method="post">
用户名:<input type="text" name="user.username"><br>
密码:<input type="password" name="user.password"> <br>
<input type="submit" name="submit" value="提交" /><br>
</form>
LoginAction内容如下:(注意:需要为user对象添加get和set方法,并且user不需要实例化, html表单中需要指定user)
public class LoginAction extends ActionSupport {
private User user;
public String login()
{
System.out.println(user.getUsername());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
第三种:使用ModelDiven接收:(注意:不需要为User对象设置set和get方法,并且user需要实例化,html表单中不需要指定user)推荐使用
在LoginAction中实现ModelDriven接口
User内容:
public class User {
private String username;
private String password;
//接收form表单中的图书字符串数组
private List<String> bookList;
//接收form表单中的用户对象数组
private List<User>userList;
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 List<String> getBookList() {
return bookList;
}
public void setBookList(List<String> bookList) {
this.bookList = bookList;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
LoginAction内容:
public class LoginAction extends ActionSupport
implements ModelDriven<User>{
private User user = new User();
public String login()
{
System.out.println(user.getUsername());
System.out.println(user.getBookList().get(0));
System.out.println(user.getBookList().get(1));
System.out.println(user.getUserList().get(0).getUsername());
System.out.println(user.getUserList().get(1).getUsername());
return SUCCESS;
}
/**
* 实现ModelDriven接口的方法
* @return
*/
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
login.jsp内容
<form action="/struts2-test1/myRoute/login.action" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"> <br>
图书1:<input type="text" name="bookList[0]"> <br>
图书2:<input type="text" name="bookList[1]"> <br>
用户1:<input type="text" name="userList[0].username"> <br>
用户2:<input type="text" name="userList[1].username"> <br>
<input type="submit" name="submit" value="提交" /><br>
</form>
- 处理结果返回,如果result中的name标签不写,默认为success
<action name="helloworld2" class="com.lxf.action.HelloWorldAction">
<result>/result.jsp</result>
<result name="update">/index.jsp</result>
</action>
处理结果的类型如下:

- 以下对于返回结果为input的介绍
(1)如果在User.php中属性为
//年龄
private int age;
在struts.xml对应的action中配置
<action name="login" class="com.lxf.action.LoginAction" method="login">
<result name="input">/index.jsp</result>
<result > /success.jsp</result>
</action>
那么在页面的input中就必须输入整数,否则会有异常:
(2)在action中重写父类的validate,做表单验证用
@Override
public void validate() {
if(user.getUsername()==null || "".equals(user.getUsername()))
{
this.addFieldError("username", "用户名不能为空!");
}
- 公共strut2配置配置公共result
<package name="">
<global-results>
<result name="404">t=/404.jsp</result>
</global-results>
</package>
* struts2.xml中的result有param子标签
<action name="login" class="com.lxf.action.LoginAction" method="login">
<result >
<param name="location">/$(#request.path).jsp</param>
<param name="parse">true</param>默认为true,代表可以使用OGNL表达式获取session与域的信息
</result>
</action>
- 打开开发模式,在struts.xml中配置常量
<!-- 打开开发模式 -->
<constant name="struts.devMode" value="true"></constant>

