前言:最近在网看见有人请求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 | contextConfigLocation |
3 | /WEB-INF/applicationContext.xml |
4 | |
5 | |
6 | |
7 | org.springframework.web.context.ContextLoaderListener |
8 | |
9 | |
10 | |
11 | struts2 |
12 | org.apache.struts2.dispatcher.FilterDispatcher |
13 | |
14 | |
15 | struts2 |
16 | /* |
17 | |
18 | |
19 |
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.jsp |
3 |
主要代码就制作两个表单
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里面 大家可以随时下载哈)
如果感兴趣就转载吧,不过请顺便把链接给转过去哈!