仿QQ空间的一款APP(二)
2016-11-03 16:21
232 查看
接着上面一片博客,这篇主要讲一下服务器怎么写的。
对于服务器方面的知识,其实我也不大了解,以前更是没有学习过SSH框架,之前也没用过IntellJ IDEA这个工具(以前都是用myeclipse的),不过用过之后就感觉这个软件非常好用,强烈推荐。
服务器方面,我采用的是基于注解的SSH框架搭建的,Tomcat7,MySQL数据库。至于Struts,spring,hibernate是什么版本我也没仔细看,直接从我姐夫那拷了一个模板,把所有的jar包导入,再配置一下applicationContext.xml,web.xml,struts.xml这几个配置文件,至于jdbc.properties这个我就没有配置了,直接在applicationContext中配置了,反正也可以,没有应该不是什么大事。。
项目目录结构:
其中@Entity注释指名这是一个实体Bean;
@Table注释指定了Entity所要映射带数据库表:
@Column代表数据库表中的一个属性
@Id代表是主键,@GeneratedValue(strategy = GenerationType.IDENTITY)代表主键增长策略。
这些都是一些注解,对应映射到你数据库中的表和对应的属性,如果你的applicationContext.xml中配置了这个属性
那么当你运行工程时候,就会自动的在数据库中创建一个表,每个表的属性和你配置的也一样,非常方便。
UserDao.java代码如下:
@Repository(“userDao”)这个注解使得可以在别的java文件中不需要new一个对象就可以使用,userDao就相当于一个对象了,不要纠结这个太多,这个注解作用会在UserAction.java中显现出来。
这里面有数据库的增删改查,还有登录的一些判断方法,都写在这里面,这些方法理应是传到service层的,但我直接传到了web层了,service部分舍弃了。
@Action(value = “login”)加上这个注解就是一个action请求了,直接使用链接加上action名字就能访问这个action了。
这里面的action写的有点多,按照我姐夫的说法,web层应该是调用service层的方法就行了,不需要写别的逻辑,结果我全写在web层里面了。这里我就偷懒了,调用和返回值全都写在了这里面,最好还是包装一下到service里面,如何action直接调用service的一个方法就行了。
服务器端记得把所有的数据变成上面格式并打印到网页上,客户端就可以收到该字符串,这个字符串就是JSONArray型的数据,具体解析方法如下:
大概就是这样,所以思路就是客户端发送http请求,服务器端响应,返回给客户端JSON格式的数据,客户端解析JSON数据,如何相应的显示在listview中去,这里我是重写了ArrayAdapter,具体怎么实现的就不细细说了,感兴趣的需要源码的可以私信我,有啥疑问也可以私信我。
对于服务器方面的知识,其实我也不大了解,以前更是没有学习过SSH框架,之前也没用过IntellJ IDEA这个工具(以前都是用myeclipse的),不过用过之后就感觉这个软件非常好用,强烈推荐。
服务器方面,我采用的是基于注解的SSH框架搭建的,Tomcat7,MySQL数据库。至于Struts,spring,hibernate是什么版本我也没仔细看,直接从我姐夫那拷了一个模板,把所有的jar包导入,再配置一下applicationContext.xml,web.xml,struts.xml这几个配置文件,至于jdbc.properties这个我就没有配置了,直接在applicationContext中配置了,反正也可以,没有应该不是什么大事。。
项目目录结构:
一、项目结构
1、model部分
负责映射到数据库中的模块。以用户表user为例分析,下面的都一样。其中@Entity注释指名这是一个实体Bean;
@Table注释指定了Entity所要映射带数据库表:
@Column代表数据库表中的一个属性
@Id代表是主键,@GeneratedValue(strategy = GenerationType.IDENTITY)代表主键增长策略。
这些都是一些注解,对应映射到你数据库中的表和对应的属性,如果你的applicationContext.xml中配置了这个属性
<prop key="hibernate.hbm2ddl.auto">update</prop>
那么当你运行工程时候,就会自动的在数据库中创建一个表,每个表的属性和你配置的也一样,非常方便。
package com.message.server.model; import net.sf.json.JSONObject; import org.springframework.stereotype.Repository; import javax.persistence.*; import java.util.List; /** * Created by SX10100563 on 2016/10/10. */ @Entity @Table(name = "user") public class User { @Id @Column(name = "userId") @GeneratedValue(strategy = GenerationType.IDENTITY) private int userId; @Column(name = "userName") private String userName; @Column(name = "userPassword") private String userPassword; public User(int userId, String userName, String userPassword) { this.userId = userId; this.userName = userName; this.userPassword = userPassword; } public User(String userName, String userPassword) { this.userName = userName; this.userPassword = userPassword; } public User(int userId) { this.userId = userId; } public User() { } public Integer getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public JSONObject UserToJSON(){ JSONObject json = new JSONObject(); json.put("userId", userId); json.put("userName", userName); json.put("userPassword", userPassword); return json; } }
2、dao部分
负责获取数据库中的数据了,从这里获得数据库数据并返回给service层进行处理。UserDao.java代码如下:
@Repository(“userDao”)这个注解使得可以在别的java文件中不需要new一个对象就可以使用,userDao就相当于一个对象了,不要纠结这个太多,这个注解作用会在UserAction.java中显现出来。
package com.message.server.dao; /** * Created by SX10100563 on 2016/10/9. */ import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import com.message.server.dao.daoImpl.UserDaoInterface; import com.message.server.model.User; import com.message.server.utils.*; import org.springframework.stereotype.Repository; /** * Session操作数据库的相关方法: * get ()从数据库获取数据对象,不存在时返回null * load ()从数据库获取数据对象,不存在时抛出异常 * createQuery ()根据条件查询数据对象 * save ()将对象保存到数据库 * update() 更新对象到数据库 * delete () 根据对象删除数据库数据 */ @Repository("userDao") public class UserDao extends MyHibernateDaoSupport implements UserDaoInterface { public void addUser(User user) { Session session = this.getSession(true); Transaction tc = session.beginTransaction(); session.save(user); try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); } public void delUser(int userId) { Session session = this.getSession(true); Transaction tc = session.beginTransaction(); User u = new User(userId); session.delete(u); try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); } public void updateUser(User user) { Session session = this.getSession(true); Transaction tc = session.beginTransaction(); session.update(user); try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); } public List<String> selectAllUserName() { List<String> usernameList = new ArrayList<>(); Session session = this.getSession(true); Transaction tc = session.beginTransaction(); List list = session.createQuery("From User").list(); for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { User u = (User) iterator.next(); usernameList.add(u.getUserName()); } try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); return usernameList; } public List<User> selectUser() { List<User> users = new ArrayList<>(); Session session = this.getSession(true); Transaction tc = session.beginTransaction(); List list = session.createQuery("From User").list(); for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { User u = (User) iterator.next(); users.add(u); } try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); return users; } public User getUserByUserId(int userId) { Session session = this.getSession(true); Transaction tc = session.beginTransaction(); User user = (User) session.load(User.class, userId); try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); return user; } public boolean isExitByName(String userName) { Session session = this.getSession(true); Transaction tc = session.beginTransaction(); List user = session.createQuery("From User u where u.userName=:userName").setString("userName", userName).list(); if (user.size() > 0) { try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); return true; } try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); return false; } public boolean isExitByNameAndPass(User user) { Session session = this.getSession(true); Transaction tc = session.beginTransaction(); List users = null; users = session.createQuery("From User u where u.userName=:userName and u.userPassword=:userPassword").setString("userName", user.getUserName()).setString("userPassword", user.getUserPassword()).list(); if (users.size() > 0) { try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); return true; } try { tc.commit(); } catch (Exception e) { e.printStackTrace(); } session.close(); return false; } }
这里面有数据库的增删改查,还有登录的一些判断方法,都写在这里面,这些方法理应是传到service层的,但我直接传到了web层了,service部分舍弃了。
3、service部分
关于service部分,我就没有写东西了,所有东西都在dao层实现了,好像没service层啥事了。4、web层
这一层的作用就是涉及到和客户端的交互了,前面更多的是从数据库获取数据,处理逻辑等,这一层就是直接返回消息了,客户端可以通过http请求访问得到返回了。@Action(value = “login”)加上这个注解就是一个action请求了,直接使用链接加上action名字就能访问这个action了。
package com.message.server.action; /** * Created by SX10100563 on 2016/10/14. */ import com.message.server.dao.UserDao; import com.message.server.model.User; import com.message.server.utils.ActionSupportUtil; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.struts2.convention.annotation.Action; import org.springframework.stereotype.Controller; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.util.List; /** * 与user有关的Action */ @Controller public class UserAction extends ActionSupportUtil { @Resource private UserDao userDao; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } /** * 用户的登录功能。 * 通过UserDao中的isExitByNameAndPass(user)方法可以知道数据库中用户名和密码是否正确 * http://localhost:8080/login.action?user.userName=cjs&user.userPassword=123 * * @return */ @Action(value = "login") public void login() throws UnsupportedEncodingException { user.setUserName(new String(user.getUserName().getBytes("ISO-8859-1"), "UTF-8")); boolean flag = userDao.isExitByNameAndPass(user); if (flag) { renderText("Success"); return; } renderText("Fail"); } /** * 用户的注册功能。 * 使用UserDao的addUser方法可以向数据库中插入用户信息(用户名、密码)、用户ID是自增 * http://localhost:8080/addUser?user.userName=&user.userPassword=1234 * * @return */ @Action(value = "addUser") public void addUser() throws UnsupportedEncodingException { user.setUserName(new String(user.getUserName().getBytes("ISO-8859-1"), "UTF-8")); userDao.addUser(user); renderText("success"); } /** * 获得所有的用户名及密码 * http://localhost:8080/getAllUsers */ @Action("getAllUsers") public void getAllUsers() { List<User> users = userDao.selectUser(); if (users == null) { renderText("user null"); } else { JSONArray json = new JSONArray(); for (User user : users) { json.add(user.UserToJSON()); } renderJson(json.toString()); } } /** * 获取所有的用户名 * http://localhost:8080/getAllUserName */ @Action("getAllUserName") public void getAllUserName(){ List<String> usernameList=userDao.selectAllUserName(); if(usernameList==null){ renderText("null"); }else{ JSONArray jsonArray=new JSONArray(); JSONObject jsonObject=new JSONObject(); for (String name : usernameList){ jsonObject.put("userName",name); jsonArray.add(jsonObject); } renderJson(jsonArray.toString()); } } }
这里面的action写的有点多,按照我姐夫的说法,web层应该是调用service层的方法就行了,不需要写别的逻辑,结果我全写在web层里面了。这里我就偷懒了,调用和返回值全都写在了这里面,最好还是包装一下到service里面,如何action直接调用service的一个方法就行了。
二、客户端访问服务器端,获取数据。
1、客户端通过http请求访问数据库
这里面serverUrl 要换成你自己的服务器地址,通过HttpPost访问action的链接,这里访问了”http://121.42.144.254:8080/msgserver_war/login“这个action,并且附带了名字和密码属性,一起发送给action验证,服务器对该请求进行解析并返回数据(登录成功返回success,登录失败返回fail)。客户端收到数据之后就可以知道登录的是否成功了。package com.example.web; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpConnection; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import android.util.Log; import com.example.web.Conn_server; /** * 这个类用来进行登录判断的工具类 * * @author ubuntu * */ public class LoginJudge { private final String serverUrl = "http://121.42.144.254:8080/msgserver_war/"; /** * 使用post方式向服务器发送请求,相当于http://localhost:8080/login.action?user.userName=cjs& * user.userPassword=123这种get方式 向服务器发出http请求,附带用户名和密码 * * @param url * @param userName * @param userPassword * @return */ public String login(String action, String userName, String userPassword) { String result = null; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("user.userName", userName)); params.add(new BasicNameValuePair("user.userPassword", userPassword)); HttpEntity entity; HttpClient client = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(serverUrl + "login"); HttpResponse response; try { entity = new UrlEncodedFormEntity(params, HTTP.UTF_8); httpPost.setEntity(entity); response = client.execute(httpPost); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // result = "网络连接成功"; result = EntityUtils.toString(response.getEntity(), "utf-8"); } else { result = "InternalFail"; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } }
2、服务器端返回JSON数据,客户端解析。
JSON数据格式类似于这种:[{“userId”:1,”userPassword”:”123456”,”userName”:”root”},{“userId”:2,”userPassword”:”123456”,”userName”:”demo”},{“userId”:3,”userPassword”:”123456”,”userName”:”test”}]服务器端记得把所有的数据变成上面格式并打印到网页上,客户端就可以收到该字符串,这个字符串就是JSONArray型的数据,具体解析方法如下:
JSONArray jsonArray = new JSONArray(result); for (int i=0;i<jsonArray.length();i++) { JSONObject jsonObject2 =(JSONObject)jsonArray.opt(j); str=str+"第"+i+"个,userId:"+jsonObject2.getString("userId")+"userName:"+jsonObject2.getString("userName")+"userPassword:"+jsonObject2.getString("userPassword"); }
大概就是这样,所以思路就是客户端发送http请求,服务器端响应,返回给客户端JSON格式的数据,客户端解析JSON数据,如何相应的显示在listview中去,这里我是重写了ArrayAdapter,具体怎么实现的就不细细说了,感兴趣的需要源码的可以私信我,有啥疑问也可以私信我。
相关文章推荐
- 仿QQ空间的一款APP(一)
- 萌土1.0,一款社交新闻APP
- 用idea调试一款app的时候,程序直接退出
- 从今天开始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
- 如何打造一款 android app
- 从零开始开发一款app,所想到的
- fir.im Weekly - 做一款 App 需要考虑什么
- 善假于物,利用工具2天开发一款完整新闻类iOS app
- 一款新闻类iOS APP的诞生过程(初学)
- PigeonCall:一款Android VoIP网络电话App架构分析
- 设计一款好的移动App,有哪些基本规则?
- 开发一款即时通讯App,从这几步开始
- Android 开源项目Kotlin+MVP+Retofit2+RxJava2架构开发一款短视频App
- 做一款仿映客的直播App?看我就够了
- 一个人工作之余6元上线一款APP的血泪史
- 《我们立志要做出一款颠覆程序员工作方式的APP,你想来试试吗?》
- 一款纯粹的在线视频App,基于Material Design + MVP + RxJava + Retrofit + Realm
- 一款App的配色方案如何建立?
- 一款综合(QQ 音乐、微信、美团、优酷、虎牙直播等多款 app)风格的搜索控制器