📜  Struts2问题与解答(1)

📅  最后修改于: 2023-12-03 14:47:44.418000             🧑  作者: Mango

Struts2问题与解答

Struts2 是一款流行的 Java Web 开发框架,它提供了 MVC 设计模式、统一的请求处理流程以及丰富的标签库等特性,使得开发人员能够快速构建高效的 Web 应用程序。然而,在使用 Struts2 进行开发的过程中,常常会遇到一些问题,以下是一些常见问题以及解答。

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>

在上面的示例中,我们定义了一个名为 defaultpackage,它继承自 Struts2 官方提供的 struts-default 包。在 default 包中,我们定义了一个名为 helloaction,它对应的 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>

我们需要在 ActionLoginAction 中定义与表单参数相同的属性 usernamepassword,并提供对应的 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;
    }
}

在上述代码中,我们定义了两个字符串类型的属性 usernamepassword,并分别实现了对应的 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 中的一些常见问题及其解答,更多问题需要开发者根据具体情况进行学习和解决。