Java Structs框架原理案例详解

Java Structs框架原理案例详解

什么是Struts框架

Struts框架是一种流行的Java Web应用程序框架,Struts采用MVC(Model-View-Controller)架构模式,将应用程序的数据(Model),用户界面(View)和控制逻辑(Controller)清晰地分离开,以便维护和扩展应用程序。

Struts框架包含许多重要的组件,包括Action、Interceptor、Result、ValueStack、Tag等。

Struts框架的核心原理

Struts框架的核心原理是拦截器(Interceptor)。拦截器是一种可扩展的机制,在处理请求之前或之后,将适当的代码注入到请求处理流程中。

Struts框架中的请求处理过程如下:

  1. 用户发送HTTP请求,其中包含一个Action名称或URL;
  2. Struts根据Action名称或URL查找适当的Action;
  3. Struts将该Action与配置文件中定义的Interceptors相关联,同时创建ActionContext和ValueStack对象;
  4. Struts调用Interceptors处理ActionContext和ValueStack对象,这一过程中可以添加、删除或修改Action的属性;
  5. Struts调用Action的方法,处理请求;
  6. Struts将Action的结果传递给Result;
  7. Struts调用Result,生成响应。

Struts框架的实例

下面是一个简单的Struts框架实例,包括一个Action、一个Interceptor、一个Result和一个配置文件。

Action

public class MyAction extends ActionSupport {
    private String message;

    @Override
    public String execute() throws Exception {
        setMessage("Hello, Struts!");
        return SUCCESS;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

Interceptor

public class MyInterceptor implements Interceptor {
    public void init() {
        System.out.println("My Interceptor initialized.");
    }

    public void destroy() {
        System.out.println("My Interceptor destroyed.");
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("My Interceptor pre-processing.");
        String result = invocation.invoke();
        System.out.println("My Interceptor post-processing.");
        return result;
    }
}

Result

public class MyResult implements Result {
    private String resultValue;

    public String getResultValue() {
        return resultValue;
    }

    public void setResultValue(String resultValue) {
        this.resultValue = resultValue;
    }

    public void execute(ActionInvocation invocation) throws Exception {
        System.out.println("My Result executing.");
        String message = ((MyAction) invocation.getAction()).getMessage();
        setResultValue(message);
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println(message);
    }

}

配置文件

<?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>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />

    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="myInterceptor" class="com.example.MyInterceptor"></interceptor>
        </interceptors>
        <default-interceptor-ref name="myInterceptor" />
        <action name="myAction" class="com.example.MyAction">
            <result type="com.example.MyResult"></result>
        </action>
    </package>
</struts>

在这个示例中,我们创建了一个名为"myAction"的Action,该Action会被映射到配置文件中的"/myAction" URL。Action中的execute()方法返回一个"SUCCESS"字符串,这意味着Struts应该将请求的处理交给一个Result对象。

MyResult对象是一个自定义的Result,它在Action执行成功后将数据写回HTTP响应中。MyInterceptor对象是一个自定义的Interceptor,它会在整个请求处理流程中注入一些逻辑。

另一个Struts框架的示例

下面是另一个Struts框架的示例,包括一个Action、一个Interceptor和一个配置文件。

Action

public class LoginAction extends ActionSupport {

    private String username;
    private String password;

    @Override
    public String execute() throws Exception {
        if ("admin".equals(getUsername()) && "admin".equals(getPassword())) {
            return SUCCESS;
        } else {
            return ERROR;
        }
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }

}

Interceptor

public class AuthenticationInterceptor implements Interceptor {
    public void init() {
        System.out.println("AuthenticationInterceptor initialized.");
    }

    public void destroy() {
        System.out.println("AuthenticationInterceptor destroyed.");
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context = invocation.getInvocationContext();
        Map<String, Object> session = context.getSession();

        if (session.get("username") == null) {
            return "login";
        } else {
            return invocation.invoke();
        }
    }
}

配置文件

<?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>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />

    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="authenticationInterceptor" class="com.example.AuthenticationInterceptor"></interceptor>
        </interceptors>
        <default-interceptor-ref name="authenticationInterceptor" />
        <action name="login" class="com.example.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </package>
</struts>

在这个示例中,我们创建了一个名为"login"的Action,它将登录用户的用户名和密码存储在会话中。在配置文件中的AuthenticationInterceptor拦截器会验证用户是否已登录。如果用户已登录,则拦截器将传递请求到Action;否则,拦截器将重定向到"/login"视图。

以上就是Struts框架的核心原理及两个实例的详细介绍。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Structs框架原理案例详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 使用Java实现系统托盘功能的介绍(附源码以及截图)

    使用Java实现系统托盘功能的介绍(附源码以及截图) 什么是系统托盘功能 系统托盘功能是指将图标置于系统托盘中,以提供快速访问与系统交互的功能,Windows系统右下角的区域就是系统托盘。Java在Swing开发中提供了 TrayIcon 和 SystemTray 两个类来实现该功能。 实现原理 使用 Java 中的 TrayIcon 和 SystemTra…

    Java 2023年5月24日
    00
  • 解决maven update project 后项目jdk变成1.5的问题

    以下是详细的攻略: 背景 在使用 Maven 更新项目后,有时会发现项目的 JDK 版本被更改为了1.5(或其他版本),造成编译失败等问题。这种情况通常是因为 Maven 没有正确识别项目的 JDK 版本而导致的。 解决方法 方案一:手动配置 Maven 设置 找到你的 Maven 安装目录下的 conf 目录,进入其中的 settings.xml 文件。 …

    Java 2023年5月19日
    00
  • InputStreamReader和BufferedReader用法及实例讲解

    InputStreamReader和BufferedReader用法及实例讲解 在Java中,读取文件或者网络数据时,我们通常会用到InputStreamReader和BufferedReader这两个类。InputStreamReader是将字节流转换成字符流,而BufferedReader则是为了加速读取字符流而存在的。下面我们将逐步讲解这两个类的用法及…

    Java 2023年5月20日
    00
  • Spring零基础到进阶之使用方法详解

    Spring零基础到进阶之使用方法详解 什么是Spring Spring 是一个开放源代码的设计层面框架,它解决的是业务层和其他各层的耦合问题,使得整个系统架构清晰、易于维护、扩展性强。 Spring框架的模块 Spring框架分为20多个模块,其中最常用的是Core Container、Data Access/Integration、Web、AOP,下面分…

    Java 2023年5月19日
    00
  • javaweb开发提高效率利器JRebel详解

    JRebel是什么 JRebel是一个Java开发生产力工具,它可以消除Java程序中常见的重启服务、重建工程和重新部署过程。JRebel可以显著提高Java开发者的生产力,让他们将更多的时间花在创造新价值上。 JRebel能做什么 JRebel可以实现Java应用程序的热部署,即在不用重启和重新部署的情况下,将Java代码的变更更新到应用程序中。JRebe…

    Java 2023年5月26日
    00
  • java lambda循环_使用Java 8 Lambda简化嵌套循环操作

    下面是关于Java 8 Lambda简化嵌套循环操作的攻略: 1. lambda表达式简介 Java 8引入了lambda表达式,它是一种匿名函数,可以像参数一样传递给方法或赋值给变量。在使用lambda表达式时只需要关注其输入和输出,而不必关心具体的实现细节,这让代码变得更加简洁易读。 2. 简化循环操作 在Java 8之前,嵌套循环操作可能会使代码显得冗…

    Java 2023年5月26日
    00
  • 教你用Java GUI实现文本文件的读写

    教你用Java GUI实现文本文件的读写 如果你想在Java图形用户界面(GUI)中实现文本文件的读写,可以按照以下步骤操作: 1. 创建GUI界面 首先,需要创建一个GUI界面,让用户可以输入和查看文件的内容。可以使用Swing或JavaFX等GUI框架来创建GUI界面。 以下是一个简单的使用JavaFX创建GUI界面的示例代码: import javaf…

    Java 2023年5月20日
    00
  • Java线程Timer定时器用法详细总结

    Java线程Timer定时器用法详细总结 在Java中,Timer定时器也称为计时器,它是一种简单的定时任务调度,可以设定指定时间时刻后执行一段代码,这种方式常常用于需要定时执行某些任务的场景,如定时检查网络连接、定时备份数据等。本文将详细总结Java线程Timer定时器的用法。 1. Timer定时器的使用 1.1 创建Timer对象 在Java中,创建T…

    Java 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部