OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱爲EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。
下面,我們來使用ognl來實現數據類型的轉換,首先還是建立一個頁面
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <html>
- <head>
- <title> 登錄頁面 </title>
- <link rel=stylesheet href="css/login.css" type="text/css">
- </head>
- <body>
- <h1 align="center">用戶登錄頁面</h1>
- <hr>
- <div align="center">
- <form action="login.lp" method="post">
- <table cellspacing=5 border=5 bodercolor=#ffaa00 >
- <tr><th colspan="3" align="center" bgcolor=#ffaa00>用戶登錄</th></tr>
- <tr>
- <th rowspan="3" background="images/2.jpg" style="width=90px"></th>
- <td>用戶名:</td><td><input type="text" class="message" name="user"></td></tr>
- <tr><td>密 碼:</td><td><input class="message" type="password" name="user"></td></tr>
- <tr><td>日 期:</td><td><input class="message" type="text" name="user"></td></tr>
- <tr><td colspan="3" align="center"><input type="submit" value="登錄"> <input type="reset" value="重置"></td></tr>
- </table>
- </form>
- </div>
- </body>
- </html>
2、寫一個User的From類,用來封裝表單傳遞過來的值,
- package myclass.struts2.form;
- import java.util.Date;
- public class User {
- public String name;
- public String password;
- public Date birth;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public Date getBirth() {
- return birth;
- }
- public void setBirth(Date birth) {
- this.birth = birth;
- }
- }
3、接下來就要寫一個轉換的類UserFormTypeConverter,用於對象與字符等各種數據的轉換,該類繼承了DefaultTypeConverter我們需要重寫其中的ConvertefromString和convertToString方法。即ConvertefromString是將客戶端的數據轉換成其他類型,convertToString是將服務器端的數據轉換成在頁面上要顯示的內容
- //類型轉換器
- public class UserFormTypeConverter extends DefaultTypeConverter{
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
- @Override
- public Object convertValue(Map<String, Object> context, Object value,
- Class toType) {
- System.out.println("conver");
- //轉換成對象
- if(toType==User.class){
- User user= new User();
- String para[]=(String[])value;
- String name=para[0];
- String password=para[1];
- try {
- Date birth=sdf.parse(para[2]);
- user.setName(name);
- user.setPassword(password);
- user.setBirth(birth);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return user;
- }
- else if(toType==String.class){//從對象轉換成字符串
- User user=(User)value;
- return "<"+user.getName()+","+user.getPassword()+","+user.getBirth().toString()+">";
- }
- //轉換成字符串
- return null;
- }
- }
需要注意的是,局部使用時在Action的同目錄下建立對應的XxxxAction-conversion.properties XxxxAction的名字對應Action類的名字,比如這裏爲 ChangeAction-conversion.properties 內容如下
對屬性進行轉換註冊(其實是setter和getter方法)
user=ognls.UserTypeConverter如果在多個action中使用到UserBean類型轉換器 那麼建議採用全局的配置在src目錄下建立 xwork-conversion.properties 內容如下jsp_servlet.UserBean=ognls.UserTypeConverter#key是bean對象類 value是對應的類型轉換器對象。
也可以使用繼承StrutsTypeConverter類再實現,這種方法在使用中很方便,通常建議使用這種方法,如下:
- package myclass.struts2.action;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Map;
- import myclass.struts2.form.User;
- import org.apache.struts2.util.StrutsTypeConverter;
- public class UserFormTypeConverter1 extends StrutsTypeConverter{
- public SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
- //轉換成對象
- public Object convertFromString(Map context, String[] value, Class toType) {
- User user=new User();
- String para[]=value;
- String name=para[0];
- String password=para[1];
- try {
- Date birth=sdf.parse(para[2]);
- user.setName(name);
- user.setPassword(password);
- user.setBirth(birth);
- } catch (ParseException e) {
- System.out.println("日期轉換異常!");
- e.printStackTrace();
- }
- return user;
- }
- //轉換成字符串
- public String convertToString(Map arg0, Object o) {
- String result=null;
- if(o instanceof User){
- User user=new User();
- result="<"+user.getName()+","+user.getPassword()+","+user.getBirth().toString()+">";
- }
- return result;
- }
- }
4、下面就可以來建立action類了
- package myclass.struts2.action;
- import myclass.struts2.form.User;
- import com.opensymphony.xwork2.ModelDriven;
- public class LoginAction{
- public User user;
- public String execute(){
- System.out.println("我進來了呢");
- System.out.println(user.getName());
- System.out.println(user.getPassword());
- System.out.println(user.getBirth());
- if("liping".equals(user.getName())&"123456".equals(user.getPassword())){
- return "succ";
- }else{
- return "fail";
- }
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public User getBoss() {
- return boss;
- }
- public void setBoss(User boss) {
- this.boss = boss;
- }
- }
5、最後配置struts.xml文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.action.extension" value="lp" />
- <package name="login" namespace="/" extends="struts-default">
- <action name="login" class="myclass.struts2.action.LoginAction">
- <result name="succ">/succ.jsp</result>
- <result name="fail">/failure.jsp</result>
- </action>
- </package>
- <package name="logout" namespace="/" extends="struts-default">
- <action name="logout" class="myclass.struts2.action.LogoutAction">
- <result name="exit">/exit.jsp</result>
- </action>
- </package>
- </struts>
到這裏,這個轉換器的實例就建立好了,不過,實際運行中,發現轉換後的日期的月份始終是一月,而且兩種轉換的方法都有這個問題,我想這可能ognl的一個bug吧。