📅  最后修改于: 2023-12-03 14:47:44.418000             🧑  作者: Mango
Struts2 是一款流行的 Java Web 开发框架,它提供了 MVC 设计模式、统一的请求处理流程以及丰富的标签库等特性,使得开发人员能够快速构建高效的 Web 应用程序。然而,在使用 Struts2 进行开发的过程中,常常会遇到一些问题,以下是一些常见问题以及解答。
Struts2 可以通过 XML 或者注解的方式进行配置。XML 配置文件通常以 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>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<action name="hello" class="com.example.actions.HelloAction">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
在上面的示例中,我们定义了一个名为 default
的 package
,它继承自 Struts2 官方提供的 struts-default
包。在 default
包中,我们定义了一个名为 hello
的 action
,它对应的 Java 类为 com.example.actions.HelloAction
。当用户请求 /hello
时,Struts2 会执行 HelloAction
类中的代码,并返回名为 success
的结果页面 /hello.jsp
。
在 Struts2 中,通过 Action
实现类的属性接收表单参数。通常,我们需要在 Action
类中定义与表单参数名称相同的属性,通过 Struts2 内置的 setXxx
方法接收表单参数。例如,假设我们有一个登录表单,包含用户名和密码两个字段:
<form action="/login" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="登录" />
</form>
我们需要在 Action
类 LoginAction
中定义与表单参数相同的属性 username
和 password
,并提供对应的 setXxx
方法。例如:
public class LoginAction extends ActionSupport {
private String username;
private String password;
@Override
public String execute() throws Exception {
// 处理表单提交,实现业务逻辑
return SUCCESS;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
在上述代码中,我们定义了两个字符串类型的属性 username
和 password
,并分别实现了对应的 setXxx
方法。在 execute
方法中,我们可以访问这两个属性,进而实现业务逻辑。
Struts2 提供了强大的拦截器机制,可以方便地在请求处理前、处理后、异常抛出等场景进行统一处理。拦截器执行顺序可以在配置文件中进行配置。
以下是一个示例,在获取用户请求参数前打印请求信息,以及请求处理结束后打印响应信息:
public class LogInterceptor implements Interceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 在处理请求前打印请求信息
HttpServletRequest request = ServletActionContext.getRequest();
String method = request.getMethod();
String uri = request.getRequestURI();
String queryString = request.getQueryString();
System.out.println(String.format("收到请求:%s %s?%s", method, uri, queryString));
try {
// 继续处理请求
String result = invocation.invoke();
// 请求处理结束后打印响应信息
HttpServletResponse response = ServletActionContext.getResponse();
String contentType = response.getContentType();
int statusCode = response.getStatus();
System.out.println(String.format("响应:%d %s", statusCode, contentType));
return result;
} catch (Exception e) {
System.err.println("请求处理失败:" + e.getMessage());
throw e;
}
}
@Override
public void destroy() {
// do nothing
}
@Override
public void init() {
// do nothing
}
}
在上述代码中,我们实现了 LogInterceptor
拦截器,将在请求处理前和完成后分别打印请求和响应信息。在 struts.xml
文件中,我们可以通过如下配置将该拦截器应用到 default
包下的所有 action
中:
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="log" class="com.example.interceptors.LogInterceptor" />
<interceptor-stack name="defaultStack">
<interceptor-ref name="log" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack" />
<!-- action 配置 ... -->
</package>
在上述配置中,我们首先定义了名为 log
的拦截器,在 interceptor-stack
中将其和 Struts2 官方提供的默认拦截器栈 defaultStack
组合成一个新的拦截器栈。然后,在 default
包中添加 default-interceptor-ref
标签,将默认拦截器栈指定为上述新的拦截器栈 defaultStack
。这样,我们就成功将 LogInterceptor
拦截器应用到了 default
包下的所有 action
中。
以上仅是 Struts2 中的一些常见问题及其解答,更多问题需要开发者根据具体情况进行学习和解决。