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技术站