下面我将详细讲解如何自定义一个基于Struts2的MVC框架。
1. 确定项目结构
首先,在项目中,我们需要有一个Controller类来处理请求,并调用对应的Service处理业务逻辑。同时,还要有一个View类负责页面的展示。在这里,我们可以采用MVC的经典分层结构,将不同的代码放在不同的包中:
com.example.framework.mvc
├─ controller
│ ├─ BaseAction.java
│ └─ UserController.java
│
├─ model
│ └─ User.java
│
├─ service
│ ├─ BaseService.java
│ └─ UserService.java
│
├─ view
│ ├─ BaseView.java
│ └─ UserView.java
│
├─ util
│ └─ AppUtil.java
│
└─ App.java
2. 定义MVC核心类
接下来,我们需要定义MVC的核心类,包括Action、View和Service。这里我们先定义一个BaseAction基类,包含常用的请求参数和方法,然后再定义一个UserController类,继承自BaseAction。
package com.example.framework.mvc.controller;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* MVC框架基类
*/
public class BaseAction extends ActionSupport {
protected HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}
protected HttpServletResponse getResponse() {
return ServletActionContext.getResponse();
}
protected void write(String text) {
PrintWriter out = null;
try {
out = getResponse().getWriter();
out.write(text);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
}
然后我们再定义一个UserController类,负责处理关于用户的请求。在该类中,我们需要实现execute方法,并调用对应的Service处理业务逻辑。
package com.example.framework.mvc.controller;
import com.example.framework.mvc.model.User;
import com.example.framework.mvc.service.UserService;
import com.example.framework.mvc.view.UserView;
import java.util.List;
/**
* 用户Controller类
*/
public class UserController extends BaseAction {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public String execute() throws Exception {
List<User> userList = this.userService.getUserList();
UserView view = new UserView(userList);
String output = view.render();
write(output);
return null;
}
}
3. 定义Service层
接下来,我们需要定义Service层,负责处理业务逻辑。在这里,我们定义一个BaseService基类,并在其子类UserService中实现获取用户列表的方法。
package com.example.framework.mvc.service;
import java.util.List;
/**
* MVC框架基础Service
*/
public class BaseService {
}
package com.example.framework.mvc.service;
import com.example.framework.mvc.model.User;
import java.util.ArrayList;
import java.util.List;
/**
* 用户Service
*/
public class UserService extends BaseService {
public List<User> getUserList() {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 20));
userList.add(new User(2, "李四", 22));
userList.add(new User(3, "王五", 25));
return userList;
}
}
4. 定义View层
最后,我们需要定义View层,负责展示页面。在这里,我们定义一个BaseView基类,并在其子类UserView中实现模板渲染的方法。
package com.example.framework.mvc.view;
/**
* MVC框架基础View
*/
public class BaseView {
protected String template = "";
public BaseView(String template) {
this.template = template;
}
public String render() {
// 解析模板
String html = parse();
// 渲染页面
return html;
}
protected String parse() {
// 解析模板
return "";
}
}
package com.example.framework.mvc.view;
import com.example.framework.mvc.model.User;
import java.util.List;
/**
* 用户View
*/
public class UserView extends BaseView {
private List<User> userList;
public UserView(List<User> userList) {
super("<html><body>{{for user in users}}<p>{{user.name}},{{user.age}}</p>{{endfor}}</body></html>");
this.userList = userList;
}
@Override
protected String parse() {
// 替换模板中的变量
String html = template.replace("{{for user in users}}", "");
for (User user : userList) {
html += template.replace("{{user.name}}", user.getName())
.replace("{{user.age}}", String.valueOf(user.getAge()));
}
html += template.replace("{{endfor}}", "");
return html;
}
}
5. 搭建框架并运行示例
最后,我们需要搭建整个框架,并运行一个示例。
在这里,我们可以采用Maven构建,配置好pom文件后就能快速构建整个工程。具体的步骤可以参考Apache Maven官网,这里不过多赘述。
在运行示例前,我们还需要在工程中加入Struts2的相关依赖,这里以Struts2 2.5.22版本为例。在pom.xml中加入以下相关依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version>
</dependency>
然后编写配置文件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>
<package name="default" namespace="/" extends="struts-default">
<action name="users" class="com.example.framework.mvc.controller.UserController">
<result type="plainText"></result>
</action>
</package>
</struts>
最后,在main方法中初始化MVC框架,并启动服务:
package com.example.framework.mvc;
import com.example.framework.mvc.controller.UserController;
import com.example.framework.mvc.service.UserService;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.DispatcherListener;
import org.apache.struts2.dispatcher.ng.ServletContextHostConfig;
import java.util.ArrayList;
import java.util.List;
public class App {
public static void main(String[] args) throws Exception {
Dispatcher dispatcher = createDispatcher();
dispatcher.init();
}
private static Dispatcher createDispatcher() {
Dispatcher dispatcher = new Dispatcher(new ServletContextHostConfig());
List<DispatcherListener> listeners = new ArrayList<>();
listeners.add(new com.opensymphony.xwork2.util.log.LoggerFactory());
dispatcher.setListeners(listeners);
dispatcher.setActionConfigPath("/");
return dispatcher;
}
}
至此,我们已完成了自定义的Struts2 MVC框架的搭建。我们可以启动服务了,通过http://localhost:8080/users进行访问。
运行示例后页面将会展示以下内容:
张三,20
李四,22
王五,25
在这个示例中,我们通过自定义MVC框架,实现了获取用户列表并展示在页面上的功能。同时,我们还实现了视图层和业务逻辑层的分离,提高了代码的可维护性和可扩展性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2自定义MVC框架 - Python技术站