动作类:
public class CustomerAction extends ActionSupport
implements ModelDriven<CstCustomer>{
private ICustomerService customerService =new CustomerServiceImpl();
private CstCustomer customer =new CstCustomer();
public CstCustomer getModel(){
return customer;
}
/**
* 添加客户
*/
public String addCustomer(){
//保存操作
customerService.saveCustomer(customer);
return"addCustomer";
}
/**
* 添加客户页面的展示
*/
public String addCustomerUI(){
//1.获取客户来源的列表
List<CstBaseDict> basedicts = customerService.findAllCustomerSource();
//2.把查询出来的结果存入请求域中
HttpServletRequest request =ServletActionContext.getRequest();
request.setAttribute("baseDicts",basedicts);
return"addCustomerUI";
}
}
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>OGNL的入门</title>
</head>
<body>
<%--1.要想使用OGNL,必须在struts2的标签中配置
2.OGNL支持普通的方法调用
<s:property value=""/>它就相当于把标签中value属性的取值输出到浏览器上
value属性的取值是一个OGNL表达式,注意不是一个字符串
如果要想让OGNL表达式就当成普通的字符串来处理的话,需要在外面套上单引号
--%>
<s:property value="OGNL-Expression"/><br/>
<s:property value="'OGNL-Expression'"/><br/><%--由于套上了单引号,所以value的取值就变成了一个普通的字符串--%>
<hr/>
<%--3.OGNL访问静态属性
使用的是@包名.类名@静态属性名称
--%>
<s:property value="@java.lang.Integer@MAX_VALUE"/>
<hr/>
<%--4.普通方法调用--%>
<s:property value="'OGNL-Expression'.length()"/>
<s:property value="'OGNL-Expression'.substring(0,5)"/>
<hr/>
<%--5.静态方法调用:
注意要想访问静态方法,必须开启配置:struts.ognl.allowStaticMethodAccess
--%>
<s:property value="@java.lang.Math@random()"/>
<hr/>
<%--6.使用OGNL操作List
注意:使用struts2的表单标签,必须提供name属性
s:radio标签是创建了一组单选按钮
list属性的取值是一个OGNL表达式,把大括号内的每个元素都当成list中的元素。
--%>
<s:radio list="{'男','女'}" name="gender" label="性别"></s:radio>
<hr/>
<%--7.使用OGNL操作Map
#{key:value,key:value}就相当于创建了一个map集合
无论使用struts2的表单哪个标签,最终在浏览器上能解析的都是html标签。
html标签的value取值是map的key,显示浏览器上的信息是map的value。
--%>
<s:radio list="#{'male':'男','female':'女'}" name="gender" label="性别"></s:radio>
</body>
</html>
ContextMap中存放的主要内容 | ||
Key | Value | 说明 |
ValueStack (root) | java.util.List | 它是一个list。key不是ValueStack,而是: com.opensymphony.xwork2.util.ValueStack.ValueStack 。但是我们不用! |
application | java.util.Map<String,Object> | ServletContext中的所有属性。 |
session | java.util.Map<String,Object> | HttpSession中的所有属性。 |
request | java.util.Map<String,Object> | ServletRequest中的所有属性。 |
parameters | java.util.Map | 参数 |
attr | java.util.Map | 把页面、请求、会话、应用范围内的所有属性放到一起。按照从小到大的范围搜索。 |
它判断了当前的动作类是否是ModelDriven类型,如果是的话,转成该类型,并且调用了getMode()方法,这时其实调用的是我们动作类重写接口的方法。
拦截器判断了得到的模型是否为null,如果不为null,进行压栈。(而并没有判断为null的情况,这也就是我们为什么要自己实例化模型的原因)。
接下来,就是JSP页面上form表单了,它的input元素中name属性取值全都变成了OGNL表达式,那么就会从栈顶逐个元素往下查找属性名称,并通过params拦截器给属性赋值。由于我们的模型被拦截器压栈了,所以模型跑栈顶去了,这也就是params拦截器能给我们封装成功的原因。a、取ActionContext中key时使用
例如<s:property value="#name" />
b、OGNL中创建Map对象时使用,例如:<s:radio list="#{'male':'男','female':'女'}" />
$
a、在JSP中使用EL表达式时使用,例如${name}
b、在xml配置文件中,编写OGNL表达式时使用。
%
在struts2中,有些标签的value属性取值就是一个OGNL表达式
例如<s:property value="OGNL Expression" />
还有一部分标签,value属性的取值就是普通字符串
例如<s:textfield value="username"/>
如果想把一个普通的字符串强制看成时OGNL,就需要使用%{}把字符串套起来。
例如<s:textfield value="%{username}"/>。
当然在<s:property value="%{OGNL Expression}" />也可以使用,但不会这么用。