我们先搭建一个入门案例来了解一下Struts2
- 首先我们需要搭建我们的开发环境:
- 将我们需要的jar包拷贝到项目的lib目录下
- 在项目的最顶层(也就是src下)新建一个struts.xml文件 -->一定要注意创建的位置和命名格式!!(ps:其实名字可以改,但是一般大家都这样写,约定大于编码嘛,所以我们入乡随俗)
- 在web.xml中配置一个Struts2已经写好的过滤器
<?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>01_Struts2Template</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.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
最后我们把项目部署上然后启动tomcat服务器,只要不报错那么我们的环境就搭建好了
- 然后搭建再写入门案例
第一步:新建一个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>Struts2入门案例</title>
</head>
<body>
<!-- hello.action:扩展名为.action是struts2框架默认处理的url后缀,当然什么也不写也可以! -->
<a href="${pageContext.request.contextPath }/hello.action">以.action结尾</a>
<a href="${pageContext.request.contextPath }/hello">不以.action结尾</a>
</body>
</html>
第二步:在struts.xml文件中进行配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- 约束 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 覆盖常量 修改成以.do结尾的 -->
<constant name="struts.action.extension" value="do"></constant>
<!--
namespace:命名空间
访问路径 = 名称空间 +动作名称
namespace的默认值:
1.不写该属性
2.写了该属性,取值是一个"";
注意:默认值不是/ !!!
-->
<package name="p1" extends="struts-default" namespace="/">
<!--
name:对应请求的地址 注意:没有后缀,和页面上是否写了.action没有关系!
class:动作类全名,指定的一个动作类 (class有一个默认动作类是:com.opensymphony.xwork2.ActionSupport
是在struts-default.xml中定义的)
method:对应请求需要执行的动作方法 (默认动作方法是public String execute(){})
-->
<action name="hello" class="com.chh.action.HelloAction" method="sayHello">
<!-- 配置结果视图 -->
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
第三步:新建我们的动作类和动作方法
package com.chh.action;
/**
* 动作方法
* @author Administrator
*
*/
public class HelloAction {
/**
* 动作方法书写的要求:
* 1.public的
* 2.返回值是String类型
* 3.没有任何参数
*/
public String sayHello(){
return "success"; //对应结果视图的name值
}
}
最后一步:新建结果视图(就是执行完动作方法要去的某个页面)
<%@ 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>
执行成功!
</body>
</html>
我们访问一下,可以看到已经成功了
虽然我们成功的在struts2的环境下把这个例子跑起来了,但是至于它是怎么运行的,内部流程我们都是处于懵逼状态的,下面我们看一张图,了解下他的内部运行流程
- Struts2配置文件
- 加载时机:当应用被tomcat加载的时候,struts2的配置文件就被加载过了。
- 加载顺序:
顺序 配置文件名 所在位置 我们能不能修改 1 default.properties
org/apache/struts2/default.properties 不能修改 2 struts-default.xml
在struts的core核心jar包. 不能修改 3 strtuts-plugin.xml
在struts2提供的插件jar包中
不能修改 4 struts.xml
我们的应用中 可以修改 5 struts.properties
我们的应用中 可以修改 6 web.xml
我们的应用中 可以修改,在过滤器中进行配置Struts2框架提供的常量
在这里我们需要注意一下:
- Struts2提供了两种配置的方式。一种是key=value的方式,即使用.properties文件。另一种是xml文件配置。一般我们推荐使用xml文件(ps:因为它能描述层级关系)。
- 当多个配置文件中,有相同的参数,后面的会把前面的值给覆盖了。
- Struts2框架提供的常量
- 常量定义在了default.properties配置文件中,体现形式都是key=value。所有的struts2应用都会用到这些常量。

- 在struts.xml中使用<constant name="" value=""></constant>元素覆盖
<!-- 覆盖常量 修改成以.do结尾的 -->
<constant name="struts.action.extension" value="do"></constant>
- 创建struts.properties文件覆盖(src下)

- 在web.xml中配置过滤器参数进行覆盖

- struts.xml中的主要元素:
1、package元素
1.1、作用:
在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
1.2、属性:
name:包的名称。必须写。且必须唯一。
extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。
struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。
abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有<action>元素的包,就可以声明为抽象包。
namespace:名称空间。
名称空间 + 动作名称 = 访问路径
1.3、packege中的namespace详解
namespace的默认值:
- 不写该属性
- 写了该属性,取值是一个"".
注意:默认值不是/
动作类的搜索顺序:
2、action元素
2.1、作用:配置动作用的。
2.2、属性:
- name:动作名称
- class:动作类全名。默认的动作类是:com.opensymphony.xwork2.ActionSupport,是在struts-default.xml中定义的
- method:动作类中的方法名称。默认是public String execute(){}
要求:
1.public的
- 返回值必须是String
- 没有参数
2.3、动作类
- 方式一:动作类就是一个POJO(Plain Old Java Object 原始的java对象),非常简单的javabean。
- 方式二:动作类实现com.opensymphony.xwork2.Action接口。
常量:给动作方法返回值用的。用常量可以使你的应用规范和统一。
3.方式三:动作类继承com.opensymphony.xwork2.ActionSupport 推荐使用
2.4、动作的访问
- 使用通配符:
<package name="user" extends="struts-default" namespace="/user">
<!-- <action name="addUser" class="com.chh.action.UserAction.UserAction" method="addUser">
<result name="success">/addUser.jsp</result>
</action>
<action name="deleteUser" class="com.chh.action.UserAction.UserAction" method="deleteUser">
<result name="success">/deleteUser.jsp</result>
</action>
<action name="updateUser" class="com.chh.action.UserAction.UserAction" method="updateUser">
<result name="success">/updateUser.jsp</result>
</action>
<action name="selectUser" class="com.chh.action.UserAction.UserAction" method="selectUser">
<result name="success">/selectUser.jsp</result>
</action> -->
<action name="*" class="com.chh.action.UserAction.UserAction" method="{1}">
<result name="success">/{1}.jsp</result>
</action>
- 升级版:( 绝对匹配优先。使用通配符的按照在配置文件中的先后顺序进行匹配的。)
<!-- 升级版
{1}代表下划线左边的 *
{2}代表下划线右边的 *
-->
<!-- <action name="*_*" class="com.chh.action.UserAction.*Action" method="{1}{2}">
<result name="success">/{1}{2}.jsp</result>
</action> -->
结果类型视图(逻辑结果视图)
1、result元素
- 作用:为动作指定结果视图
- 属性:name:逻辑视图的名称,对应着动作方法的返回值。默认值是success。
- type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher。
2、result元素中type的取值
type属性的取值在struts-default.xml中定义着。
- 常用结果类型介绍:
- dispatcher:(默认值)使用请求转发,转向一个页面。
- redirect:使用重定向,转向一个页面。
redirectAction:注意:使用的是重定向。
- 重定向到另一个相同名称空间的动作。
<package name="p1" extends="struts-default">
<action name="action1" class="com.chh.Action.ActionDemo1">
<!--在不指定type属性时,默认使用的是请求转发 -->
<!--
redirectAction:使用重定向,重定向到另一个相同名称空间的动作
即重定向到相同包下的另一个动作(action)
-->
<result name="success" type="redirectAction">action2</result>
</action>
<action name="action2">
<result>/error.jsp</result>
</action>
</package>
2.重定向到不同名称空间的动作
<package name="p1" extends="struts-default">
<action name="action1" class="com.chh.Action.ActionDemo1">
<!--
访问不同包下的动作: /n2下的动作action3,那个直接指定的方式无法访问
必须使用<result>元素下的子元素<param name="">value</param>
name属性:参数名称
value:参数的值
参数的名称要注意大小写!!!
type="chain"代表请求转发。,配置信息和重定向一模一样
-->
<result name="success" type="redirectAction">
<param name="namespace">/n2</param>
<param name="actionName">action3</param>
</result>
</action>
</package>
<package name="p2" extends="struts-default" namespace="/n2">
<action name="action3">
<result>/demo.jsp</result>
</action>
</package>
3、result元素中param子元素
在转发或者重定向到不同包下的动作时,都用到了result元素的子元素param。
param元素的作用:依赖注入(Dependence Injection)思想
我们通过struts-default.xml中的resultTypes元素中配置可以看出,每个结果类型视图其实都是靠一个类来实现的。而param元素就是将配置的参数,注入到该类中。
调用的是对应类的setter方法进行注入的。
- 在动作类中访问Servlet的API
使用ServletActionContext类
