前言:最近在网看见有人请求flex+ssh的例子,其实我自己觉得,如果要结合flex开发完全用不着struts,因为flex有开源的项目BlazeDS ,更容易和Spring Hibernate 结合,但是既然大家需要加之SSH在现在还很流行,我就把我自己所了解的分享给大家,希望大家喜欢,我自己的水平有限哈,其中有很多不足,希望大家能够指出。
开发环境:OS(Windows7 professional), IDE(MyEclipse blue 7.5 FlashBuilder Standalone), Server(Jboss 4.2),DB(MySQL)
所需要导入的包:JSON-lib for java(下载) JSON-lib for as(下载)
例子介绍:一个简单的用户注册登录,嗯,其实FLEX+SSH这样的组合,是用FLEX来取代JSP的角色
适合对象:本文需要你对SSH开发有所了解,然后对flex开发比较感兴趣
下面我们就详细介绍,从我们开发项目的顺序开始,先配置开发环境,这个我就不在多说了,只是说说我所用的框架版本Struts2.0 Spring2.5 Hibernate 3.2 ,结构图如下图:
下面看看我们配置文件
Struts2和struts1.x不同 它是用Filter来截获请求 ,要结合Spring 就还必须加入listener ,设置applicationContext.xml的位置,我们一般放到WEB-INF下面,下面是web.xml
1 2 contextConfigLocation3 /WEB-INF/applicationContext.xml4 5 6 7 org.springframework.web.context.ContextLoaderListener8 9 10 11 struts212 org.apache.struts2.dispatcher.FilterDispatcher13 14 15 struts216 /*17 18 19 在SSH,我们一般都用Spring来创建sessionFactory,而不去用Hibernnate的 ,所以我们在导入hibernate框架时就用不着创建hibernate sessionFactory . 在applicationContext.xml里面创建一个bean就行了
1 id="sessionFactory"2 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">3 name="configLocation"4 value="classpath:hibernate.cfg.xml">5 6 由于MyEclipse 的版本比较低 所以没有Struts2.0 ,所以只有自己导入,在这里要说一点,一定要记得到如struts2-spring-plugin-2.0.14.jar 然后在struts.xml加一句
1 name="struts.objectFactory" value="spring" />下面就是一步一步写我们的代码:
1) 建立po: po.User.java
1 public class User {2 3 private String account;4 private String password; 2)建立映射文件:po.User.hbm.xml 这里我们只是简单的测试,所以在数据库里面就保存账户和密码就行了
1 version="1.0"?>2 hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">5 6 name="po.User" table="T_USER">7 name="account" column="UACCOUNT">8 class="assigned"/> 9 10 name="password" column="UPASSWORD"/>11 12 3)po建立完成后就写我们的dao 由于要用到Spring的注入功能和实现模块的可插拔(我们老师经常这么说),所以就要开发接口dao.UserDao.java,我们要提供用户注册登录功能,所以在Dao中包含了下面那两个函数
1 package dao;2 3 import po.User;4 5 public interface UserDao {6 7 public User getUserByAccount(String account);8 public boolean addUser(String account,String password);9 10 } 4)然后就写实现类daoimple.UserDaoImpl.java 这里就不必在多说了也不必插入代码了不过有点要说明 在这里UserDaoImpl不仅要实现UserDao 还要继承HibernateDaoSupport ,因为只有继承了这个类,在DAO里面才能调用Spring的sessionFactory,看看在Spring里面创建dao你就可以明白了
1 public class UserDaoImpl extends HibernateDaoSupport implements UserDao { 5)在Spring中创建dao bean 这样在后面我们就方便的可以报UserDao 注入Action里面了
1 id="udao" class="daoimpl.UserDaoImpl">2 name="sessionFactory" ref="sessionFactory"> 3 6)用户有两个动作(注册登录)所以我们创建了RegisterAction LoginAction 这里重点,我在网上看见好多flex与struts结合的例子都通过getRequest().getParameter(arg0) 来获得flex请求参数 ,我们这里不,因为用flex也可以像jsp那样自动填充Action里面的属性,当说到flex代码是我会具体说说。
1 public class LoginAction {2 3 private String account;4 private String password;5 private UserDao udao;6 public String getAccount() {7 return account;8 }9 public void setAccount(String account) {10 this.account = account;11 }12 public String getPassword() {13 return password;14 }15 public void setPassword(String password) {16 this.password = password;17 }18 public String execute() throws IOException{19 HttpSession session =ServletActionContext.getRequest().getSession();20 HttpServletResponse response = ServletActionContext.getResponse();21 22 Map map = new HashMap(); 23 User u = null;24 u = (User)session.getAttribute("user");25 if(u!=null){26 map.put("result", "true");27 28 29 }30 else{31 u = udao.getUserByAccount(account);32 if(u!=null&&u.getPassword().equals(password)){33 map.put("result", "true");34 35 36 }37 else{38 map.put("result", "false");39 40 41 }42 43 }44 JSONObject json = JSONObject.fromObject( map ); 45 session.setAttribute("result", json.toString());46 return "result";47 48 49 }50 public UserDao getUdao() {51 return udao;52 }53 public void setUdao(UserDao udao) {54 this.udao = udao;55 }56 } Struts2与struts1.x有很大的区别,在Struts1.x中每个Action都必须继承org.apache.struts.action.Action而Struts2却不用继承任何类,我们老师说着就避免了软件工程中所谓的代码入侵,其实我也不怎么懂,说说上面的action吧 大家看见了,我在execute()函数里面用了JSON 大致是这样的 flex请求Action action返回JSON生成的对象比如登录成功就会返回{“result”:”true”}
然后看Spring怎么调用Action
我们把每个action都作为一个bean创建在Spring中,然后在struts.xml配置action只需要bean的id就行了
1 id="LoginAction" class="action.LoginAction">2 name="udao" ref="udao">3
1 name="login" class="LoginAction">2 name="result"> /result.jsp3 现在基本把SSH代码写好了 ,写jsp测试,放到服务器里面,测试通过就进行下一步,
现在写flex代码,我想现在有FLEX+SSH这样的组合,也是有原因的,因为FLEX开发界面是可视化编程,比开发JSP轻松松了,让我们这些不会做界面的程序员也能做出漂亮的界面
下面是简单的一个界面
主要代码就制作两个表单
flex我就只讲重点的部分 至于界面 我不想过多讲
先看看结构吧
初始化两个HttpService
1 2 id="loginService" showBusyCursor="true"/>3 id="registerService" showBusyCursor="true"/>4
然后对这两个Service初始化 我比较喜欢写函数初始化
1 //初始化函数2 private function init():void{3 //用户登陆4 loginService.method ="POST";5 loginService.url="http://localhost:8888/TestFlex/login.action";6 loginService.addEventListener(ResultEvent.RESULT,loginHandler);7 loginService.addEventListener(FaultEvent.FAULT,faultHandler);8 //用户注册9 registerService.method="POST";10 registerService.url ="http://localhost:8888/TestFlex/register.action";11 registerService.addEventListener(ResultEvent.RESULT,registerHandler);12 registerService.addEventListener(FaultEvent.FAULT,faultHandler);13 14 15 }具体代码就贴出来 ,我会把我所哟的源代码提供下载,我主要想说flex请求是 怎么让Action填充属性,同过flex的URLVariables
比如我登录时
1 var parameters:URLVariables = new URLVariables();2 parameters.account = loginaccount.text;3 parameters.password = loginpassword.text;4 loginService.send(parameters);同过上述代码请求就能让Action自动填充属性
现在来操作一下吧
1 private function loginHandler(e:ResultEvent):void{2 var obj:Object = JSON.decode(e.result.toString());3 var bol:Boolean = new Boolean(obj.result);4 5 if(bol){6 mx.controls.Alert.show("恭喜你登陆成功!");7 }8 9 }这里我为什么不直接从服务端返回提示信息 而是返回JSON对象了 因为在大的项目里面数据交换复杂 同过JSON能够方便的操作这些数据,我这里也是提供给大家想法 如果之际从服务端返回提示信息业可以。
注册 登录 成功!
这是我第一次写博客,还有也是第一次写技术文章 ,很多地方讲的不清楚,如果不清楚大家多多看看代码哈
下载项目(在我的MSN里面 大家可以随时下载哈)
如果感兴趣就转载吧,不过请顺便把链接给转过去哈!