### Struts2 OGNL 表单提交问题详解 #### 一、背景介绍 Struts2框架作为一款流行的企业级应用开发框架,在处理MVC架构方面有着独特的优势。其中,OGNL (Object-Graph Navigation Language) 作为一种强大的表达式语言,被广泛应用于Struts2中进行数据模型的访问及操作。本文将详细介绍如何利用OGNL优化Struts2中的表单提交逻辑。 #### 二、原始方案解析 原始示例中展示了如何通过Struts2框架处理简单的登录验证流程。具体包括: - **登录页面**(`login.jsp`):定义了一个表单,包含用户名和密码两个字段。 - **请求处理类**(`LoginAction.java`):实现了登录逻辑的校验,即比较前端传入的用户名和密码是否匹配预设值。 - **响应页面**(`HelloWorld.jsp`):展示登录结果的信息。 此方案中,表单中的每个字段都需要在Action类中声明对应的属性,并提供相应的getter和setter方法。当表单字段较多时,这样的设计会使得Action类变得臃肿,不易维护。 #### 三、改进方案分析 为了解决上述问题,可以采用更灵活的数据模型——**POJO**(Plain Old Java Object),并通过OGNL表达式简化数据绑定的过程。改进后的方案如下: - **改进后的登录页面**(`login.jsp`):保留原有表单结构。 - **改进后的请求处理类**(`LoginAction.java`):引入一个新的内部类`UserInfo`用于封装表单数据,并使用OGNL表达式进行数据绑定。 #### 四、改进后方案的详细实现 ##### 1. 登录页面 (`login.jsp`) ```jsp <%@page language="java" contentType="text/html;charset=utf-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Login Page</title> </head> <body> <s:form action="/test/loginAction.action" method="post"> <s:textfield name="userInfo.userName" label="用户名"/> <s:password name="userInfo.password" label="密码"/> <s:submit/> </s:form> </body> </html> ``` ##### 2. 请求处理类 (`LoginAction.java`) ```java package tutorial; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private UserInfo userInfo = new UserInfo(); public String execute() { if ("xiaozhu".equals(userInfo.getUserName()) && "111111".equals(userInfo.getPassword())) { return SUCCESS; } else { addActionError("用户名或密码错误"); return ERROR; } } // 使用OGNL进行数据绑定 public UserInfo getUserInfo() { return userInfo; } public void setUserInfo(UserInfo userInfo) { this.userInfo = userInfo; } static class UserInfo { private String userName; private String password; 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; } } } ``` ##### 3. 响应页面 (`HelloWorld.jsp`) ```jsp <%@page language="java" contentType="text/html;charset=utf-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Welcome</title> </head> <body> <% if (request.getAttribute("javax.servlet.error.status_code") != null && request.getAttribute("javax.servlet.error.status_code").toString().equals("404")) { %> <h3>Error 404: Page Not Found</h3> <% } else { %> <h3>Welcome, <s:property value="userInfo.userName"/>!</h3> <% } %> </body> </html> ``` #### 五、总结 通过引入内部类`UserInfo`并将表单数据映射到该对象中,不仅减少了Action类中的属性数量,还提高了代码的可读性和可维护性。此外,使用OGNL表达式进行数据绑定,进一步简化了表单提交的逻辑处理过程。这种改进方案符合面向对象的设计原则,有助于构建更加清晰、模块化的应用程序。
- 爱笑的小兔子2012-11-13问题总结的很多,有点点不全,米找到我的问题不过还是谢谢分享
- 枫林落叶2012-06-15提到的问题还可以,有我需要的,就是不是很全,也有好多没有
- 粉丝: 5
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助