Java进阶:Struts多模块的技巧

Java进阶: Struts多模块的技巧

简介

在今天的互联网中,Web 应用开发已经成为技术人员的必备技能。Struts 多模块则是其中的一个重要技能。本文将详细讲述如何在 Struts 中使用多模块,并提供两个示例供读者参考。

概述

Struts 是一个基于 MVC 模式,面向 Web 开发的框架。在使用 Struts 进行 Web 应用开发时,我们通常需要考虑到多个模块之间的调用关系。为了解决这个问题,就需要使用 Struts 多模块技巧。

配置多模块

在 Struts 中使用多模块需要进行如下配置:

1. 在 struts.xml 中添加模块

在 struts.xml 中添加相应的模块:

<struts>
    <package name="default">
        <action name="index" class="com.example.IndexAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>

    <package name="admin" extends="default">
        <action name="login" class="com.example.admin.LoginAction">
            <result name="success">/admin/index.jsp</result>
        </action>
    </package>
</struts>

上面的配置定义了两个模块:default 和 admin。其中,admin 模块继承 default 模块,可以使用 default 模块中定义的 action 和 result。

2. 配置模块拦截器

在 struts.xml 中添加拦截器,配置拦截器栈:

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />

    <package name="default">
        <default-interceptor-ref name="defaultStack" />
        <action name="index" class="com.example.IndexAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>

    <package name="admin" extends="default">
        <default-interceptor-ref name="adminStack" />
        <action name="login" class="com.example.admin.LoginAction">
            <result name="success">/admin/index.jsp</result>
        </action>
    </package>

    <interceptors>
        <interceptor-stack name="adminStack">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="params">
                <param name="excludeParams">dojo\..*</param>
            </interceptor-ref>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="debugging"/>
            <interceptor-ref name="scopedModelDriven"/>
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="actionMappingParams"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^dojo\..*|^struts\..*|^method\..*|^action:*</param>
            </interceptor-ref>
        </interceptor-stack>
    </interceptors>
</struts>

上面的配置中定义了两个拦截器栈:defaultStack 和 adminStack。
其中,defaultStack 是默认拦截器栈,用于 default 模块。
adminStack 是针对 admin 模块的拦截器栈。

3. 拆分模块配置文件

将 moduleConfig.xml 拆分为多个文件,更新 struts.xml 配置文件:

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />

    <include file="admin-struts.xml"/>

    <package name="default">
        <default-interceptor-ref name="defaultStack" />
        <action name="index" class="com.example.IndexAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

在上面的配置中,我们使用了 <include> 元素,将 admin-struts.xml
文件包含在 struts.xml 中。

示例一:简单示例

以登录功能为例,讲解如何使用 Struts 多模块实现:

1. index.jsp

<html>
<head>
    <title>登录系统</title>
</head>
<body>
    <form action="<s:url action='admin/login'/>" method="post">
        用户名:<input type="text" name="username" /><br />
        密码:<input type="password" name="password" /><br />
        <input type="submit" value="登录" />
    </form>
</body>
</html>

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

    <package name="admin" extends="default">
        <default-interceptor-ref name="adminStack" />
        <action name="login" class="com.example.admin.LoginAction">
            <result name="success">/admin/index.jsp</result>
        </action>
    </package>

    <interceptors>
        <interceptor-stack name="adminStack">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="params">
                <param name="excludeParams">dojo\..*</param>
            </interceptor-ref>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="debugging"/>
            <interceptor-ref name="scopedModelDriven"/>
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="actionMappingParams"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^dojo\..*|^struts\..*|^method\..*|^action:*</param>
            </interceptor-ref>
        </interceptor-stack>
    </interceptors>
</struts>

3. LoginAction.java

package com.example.admin;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

    private String username;
    private String password;

    public String execute() throws Exception {
        if("admin".equals(username) && "admin".equals(password)) {
            return SUCCESS;
        }
        return ERROR;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

示例二:高级示例

以上传文件功能为例,讲解如何使用 Struts 多模块实现:

1. index.jsp

<html>
<head>
    <title>上传文件</title>
</head>
<body>
    <form action="<s:url action='file/upload'/>" enctype="multipart/form-data" method="post">
        选择文件:<input type="file" name="file" /><br />
        <input type="submit" value="上传" />
    </form>
</body>
</html>

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

    <package name="file" extends="default">
        <default-interceptor-ref name="fileStack" />
        <action name="upload" class="com.example.file.UploadAction">
            <result name="success">/file/index.jsp</result>
        </action>
    </package>

    <interceptors>
        <interceptor-stack name="fileStack">
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="basicStack"/>
        </interceptor-stack>
    </interceptors>
</struts>

3. UploadAction.java

package com.example.file;

import java.io.File;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

    private File file;
    private String fileContentType;
    private String fileFileName;

    public String execute() throws Exception {
        String filePath = "C:/upload";
        File dir = new File(filePath);
        if(!dir.exists()) {
            dir.mkdirs();
        }
        FileUtils.copyFile(file, new File(dir, fileFileName));
        return SUCCESS;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getFileContentType() {
        return fileContentType;
    }

    public void setFileContentType(String fileContentType) {
        this.fileContentType = fileContentType;
    }

    public String getFileFileName() {
        return fileFileName;
    }

    public void setFileFileName(String fileFileName) {
        this.fileFileName = fileFileName;
    }
}

总结

以上是 Struts 多模块的技巧攻略。使用 Struts 多模块可以更方便地管理 Web 项目,并且提高开发效率。读者可以根据上述两个示例进行实践和学习。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java进阶:Struts多模块的技巧 - Python技术站

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

相关文章

  • Spring Boot整合Web项目常用功能详解

    下面我给你详细讲解SpringBoot整合Web项目常用功能的完整攻略: 一、概述 SpringBoot是一种可以简化Spring应用程序的创建和开发过程的框架。在Web应用程序中,常见的功能包括:前端页面开发、路由、数据接收和处理、数据持久化等。SpringBoot在这些方面均提供了相应的支持和优化,能够让Web应用的开发更加高效和方便。 二、常用功能 1…

    Java 2023年5月15日
    00
  • 详解Java中native关键字

    首先我们需要了解一下Java中native关键字的含义。 Native关键字 在Java中,native关键字被用来修饰一个方法,标记这个方法是用外部语言(如C或C++)实现的。通俗地说,native表示这个方法的实现不是在Java代码中,而是在外部的二进制库中。使用native可以让Java代码与外部代码(如C++)实现交互,为Java提供了更强大的功能。…

    Java 2023年5月26日
    00
  • Java字符串写入文件三种方式的实现

    【Java字符串写入文件三种方式的实现】 写入文件是我们在Java程序开发中常见的任务之一。而字符串写入文件则更为常见,因为我们需要保存或输出的许多数据都是由字符串组成的。在这个攻略中,我将向你展示如何使用三种不同的方式在Java中将字符串写入文件。 方式一:使用字符流写入文件 使用字符流写入文件并不难,主要分为三步: 创建一个文件输出流。可以使用Java中…

    Java 2023年5月20日
    00
  • Spring MVC参数校验详解(关于`@RequestBody`返回`400`)

    关于Spring MVC参数校验,可以分为两种情况讨论:针对普通请求参数的校验和针对请求体中的JSON格式数据的校验。这里我们主要讲解后者,即针对@RequestBody注解返回400错误时的问题。 1. 报错原因 在开发中,当我们使用@RequestBody注解接收请求体中的JSON格式数据时,经常会遇到传入的参数格式不正确的情况,比如类型不匹配、缺失必要…

    Java 2023年5月20日
    00
  • java实现单链表中的增删改

    让我们来讲解一下Java实现单链表中的增删改的完整攻略。 一、单链表概述 单链表是一种线性数据结构,它是由若干个节点组成,每个节点包含两部分,一部分是存储数据的元素,另一部分是指向下一个节点的指针。单链表的头节点没有前驱节点,尾节点没有后继节点。 单链表常用的操作有插入、删除、修改和查询,其中插入和删除操作是单链表的核心操作。 二、Java单链表实现 下面我…

    Java 2023年5月19日
    00
  • 垃圾收集器接口的作用是什么?

    以下是关于垃圾收集器接口的详细讲解: 什么是垃圾收集器接口? 垃圾收集器接口是 Java 虚拟机提供的一组接口,用于实现自定义的垃圾收集器。通过实现垃圾收集器接口,可以自定义垃圾收集器的行为和策略,以满足不同的应用场景和需求。 垃圾收集器接口包括以下几个接口: Collector:垃圾收集器接口,定义了垃圾收集的基本行为和策略。 MemoryPoolMXBe…

    Java 2023年5月12日
    00
  • Java中对象的序列化方式克隆详解

    Java中对象的序列化方式克隆详解 什么是对象的序列化? 在Java中,对象的序列化是指将Java对象转换为二进制流的过程。序列化可以将对象存储在文件或者在网络传输中进行传输,也可以通过反序列化将二进制流转换为Java对象。 Java中提供了java.io.Serializable接口,如果一个类实现了这个接口,则该类的对象可以被序列化。 Java中的序列化…

    Java 2023年5月26日
    00
  • Java SpringBoot使用guava过滤器

    Java SpringBoot使用Guava过滤器攻略 在Java SpringBoot中使用Guava库来实现过滤器可以非常方便地对数据进行过滤和转换。以下是实现该功能的完整攻略: 第一步:添加Maven依赖 在pom.xml文件中添加以下依赖: <dependencies> <dependency> <groupId>…

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