一、OGNL
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
二、特点:
1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。
2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:
<s:propertyvalue="xxx"/>。
3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。
4.值栈(ValueStack) :
可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。
三、OGNL中重要的3个符号:#、%、$:
#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……
1.#符号的用途一般有三种。
— 访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(“msg”) 。
— 用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==’pla1’}.{age}[0]。
— 用来构造Map,例如示例中的#{‘foo1’:’bar1’, ‘foo2’:’bar2’}。
2.%符号
%符号的用途是在标志的属性为字符串类型时,告诉编译环境此字符串为OGNL表达式。
3.$符号
$符号主要有两个方面的用途。
— 在国际化资源文件中,引用OGNL表达式,例如:
<result type="success">useraction.action?msg=${msg}</result>
四、struts2标签
这里只对struts2标签进行简单的学习,一般在项目开发中前后台会进行分离开发。
例:使用struts2实现一个简单的登录模块。
person.java
package com.it.struts.entity;
public class person {
private String pname;
private String pwd;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public person(String pname, String pwd) {
super();
this.pname = pname;
this.pwd = pwd;
}
public person() {
super();
}
}
login.sp
<s:form action="personAction!login" method="post">
<s:textfield name="pname" label="用户名"></s:textfield>
<s:textfield name="pwd" label="密码"></s:textfield>
<tr>
<td colspan="2">
<s:submit theme="simple" value="提交"></s:submit>
<s:submit theme="simple" value="重置"></s:submit>
</td>
</tr>
</s:form>
这里注意,textfield 默认设置表格属性,所以之后的提交、重置按钮需要加入<td><tr>
进行格式控制。
struts.xml
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="false" />
<package name="default" namespace="/person" extends="struts-default">
<action name="personAction" class="com.it.struts.action.PersonAction1">
<result name="success">show.jsp</result>
<result name="error" type="redirect">login.jsp</result>
</struts>
这里struts.enable.DynamicMethodInvocation = true,设置为动态方法调用,配置文件才会识别personAction!login,并调用action中的login方法。
PersonAction1.java
package com.it.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.it.struts.entity.person;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class PersonAction1 extends ActionSupport implements ModelDriven<person>{
person person = new person();
@Override
public person getModel() {
// TODO Auto-generated method stub
return person;
}
public String login() throws Exception {
System.out.println("login");
String path = null;
if("abc".equals(person.getPname())&&"123".equals(person.getPwd())) {
path = SUCCESS;
}
else {
path = INPUT;
}
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute("name",person.getPname());
return path;
}
public String reg() throws Exception {
// TODO Auto-generated method stub
String path = null;
if("abc".equals(person.getPname())&&"123".equals(person.getPwd())) {
path = SUCCESS;
}
else {
path = INPUT;
}
return path;
}
}
这里的action传值使用的是模型驱动方式,一般使用此方法获取参数。
person person = new person();
@Override
public person getModel() {
// TODO Auto-generated method stub
return person;
}
show.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
hello<s:property value="pname"/>
hello:${name}
hello:${sessionScope.name}
</body>
</html>
这的三种写法都可以获得 pname的值;
五、使用struts2实现一个注册:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'ui.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style type="text/css">
*{font-size:12px;font-style: normal;}
.label{font-style: normal;}
</style>
</head>
<body>
<s:form action="ui.action">
<s:textfield name="emp.name" label="姓名"></s:textfield>
<s:password name="emp.pass" label="密码"></s:password>
<s:radio name="emp.sex" listKey="key" listValue="value" list="#{1:'男', 2: '女'}" value="1" label="性别"></s:radio>
<s:checkbox name="emp.marry" label="婚否?" labelposition="left" value="1"></s:checkbox>
<s:checkboxlist name="emp.hobby" listKey="key" listValue="value" list="#{1:'运动', 2: '上网', 3: '房地产', 4:'经商'}" value="{1,3}" label="爱好"></s:checkboxlist>
<s:textarea name="emp.intro" label="简介" ></s:textarea>
<s:select name="emp.dept" label="部门" list="#{1:'销售部',2:'生产车间',3:'宣传部',4:'办公室'}"></s:select>
<s:combobox name="emp.book" value="红楼梦" label="你喜欢的图书" list="{'钢铁是怎样炼成的', '红楼梦', '西游记'}"></s:combobox>
<s:hidden name="emp.id" value="100"></s:hidden>
<s:file name="emp.file" label="照片"></s:file>
<tr><td colspan="2" align="right">
<s:submit value="提交" theme="simple"></s:submit>
<s:reset value="重置" theme="simple"></s:reset>
</td></tr>
</s:form>
<h5></h5>
<br/><br/><a href="index.jsp">Back Main menu</a>
</body>
</html>
效果:
这里后台处理与登录相同不再赘述。