一、简介
Struts是一种基于MVC设计模式的Web应用程序框架。它非常适合于面向数据表格、表格链接和适应多个数据库环境的应用程序。而OGNL(Object Graph Navigation Language)是Struts框架中的一种表达式语言,用于表达访问对象图结构的多级路径。
其中,栈是Struts框架下和OGNL表达式密切相关的一个重要组成部分,它被用作存储选定的表单域或Bean对象的键值对。栈值是保存在Struts框架所定义的栈对象中的值,用来传递数据或将其共享到不同的内部结构中。
下面将详细讲解Java的Struts框架中栈值和OGNL的使用,并提供两个示例。
二、使用栈值
使用Struts框架时,我们可以在Java类级别的操作中访问当前HTTP会话的属性。我们可以使用HTTP ServletRequest
和使用HTTP会话设定属性名和属性值。这些值在整个请求中都可用,包括在呈现JSP视图时。
示例1:在Struts Action中使用栈值
我们可以在Action中使用栈值来传递参数。例如:
首先,在Action
中,定义返回值为SUCCESS
和一个数据对象(这里使用了一个JavaBean):
public class HelloWorldAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String message;
private HelloWorldBean helloWorldBean;
public HelloWorldAction() {
helloWorldBean = new HelloWorldBean();
}
public String execute() throws Exception {
setMessage(helloWorldBean.sayHello());
return Action.SUCCESS;
}
// getters and setters
}
然后,我们在JSP页面中将它们与栈值进行连接:
<s:form action="helloStruts" method="post">
<s:textfield name="message" label="Message"/>
<s:submit value="Say Hello"/>
</s:form>
在这种情况下,执行execute()
方法时,栈中的message
属性将被填充为表单提交中的参数。我们可以使用传递给setText()
的值来更新该属性,例如:
public String execute() throws Exception {
if (/* 某个条件 */) {
addActionError("Please enter a valid name!");
} else {
setMessage(helloWorldBean.sayHello());
}
return Action.SUCCESS;
}
示例2:在自定义拦截器中使用栈值
我们可以使用自定义拦截器提供Struts中缺失的或自己独有的功能。下面是一个简单的自定义拦截器示例,用于记录页面请求的响应时间,并将响应时间添加到页面内容中:
public class ExecutionTimeInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
public static final String EXECUTION_TIME_ATTRIBUTE = "execution-time";
public String intercept(ActionInvocation invocation) throws Exception {
long startTime = System.currentTimeMillis();
String result = invocation.invoke();
long endTime = System.currentTimeMillis();
Map<String, Object> context = invocation.getInvocationContext().getContextMap();
HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
String content = ((String) context.get(ServletActionContext.HTTP_RESPONSE_BODY)).replaceFirst("</body>",
"<div style='position: fixed; top: 0; right: 0; background-color: #d8d8d8; padding: 3px; border: 1px solid #7F7F7F;'>"
+ "Response Time: " + (endTime - startTime) + "ms</div></body>");
request.setAttribute(EXECUTION_TIME_ATTRIBUTE, (endTime - startTime) + "ms");
context.put(ServletActionContext.HTTP_RESPONSE_BODY, content);
return result;
}
public void destroy() {
}
public void init() {
}
}
在自定义拦截器ExecutionTimeInterceptor
中,我们使用HttpServletRequest
对象来访问栈中存储的请求属性。当请求完成时,我们将响应时间添加到页面内容中,并将执行时间存储在请求属性中。
三、使用OGNL
使用OGNL,我们可以轻松地通过引用对象、访问属性、执行方法、访问数组以及在对象图的层次结构中导航数组、属性和方法之间的关系。
示例3:访问Map中的元素
首先,我们需要定义一个返回Map
类型对象的JavaBean:
public class MyBean {
private Map<String, String> map = new HashMap<String, String>();
public MyBean() {
map.put("name", "value");
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
然后,我们可以在JSP中使用OGNL表达式来访问该Map的元素:
<s:property value="#myBean.map['name']"/>
这将输出value
。
示例4:导航对象图结构
假设我们有一个JavaBean定义为:
public class Person {
private String name;
private int age;
private List<String> children;
// getters and setters
}
我们可以使用OGNL表达式来访问Person
的属性和方法:
<s:property value="name"/>
<s:property value="age"/>
<s:iterator value="children">
<s:property value="length()"/>
</s:iterator>
使用<s:property>
标记,我们可以直接访问Person
的属性。使用<s:iterator>
标记,我们可以遍历Person
的children
属性,其值是一个List
。同时,我们可以使用length()
方法来访问每个元素的长度。
四、总结
本文介绍了Struts框架中栈和OGNL的基础知识,提供了两个栈值的示例和两个OGNL的示例。在使用Struts框架和Struts标签库时,了解如何使用栈和OGNL表达式非常重要,尤其是希望进一步了解Struts和相关技术的开发人员。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java的Struts框架中栈值和OGNL的使用 - Python技术站