一、Struts2工作原理
- 客户端请求(HTTP Request)
- 客户端(如浏览器)发送一个HTTP请求到Web服务器。这个请求包含了请求的URL、参数等信息。例如,用户在浏览器中输入一个Struts2应用相关的网址,如
http://example.com/myStruts2Action.action
。
- 客户端(如浏览器)发送一个HTTP请求到Web服务器。这个请求包含了请求的URL、参数等信息。例如,用户在浏览器中输入一个Struts2应用相关的网址,如
- FilterDispatcher(核心过滤器)
- 在Struts2框架中,FilterDispatcher是一个核心的Servlet过滤器。它负责拦截所有的请求。
- 它的主要工作包括:
- 解析请求的URL,确定请求对应的Action(业务逻辑处理类)。例如,如果请求的URL是
/user/login.action
,它会根据配置找到对应的UserLoginAction
类。 - 加载Struts2的配置文件(通常是
struts.xml
),该配置文件包含了关于Action的映射、拦截器等重要信息。
- 解析请求的URL,确定请求对应的Action(业务逻辑处理类)。例如,如果请求的URL是
- ValueStack(值栈)的创建与准备
- 在处理请求的过程中,Struts2会创建一个ValueStack对象。ValueStack是一个类似于数据存储容器的结构。
- 它会将请求相关的数据(如请求参数等)放入ValueStack中。例如,如果请求中有
username
和password
两个参数,这些参数会被设置到ValueStack相应的属性上。
- Interceptors(拦截器)处理
- 拦截器是Struts2中一个重要的概念。在执行Action之前,会按照配置顺序依次执行一系列的拦截器。
- 拦截器可以完成诸如参数验证、日志记录、权限检查等功能。例如,一个参数验证拦截器可以检查请求中的参数是否符合要求,如果不符合则可以直接返回错误信息,而不会执行后续的Action。
- 每个拦截器都有
intercept
方法,在这个方法中可以对请求进行处理,并且可以决定是否继续调用下一个拦截器或者直接调用Action。
- Action Execution(Action执行)
- 经过拦截器链后,最终会执行对应的Action类中的方法。
- Action类是用户编写的业务逻辑处理类,它包含了处理具体业务逻辑的方法。例如,一个
UserLoginAction
类可能有一个login
方法,用于验证用户登录信息是否正确。 - Action可以与模型(Model)进行交互,例如访问数据库、调用业务逻辑层的方法等,然后将处理结果返回。
- Result Processing(结果处理)
- Action执行完成后会返回一个结果码(如
success
、error
等)。 - 根据这个结果码,Struts2会在配置文件(
struts.xml
)中查找对应的结果视图(View)配置。例如,如果结果码是success
,可能会跳转到一个success.jsp
页面,这个页面的配置是在struts.xml
中通过<result>
标签来定义的。
- Action执行完成后会返回一个结果码(如
- View Rendering(视图渲染)
- 找到对应的视图(如JSP页面)后,Struts2会将ValueStack中的数据传递给视图。
- 在视图中可以使用Struts2的标签库(如
<s:property>
标签)来获取和显示ValueStack中的数据。例如,在success.jsp
页面中,可以使用<s:property value = "username"/>
来显示从ValueStack中获取的username
值。
- HTTP Response(响应返回客户端)
- 视图渲染完成后,会生成一个HTTP响应,然后将这个响应发送回客户端(浏览器)。这个响应包含了页面的HTML内容或者其他格式的数据(如JSON等,如果是用于AJAX请求的响应)。
二、Struts2代码示例
- 创建Action类
- 首先创建一个简单的Action类,例如
HelloAction
:
- 首先创建一个简单的Action类,例如
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
private String message;
public String execute() {
message = "Hello, Struts2!";
return SUCCESS;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
- 这里
HelloAction
继承自ActionSupport
,ActionSupport
提供了一些默认的方法和常量(如SUCCESS
)。execute
方法是Action类中的主要业务逻辑处理方法,在这里我们设置了一个message
属性的值,并返回SUCCESS
结果码。
- 配置
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>
<package name="default" extends="struts - default">
<action name="hello" class="HelloAction">
<result>/hello.jsp</result>
</action>
</package>
</struts>
- 在
struts.xml
中,我们定义了一个名为default
的包,并且在这个包中定义了一个名为hello
的Action,它对应的类是HelloAction
。当这个Action执行成功(返回SUCCESS
)后,会跳转到/hello.jsp
页面。
- 创建视图页面(
hello.jsp
)
<%@ page contentType="text/html;charset=UTF - 8" language="java" %>
<%@ taglib prefix="s" uri="/struts - tags" %>
<html>
<head>
<title>Hello Struts2</title>
</head>
<body>
<s:property value="message"/>
</body>
</html>
- 在
hello.jsp
页面中,我们使用了Struts2的标签库(<s:property>
)来显示从Action中传递过来的message
属性的值。