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日

相关文章

  • 详解Spring Controller autowired Request变量

    这是一个非常好的问题。在Spring MVC中,控制器(Controller)是用来处理请求的,请求(Request)是一个非常重要的对象。当我们使用@RequestMapping注解处理请求时,经常会使用请求对象(Request)来获取请求中携带的数据和请求参数以及设置响应,包括响应状态、响应头和响应正文等。Autowired是spring框架中的注解,用…

    Java 2023年6月15日
    00
  • SpringBoot定制化Starter实现方法

    让我详细讲解SpringBoot定制化Starter实现方法的完整攻略。 什么是 SpringBoot Starter SpringBoot Starter 是一个提供很多开箱即用功能的集成包(或者说是依赖包)。通常情况下,我们只需要引入这个 Starter,配置一下参数即可,相关的依赖和配置都已经自动完成了。 SpringBoot Starter 的作用 …

    Java 2023年5月19日
    00
  • Java获取当前系统事件System.currentTimeMillis()方法

    当我们需要在Java程序中获取系统时间时,常用的方法是使用System.currentTimeMillis()方法。该方法可以获取当前系统时间的毫秒数。 使用该方法的步骤如下: 步骤1:导入Java.util包 首先我们需要导入Java.util包,因为该包中提供了一些与日期和时间相关的类。 import java.util.*; 步骤2:获取系统时间 接下…

    Java 2023年5月20日
    00
  • java异常和错误类总结(必看篇)

    下面是本文的完整攻略: Java异常和错误类总结(必看篇) 什么是异常和错误? Java程序的运行过程中,可能会出现各种各样的不正常情况,比如输入错误、内存不足、文件不存在等等。这些不正常情况统称为“异常”(Exception)和“错误”(Error)。 异常和错误都是Java的类,都继承自Throwable类。它们之间的区别在于,异常通常是程序运行过程中的…

    Java 2023年5月27日
    00
  • ANGULARJS中用NG-BIND指令实现单向绑定的例子

    下面我将详细讲解关于 ANGULARJS 中使用 ng-bind 指令实现单向绑定的攻略,主要分为以下几个方面。 什么是 ng-bind 指令? ng-bind 是 ANGULARJS 框架中用于将数据值绑定到 HTML 元素中的指令,它用于在模板中动态绑定数据,可以通过变化自动更新绑定数据的值,实现实时更新数据,具体用法如下: <div ng-bin…

    Java 2023年6月15日
    00
  • java JSON解析库Alibaba Fastjson用法详解

    Java JSON解析库Alibaba Fastjson用法详解 JSON作为一种轻量级的数据交换格式,被广泛应用于各种应用中。而Alibaba Fastjson作为一个性能优越、使用简单的JSON解析库,受到了开发者的喜爱。本文将详细讲解Fastjson的使用方法。 前置知识 在使用Fastjson之前,需要了解一些相关的知识: JSON格式(了解其基本结…

    Java 2023年5月26日
    00
  • spring+mybatis实现图书管理系统

    以下是“spring+mybatis实现图书管理系统”的完整攻略。 1. 环境准备 首先需要准备好开发环境,包括以下工具和框架: JDK(Java Development Kit): 用于编译和运行Java程序的开发工具包。 Eclipse(或其他Java开发工具):用于编写和调试Java代码的集成开发环境(IDE)。 Maven:Java项目的构建工具,用…

    Java 2023年6月15日
    00
  • java分布式面试系统限流最佳实践

    针对Java分布式面试系统的限流最佳实践,我将分享以下攻略: 1. 需求调研与场景分析 首先,你需要了解你的系统在什么场景下存在限流的需求,例如有哪些接口需要限流、在什么情况下需要限流等等。在这个阶段中,你需要和业务对接人员进行沟通,了解产品的最大承载量、是否需要分区以及不同区之间的流量比例等。 2. 选择限流算法 常见的限流算法有令牌桶算法、漏桶算法以及计…

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