有关flash , javascript 的一些小心得
RSS icon Email icon Home icon
  • Flex 的RemoteObject 通讯遇到的问题

    今天做了一些flex的测试,是根据”flex第一步”这一本书来做的,主要是在服务端写一个java的类读取数据库数据,然后通过FDS用remotion来做通讯.

    java服务端是这样写的:

    package tree;
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Collection;
    public class GetUserService {
    public static void main(String args[]){
    GetUserService db = new GetUserService();
    Collection arr = db.getUsers();
    System.out.println(arr.toString());
    }
    //定义函数
    public Collection getUsers(){
    ArrayList<Map> list = new ArrayList<Map>();
    String dbDriver = “com.mysql.jdbc.Driver”;
    String dbServer = “localhost”;
    String dbName = “walktree”;
    String dbUser = “root”;
    String dbPass = “feifei”;
    String url = “jdbc:mysql://” + dbServer +”/”+dbName+”?user=”+dbUser+”&password=”+dbPass;
    try{
    Class.forName(dbDriver);
    }catch(ClassNotFoundException e){
    System.out.println(”连接出错”);
    return null;
    }
    try{
    Connection con = DriverManager.getConnection(url);
    //创建数据库操作对象
    Statement sta = con.createStatement();
    String sql = “select * from userinfo”;
    ResultSet rs = sta.executeQuery(sql);
    Map<String , Object> user;
    while(rs.next()){
    user = new HashMap<String , Object>();
    user.put(”username”, (String)rs.getString(”username”));
    user.put(”url”, (String)rs.getString(”url”));
    user.put(”email”, (String)rs.getString(”email”));
    list.add(user);
    //System.out.println(rs.getString(”username”));
    }
    return list;
    }catch(SQLException e){
    System.out.println(”无数据”);
    return null;
    }
    }
    }

    然后flex代码:
    <?xml version=”1.0″ encoding=”utf-8″?>
    <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” fontSize=”12″
    creationComplete=”init()”>
    <mx:Script>
    <![CDATA[
    import mx.rpc.http.HTTPService;
    import mx.rpc.events.ResultEvent;
    import mx.rpc.events.FaultEvent;
    import flash.events.Event;
    import mx.managers.CursorManager;

    internal function init():void{
    service.getUsers();
    }
    internal function resultHand(evt:ResultEvent):void{
    CursorManager.removeBusyCursor();
    myList.labelField = "username";
    myList.dataProvider = evt.result;
    }
    internal function faultHand(evt:FaultEvent):void{
    emailTxt.text = "fault"+evt.fault;
    trace("fault"+evt.fault);
    }
    internal function selectHand(evt:Event):void{
    var user:Object = myList.selectedItem;
    userPanel.title = "详细信息"+user.username;
    userTxt.text = user.username;
    emailTxt.text = user.email;
    urlTxt.text = user.url;
    }
    ]]>
    </mx:Script>

    <mx:RemoteObject id=”service” fault=”faultHand(event)” showBusyCursor=”true”
    destination=”userService” >
    <mx:method name=”getUsers” result=”resultHand(event)” />
    </mx:RemoteObject>
    <mx:Panel x=”10″ y=”10″ width=”156″ height=”286″ layout=”absolute” title=”名册”>
    <mx:List id=”myList” x=”0″ y=”0″ width=”100%” height=”244″ change=”selectHand(event)”/>
    </mx:Panel>

    <mx:Panel x=”183″ y=”10″ width=”276″ height=”286″ layout=”absolute” id=”userPanel”>
    <mx:Label x=”10″ y=”10″ text=”Label” id=”userTxt” fontWeight=”bold”/>
    <mx:Label x=”12″ y=”38″ text=”Label” id=”emailTxt”/>
    <mx:Label x=”12″ y=”66″ text=”Label” id=”urlTxt”/>
    </mx:Panel>

    </mx:Application>

        最后在tomcat下就是显示不出数据来,于是做了一些测试,在getUsers()函数最后返回一个字符串,如”Hell”,这样在在flex端就可以显示出内容,开始时怎么也想不出问题所在.怀疑是Map的数据与flex的不兼容,于是做了这样一个测试.:

    ArrayList<Map> list = new ArrayList<Map>();
    Map<String , String> note = new HashMap<String, String>();
    note.put(”username”, “king”);
    note.put(”email”, “king@163.com”);
    note.put(”url”,”http://king.com”);
    list.add(note);
    Map<String , String> note2 = new HashMap<String, String>();
    note2.put(”username”, “小明”);
    note2.put(”email”, “xiao@163.com”);
    note2.put(”url”,”http://xiao.com”);
    list.add(note2);
    return list;

        最后可以通过,flex显示,继续找答案,最后终于找到了.是因为服务端的程序,
    Map<String , Object> user;
    user = new HashMap<String , Object>();

    定义了Object,在java中Object类型的数据是如何应用的,我虽然不能说得很明白,但它至少不会像flex中的Object类型一样使用.而这本书明明是这样写的.看来此书《FLEX第一步》的很多代码是未经过测试的。国内的书一般都会多少有这样的特点,不是我极端。
    明白了问题所在后,把上面的代码修改成:
    Map<String , String> user;
    user = new HashMap<String , String>();

    这样返回的值就显示正常了。

  • 解决jsp页面写入中文到mysql时乱码问题

        今天遇到了在jsp页面写入中文到mysql时出现了乱码,已经漫长的过程,问题终于解决了。
       
        先说下自己的开发环境:jsp+Eclipse+mysql+tomcat,现在一般习惯在DW(dreadweaver)下写jsp代码,是通过一个javaBean把数据插入到mysql数据库的。测试后发现英文成功了,但中文现出了:“???”这样的乱码,第一反应是直接在mysql 里执行插入中文语句,mysql成功了,没有出现乱码。于是上网找了很多资料:

        其实无论是用什么编码:gb2312或者utf-8,都要遵循编码统一的道理。就是说如果你在页面中采用了utf-8,那么你建mysql表时也如此,以下是如处需要统一的地方:

    1. 在jsp页面的<%@ page 位置加上 contentType=”text/html; charset=utf-8″ %>,<meta 的位置也是如此:content=”text/html;charset=utf-8″ />
    2. 建立一个mysql数据库,字符集采用utf-8,建表也是如此。
    3. 在getConnection的URL中加上:?useUnicode=true&characterEncoding=UTF-8″,如:url = “jdbc:mysql://localhost:3306/peom?useUnicode=true&characterEncoding=UTF-8″,也就是在peom表的后面
    4. 如果你不是在jsp页面里直接处理form,也是和我一样采用servlet来处理form的话,那么在还要增加一个过滤器,这主要是因为采用的是tomcat的web发布器,如果用resin的话,不会有这样的问题,这也是我后面花了很长时间的原因所在。
      过虑器 SetCharacterEncodingFilter.java  的代码:
      package peom;import java.io.IOException;
      import javax.servlet.Filter;
      import javax.servlet.FilterChain;
      import javax.servlet.FilterConfig;
      import javax.servlet.ServletException;
      import javax.servlet.ServletRequest;
      import javax.servlet.ServletResponse;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletRequestWrapper;

      public class SetCharacterEncodingFilter implements Filter {
          class Request extends HttpServletRequestWrapper
          {
              public Request(HttpServletRequest request) {
                  super(request);
              }

              public String toChi(String input) {
                  try {
                      byte[] bytes = input.getBytes(”ISO8859-1″);
                      return new String(bytes, “utf-8″);
                  } catch (Exception ex) {
                  }
                  return null;
              }

              private HttpServletRequest getHttpServletRequest()
              {
                  return (HttpServletRequest) super.getRequest();
              }

              public String getParameter(String name)
              {
                  return
                  toChi(getHttpServletRequest().getParameter(name));
              }
              public String[] getParameterValues(String name)
              {
                  String values[] =getHttpServletRequest().getParameterValues(name);
                  if (values != null) {
                      for (int i = 0; i < values.length; i++) {
                          values[i] = toChi(values[i]);
                      }
                  }
                  return values;
              }
          }

          public void destroy() {
          }
          public void doFilter(ServletRequest request, ServletResponse
          response,FilterChain chain) throws IOException, ServletException {
              HttpServletRequest httpreq = (HttpServletRequest) request;

              if (httpreq.getMethod().equals(”POST”)) {

                  request.setCharacterEncoding(”utf-8″);

              } else {
                  request = new Request(httpreq);
              }

              chain.doFilter(request, response);
          }

          public void init(FilterConfig filterConfig) throws
          ServletException {
          }  
      }

      然后在WEB-INF目录下的web.xml文件,配置下过虑器,

      <filter>
         <filter-name>SetCharacterEncodingFilter</filter-name>
         <filter-class>peom.SetCharacterEncodingFilter</filter-class>
       </filter>
       <filter-mapping>
         <filter-name>SetCharacterEncodingFilter</filter-name>
         <url-pattern>/*</url-pattern>
       </filter-mapping>

      这里要注意的是:路径、代码尽量放在前面,最好是<web-app 的后面

    5. 完成遇到类型问题处理完,就觉得挺简单,在问题中时还是要多点参考参考。
  • 自己的博客终于开通了

    自己的博客终于开通了,一直都有写博客的打算,但是又不喜欢在大门户上写,因为觉得如果在门户上写都会是自己的一些生活所事不专业,而自己的博客是希望有专业性与自己的工作有关的.

    在这里自己就可以随意修改自己的博客了,要什么风格:简单的或者酷酷的都可以.

    呵呵.